From 102ae553bec88f59fc616a2463ac42272767e3de Mon Sep 17 00:00:00 2001 From: Kichiyaki Date: Wed, 5 May 2021 13:14:50 +0200 Subject: [PATCH] refactor appending filters --- tw/twmodel/daily_player_stats.go | 24 +++++++-- tw/twmodel/daily_tribe_stats.go | 24 +++++++-- tw/twmodel/ennoblement.go | 86 +++++++++++++++++--------------- tw/twmodel/helpers.go | 37 ++++++++++++++ tw/twmodel/player.go | 33 ++++++++---- tw/twmodel/player_history.go | 25 ++++++++-- tw/twmodel/tribe_change.go | 52 ++++++++++++------- tw/twmodel/tribe_history.go | 21 ++++++++ tw/twmodel/village.go | 43 +++++++++++----- 9 files changed, 252 insertions(+), 93 deletions(-) diff --git a/tw/twmodel/daily_player_stats.go b/tw/twmodel/daily_player_stats.go index 6d78943..44330f0 100644 --- a/tw/twmodel/daily_player_stats.go +++ b/tw/twmodel/daily_player_stats.go @@ -61,9 +61,6 @@ func (f *DailyPlayerStatsFilter) WhereWithAlias(q *orm.Query, alias string) (*or if !isZero(f.PlayerIDNEQ) { q = q.Where(gopgutil.BuildConditionNotInArray("?"), gopgutil.AddAliasToColumnName("player_id", alias), pg.Array(f.PlayerIDNEQ)) } - if f.PlayerFilter != nil { - return f.PlayerFilter.WhereWithAlias(q.Relation("Player._"), "player", "Player.Tribe._", "player__tribe") - } return q, nil } @@ -71,3 +68,24 @@ func (f *DailyPlayerStatsFilter) WhereWithAlias(q *orm.Query, alias string) (*or func (f *DailyPlayerStatsFilter) Where(q *orm.Query) (*orm.Query, error) { return f.WhereWithAlias(q, "daily_player_stats") } + +func (f *DailyPlayerStatsFilter) WhereWithRelations(q *orm.Query) (*orm.Query, error) { + if f == nil { + return q, nil + } + + filtersToAppend := []filterToAppend{ + { + filter: f, + alias: "daily_player_stats", + }, + } + if f.PlayerFilter != nil { + filtersToAppend = append(filtersToAppend, filterToAppend{ + filter: f.PlayerFilter, + relationName: "Player", + }) + } + + return appendFilters(q, filtersToAppend...) +} diff --git a/tw/twmodel/daily_tribe_stats.go b/tw/twmodel/daily_tribe_stats.go index be348c6..9726b5c 100644 --- a/tw/twmodel/daily_tribe_stats.go +++ b/tw/twmodel/daily_tribe_stats.go @@ -64,9 +64,6 @@ func (f *DailyTribeStatsFilter) WhereWithAlias(q *orm.Query, alias string) (*orm if !isZero(f.TribeIDNEQ) { q = q.Where(gopgutil.BuildConditionNotInArray("?"), gopgutil.AddAliasToColumnName("tribe_id", alias), pg.Array(f.TribeIDNEQ)) } - if f.TribeFilter != nil { - return f.TribeFilter.WhereWithAlias(q.Relation("Tribe._"), "tribe") - } return q, nil } @@ -74,3 +71,24 @@ func (f *DailyTribeStatsFilter) WhereWithAlias(q *orm.Query, alias string) (*orm func (f *DailyTribeStatsFilter) Where(q *orm.Query) (*orm.Query, error) { return f.WhereWithAlias(q, "daily_tribe_stats") } + +func (f *DailyTribeStatsFilter) WhereWithRelations(q *orm.Query) (*orm.Query, error) { + if f == nil { + return q, nil + } + + filtersToAppend := []filterToAppend{ + { + filter: f, + alias: "daily_tribe_stats", + }, + } + if f.TribeFilter != nil { + filtersToAppend = append(filtersToAppend, filterToAppend{ + filter: f.TribeFilter, + relationName: "Tribe", + }) + } + + return appendFilters(q, filtersToAppend...) +} diff --git a/tw/twmodel/ennoblement.go b/tw/twmodel/ennoblement.go index 15c46f6..a883c0f 100644 --- a/tw/twmodel/ennoblement.go +++ b/tw/twmodel/ennoblement.go @@ -139,50 +139,54 @@ func (f *EnnoblementFilter) WhereWithAlias(q *orm.Query, alias string) (*orm.Que q = f.Or.WhereWithAlias(q, alias) } - var err error - if f.NewOwnerFilter != nil { - q, err = f.NewOwnerFilter.WhereWithAlias(q.Relation("NewOwner._"), "new_owner", "NewOwner.Tribe._", "new_owner__tribe") - if err != nil { - return q, err - } - } - if f.NewOwnerTribeFilter != nil { - q, err = f.NewOwnerTribeFilter.WhereWithAlias(q.Relation("NewOwnerTribe._"), "new_owner_tribe") - if err != nil { - return q, err - } - } - if f.OldOwnerFilter != nil { - q, err = f.OldOwnerFilter.WhereWithAlias(q.Relation("OldOwner._"), "old_owner", "OldOwner.Tribe._", "old_owner__tribe") - if err != nil { - return q, err - } - } - if f.OldOwnerTribeFilter != nil { - q, err = f.OldOwnerTribeFilter.WhereWithAlias(q.Relation("OldOwnerTribe._"), "old_owner_tribe") - if err != nil { - return q, err - } - } - if f.VillageFilter != nil { - q, err = f. - VillageFilter. - WhereWithAlias( - q.Relation("Village._"), - "village", - "Village.Player._", - "village__player", - "Village.Player.Tribe._", - "village__player__tribe", - ) - if err != nil { - return q, err - } - } - return q, nil } func (f *EnnoblementFilter) Where(q *orm.Query) (*orm.Query, error) { return f.WhereWithAlias(q, "ennoblement") } + +func (f *EnnoblementFilter) WhereWithRelations(q *orm.Query) (*orm.Query, error) { + if f == nil { + return q, nil + } + + filtersToAppend := []filterToAppend{ + { + filter: f, + alias: "ennoblement", + }, + } + if f.VillageFilter != nil { + filtersToAppend = append(filtersToAppend, filterToAppend{ + filter: f.VillageFilter, + relationName: "Village", + }) + } + if f.OldOwnerFilter != nil { + filtersToAppend = append(filtersToAppend, filterToAppend{ + filter: f.OldOwnerFilter, + relationName: "OldOwner", + }) + } + if f.OldOwnerTribeFilter != nil { + filtersToAppend = append(filtersToAppend, filterToAppend{ + filter: f.OldOwnerTribeFilter, + relationName: "OldOwnerTribe", + }) + } + if f.NewOwnerFilter != nil { + filtersToAppend = append(filtersToAppend, filterToAppend{ + filter: f.NewOwnerFilter, + relationName: "NewOwner", + }) + } + if f.NewOwnerTribeFilter != nil { + filtersToAppend = append(filtersToAppend, filterToAppend{ + filter: f.NewOwnerTribeFilter, + relationName: "newOwnerTribe", + }) + } + + return appendFilters(q, filtersToAppend...) +} diff --git a/tw/twmodel/helpers.go b/tw/twmodel/helpers.go index 087be55..ac8bcdc 100644 --- a/tw/twmodel/helpers.go +++ b/tw/twmodel/helpers.go @@ -1,9 +1,46 @@ package twmodel import ( + "github.com/Kichiyaki/gopgutil/v10" + "github.com/go-pg/pg/v10/orm" + "github.com/pkg/errors" "reflect" ) func isZero(v interface{}) bool { return reflect.ValueOf(v).IsZero() } + +type filter interface { + WhereWithAlias(q *orm.Query, alias string) (*orm.Query, error) +} + +type filterToAppend struct { + filter filter + alias string + relationName string +} + +func appendFilters(q *orm.Query, filtersToAppend ...filterToAppend) (*orm.Query, error) { + tableModel := q.TableModel() + var err error + for _, f := range filtersToAppend { + if f.relationName != "" && tableModel != nil { + alias, err := gopgutil.BuildAliasFromRelationName(tableModel, f.relationName) + if err != nil { + return q, errors.Wrapf(err, "Couldn't build alias from relation name '%s'", f.relationName) + } + q, err = f.filter.WhereWithAlias(q.Relation(f.relationName+"._"), alias) + if err != nil { + return q, errors.Wrapf(err, "Couldn't append filter for the relation '%s'", f.relationName) + } + continue + } + q, err = f.filter.WhereWithAlias(q, f.alias) + if err != nil { + return q, err + } + } + + return q, nil +} diff --git a/tw/twmodel/player.go b/tw/twmodel/player.go index cd88fd8..7d433f0 100644 --- a/tw/twmodel/player.go +++ b/tw/twmodel/player.go @@ -93,7 +93,7 @@ type PlayerFilter struct { OpponentsDefeatedFilter } -func (f *PlayerFilter) WhereWithAlias(q *orm.Query, alias, tribeRelationName, tribeAlias string) (*orm.Query, error) { +func (f *PlayerFilter) WhereWithAlias(q *orm.Query, alias string) (*orm.Query, error) { if f == nil { return q, nil } @@ -241,19 +241,32 @@ func (f *PlayerFilter) WhereWithAlias(q *orm.Query, alias, tribeRelationName, tr q = q.Where(gopgutil.BuildConditionNotInArray("?"), gopgutil.AddAliasToColumnName("tribe_id", alias), pg.Array(f.TribeIDNEQ)) } - var err error - if f.TribeFilter != nil && tribeRelationName != "" { - q, err = f.TribeFilter.WhereWithAlias(q.Relation(tribeRelationName), tribeAlias) - if err != nil { - return nil, err - } - } - return f.OpponentsDefeatedFilter.WhereWithAlias(q, alias) } func (f *PlayerFilter) Where(q *orm.Query) (*orm.Query, error) { - return f.WhereWithAlias(q, "player", "Tribe._", "tribe") + return f.WhereWithAlias(q, "player") +} + +func (f *PlayerFilter) WhereWithRelations(q *orm.Query) (*orm.Query, error) { + if f == nil { + return q, nil + } + + filtersToAppend := []filterToAppend{ + { + filter: f, + alias: "player", + }, + } + if f.TribeFilter != nil { + filtersToAppend = append(filtersToAppend, filterToAppend{ + filter: f.TribeFilter, + relationName: "Tribe", + }) + } + + return appendFilters(q, filtersToAppend...) } type FoundPlayer struct { diff --git a/tw/twmodel/player_history.go b/tw/twmodel/player_history.go index 6dc4d8a..fb91c8c 100644 --- a/tw/twmodel/player_history.go +++ b/tw/twmodel/player_history.go @@ -64,13 +64,30 @@ func (f *PlayerHistoryFilter) WhereWithAlias(q *orm.Query, alias string) (*orm.Q q = q.Where(gopgutil.BuildConditionNotInArray("?"), gopgutil.AddAliasToColumnName("player_id", alias), pg.Array(f.PlayerIDNEQ)) } - if f.PlayerFilter != nil { - return f.PlayerFilter.WhereWithAlias(q.Relation("Player._"), "player", "Player.Tribe._", "player__tribe") - } - return q, nil } func (f *PlayerHistoryFilter) Where(q *orm.Query) (*orm.Query, error) { return f.WhereWithAlias(q, "player_history") } + +func (f *PlayerHistoryFilter) WhereWithRelations(q *orm.Query) (*orm.Query, error) { + if f == nil { + return q, nil + } + + filtersToAppend := []filterToAppend{ + { + filter: f, + alias: "player_history", + }, + } + if f.PlayerFilter != nil { + filtersToAppend = append(filtersToAppend, filterToAppend{ + filter: f.PlayerFilter, + relationName: "Player", + }) + } + + return appendFilters(q, filtersToAppend...) +} diff --git a/tw/twmodel/tribe_change.go b/tw/twmodel/tribe_change.go index b67eca8..44ef843 100644 --- a/tw/twmodel/tribe_change.go +++ b/tw/twmodel/tribe_change.go @@ -68,19 +68,12 @@ func (f *TribeChangeFilter) WhereWithAlias(q *orm.Query, alias string) (*orm.Que return q, nil } - var err error if !isZero(f.PlayerID) { q = q.Where(gopgutil.BuildConditionArray("?"), gopgutil.AddAliasToColumnName("player_id", alias), pg.Array(f.PlayerID)) } if !isZero(f.PlayerIDNEQ) { q = q.Where(gopgutil.BuildConditionNotInArray("?"), gopgutil.AddAliasToColumnName("player_id", alias), pg.Array(f.PlayerIDNEQ)) } - if f.PlayerFilter != nil { - q, err = f.PlayerFilter.WhereWithAlias(q.Relation("Player._"), "player", "Player.Tribe._", "player__tribe") - if err != nil { - return nil, err - } - } if !isZero(f.OldTribeID) { q = q.Where(gopgutil.BuildConditionArray("?"), gopgutil.AddAliasToColumnName("old_tribe_id", alias), pg.Array(f.OldTribeID)) @@ -88,12 +81,6 @@ func (f *TribeChangeFilter) WhereWithAlias(q *orm.Query, alias string) (*orm.Que if !isZero(f.OldTribeIDNEQ) { q = q.Where(gopgutil.BuildConditionNotInArray("?"), gopgutil.AddAliasToColumnName("old_tribe_id", alias), pg.Array(f.OldTribeIDNEQ)) } - if f.OldTribeFilter != nil { - q, err = f.OldTribeFilter.WhereWithAlias(q.Relation("OldTribe._"), "old_tribe") - if err != nil { - return nil, err - } - } if !isZero(f.NewTribeID) { q = q.Where(gopgutil.BuildConditionArray("?"), gopgutil.AddAliasToColumnName("new_tribe_id", alias), pg.Array(f.NewTribeID)) @@ -101,12 +88,6 @@ func (f *TribeChangeFilter) WhereWithAlias(q *orm.Query, alias string) (*orm.Que if !isZero(f.NewTribeIDNEQ) { q = q.Where(gopgutil.BuildConditionNotInArray("?"), gopgutil.AddAliasToColumnName("new_tribe_id", alias), pg.Array(f.NewTribeIDNEQ)) } - if f.NewTribeFilter != nil { - q, err = f.NewTribeFilter.WhereWithAlias(q.Relation("NewTribe._"), "new_tribe") - if err != nil { - return nil, err - } - } if !isZero(f.CreatedAt) { q = q.Where(gopgutil.BuildConditionEquals("?"), gopgutil.AddAliasToColumnName("created_at", alias), f.CreatedAt) @@ -134,3 +115,36 @@ func (f *TribeChangeFilter) WhereWithAlias(q *orm.Query, alias string) (*orm.Que func (f *TribeChangeFilter) Where(q *orm.Query) (*orm.Query, error) { return f.WhereWithAlias(q, "tribe_change") } + +func (f *TribeChangeFilter) WhereWithRelations(q *orm.Query) (*orm.Query, error) { + if f == nil { + return q, nil + } + + filtersToAppend := []filterToAppend{ + { + filter: f, + alias: "tribe_change", + }, + } + if f.PlayerFilter != nil { + filtersToAppend = append(filtersToAppend, filterToAppend{ + filter: f.PlayerFilter, + relationName: "Player", + }) + } + if f.OldTribeFilter != nil { + filtersToAppend = append(filtersToAppend, filterToAppend{ + filter: f.OldTribeFilter, + relationName: "OldTribe", + }) + } + if f.NewTribeFilter != nil { + filtersToAppend = append(filtersToAppend, filterToAppend{ + filter: f.NewTribeFilter, + relationName: "NewTribe", + }) + } + + return appendFilters(q, filtersToAppend...) +} diff --git a/tw/twmodel/tribe_history.go b/tw/twmodel/tribe_history.go index 295aad3..086a7de 100644 --- a/tw/twmodel/tribe_history.go +++ b/tw/twmodel/tribe_history.go @@ -74,3 +74,24 @@ func (f *TribeHistoryFilter) WhereWithAlias(q *orm.Query, alias string) (*orm.Qu func (f *TribeHistoryFilter) Where(q *orm.Query) (*orm.Query, error) { return f.WhereWithAlias(q, "tribe_history") } + +func (f *TribeHistoryFilter) WhereWithRelations(q *orm.Query) (*orm.Query, error) { + if f == nil { + return q, nil + } + + filtersToAppend := []filterToAppend{ + { + filter: f, + alias: "tribe_history", + }, + } + if f.TribeFilter != nil { + filtersToAppend = append(filtersToAppend, filterToAppend{ + filter: f.TribeFilter, + relationName: "Tribe", + }) + } + + return appendFilters(q, filtersToAppend...) +} diff --git a/tw/twmodel/village.go b/tw/twmodel/village.go index da5e0d3..4cfadf9 100644 --- a/tw/twmodel/village.go +++ b/tw/twmodel/village.go @@ -73,7 +73,7 @@ type VillageFilter struct { PlayerFilter *PlayerFilter `json:"playerFilter" gqlgen:"playerFilter"` } -func (f *VillageFilter) WhereWithAlias(q *orm.Query, alias, playerRelationName, playerAlias, tribeRelationName, tribeAlias string) (*orm.Query, error) { +func (f *VillageFilter) WhereWithAlias(q *orm.Query, alias string) (*orm.Query, error) { if f == nil { return q, nil } @@ -181,20 +181,37 @@ func (f *VillageFilter) WhereWithAlias(q *orm.Query, alias, playerRelationName, q = q.Where(gopgutil.BuildConditionNotInArray("?"), gopgutil.AddAliasToColumnName("player_id", alias), pg.Array(f.PlayerIDNEQ)) } - if f.PlayerFilter != nil && playerRelationName != "" && tribeRelationName != "" { - return f.PlayerFilter.WhereWithAlias(q.Relation(playerRelationName), playerAlias, tribeRelationName, tribeAlias) - } - return q, nil } func (f *VillageFilter) Where(q *orm.Query) (*orm.Query, error) { - return f.WhereWithAlias( - q, - "village", - "Player._", - "player", - "Player.Tribe._", - "player__tribe", - ) + return f.WhereWithAlias(q, "village") +} + +func (f *VillageFilter) WhereWithRelations(q *orm.Query) (*orm.Query, error) { + if f == nil { + return q, nil + } + + filtersToAppend := []filterToAppend{ + { + filter: f, + alias: "village", + }, + } + if f.PlayerFilter != nil { + filtersToAppend = append(filtersToAppend, filterToAppend{ + filter: f.PlayerFilter, + relationName: "Player", + }) + + if f.PlayerFilter.TribeFilter != nil { + filtersToAppend = append(filtersToAppend, filterToAppend{ + filter: f.PlayerFilter.TribeFilter, + relationName: "Player.Tribe", + }) + } + } + + return appendFilters(q, filtersToAppend...) }