refactor appending filters

This commit is contained in:
Dawid Wysokiński 2021-05-05 13:14:50 +02:00
parent dbe43f2ad7
commit 102ae553be
9 changed files with 252 additions and 93 deletions

View File

@ -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...)
}

View File

@ -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...)
}

View File

@ -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...)
}

View File

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

View File

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

View File

@ -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...)
}

View File

@ -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...)
}

View File

@ -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...)
}

View File

@ -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...)
}