map_usecase.GetMarkers should load villages in separate goroutines
This commit is contained in:
parent
68848a783c
commit
e97fb53bcf
1
go.mod
1
go.mod
|
@ -18,6 +18,7 @@ require (
|
|||
github.com/tribalwarshelp/map-generator v0.0.0-20200623143352-cc037d744be2
|
||||
github.com/tribalwarshelp/shared v0.0.0-20200728103702-87e7e5f1b8fd
|
||||
github.com/vektah/gqlparser/v2 v2.0.1
|
||||
golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208
|
||||
golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae // indirect
|
||||
google.golang.org/protobuf v1.25.0 // indirect
|
||||
gopkg.in/yaml.v2 v2.3.0 // indirect
|
||||
|
|
3
go.sum
3
go.sum
|
@ -264,7 +264,10 @@ golang.org/x/net v0.0.0-20200602114024-627f9648deb9/go.mod h1:qpuaurCH72eLCgpAm/
|
|||
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
|
||||
golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||
golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||
golang.org/x/sync v0.0.0-20190423024810-112230192c58 h1:8gQV6CLnAEikrhgkHFbMAEhagSSnXWGV915qUMm9mrU=
|
||||
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||
golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208 h1:qwRHBd0NqMbJxfbotnDhm2ByMI1Shq4Y6oRJo21SGJA=
|
||||
golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||
golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||
golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||
|
|
|
@ -5,12 +5,14 @@ import (
|
|||
"fmt"
|
||||
"strconv"
|
||||
"strings"
|
||||
"sync"
|
||||
|
||||
"github.com/pkg/errors"
|
||||
"github.com/tribalwarshelp/api/servermap"
|
||||
"github.com/tribalwarshelp/api/village"
|
||||
"github.com/tribalwarshelp/map-generator/generator"
|
||||
"github.com/tribalwarshelp/shared/models"
|
||||
"golang.org/x/sync/errgroup"
|
||||
)
|
||||
|
||||
const (
|
||||
|
@ -27,6 +29,9 @@ func New(villageRepo village.Repository) servermap.Usecase {
|
|||
}
|
||||
|
||||
func (ucase *usecase) GetMarkers(ctx context.Context, cfg servermap.GetMarkersConfig) ([]*generator.Marker, error) {
|
||||
var mutex sync.Mutex
|
||||
g := new(errgroup.Group)
|
||||
|
||||
tribes := make(map[string][]int)
|
||||
tribeIDs := []int{}
|
||||
cache := make(map[int]bool)
|
||||
|
@ -64,81 +69,102 @@ func (ucase *usecase) GetMarkers(ctx context.Context, cfg servermap.GetMarkersCo
|
|||
markers := []*generator.Marker{}
|
||||
|
||||
if cfg.ShowOtherPlayerVillages {
|
||||
villages, _, err := ucase.villageRepo.Fetch(ctx, village.FetchConfig{
|
||||
Server: cfg.Server,
|
||||
Filter: &models.VillageFilter{
|
||||
PlayerFilter: &models.PlayerFilter{
|
||||
IdNEQ: append(playerIDs, 0),
|
||||
TribeFilter: &models.TribeFilter{
|
||||
IdNEQ: tribeIDs,
|
||||
g.Go(func() error {
|
||||
villages, _, err := ucase.villageRepo.Fetch(ctx, village.FetchConfig{
|
||||
Server: cfg.Server,
|
||||
Filter: &models.VillageFilter{
|
||||
PlayerFilter: &models.PlayerFilter{
|
||||
IdNEQ: append(playerIDs, 0),
|
||||
TribeFilter: &models.TribeFilter{
|
||||
IdNEQ: tribeIDs,
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
Count: false,
|
||||
})
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
markers = append(markers, &generator.Marker{
|
||||
Villages: villages,
|
||||
Color: defaultPlayerVillagesColor,
|
||||
Count: false,
|
||||
})
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
mutex.Lock()
|
||||
markers = append(markers, &generator.Marker{
|
||||
Villages: villages,
|
||||
Color: defaultPlayerVillagesColor,
|
||||
})
|
||||
mutex.Unlock()
|
||||
return nil
|
||||
})
|
||||
}
|
||||
|
||||
if cfg.ShowBarbarianVillages {
|
||||
villages, _, err := ucase.villageRepo.Fetch(ctx, village.FetchConfig{
|
||||
Server: cfg.Server,
|
||||
Filter: &models.VillageFilter{
|
||||
PlayerID: []int{0},
|
||||
},
|
||||
Count: false,
|
||||
})
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
markers = append(markers, &generator.Marker{
|
||||
Villages: villages,
|
||||
Color: defaultBarbarianVillagesColor,
|
||||
g.Go(func() error {
|
||||
villages, _, err := ucase.villageRepo.Fetch(ctx, village.FetchConfig{
|
||||
Server: cfg.Server,
|
||||
Filter: &models.VillageFilter{
|
||||
PlayerID: []int{0},
|
||||
},
|
||||
Count: false,
|
||||
})
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
mutex.Lock()
|
||||
markers = append(markers, &generator.Marker{
|
||||
Villages: villages,
|
||||
Color: defaultBarbarianVillagesColor,
|
||||
})
|
||||
mutex.Unlock()
|
||||
return nil
|
||||
})
|
||||
}
|
||||
|
||||
for color, tribeIDs := range tribes {
|
||||
villages, _, err := ucase.villageRepo.Fetch(ctx, village.FetchConfig{
|
||||
Server: cfg.Server,
|
||||
Filter: &models.VillageFilter{
|
||||
PlayerFilter: &models.PlayerFilter{
|
||||
TribeID: tribeIDs,
|
||||
g.Go(func() error {
|
||||
villages, _, err := ucase.villageRepo.Fetch(ctx, village.FetchConfig{
|
||||
Server: cfg.Server,
|
||||
Filter: &models.VillageFilter{
|
||||
PlayerFilter: &models.PlayerFilter{
|
||||
TribeID: tribeIDs,
|
||||
},
|
||||
},
|
||||
},
|
||||
Count: false,
|
||||
})
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
markers = append(markers, &generator.Marker{
|
||||
Villages: villages,
|
||||
Color: color,
|
||||
Count: false,
|
||||
})
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
mutex.Lock()
|
||||
markers = append(markers, &generator.Marker{
|
||||
Villages: villages,
|
||||
Color: color,
|
||||
})
|
||||
mutex.Unlock()
|
||||
return nil
|
||||
})
|
||||
}
|
||||
|
||||
for color, playerIDs := range players {
|
||||
villages, _, err := ucase.villageRepo.Fetch(ctx, village.FetchConfig{
|
||||
Server: cfg.Server,
|
||||
Filter: &models.VillageFilter{
|
||||
PlayerID: playerIDs,
|
||||
},
|
||||
Count: false,
|
||||
})
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
markers = append(markers, &generator.Marker{
|
||||
Villages: villages,
|
||||
Color: color,
|
||||
g.Go(func() error {
|
||||
villages, _, err := ucase.villageRepo.Fetch(ctx, village.FetchConfig{
|
||||
Server: cfg.Server,
|
||||
Filter: &models.VillageFilter{
|
||||
PlayerID: playerIDs,
|
||||
},
|
||||
Count: false,
|
||||
})
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
mutex.Lock()
|
||||
markers = append(markers, &generator.Marker{
|
||||
Villages: villages,
|
||||
Color: color,
|
||||
})
|
||||
mutex.Unlock()
|
||||
return nil
|
||||
})
|
||||
}
|
||||
|
||||
return markers, nil
|
||||
err := g.Wait()
|
||||
return markers, err
|
||||
}
|
||||
|
||||
func parseQueryParam(str string) (int, string, error) {
|
||||
|
|
Reference in New Issue