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/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
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/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=
|
||||||
|
|
|
@ -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) {
|
||||||
|
|
Reference in New Issue
Block a user