dataloader - set maxBatch to 200 and wait to 2 milliseconds

This commit is contained in:
Dawid Wysokiński 2021-05-10 23:15:55 +02:00
parent 9516140c0f
commit 44c90d0efc
13 changed files with 51 additions and 51 deletions

View File

@ -1,4 +1,4 @@
package dataloaders package dataloader
import ( import (
"context" "context"
@ -12,10 +12,11 @@ import (
) )
const ( const (
wait = 4 * time.Millisecond wait = 2 * time.Millisecond
maxBatch = 200
) )
type DataLoaders struct { type DataLoader struct {
VersionByCode *VersionLoader VersionByCode *VersionLoader
} }
@ -26,11 +27,11 @@ type Config struct {
VersionRepo version.Repository VersionRepo version.Repository
} }
func NewDataLoaders(cfg Config) *DataLoaders { func NewDataLoader(cfg Config) *DataLoader {
return &DataLoaders{ return &DataLoader{
VersionByCode: &VersionLoader{ VersionByCode: &VersionLoader{
wait: wait, wait: wait,
maxBatch: 0, maxBatch: maxBatch,
fetch: func(keys []string) ([]*twmodel.Version, []error) { fetch: func(keys []string) ([]*twmodel.Version, []error) {
var codes []twmodel.VersionCode var codes []twmodel.VersionCode
for _, code := range keys { for _, code := range keys {

View File

@ -1,6 +1,6 @@
// Code generated by github.com/vektah/dataloaden, DO NOT EDIT. // Code generated by github.com/vektah/dataloaden, DO NOT EDIT.
package dataloaders package dataloader
import ( import (
"github.com/tribalwarshelp/shared/tw/twmodel" "github.com/tribalwarshelp/shared/tw/twmodel"

View File

@ -1,6 +1,6 @@
// Code generated by github.com/vektah/dataloaden, DO NOT EDIT. // Code generated by github.com/vektah/dataloaden, DO NOT EDIT.
package dataloaders package dataloader
import ( import (
"github.com/tribalwarshelp/shared/tw/twmodel" "github.com/tribalwarshelp/shared/tw/twmodel"

View File

@ -1,6 +1,6 @@
// Code generated by github.com/vektah/dataloaden, DO NOT EDIT. // Code generated by github.com/vektah/dataloaden, DO NOT EDIT.
package dataloaders package dataloader
import ( import (
"sync" "sync"

View File

@ -1,4 +1,4 @@
package dataloaders package dataloader
import ( import (
"context" "context"
@ -9,17 +9,17 @@ import (
"github.com/tribalwarshelp/api/village" "github.com/tribalwarshelp/api/village"
) )
type ServerDataLoaders struct { type ServerDataLoader struct {
PlayerByID *PlayerLoader PlayerByID *PlayerLoader
TribeByID *TribeLoader TribeByID *TribeLoader
VillageByID *VillageLoader VillageByID *VillageLoader
} }
func NewServerDataLoaders(server string, cfg Config) *ServerDataLoaders { func NewServerDataLoader(server string, cfg Config) *ServerDataLoader {
return &ServerDataLoaders{ return &ServerDataLoader{
PlayerByID: &PlayerLoader{ PlayerByID: &PlayerLoader{
wait: wait, wait: wait,
maxBatch: 0, maxBatch: maxBatch,
fetch: func(ids []int) ([]*twmodel.Player, []error) { fetch: func(ids []int) ([]*twmodel.Player, []error) {
players, _, err := cfg.PlayerRepo.Fetch(context.Background(), player.FetchConfig{ players, _, err := cfg.PlayerRepo.Fetch(context.Background(), player.FetchConfig{
Filter: &twmodel.PlayerFilter{ Filter: &twmodel.PlayerFilter{
@ -47,7 +47,7 @@ func NewServerDataLoaders(server string, cfg Config) *ServerDataLoaders {
}, },
TribeByID: &TribeLoader{ TribeByID: &TribeLoader{
wait: wait, wait: wait,
maxBatch: 0, maxBatch: maxBatch,
fetch: func(ids []int) ([]*twmodel.Tribe, []error) { fetch: func(ids []int) ([]*twmodel.Tribe, []error) {
tribes, _, err := cfg.TribeRepo.Fetch(context.Background(), tribe.FetchConfig{ tribes, _, err := cfg.TribeRepo.Fetch(context.Background(), tribe.FetchConfig{
Server: server, Server: server,
@ -75,7 +75,7 @@ func NewServerDataLoaders(server string, cfg Config) *ServerDataLoaders {
}, },
VillageByID: &VillageLoader{ VillageByID: &VillageLoader{
wait: wait, wait: wait,
maxBatch: 0, maxBatch: maxBatch,
fetch: func(ids []int) ([]*twmodel.Village, []error) { fetch: func(ids []int) ([]*twmodel.Village, []error) {
villages, _, err := cfg.VillageRepo.Fetch(context.Background(), village.FetchConfig{ villages, _, err := cfg.VillageRepo.Fetch(context.Background(), village.FetchConfig{
Server: server, Server: server,

View File

@ -1,6 +1,6 @@
// Code generated by github.com/vektah/dataloaden, DO NOT EDIT. // Code generated by github.com/vektah/dataloaden, DO NOT EDIT.
package dataloaders package dataloader
import ( import (
"github.com/tribalwarshelp/shared/tw/twmodel" "github.com/tribalwarshelp/shared/tw/twmodel"

View File

@ -1,20 +1,20 @@
package dataloaders package dataloader
import ( import (
"context" "context"
"github.com/tribalwarshelp/shared/tw/twmodel" "github.com/tribalwarshelp/shared/tw/twmodel"
) )
type VersionDataLoaders struct { type VersionDataLoader struct {
PlayerServersByID *PlayerServersLoader PlayerServersByID *PlayerServersLoader
PlayerNameChangesByID *PlayerNameChangesLoader PlayerNameChangesByID *PlayerNameChangesLoader
} }
func NewVersionDataLoaders(versionCode twmodel.VersionCode, cfg Config) *VersionDataLoaders { func NewVersionDataLoader(versionCode twmodel.VersionCode, cfg Config) *VersionDataLoader {
return &VersionDataLoaders{ return &VersionDataLoader{
PlayerServersByID: &PlayerServersLoader{ PlayerServersByID: &PlayerServersLoader{
wait: wait, wait: wait,
maxBatch: 0, maxBatch: maxBatch,
fetch: func(keys []int) ([][]string, []error) { fetch: func(keys []int) ([][]string, []error) {
playerServersByID, err := cfg.PlayerRepo.FetchPlayerServers(context.Background(), versionCode, keys...) playerServersByID, err := cfg.PlayerRepo.FetchPlayerServers(context.Background(), versionCode, keys...)
if err != nil { if err != nil {
@ -29,7 +29,7 @@ func NewVersionDataLoaders(versionCode twmodel.VersionCode, cfg Config) *Version
}, },
PlayerNameChangesByID: &PlayerNameChangesLoader{ PlayerNameChangesByID: &PlayerNameChangesLoader{
wait: wait, wait: wait,
maxBatch: 0, maxBatch: maxBatch,
fetch: func(keys []int) ([][]*twmodel.PlayerNameChange, []error) { fetch: func(keys []int) ([][]*twmodel.PlayerNameChange, []error) {
playerNameChangesByID, err := cfg.PlayerRepo.FetchNameChanges(context.Background(), versionCode, keys...) playerNameChangesByID, err := cfg.PlayerRepo.FetchNameChanges(context.Background(), versionCode, keys...)
if err != nil { if err != nil {

View File

@ -1,6 +1,6 @@
// Code generated by github.com/vektah/dataloaden, DO NOT EDIT. // Code generated by github.com/vektah/dataloaden, DO NOT EDIT.
package dataloaders package dataloader
import ( import (
"github.com/tribalwarshelp/shared/tw/twmodel" "github.com/tribalwarshelp/shared/tw/twmodel"

View File

@ -1,6 +1,6 @@
// Code generated by github.com/vektah/dataloaden, DO NOT EDIT. // Code generated by github.com/vektah/dataloaden, DO NOT EDIT.
package dataloaders package dataloader
import ( import (
"github.com/tribalwarshelp/shared/tw/twmodel" "github.com/tribalwarshelp/shared/tw/twmodel"

View File

@ -49,7 +49,6 @@ func graphqlHandler(cfg generated.Config) gin.HandlerFunc {
srv.AddTransport(transport.GET{}) srv.AddTransport(transport.GET{})
srv.AddTransport(transport.POST{}) srv.AddTransport(transport.POST{})
srv.AddTransport(transport.MultipartForm{})
srv.Use(extension.Introspection{}) srv.Use(extension.Introspection{})
srv.Use(extension.AutomaticPersistedQuery{ srv.Use(extension.AutomaticPersistedQuery{
Cache: lru.New(100), Cache: lru.New(100),

View File

@ -12,7 +12,7 @@ import (
) )
func (r *serverResolver) Version(ctx context.Context, obj *twmodel.Server) (*twmodel.Version, error) { func (r *serverResolver) Version(ctx context.Context, obj *twmodel.Server) (*twmodel.Version, error) {
loaders := middleware.DataLoadersFromContext(ctx) loaders := middleware.DataLoaderFromContext(ctx)
if loaders != nil { if loaders != nil {
lv, _ := loaders.VersionByCode.Load(obj.VersionCode.String()) lv, _ := loaders.VersionByCode.Load(obj.VersionCode.String())
return lv, nil return lv, nil

View File

@ -18,7 +18,7 @@ import (
httpdelivery "github.com/tribalwarshelp/api/graphql/delivery/http" httpdelivery "github.com/tribalwarshelp/api/graphql/delivery/http"
"github.com/tribalwarshelp/api/graphql/resolvers" "github.com/tribalwarshelp/api/graphql/resolvers"
"github.com/tribalwarshelp/api/graphql/dataloaders" "github.com/tribalwarshelp/api/graphql/dataloader"
dailyplayerstatsrepo "github.com/tribalwarshelp/api/dailyplayerstats/repository" dailyplayerstatsrepo "github.com/tribalwarshelp/api/dailyplayerstats/repository"
dailyplayerstatsucase "github.com/tribalwarshelp/api/dailyplayerstats/usecase" dailyplayerstatsucase "github.com/tribalwarshelp/api/dailyplayerstats/usecase"
@ -132,7 +132,7 @@ func main() {
middleware.DataLoadersToContextConfig{ middleware.DataLoadersToContextConfig{
ServerRepo: serverRepo, ServerRepo: serverRepo,
}, },
dataloaders.Config{ dataloader.Config{
PlayerRepo: playerRepo, PlayerRepo: playerRepo,
TribeRepo: tribeRepo, TribeRepo: tribeRepo,
VillageRepo: villageRepo, VillageRepo: villageRepo,

View File

@ -10,23 +10,23 @@ import (
"github.com/gin-gonic/gin" "github.com/gin-gonic/gin"
"github.com/tribalwarshelp/api/graphql/dataloaders" "github.com/tribalwarshelp/api/graphql/dataloader"
"github.com/tribalwarshelp/api/server" "github.com/tribalwarshelp/api/server"
) )
var serverDataLoadersContextKey ContextKey = "serverDataLoaders" var serverDataLoadersContextKey ContextKey = "serverDataLoaders"
var versionLoadersContextKey ContextKey = "versionLoaders" var versionDataLoadersContextKey ContextKey = "versionLoaders"
var dataloadersContextKey ContextKey = "dataloaders" var dataLoaderContextKey ContextKey = "dataloader"
type DataLoadersToContextConfig struct { type DataLoadersToContextConfig struct {
ServerRepo server.Repository ServerRepo server.Repository
} }
func DataLoadersToContext(dltcc DataLoadersToContextConfig, cfg dataloaders.Config) gin.HandlerFunc { func DataLoadersToContext(dltcc DataLoadersToContextConfig, cfg dataloader.Config) gin.HandlerFunc {
return func(c *gin.Context) { return func(c *gin.Context) {
ctx := c.Request.Context() ctx := c.Request.Context()
serverDataLoaders := make(map[string]*dataloaders.ServerDataLoaders) serverDataLoaders := make(map[string]*dataloader.ServerDataLoader)
versionDataLoaders := make(map[twmodel.VersionCode]*dataloaders.VersionDataLoaders) versionDataLoaders := make(map[twmodel.VersionCode]*dataloader.VersionDataLoader)
servers, _, err := dltcc.ServerRepo.Fetch(c.Request.Context(), server.FetchConfig{ servers, _, err := dltcc.ServerRepo.Fetch(c.Request.Context(), server.FetchConfig{
Columns: []string{strutil.Underscore("versionCode"), "key"}, Columns: []string{strutil.Underscore("versionCode"), "key"},
Select: true, Select: true,
@ -39,54 +39,54 @@ func DataLoadersToContext(dltcc DataLoadersToContextConfig, cfg dataloaders.Conf
return return
} }
for _, serv := range servers { for _, serv := range servers {
serverDataLoaders[serv.Key] = dataloaders.NewServerDataLoaders(serv.Key, cfg) serverDataLoaders[serv.Key] = dataloader.NewServerDataLoader(serv.Key, cfg)
if _, ok := versionDataLoaders[serv.VersionCode]; !ok { if _, ok := versionDataLoaders[serv.VersionCode]; !ok {
versionDataLoaders[serv.VersionCode] = dataloaders.NewVersionDataLoaders(serv.VersionCode, cfg) versionDataLoaders[serv.VersionCode] = dataloader.NewVersionDataLoader(serv.VersionCode, cfg)
} }
} }
ctx = StoreServerDataLoadersInContext(ctx, serverDataLoaders) ctx = StoreServerDataLoadersInContext(ctx, serverDataLoaders)
ctx = StoreVersionDataLoadersInContext(ctx, versionDataLoaders) ctx = StoreVersionDataLoadersInContext(ctx, versionDataLoaders)
ctx = StoreDataLoadersInContext(ctx, dataloaders.NewDataLoaders(cfg)) ctx = StoreDataLoaderInContext(ctx, dataloader.NewDataLoader(cfg))
c.Request = c.Request.WithContext(ctx) c.Request = c.Request.WithContext(ctx)
c.Next() c.Next()
} }
} }
func StoreServerDataLoadersInContext(ctx context.Context, loaders map[string]*dataloaders.ServerDataLoaders) context.Context { func StoreServerDataLoadersInContext(ctx context.Context, loaders map[string]*dataloader.ServerDataLoader) context.Context {
return context.WithValue(ctx, serverDataLoadersContextKey, loaders) return context.WithValue(ctx, serverDataLoadersContextKey, loaders)
} }
func ServerDataLoadersFromContext(ctx context.Context) map[string]*dataloaders.ServerDataLoaders { func ServerDataLoadersFromContext(ctx context.Context) map[string]*dataloader.ServerDataLoader {
dl := ctx.Value(serverDataLoadersContextKey) dl := ctx.Value(serverDataLoadersContextKey)
if dl == nil { if dl == nil {
return nil return nil
} }
return dl.(map[string]*dataloaders.ServerDataLoaders) return dl.(map[string]*dataloader.ServerDataLoader)
} }
func StoreVersionDataLoadersInContext(ctx context.Context, loaders map[twmodel.VersionCode]*dataloaders.VersionDataLoaders) context.Context { func StoreVersionDataLoadersInContext(ctx context.Context, loaders map[twmodel.VersionCode]*dataloader.VersionDataLoader) context.Context {
return context.WithValue(ctx, versionLoadersContextKey, loaders) return context.WithValue(ctx, versionDataLoadersContextKey, loaders)
} }
func VersionDataLoadersFromContext(ctx context.Context) map[twmodel.VersionCode]*dataloaders.VersionDataLoaders { func VersionDataLoadersFromContext(ctx context.Context) map[twmodel.VersionCode]*dataloader.VersionDataLoader {
dl := ctx.Value(versionLoadersContextKey) dl := ctx.Value(versionDataLoadersContextKey)
if dl == nil { if dl == nil {
return nil return nil
} }
return dl.(map[twmodel.VersionCode]*dataloaders.VersionDataLoaders) return dl.(map[twmodel.VersionCode]*dataloader.VersionDataLoader)
} }
func StoreDataLoadersInContext(ctx context.Context, loaders *dataloaders.DataLoaders) context.Context { func StoreDataLoaderInContext(ctx context.Context, loaders *dataloader.DataLoader) context.Context {
return context.WithValue(ctx, dataloadersContextKey, loaders) return context.WithValue(ctx, dataLoaderContextKey, loaders)
} }
func DataLoadersFromContext(ctx context.Context) *dataloaders.DataLoaders { func DataLoaderFromContext(ctx context.Context) *dataloader.DataLoader {
dl := ctx.Value(dataloadersContextKey) dl := ctx.Value(dataLoaderContextKey)
if dl == nil { if dl == nil {
return nil return nil
} }
return dl.(*dataloaders.DataLoaders) return dl.(*dataloader.DataLoader)
} }