map_usecase.GetMarkers should load villages in separate goroutines

This commit is contained in:
Dawid Wysokiński 2020-07-31 20:49:00 +02:00
parent 68848a783c
commit e97fb53bcf
3 changed files with 87 additions and 57 deletions

1
go.mod
View File

@ -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
View File

@ -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=

View File

@ -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) {