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/map-generator v0.0.0-20200623143352-cc037d744be2
github.com/tribalwarshelp/shared v0.0.0-20200728103702-87e7e5f1b8fd github.com/tribalwarshelp/shared v0.0.0-20200728103702-87e7e5f1b8fd
github.com/vektah/gqlparser/v2 v2.0.1 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 golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae // indirect
google.golang.org/protobuf v1.25.0 // indirect google.golang.org/protobuf v1.25.0 // indirect
gopkg.in/yaml.v2 v2.3.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/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-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-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-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-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-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/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" "fmt"
"strconv" "strconv"
"strings" "strings"
"sync"
"github.com/pkg/errors" "github.com/pkg/errors"
"github.com/tribalwarshelp/api/servermap" "github.com/tribalwarshelp/api/servermap"
"github.com/tribalwarshelp/api/village" "github.com/tribalwarshelp/api/village"
"github.com/tribalwarshelp/map-generator/generator" "github.com/tribalwarshelp/map-generator/generator"
"github.com/tribalwarshelp/shared/models" "github.com/tribalwarshelp/shared/models"
"golang.org/x/sync/errgroup"
) )
const ( 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) { 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) tribes := make(map[string][]int)
tribeIDs := []int{} tribeIDs := []int{}
cache := make(map[int]bool) cache := make(map[int]bool)
@ -64,81 +69,102 @@ func (ucase *usecase) GetMarkers(ctx context.Context, cfg servermap.GetMarkersCo
markers := []*generator.Marker{} markers := []*generator.Marker{}
if cfg.ShowOtherPlayerVillages { if cfg.ShowOtherPlayerVillages {
villages, _, err := ucase.villageRepo.Fetch(ctx, village.FetchConfig{ g.Go(func() error {
Server: cfg.Server, villages, _, err := ucase.villageRepo.Fetch(ctx, village.FetchConfig{
Filter: &models.VillageFilter{ Server: cfg.Server,
PlayerFilter: &models.PlayerFilter{ Filter: &models.VillageFilter{
IdNEQ: append(playerIDs, 0), PlayerFilter: &models.PlayerFilter{
TribeFilter: &models.TribeFilter{ IdNEQ: append(playerIDs, 0),
IdNEQ: tribeIDs, TribeFilter: &models.TribeFilter{
IdNEQ: tribeIDs,
},
}, },
}, },
}, Count: false,
Count: false, })
}) if err != nil {
if err != nil { return err
return nil, err }
} mutex.Lock()
markers = append(markers, &generator.Marker{ markers = append(markers, &generator.Marker{
Villages: villages, Villages: villages,
Color: defaultPlayerVillagesColor, Color: defaultPlayerVillagesColor,
})
mutex.Unlock()
return nil
}) })
} }
if cfg.ShowBarbarianVillages { if cfg.ShowBarbarianVillages {
villages, _, err := ucase.villageRepo.Fetch(ctx, village.FetchConfig{ g.Go(func() error {
Server: cfg.Server, villages, _, err := ucase.villageRepo.Fetch(ctx, village.FetchConfig{
Filter: &models.VillageFilter{ Server: cfg.Server,
PlayerID: []int{0}, Filter: &models.VillageFilter{
}, PlayerID: []int{0},
Count: false, },
}) Count: false,
if err != nil { })
return nil, err if err != nil {
} return err
markers = append(markers, &generator.Marker{ }
Villages: villages, mutex.Lock()
Color: defaultBarbarianVillagesColor, markers = append(markers, &generator.Marker{
Villages: villages,
Color: defaultBarbarianVillagesColor,
})
mutex.Unlock()
return nil
}) })
} }
for color, tribeIDs := range tribes { for color, tribeIDs := range tribes {
villages, _, err := ucase.villageRepo.Fetch(ctx, village.FetchConfig{ g.Go(func() error {
Server: cfg.Server, villages, _, err := ucase.villageRepo.Fetch(ctx, village.FetchConfig{
Filter: &models.VillageFilter{ Server: cfg.Server,
PlayerFilter: &models.PlayerFilter{ Filter: &models.VillageFilter{
TribeID: tribeIDs, PlayerFilter: &models.PlayerFilter{
TribeID: tribeIDs,
},
}, },
}, Count: false,
Count: false, })
}) if err != nil {
if err != nil { return err
return nil, err }
} mutex.Lock()
markers = append(markers, &generator.Marker{ markers = append(markers, &generator.Marker{
Villages: villages, Villages: villages,
Color: color, Color: color,
})
mutex.Unlock()
return nil
}) })
} }
for color, playerIDs := range players { for color, playerIDs := range players {
villages, _, err := ucase.villageRepo.Fetch(ctx, village.FetchConfig{ g.Go(func() error {
Server: cfg.Server, villages, _, err := ucase.villageRepo.Fetch(ctx, village.FetchConfig{
Filter: &models.VillageFilter{ Server: cfg.Server,
PlayerID: playerIDs, Filter: &models.VillageFilter{
}, PlayerID: playerIDs,
Count: false, },
}) Count: false,
if err != nil { })
return nil, err if err != nil {
} return err
markers = append(markers, &generator.Marker{ }
Villages: villages, mutex.Lock()
Color: color, 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) { func parseQueryParam(str string) (int, string, error) {