diff --git a/go.mod b/go.mod index f3a2fd9..898f16d 100644 --- a/go.mod +++ b/go.mod @@ -4,6 +4,7 @@ go 1.16 require ( github.com/Kichiyaki/go-php-serialize v0.0.0-20200601110855-47b6982acf83 + github.com/Kichiyaki/gopgutil/v10 v10.0.0-20210502103432-20b73c1e09b3 // indirect github.com/go-pg/pg/v10 v10.9.1 github.com/pkg/errors v0.9.1 github.com/vmihailenco/msgpack/v5 v5.3.1 // indirect diff --git a/go.sum b/go.sum index 8b13268..8b5b827 100644 --- a/go.sum +++ b/go.sum @@ -2,6 +2,10 @@ cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMT github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/Kichiyaki/go-php-serialize v0.0.0-20200601110855-47b6982acf83 h1:Oa8Bk4LNcknxw50gZOlvPwEreOlAbOnu7V82lUYNbOM= github.com/Kichiyaki/go-php-serialize v0.0.0-20200601110855-47b6982acf83/go.mod h1:+iGkf5HfOVeRVd9K7qQDucIl+/Kt3MyenMa90b/O/c4= +github.com/Kichiyaki/gopgutil/v10 v10.0.0-20210502103432-20b73c1e09b3 h1:kF01z5HAcpmn8PeGysegVKWblqV/t+boiZFi+6TIFVM= +github.com/Kichiyaki/gopgutil/v10 v10.0.0-20210502103432-20b73c1e09b3/go.mod h1:Ol4iqPU50Ena5DFDOJvGnr17/gVbnhqSW/TuI0mWyo4= +github.com/Kichiyaki/goutil v0.0.0-20210502095630-318d17091eab h1:XFHuFbQQPKkSYw/Z+nQ0ZeOz/Bx3PFWRk0lWtJc7yx8= +github.com/Kichiyaki/goutil v0.0.0-20210502095630-318d17091eab/go.mod h1:+HhI932Xb0xrCodNcCv5GPiCjLYhDxWhCtlEqMIJhB4= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= diff --git a/models/helpers.go b/models/helpers.go deleted file mode 100644 index 9d69b65..0000000 --- a/models/helpers.go +++ /dev/null @@ -1,103 +0,0 @@ -package models - -import ( - "strings" - "time" -) - -func addAliasToColumnName(column, prefix string) string { - if prefix != "" && !strings.HasPrefix(column, prefix+".") { - column = wrapStringInDoubleQuotes(prefix) + "." + wrapStringInDoubleQuotes(column) - } else { - column = wrapStringInDoubleQuotes(column) - } - return column -} - -func wrapStringInDoubleQuotes(str string) string { - return `"` + str + `"` -} - -func buildConditionEquals(column string) string { - return column + " = ?" -} - -func buildConditionLT(column string) string { - return column + " < ?" -} - -func buildConditionLTE(column string) string { - return column + " <= ?" -} - -func buildConditionGT(column string) string { - return column + " > ?" -} - -func buildConditionGTE(column string) string { - return column + " >= ?" -} - -func buildConditionMatch(column string) string { - return column + " LIKE ?" -} - -func buildConditionIEQ(column string) string { - return column + " ILIKE ?" -} - -func buildConditionArray(column string) string { - return column + " = ANY(?)" -} - -func buildConditionNotInArray(column string) string { - return "NOT (" + buildConditionArray(column) + ")" -} - -func isZero(v interface{}) bool { - switch c := v.(type) { - case string: - return c == "" - case *string: - return c == nil - case []string: - return c == nil || len(c) == 0 - case []VersionCode: - return c == nil || len(c) == 0 - case []ServerStatus: - return c == nil || len(c) == 0 - case int: - return c == 0 - case *int: - return c == nil - case []int: - return c == nil || len(c) == 0 - case float64: - return c == 0 - case *float64: - return c == nil - case float32: - return c == 0 - case *float32: - return c == nil - case bool: - return !c - case *bool: - return c == nil - case time.Time: - return c.IsZero() - case *time.Time: - return c == nil - default: - return false - } -} - -func findStringWithPrefix(sl []string, prefix string) string { - for _, s := range sl { - if strings.HasPrefix(s, prefix) { - return s - } - } - return "" -} diff --git a/models/opponents_defeated.go b/models/opponents_defeated.go deleted file mode 100644 index 046f09d..0000000 --- a/models/opponents_defeated.go +++ /dev/null @@ -1,188 +0,0 @@ -package models - -import "github.com/go-pg/pg/v10/orm" - -type OpponentsDefeated struct { - RankAtt int `json:"rankAtt" pg:",use_zero" gqlgen:"rankAtt"` - ScoreAtt int `pg:",use_zero" json:"scoreAtt" gqlgen:"scoreAtt"` - RankDef int `pg:",use_zero" json:"rankDef" gqlgen:"rankDef"` - ScoreDef int `pg:",use_zero" json:"scoreDef" gqlgen:"scoreDef"` - RankSup int `pg:",use_zero" json:"rankSup,omitempty" gqlgen:"rankSup"` - ScoreSup int `pg:",use_zero" json:"scoreSup,omitempty" gqlgen:"scoreSup"` - RankTotal int `pg:",use_zero" json:"rankTotal" gqlgen:"rankTotal"` - ScoreTotal int `pg:",use_zero" json:"scoreTotal" gqlgen:"scoreTotal"` -} - -type OpponentsDefeatedFilter struct { - RankAtt int `json:"rankAtt" gqlgen:"rankAtt"` - RankAttGT int `json:"rankAttGT" gqlgen:"rankAttGT"` - RankAttGTE int `json:"rankAttGTE" gqlgen:"rankAttGTE"` - RankAttLT int `json:"rankAttLT" gqlgen:"rankAttLT"` - RankAttLTE int `json:"rankAttLTE" gqlgen:"rankAttLTE"` - ScoreAtt int `json:"scoreAtt" gqlgen:"scoreAtt"` - ScoreAttGT int `json:"scoreAttGT" gqlgen:"scoreAttGT"` - ScoreAttGTE int `json:"scoreAttGTE" gqlgen:"scoreAttGTE"` - ScoreAttLT int `json:"scoreAttLT" gqlgen:"scoreAttLT"` - ScoreAttLTE int `json:"scoreAttLTE" gqlgen:"scoreAttLTE"` - - RankDef int `json:"rankDef" gqlgen:"rankDef"` - RankDefGT int `json:"rankDefGT" gqlgen:"rankDefGT"` - RankDefGTE int `json:"rankDefGTE" gqlgen:"rankDefGTE"` - RankDefLT int `json:"rankDefLT" gqlgen:"rankDefLT"` - RankDefLTE int `json:"rankDefLTE" gqlgen:"rankDefLTE"` - ScoreDef int `json:"scoreDef" gqlgen:"scoreDef"` - ScoreDefGT int `json:"scoreDefGT" gqlgen:"scoreDefGT"` - ScoreDefGTE int `json:"scoreDefGTE" gqlgen:"scoreDefGTE"` - ScoreDefLT int `json:"scoreDefLT" gqlgen:"scoreDefLT"` - ScoreDefLTE int `json:"scoreDefLTE" gqlgen:"scoreDefLTE"` - - RankSup int `json:"rankSup,omitempty" gqlgen:"rankSup"` - RankSupGT int `json:"rankSupGT,omitempty" gqlgen:"rankSupGT"` - RankSupGTE int `json:"rankSupGTE,omitempty" gqlgen:"rankSupGTE"` - RankSupLT int `json:"rankSupLT,omitempty" gqlgen:"rankSupLT"` - RankSupLTE int `json:"rankSupLTE,omitempty" gqlgen:"rankSupLTE"` - ScoreSup int `json:"scoreSup,omitempty" gqlgen:"scoreSup"` - ScoreSupGT int `json:"scoreSupGT,omitempty" gqlgen:"scoreSupGT"` - ScoreSupGTE int `json:"scoreSupGTE,omitempty" gqlgen:"scoreSupGTE"` - ScoreSupLT int `json:"scoreSupLT,omitempty" gqlgen:"scoreSupLT"` - ScoreSupLTE int `json:"scoreSupLTE,omitempty" gqlgen:"scoreSupLTE"` - - RankTotal int `json:"rankTotal" gqlgen:"rankTotal"` - RankTotalGT int `json:"rankTotalGT" gqlgen:"rankTotalGT"` - RankTotalGTE int `json:"rankTotalGTE" gqlgen:"rankTotalGTE"` - RankTotalLT int `json:"rankTotalLT" gqlgen:"rankTotalLT"` - RankTotalLTE int `json:"rankTotalLTE" gqlgen:"rankTotalLTE"` - ScoreTotal int `json:"scoreTotal" gqlgen:"scoreTotal"` - ScoreTotalGT int `json:"scoreTotalGT" gqlgen:"scoreTotalGT"` - ScoreTotalGTE int `json:"scoreTotalGTE" gqlgen:"scoreTotalGTE"` - ScoreTotalLT int `json:"scoreTotalLT" gqlgen:"scoreTotalLT"` - ScoreTotalLTE int `json:"scoreTotalLTE" gqlgen:"scoreTotalLTE"` -} - -func (f *OpponentsDefeatedFilter) WhereWithAlias(q *orm.Query, alias string) (*orm.Query, error) { - if !isZero(f.RankAtt) { - q = q.Where(buildConditionEquals(addAliasToColumnName("rank_att", alias)), f.RankAtt) - } - if !isZero(f.RankAttGT) { - q = q.Where(buildConditionGT(addAliasToColumnName("rank_att", alias)), f.RankAttGT) - } - if !isZero(f.RankAttGTE) { - q = q.Where(buildConditionGTE(addAliasToColumnName("rank_att", alias)), f.RankAttGTE) - } - if !isZero(f.RankAttLT) { - q = q.Where(buildConditionLT(addAliasToColumnName("rank_att", alias)), f.RankAttLT) - } - if !isZero(f.RankAttLTE) { - q = q.Where(buildConditionLTE(addAliasToColumnName("rank_att", alias)), f.RankAttLTE) - } - if !isZero(f.ScoreAtt) { - q = q.Where(buildConditionEquals(addAliasToColumnName("score_att", alias)), f.ScoreAtt) - } - if !isZero(f.ScoreAttGT) { - q = q.Where(buildConditionGT(addAliasToColumnName("score_att", alias)), f.ScoreAttGT) - } - if !isZero(f.ScoreAttGTE) { - q = q.Where(buildConditionGTE(addAliasToColumnName("score_att", alias)), f.ScoreAttGTE) - } - if !isZero(f.ScoreAttLT) { - q = q.Where(buildConditionLT(addAliasToColumnName("score_att", alias)), f.ScoreAttLT) - } - if !isZero(f.ScoreAttLTE) { - q = q.Where(buildConditionLTE(addAliasToColumnName("score_att", alias)), f.ScoreAttLTE) - } - - if !isZero(f.RankDef) { - q = q.Where(buildConditionEquals(addAliasToColumnName("rank_def", alias)), f.RankDef) - } - if !isZero(f.RankDefGT) { - q = q.Where(buildConditionGT(addAliasToColumnName("rank_def", alias)), f.RankDefGT) - } - if !isZero(f.RankDefGTE) { - q = q.Where(buildConditionGTE(addAliasToColumnName("rank_def", alias)), f.RankDefGTE) - } - if !isZero(f.RankDefLT) { - q = q.Where(buildConditionLT(addAliasToColumnName("rank_def", alias)), f.RankDefLT) - } - if !isZero(f.RankDefLTE) { - q = q.Where(buildConditionLTE(addAliasToColumnName("rank_def", alias)), f.RankDefLTE) - } - if !isZero(f.ScoreDef) { - q = q.Where(buildConditionEquals(addAliasToColumnName("score_def", alias)), f.ScoreDef) - } - if !isZero(f.ScoreDefGT) { - q = q.Where(buildConditionGT(addAliasToColumnName("score_def", alias)), f.ScoreDefGT) - } - if !isZero(f.ScoreDefGTE) { - q = q.Where(buildConditionGTE(addAliasToColumnName("score_def", alias)), f.ScoreDefGTE) - } - if !isZero(f.ScoreDefLT) { - q = q.Where(buildConditionLT(addAliasToColumnName("score_def", alias)), f.ScoreDefLT) - } - if !isZero(f.ScoreDefLTE) { - q = q.Where(buildConditionLTE(addAliasToColumnName("score_def", alias)), f.ScoreDefLTE) - } - - if !isZero(f.RankSup) { - q = q.Where(buildConditionEquals(addAliasToColumnName("rank_sup", alias)), f.RankSup) - } - if !isZero(f.RankSupGT) { - q = q.Where(buildConditionGT(addAliasToColumnName("rank_sup", alias)), f.RankSupGT) - } - if !isZero(f.RankSupGTE) { - q = q.Where(buildConditionGTE(addAliasToColumnName("rank_sup", alias)), f.RankSupGTE) - } - if !isZero(f.RankSupLT) { - q = q.Where(buildConditionLT(addAliasToColumnName("rank_sup", alias)), f.RankSupLT) - } - if !isZero(f.RankSupLTE) { - q = q.Where(buildConditionLTE(addAliasToColumnName("rank_sup", alias)), f.RankSupLTE) - } - if !isZero(f.ScoreSup) { - q = q.Where(buildConditionEquals(addAliasToColumnName("score_sup", alias)), f.ScoreSup) - } - if !isZero(f.ScoreSupGT) { - q = q.Where(buildConditionGT(addAliasToColumnName("score_sup", alias)), f.ScoreSupGT) - } - if !isZero(f.ScoreSupGTE) { - q = q.Where(buildConditionGTE(addAliasToColumnName("score_sup", alias)), f.ScoreSupGTE) - } - if !isZero(f.ScoreSupLT) { - q = q.Where(buildConditionLT(addAliasToColumnName("score_sup", alias)), f.ScoreSupLT) - } - if !isZero(f.ScoreSupLTE) { - q = q.Where(buildConditionLTE(addAliasToColumnName("score_sup", alias)), f.ScoreSupLTE) - } - - if !isZero(f.RankTotal) { - q = q.Where(buildConditionEquals(addAliasToColumnName("rank_total", alias)), f.RankTotal) - } - if !isZero(f.RankTotalGT) { - q = q.Where(buildConditionGT(addAliasToColumnName("rank_total", alias)), f.RankTotalGT) - } - if !isZero(f.RankTotalGTE) { - q = q.Where(buildConditionGTE(addAliasToColumnName("rank_total", alias)), f.RankTotalGTE) - } - if !isZero(f.RankTotalLT) { - q = q.Where(buildConditionLT(addAliasToColumnName("rank_total", alias)), f.RankTotalLT) - } - if !isZero(f.RankTotalLTE) { - q = q.Where(buildConditionLTE(addAliasToColumnName("rank_total", alias)), f.RankTotalLTE) - } - if !isZero(f.ScoreTotal) { - q = q.Where(buildConditionEquals(addAliasToColumnName("score_total", alias)), f.ScoreTotal) - } - if !isZero(f.ScoreTotalGT) { - q = q.Where(buildConditionGT(addAliasToColumnName("score_total", alias)), f.ScoreTotalGT) - } - if !isZero(f.ScoreTotalGTE) { - q = q.Where(buildConditionGTE(addAliasToColumnName("score_total", alias)), f.ScoreTotalGTE) - } - if !isZero(f.ScoreTotalLT) { - q = q.Where(buildConditionLT(addAliasToColumnName("score_total", alias)), f.ScoreTotalLT) - } - if !isZero(f.ScoreTotalLTE) { - q = q.Where(buildConditionLTE(addAliasToColumnName("score_total", alias)), f.ScoreTotalLTE) - } - - return q, nil -} diff --git a/models/village.go b/models/village.go deleted file mode 100644 index a823fef..0000000 --- a/models/village.go +++ /dev/null @@ -1,232 +0,0 @@ -package models - -import ( - "fmt" - "strconv" - "strings" - - "github.com/go-pg/pg/v10" - "github.com/go-pg/pg/v10/orm" -) - -type Village struct { - tableName struct{} `pg:"?SERVER.villages,alias:village"` - - ID int `json:"id" pg:"type:bigint,pk" gqlgen:"id"` - Name string `json:"name" gqlgen:"name"` - Points int `json:"points" pg:",use_zero" gqlgen:"points"` - X int `json:"x" pg:",use_zero" gqlgen:"x"` - Y int `json:"y" pg:",use_zero" gqlgen:"y"` - Bonus int `json:"bonus" pg:",use_zero" gqlgen:"bonus"` - - PlayerID int `json:"-" pg:",use_zero" gqlgen:"playerID"` - Player *Player `json:"player,omitempty" gqlgen:"-" pg:"rel:has-one"` -} - -func (v *Village) Continent() string { - if v == nil { - return "" - } - return fmt.Sprintf("K%c%c", strconv.FormatInt(int64(v.Y), 10)[0], strconv.FormatInt(int64(v.X), 10)[0]) -} - -func (v *Village) FullName() string { - return fmt.Sprintf("%s (%d|%d) %s", - v.Name, - v.X, - v.Y, - v.Continent()) -} - -type VillageFilter struct { - ID []int `json:"id" gqlgen:"id"` - IDNEQ []int `json:"idNEQ" gqlgen:"idNEQ"` - - Name []string `json:"name" gqlgen:"name"` - NameNEQ []string `json:"nameNEQ" gqlgen:"nameNEQ"` - NameMATCH string `json:"nameMATCH" gqlgen:"nameMATCH"` - NameIEQ string `json:"nameIEQ" gqlgen:"nameIEQ"` - - XGT int `json:"xGT" gqlgen:"xGT"` - XGTE int `json:"xGTE" gqlgen:"xGTE"` - XLT int `json:"xLT" gqlgen:"xLT"` - XLTE int `json:"xLTE" gqlgen:"xLTE"` - YGT int `json:"yGT" gqlgen:"yGT"` - YGTE int `json:"yGTE" gqlgen:"yGTE"` - YLT int `json:"yLT" gqlgen:"yLT"` - YLTE int `json:"yLTE" gqlgen:"yLTE"` - XY []string `json:"xy" gqlgen:"xy"` - - Points int `json:"points" gqlgen:"points"` - PointsGT int `json:"pointsGT" gqlgen:"pointsGT"` - PointsGTE int `json:"pointsGTE" gqlgen:"pointsGTE"` - PointsLT int `json:"pointsLT" gqlgen:"pointsLT"` - PointsLTE int `json:"pointsLTE" gqlgen:"pointsLTE"` - - Bonus int `json:"bonus" gqlgen:"bonus"` - BonusGT int `json:"bonusGT" gqlgen:"bonusGT"` - BonusGTE int `json:"bonusGTE" gqlgen:"bonusGTE"` - BonusLT int `json:"bonusLT" gqlgen:"bonusLT"` - BonusLTE int `json:"bonusLTE" gqlgen:"bonusLTE"` - - PlayerID []int `json:"playerID" gqlgen:"playerID"` - PlayerIDNEQ []int `json:"playerIDNEQ" gqlgen:"playerIDNEQ"` - PlayerFilter *PlayerFilter `json:"playerFilter" gqlgen:"playerFilter"` -} - -func (f *VillageFilter) WhereWithAlias(q *orm.Query, alias string) (*orm.Query, error) { - if !isZero(f.ID) { - q = q.Where(buildConditionArray(addAliasToColumnName("id", alias)), pg.Array(f.ID)) - } - if !isZero(f.IDNEQ) { - q = q.Where(buildConditionNotInArray(addAliasToColumnName("id", alias)), pg.Array(f.IDNEQ)) - } - - if !isZero(f.Name) { - q = q.Where(buildConditionArray(addAliasToColumnName("name", alias)), pg.Array(f.Name)) - } - if !isZero(f.NameNEQ) { - q = q.Where(buildConditionNotInArray(addAliasToColumnName("name", alias)), pg.Array(f.NameNEQ)) - } - if !isZero(f.NameMATCH) { - q = q.Where(buildConditionMatch(addAliasToColumnName("name", alias)), f.NameMATCH) - } - if !isZero(f.NameIEQ) { - q = q.Where(buildConditionIEQ(addAliasToColumnName("name", alias)), f.NameIEQ) - } - - if !isZero(f.XGT) { - q = q.Where(buildConditionGT(addAliasToColumnName("x", alias)), f.XGT) - } - if !isZero(f.XGTE) { - q = q.Where(buildConditionGTE(addAliasToColumnName("x", alias)), f.XGTE) - } - if !isZero(f.XLT) { - q = q.Where(buildConditionLT(addAliasToColumnName("x", alias)), f.XLT) - } - if !isZero(f.XLTE) { - q = q.Where(buildConditionLTE(addAliasToColumnName("x", alias)), f.XLTE) - } - - if !isZero(f.YGT) { - q = q.Where(buildConditionGT(addAliasToColumnName("y", alias)), f.YGT) - } - if !isZero(f.YGTE) { - q = q.Where(buildConditionGTE(addAliasToColumnName("y", alias)), f.YGTE) - } - if !isZero(f.YLT) { - q = q.Where(buildConditionLT(addAliasToColumnName("y", alias)), f.YLT) - } - if !isZero(f.YLTE) { - q = q.Where(buildConditionLTE(addAliasToColumnName("y", alias)), f.YLTE) - } - - if !isZero(f.XY) { - q = q.WhereGroup(func(q *orm.Query) (*orm.Query, error) { - for _, xy := range f.XY { - splitted := strings.Split(xy, "|") - if len(splitted) != 2 { - continue - } - x, err := strconv.Atoi(splitted[0]) - if err != nil { - continue - } - y, err := strconv.Atoi(splitted[1]) - if err != nil { - continue - } - q = q.WhereOrGroup(func(q *orm.Query) (*orm.Query, error) { - q = q.Where("x = ?", x) - q = q.Where("y = ?", y) - return q, nil - }) - } - return q, nil - }) - } - - if !isZero(f.Points) { - q = q.Where(buildConditionEquals(addAliasToColumnName("points", alias)), f.Points) - } - if !isZero(f.PointsGT) { - q = q.Where(buildConditionGT(addAliasToColumnName("points", alias)), f.PointsGT) - } - if !isZero(f.PointsGTE) { - q = q.Where(buildConditionGTE(addAliasToColumnName("points", alias)), f.PointsGTE) - } - if !isZero(f.PointsLT) { - q = q.Where(buildConditionLT(addAliasToColumnName("points", alias)), f.PointsLT) - } - if !isZero(f.PointsLTE) { - q = q.Where(buildConditionLTE(addAliasToColumnName("points", alias)), f.PointsLTE) - } - - if !isZero(f.Bonus) { - q = q.Where(buildConditionEquals(addAliasToColumnName("bonus", alias)), f.Bonus) - } - if !isZero(f.BonusGT) { - q = q.Where(buildConditionGT(addAliasToColumnName("bonus", alias)), f.BonusGT) - } - if !isZero(f.BonusGTE) { - q = q.Where(buildConditionGTE(addAliasToColumnName("bonus", alias)), f.BonusGTE) - } - if !isZero(f.BonusLT) { - q = q.Where(buildConditionLT(addAliasToColumnName("bonus", alias)), f.BonusLT) - } - if !isZero(f.BonusLTE) { - q = q.Where(buildConditionLTE(addAliasToColumnName("bonus", alias)), f.BonusLTE) - } - - if !isZero(f.PlayerID) { - q = q.Where(buildConditionArray(addAliasToColumnName("player_id", alias)), pg.Array(f.PlayerID)) - } - if !isZero(f.PlayerIDNEQ) { - q = q.Where(buildConditionNotInArray(addAliasToColumnName("player_id", alias)), pg.Array(f.PlayerIDNEQ)) - } - - return q, nil -} - -func (f *VillageFilter) Where(q *orm.Query) (*orm.Query, error) { - return f.WhereWithAlias(q, "village") -} - -type VillageRelationshipAndSortAppender struct { - Filter *VillageFilter - Sort []string -} - -func (a *VillageRelationshipAndSortAppender) Append(q *orm.Query) (*orm.Query, error) { - var err error - playerRequired := findStringWithPrefix(a.Sort, "player.") != "" - playerTribeRequired := findStringWithPrefix(a.Sort, "player.tribe.") != "" - if a.Filter.PlayerFilter != nil { - q, err = a.Filter.PlayerFilter.WhereWithAlias(q, "player") - if err != nil { - return q, err - } - playerRequired = true - if a.Filter.PlayerFilter.TribeFilter != nil { - q, err = a.Filter.PlayerFilter.WhereWithAlias(q, "tribe") - if err != nil { - return q, err - } - playerTribeRequired = true - } - } - - if !isZero(a.Sort) { - q = q.Order(a.Sort...) - } - - if playerRequired { - q = q.Relation("Player._") - } - - if playerTribeRequired { - q = q.Join("LEFT JOIN ?SERVER.tribes AS tribe ON tribe.id = player.tribe_id") - } - - return q, nil -} diff --git a/tw/dataloader/config.go b/tw/twdataloader/config.go similarity index 91% rename from tw/dataloader/config.go rename to tw/twdataloader/config.go index 1f5410e..502eb1e 100644 --- a/tw/dataloader/config.go +++ b/tw/twdataloader/config.go @@ -1,4 +1,4 @@ -package dataloader +package twdataloader import ( "net/http" diff --git a/tw/dataloader/endpoints.go b/tw/twdataloader/endpoints.go similarity index 98% rename from tw/dataloader/endpoints.go rename to tw/twdataloader/endpoints.go index 6245217..d06f771 100644 --- a/tw/dataloader/endpoints.go +++ b/tw/twdataloader/endpoints.go @@ -1,4 +1,4 @@ -package dataloader +package twdataloader const ( EndpointConfig = "/interface.php?func=get_config" diff --git a/tw/dataloader/server_data_loader.go b/tw/twdataloader/server_data_loader.go similarity index 86% rename from tw/dataloader/server_data_loader.go rename to tw/twdataloader/server_data_loader.go index dcb4815..dc86f37 100644 --- a/tw/dataloader/server_data_loader.go +++ b/tw/twdataloader/server_data_loader.go @@ -1,4 +1,4 @@ -package dataloader +package twdataloader import ( "compress/gzip" @@ -15,18 +15,18 @@ import ( "github.com/pkg/errors" - "github.com/tribalwarshelp/shared/models" + models2 "github.com/tribalwarshelp/shared/tw/twmodel" ) type ServerDataLoader interface { - LoadOD(tribe bool) (map[int]*models.OpponentsDefeated, error) - LoadPlayers() ([]*models.Player, error) - LoadTribes() ([]*models.Tribe, error) - LoadVillages() ([]*models.Village, error) - LoadEnnoblements(cfg *LoadEnnoblementsConfig) ([]*models.Ennoblement, error) - GetConfig() (*models.ServerConfig, error) - GetBuildingConfig() (*models.BuildingConfig, error) - GetUnitConfig() (*models.UnitConfig, error) + LoadOD(tribe bool) (map[int]*models2.OpponentsDefeated, error) + LoadPlayers() ([]*models2.Player, error) + LoadTribes() ([]*models2.Tribe, error) + LoadVillages() ([]*models2.Village, error) + LoadEnnoblements(cfg *LoadEnnoblementsConfig) ([]*models2.Ennoblement, error) + GetConfig() (*models2.ServerConfig, error) + GetBuildingConfig() (*models2.BuildingConfig, error) + GetUnitConfig() (*models2.UnitConfig, error) } type serverDataLoader struct { @@ -72,8 +72,8 @@ func (d *serverDataLoader) parseODLine(line []string) (*parsedODLine, error) { return p, nil } -func (d *serverDataLoader) LoadOD(tribe bool) (map[int]*models.OpponentsDefeated, error) { - m := make(map[int]*models.OpponentsDefeated) +func (d *serverDataLoader) LoadOD(tribe bool) (map[int]*models2.OpponentsDefeated, error) { + m := make(map[int]*models2.OpponentsDefeated) formattedURLs := []string{ fmt.Sprintf("%s%s", d.baseURL, EndpointKillAll), fmt.Sprintf("%s%s", d.baseURL, EndpointKillAtt), @@ -106,7 +106,7 @@ func (d *serverDataLoader) LoadOD(tribe bool) (map[int]*models.OpponentsDefeated return nil, errors.Wrapf(err, "couldn't parse the line, url %s, line %s", formattedURL, strings.Join(line, ",")) } if _, ok := m[parsed.ID]; !ok { - m[parsed.ID] = &models.OpponentsDefeated{} + m[parsed.ID] = &models2.OpponentsDefeated{} } switch formattedURL { case formattedURLs[0]: @@ -127,14 +127,14 @@ func (d *serverDataLoader) LoadOD(tribe bool) (map[int]*models.OpponentsDefeated return m, nil } -func (d *serverDataLoader) parsePlayerLine(line []string) (*models.Player, error) { +func (d *serverDataLoader) parsePlayerLine(line []string) (*models2.Player, error) { if len(line) != 6 { return nil, errors.New("Invalid line format (should be id,name,tribeid,villages,points,rank)") } var err error ex := true - player := &models.Player{ + player := &models2.Player{ Exists: &ex, } player.ID, err = strconv.Atoi(line[0]) @@ -165,7 +165,7 @@ func (d *serverDataLoader) parsePlayerLine(line []string) (*models.Player, error return player, nil } -func (d *serverDataLoader) LoadPlayers() ([]*models.Player, error) { +func (d *serverDataLoader) LoadPlayers() ([]*models2.Player, error) { formattedURL := d.baseURL + EndpointPlayer lines, err := d.getCSVData(formattedURL, true) if err != nil { @@ -175,7 +175,7 @@ func (d *serverDataLoader) LoadPlayers() ([]*models.Player, error) { } } - var players []*models.Player + var players []*models2.Player for _, line := range lines { player, err := d.parsePlayerLine(line) if err != nil { @@ -187,14 +187,14 @@ func (d *serverDataLoader) LoadPlayers() ([]*models.Player, error) { return players, nil } -func (d *serverDataLoader) parseTribeLine(line []string) (*models.Tribe, error) { +func (d *serverDataLoader) parseTribeLine(line []string) (*models2.Tribe, error) { if len(line) != 8 { return nil, errors.New("invalid line format (should be id,name,tag,members,villages,points,allpoints,rank)") } var err error ex := true - tribe := &models.Tribe{ + tribe := &models2.Tribe{ Exists: &ex, } tribe.ID, err = strconv.Atoi(line[0]) @@ -233,7 +233,7 @@ func (d *serverDataLoader) parseTribeLine(line []string) (*models.Tribe, error) return tribe, nil } -func (d *serverDataLoader) LoadTribes() ([]*models.Tribe, error) { +func (d *serverDataLoader) LoadTribes() ([]*models2.Tribe, error) { formattedURL := d.baseURL + EndpointTribe lines, err := d.getCSVData(formattedURL, true) if err != nil { @@ -242,7 +242,7 @@ func (d *serverDataLoader) LoadTribes() ([]*models.Tribe, error) { return nil, errors.Wrapf(err, "cannot to get data, url %s", formattedURL) } } - var tribes []*models.Tribe + var tribes []*models2.Tribe for _, line := range lines { tribe, err := d.parseTribeLine(line) if err != nil { @@ -253,12 +253,12 @@ func (d *serverDataLoader) LoadTribes() ([]*models.Tribe, error) { return tribes, nil } -func (d *serverDataLoader) parseVillageLine(line []string) (*models.Village, error) { +func (d *serverDataLoader) parseVillageLine(line []string) (*models2.Village, error) { if len(line) != 7 { return nil, errors.New("invalid line format (should be id,name,x,y,playerID,points,bonus)") } var err error - village := &models.Village{} + village := &models2.Village{} village.ID, err = strconv.Atoi(line[0]) if err != nil { return nil, errors.Wrap(err, "village.ID") @@ -290,7 +290,7 @@ func (d *serverDataLoader) parseVillageLine(line []string) (*models.Village, err return village, nil } -func (d *serverDataLoader) LoadVillages() ([]*models.Village, error) { +func (d *serverDataLoader) LoadVillages() ([]*models2.Village, error) { formattedURL := d.baseURL + EndpointVillage lines, err := d.getCSVData(formattedURL, true) if err != nil { @@ -299,7 +299,7 @@ func (d *serverDataLoader) LoadVillages() ([]*models.Village, error) { return nil, errors.Wrapf(err, "couldn't load data, formattedURL %s", formattedURL) } } - var villages []*models.Village + var villages []*models2.Village for _, line := range lines { village, err := d.parseVillageLine(line) if err != nil { @@ -310,12 +310,12 @@ func (d *serverDataLoader) LoadVillages() ([]*models.Village, error) { return villages, nil } -func (d *serverDataLoader) parseEnnoblementLine(line []string) (*models.Ennoblement, error) { +func (d *serverDataLoader) parseEnnoblementLine(line []string) (*models2.Ennoblement, error) { if len(line) != 4 { return nil, errors.New("invalid line format (should be village_id,timestamp,new_owner_id,old_owner_id)") } var err error - ennoblement := &models.Ennoblement{} + ennoblement := &models2.Ennoblement{} ennoblement.VillageID, err = strconv.Atoi(line[0]) if err != nil { return nil, errors.Wrap(err, "ennoblement.VillageID") @@ -341,7 +341,7 @@ type LoadEnnoblementsConfig struct { EnnobledAtGT time.Time } -func (d *serverDataLoader) LoadEnnoblements(cfg *LoadEnnoblementsConfig) ([]*models.Ennoblement, error) { +func (d *serverDataLoader) LoadEnnoblements(cfg *LoadEnnoblementsConfig) ([]*models2.Ennoblement, error) { if cfg == nil { cfg = &LoadEnnoblementsConfig{} } @@ -360,7 +360,7 @@ func (d *serverDataLoader) LoadEnnoblements(cfg *LoadEnnoblementsConfig) ([]*mod return nil, errors.Wrapf(err, "couldn't load data, formattedURL %s", formattedURL) } - var ennoblements []*models.Ennoblement + var ennoblements []*models2.Ennoblement for _, line := range lines { ennoblement, err := d.parseEnnoblementLine(line) if err != nil { @@ -373,9 +373,9 @@ func (d *serverDataLoader) LoadEnnoblements(cfg *LoadEnnoblementsConfig) ([]*mod return ennoblements, nil } -func (d *serverDataLoader) GetConfig() (*models.ServerConfig, error) { +func (d *serverDataLoader) GetConfig() (*models2.ServerConfig, error) { formattedURL := d.baseURL + EndpointConfig - cfg := &models.ServerConfig{} + cfg := &models2.ServerConfig{} err := d.getXML(formattedURL, cfg) if err != nil { return nil, errors.Wrap(err, "getConfig") @@ -383,9 +383,9 @@ func (d *serverDataLoader) GetConfig() (*models.ServerConfig, error) { return cfg, nil } -func (d *serverDataLoader) GetBuildingConfig() (*models.BuildingConfig, error) { +func (d *serverDataLoader) GetBuildingConfig() (*models2.BuildingConfig, error) { formattedURL := d.baseURL + EndpointBuildingConfig - cfg := &models.BuildingConfig{} + cfg := &models2.BuildingConfig{} err := d.getXML(formattedURL, cfg) if err != nil { return nil, errors.Wrap(err, "getBuildingConfig") @@ -393,9 +393,9 @@ func (d *serverDataLoader) GetBuildingConfig() (*models.BuildingConfig, error) { return cfg, nil } -func (d *serverDataLoader) GetUnitConfig() (*models.UnitConfig, error) { +func (d *serverDataLoader) GetUnitConfig() (*models2.UnitConfig, error) { formattedURL := d.baseURL + EndpointUnitConfig - cfg := &models.UnitConfig{} + cfg := &models2.UnitConfig{} err := d.getXML(formattedURL, cfg) if err != nil { return nil, errors.Wrap(err, "getUnitConfig") diff --git a/tw/dataloader/version_data_loader.go b/tw/twdataloader/version_data_loader.go similarity index 98% rename from tw/dataloader/version_data_loader.go rename to tw/twdataloader/version_data_loader.go index 6b446f1..067d5ac 100644 --- a/tw/dataloader/version_data_loader.go +++ b/tw/twdataloader/version_data_loader.go @@ -1,4 +1,4 @@ -package dataloader +package twdataloader import ( "fmt" diff --git a/models/building_config.go b/tw/twmodel/building_config.go similarity index 99% rename from models/building_config.go rename to tw/twmodel/building_config.go index fb409dc..daa93c2 100644 --- a/models/building_config.go +++ b/tw/twmodel/building_config.go @@ -1,4 +1,4 @@ -package models +package twmodel import "encoding/xml" diff --git a/tw/twmodel/coords.go b/tw/twmodel/coords.go new file mode 100644 index 0000000..73aac9c --- /dev/null +++ b/tw/twmodel/coords.go @@ -0,0 +1,30 @@ +package twmodel + +import ( + "github.com/pkg/errors" + "strconv" + "strings" +) + +const CoordsSeparator = "|" + +type Coords struct { + X int + Y int +} + +func ParseCoords(coords string) (*Coords, error) { + splitted := strings.Split(coords, CoordsSeparator) + if len(splitted) != 2 { + return nil, errors.Errorf("%s: invalid format (should be number|number)", coords) + } + x, err := strconv.Atoi(splitted[0]) + if err != nil { + return nil, errors.Wrapf(err, "%s: the part before | isn't a number", coords) + } + y, err := strconv.Atoi(splitted[1]) + if err != nil { + return nil, errors.Wrapf(err, "%s: the part after | isn't a number", coords) + } + return &Coords{x, y}, nil +} diff --git a/models/daily_player_stats.go b/tw/twmodel/daily_player_stats.go similarity index 55% rename from models/daily_player_stats.go rename to tw/twmodel/daily_player_stats.go index 82c3979..a64c28f 100644 --- a/models/daily_player_stats.go +++ b/tw/twmodel/daily_player_stats.go @@ -1,6 +1,7 @@ -package models +package twmodel import ( + "github.com/Kichiyaki/gopgutil/v10" "time" "github.com/go-pg/pg/v10" @@ -34,27 +35,34 @@ type DailyPlayerStatsFilter struct { } func (f *DailyPlayerStatsFilter) WhereWithAlias(q *orm.Query, alias string) (*orm.Query, error) { + if f == nil { + return q, nil + } + if !isZero(f.CreateDate) { - q = q.Where(buildConditionEquals(addAliasToColumnName("create_date", alias)), f.CreateDate) + q = q.Where(gopgutil.BuildConditionEquals(gopgutil.AddAliasToColumnName("create_date", alias)), f.CreateDate) } if !isZero(f.CreateDateGT) { - q = q.Where(buildConditionGT(addAliasToColumnName("create_date", alias)), f.CreateDateGT) + q = q.Where(gopgutil.BuildConditionGT(gopgutil.AddAliasToColumnName("create_date", alias)), f.CreateDateGT) } if !isZero(f.CreateDateGTE) { - q = q.Where(buildConditionGTE(addAliasToColumnName("create_date", alias)), f.CreateDateGTE) + q = q.Where(gopgutil.BuildConditionGTE(gopgutil.AddAliasToColumnName("create_date", alias)), f.CreateDateGTE) } if !isZero(f.CreateDateLT) { - q = q.Where(buildConditionLT(addAliasToColumnName("create_date", alias)), f.CreateDateLT) + q = q.Where(gopgutil.BuildConditionLT(gopgutil.AddAliasToColumnName("create_date", alias)), f.CreateDateLT) } if !isZero(f.CreateDateLTE) { - q = q.Where(buildConditionLTE(addAliasToColumnName("create_date", alias)), f.CreateDateLTE) + q = q.Where(gopgutil.BuildConditionLTE(gopgutil.AddAliasToColumnName("create_date", alias)), f.CreateDateLTE) } if !isZero(f.PlayerID) { - q = q.Where(buildConditionArray(addAliasToColumnName("player_id", alias)), pg.Array(f.PlayerID)) + q = q.Where(gopgutil.BuildConditionArray(gopgutil.AddAliasToColumnName("player_id", alias)), pg.Array(f.PlayerID)) } if !isZero(f.PlayerIDNEQ) { - q = q.Where(buildConditionNotInArray(addAliasToColumnName("player_id", alias)), pg.Array(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 @@ -63,42 +71,3 @@ 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") } - -type DailyPlayerStatsRelationshipAndSortAppender struct { - Filter *DailyPlayerStatsFilter - Sort []string -} - -func (a *DailyPlayerStatsRelationshipAndSortAppender) Append(q *orm.Query) (*orm.Query, error) { - var err error - playerRequired := findStringWithPrefix(a.Sort, "player.") != "" - playerTribeRequired := findStringWithPrefix(a.Sort, "player.tribe.") != "" - if a.Filter.PlayerFilter != nil { - q, err = a.Filter.PlayerFilter.WhereWithAlias(q, "player") - if err != nil { - return q, err - } - playerRequired = true - if a.Filter.PlayerFilter.TribeFilter != nil { - q, err = a.Filter.PlayerFilter.WhereWithAlias(q, "tribe") - if err != nil { - return q, err - } - playerTribeRequired = true - } - } - - if !isZero(a.Sort) { - q = q.Order(a.Sort...) - } - - if playerRequired { - q = q.Relation("Player._") - } - - if playerTribeRequired { - q = q.Join("LEFT JOIN ?SERVER.tribes AS tribe ON tribe.id = player.tribe_id") - } - - return q, nil -} diff --git a/models/daily_tribe_stats.go b/tw/twmodel/daily_tribe_stats.go similarity index 64% rename from models/daily_tribe_stats.go rename to tw/twmodel/daily_tribe_stats.go index eca35ea..2581c98 100644 --- a/models/daily_tribe_stats.go +++ b/tw/twmodel/daily_tribe_stats.go @@ -1,6 +1,7 @@ -package models +package twmodel import ( + "github.com/Kichiyaki/gopgutil/v10" "time" "github.com/go-pg/pg/v10" @@ -37,27 +38,34 @@ type DailyTribeStatsFilter struct { } func (f *DailyTribeStatsFilter) WhereWithAlias(q *orm.Query, alias string) (*orm.Query, error) { + if f == nil { + return q, nil + } + if !isZero(f.CreateDate) { - q = q.Where(buildConditionEquals(addAliasToColumnName("create_date", alias)), f.CreateDate) + q = q.Where(gopgutil.BuildConditionEquals(gopgutil.AddAliasToColumnName("create_date", alias)), f.CreateDate) } if !isZero(f.CreateDateGT) { - q = q.Where(buildConditionGT(addAliasToColumnName("create_date", alias)), f.CreateDateGT) + q = q.Where(gopgutil.BuildConditionGT(gopgutil.AddAliasToColumnName("create_date", alias)), f.CreateDateGT) } if !isZero(f.CreateDateGTE) { - q = q.Where(buildConditionGTE(addAliasToColumnName("create_date", alias)), f.CreateDateGTE) + q = q.Where(gopgutil.BuildConditionGTE(gopgutil.AddAliasToColumnName("create_date", alias)), f.CreateDateGTE) } if !isZero(f.CreateDateLT) { - q = q.Where(buildConditionLT(addAliasToColumnName("create_date", alias)), f.CreateDateLT) + q = q.Where(gopgutil.BuildConditionLT(gopgutil.AddAliasToColumnName("create_date", alias)), f.CreateDateLT) } if !isZero(f.CreateDateLTE) { - q = q.Where(buildConditionLTE(addAliasToColumnName("create_date", alias)), f.CreateDateLTE) + q = q.Where(gopgutil.BuildConditionLTE(gopgutil.AddAliasToColumnName("create_date", alias)), f.CreateDateLTE) } if !isZero(f.TribeID) { - q = q.Where(buildConditionArray(addAliasToColumnName("tribe_id", alias)), pg.Array(f.TribeID)) + q = q.Where(gopgutil.BuildConditionArray(gopgutil.AddAliasToColumnName("tribe_id", alias)), pg.Array(f.TribeID)) } if !isZero(f.TribeIDNEQ) { - q = q.Where(buildConditionNotInArray(addAliasToColumnName("tribe_id", alias)), pg.Array(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 @@ -66,30 +74,3 @@ 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") } - -type DailyTribeStatsRelationshipAndSortAppender struct { - Filter *DailyTribeStatsFilter - Sort []string -} - -func (a *DailyTribeStatsRelationshipAndSortAppender) Append(q *orm.Query) (*orm.Query, error) { - var err error - tribeRequired := findStringWithPrefix(a.Sort, "tribe.") != "" - if a.Filter.TribeFilter != nil { - q, err = a.Filter.TribeFilter.WhereWithAlias(q, "tribe") - if err != nil { - return q, err - } - tribeRequired = true - } - - if !isZero(a.Sort) { - q = q.Order(a.Sort...) - } - - if tribeRequired { - q = q.Relation("Tribe._") - } - - return q, nil -} diff --git a/models/ennoblement.go b/tw/twmodel/ennoblement.go similarity index 56% rename from models/ennoblement.go rename to tw/twmodel/ennoblement.go index 30514c9..85d4b35 100644 --- a/models/ennoblement.go +++ b/tw/twmodel/ennoblement.go @@ -1,6 +1,7 @@ -package models +package twmodel import ( + "github.com/Kichiyaki/gopgutil/v10" "time" "github.com/go-pg/pg/v10" @@ -32,21 +33,23 @@ type EnnoblementFilterOr struct { } func (f *EnnoblementFilterOr) WhereWithAlias(q *orm.Query, alias string) *orm.Query { - q = q.WhereGroup(func(q *orm.Query) (*orm.Query, error) { - if !isZero(f.NewOwnerID) { - q = q.WhereOr(buildConditionArray(addAliasToColumnName("new_owner_id", alias)), pg.Array(f.NewOwnerID)) - } - if !isZero(f.NewOwnerTribeID) { - q = q.WhereOr(buildConditionArray(addAliasToColumnName("new_owner_tribe_id", alias)), pg.Array(f.NewOwnerTribeID)) - } - if !isZero(f.OldOwnerID) { - q = q.WhereOr(buildConditionArray(addAliasToColumnName("old_owner_id", alias)), pg.Array(f.OldOwnerID)) - } - if !isZero(f.OldOwnerTribeID) { - q = q.WhereOr(buildConditionArray(addAliasToColumnName("old_owner_tribe_id", alias)), pg.Array(f.OldOwnerTribeID)) - } - return q, nil - }) + if f != nil { + q = q.WhereGroup(func(q *orm.Query) (*orm.Query, error) { + if !isZero(f.NewOwnerID) { + q = q.WhereOr(gopgutil.BuildConditionArray(gopgutil.AddAliasToColumnName("new_owner_id", alias)), pg.Array(f.NewOwnerID)) + } + if !isZero(f.NewOwnerTribeID) { + q = q.WhereOr(gopgutil.BuildConditionArray(gopgutil.AddAliasToColumnName("new_owner_tribe_id", alias)), pg.Array(f.NewOwnerTribeID)) + } + if !isZero(f.OldOwnerID) { + q = q.WhereOr(gopgutil.BuildConditionArray(gopgutil.AddAliasToColumnName("old_owner_id", alias)), pg.Array(f.OldOwnerID)) + } + if !isZero(f.OldOwnerTribeID) { + q = q.WhereOr(gopgutil.BuildConditionArray(gopgutil.AddAliasToColumnName("old_owner_tribe_id", alias)), pg.Array(f.OldOwnerTribeID)) + } + return q, nil + }) + } return q } @@ -79,135 +82,107 @@ type EnnoblementFilter struct { } func (f *EnnoblementFilter) WhereWithAlias(q *orm.Query, alias string) (*orm.Query, error) { + if f == nil { + return q, nil + } + if !isZero(f.EnnobledAt) { - q = q.Where(buildConditionEquals(addAliasToColumnName("ennobled_at", alias)), f.EnnobledAt) + q = q.Where(gopgutil.BuildConditionEquals(gopgutil.AddAliasToColumnName("ennobled_at", alias)), f.EnnobledAt) } if !isZero(f.EnnobledAtGT) { - q = q.Where(buildConditionGT(addAliasToColumnName("ennobled_at", alias)), f.EnnobledAtGT) + q = q.Where(gopgutil.BuildConditionGT(gopgutil.AddAliasToColumnName("ennobled_at", alias)), f.EnnobledAtGT) } if !isZero(f.EnnobledAtGTE) { - q = q.Where(buildConditionGTE(addAliasToColumnName("ennobled_at", alias)), f.EnnobledAtGTE) + q = q.Where(gopgutil.BuildConditionGTE(gopgutil.AddAliasToColumnName("ennobled_at", alias)), f.EnnobledAtGTE) } if !isZero(f.EnnobledAtLT) { - q = q.Where(buildConditionLT(addAliasToColumnName("ennobled_at", alias)), f.EnnobledAtLT) + q = q.Where(gopgutil.BuildConditionLT(gopgutil.AddAliasToColumnName("ennobled_at", alias)), f.EnnobledAtLT) } if !isZero(f.EnnobledAtLTE) { - q = q.Where(buildConditionLTE(addAliasToColumnName("ennobled_at", alias)), f.EnnobledAtLTE) + q = q.Where(gopgutil.BuildConditionLTE(gopgutil.AddAliasToColumnName("ennobled_at", alias)), f.EnnobledAtLTE) } if !isZero(f.VillageID) { - q = q.Where(buildConditionArray(addAliasToColumnName("village_id", alias)), pg.Array(f.VillageID)) + q = q.Where(gopgutil.BuildConditionArray(gopgutil.AddAliasToColumnName("village_id", alias)), pg.Array(f.VillageID)) } if !isZero(f.VillageIDNEQ) { - q = q.Where(buildConditionNotInArray(addAliasToColumnName("village_id", alias)), pg.Array(f.VillageIDNEQ)) + q = q.Where(gopgutil.BuildConditionNotInArray(gopgutil.AddAliasToColumnName("village_id", alias)), pg.Array(f.VillageIDNEQ)) } if !isZero(f.NewOwnerID) { - q = q.Where(buildConditionArray(addAliasToColumnName("new_owner_id", alias)), pg.Array(f.NewOwnerID)) + q = q.Where(gopgutil.BuildConditionArray(gopgutil.AddAliasToColumnName("new_owner_id", alias)), pg.Array(f.NewOwnerID)) } if !isZero(f.NewOwnerIDNEQ) { - q = q.Where(buildConditionNotInArray(addAliasToColumnName("new_owner_id", alias)), pg.Array(f.NewOwnerIDNEQ)) + q = q.Where(gopgutil.BuildConditionNotInArray(gopgutil.AddAliasToColumnName("new_owner_id", alias)), pg.Array(f.NewOwnerIDNEQ)) } if !isZero(f.NewOwnerTribeID) { - q = q.Where(buildConditionArray(addAliasToColumnName("new_owner_tribe_id", alias)), pg.Array(f.NewOwnerTribeID)) + q = q.Where(gopgutil.BuildConditionArray(gopgutil.AddAliasToColumnName("new_owner_tribe_id", alias)), pg.Array(f.NewOwnerTribeID)) } if !isZero(f.NewOwnerTribeIDNEQ) { - q = q.Where(buildConditionNotInArray(addAliasToColumnName("new_owner_tribe_id", alias)), pg.Array(f.NewOwnerTribeIDNEQ)) + q = q.Where(gopgutil.BuildConditionNotInArray(gopgutil.AddAliasToColumnName("new_owner_tribe_id", alias)), pg.Array(f.NewOwnerTribeIDNEQ)) } if !isZero(f.OldOwnerID) { - q = q.Where(buildConditionArray(addAliasToColumnName("old_owner_id", alias)), pg.Array(f.OldOwnerID)) + q = q.Where(gopgutil.BuildConditionArray(gopgutil.AddAliasToColumnName("old_owner_id", alias)), pg.Array(f.OldOwnerID)) } if !isZero(f.OldOwnerIDNEQ) { - q = q.Where(buildConditionNotInArray(addAliasToColumnName("old_owner_id", alias)), pg.Array(f.OldOwnerIDNEQ)) + q = q.Where(gopgutil.BuildConditionNotInArray(gopgutil.AddAliasToColumnName("old_owner_id", alias)), pg.Array(f.OldOwnerIDNEQ)) } if !isZero(f.OldOwnerTribeID) { - q = q.Where(buildConditionArray(addAliasToColumnName("old_owner_tribe_id", alias)), pg.Array(f.OldOwnerTribeID)) + q = q.Where(gopgutil.BuildConditionArray(gopgutil.AddAliasToColumnName("old_owner_tribe_id", alias)), pg.Array(f.OldOwnerTribeID)) } if !isZero(f.OldOwnerTribeIDNEQ) { - q = q.Where(buildConditionNotInArray(addAliasToColumnName("old_owner_tribe_id", alias)), pg.Array(f.OldOwnerTribeIDNEQ)) + q = q.Where(gopgutil.BuildConditionNotInArray(gopgutil.AddAliasToColumnName("old_owner_tribe_id", alias)), pg.Array(f.OldOwnerTribeIDNEQ)) } if f.Or != nil { 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") } - -type EnnoblementRelationshipAndSortAppender struct { - Filter *EnnoblementFilter - Sort []string -} - -func (a *EnnoblementRelationshipAndSortAppender) Append(q *orm.Query) (*orm.Query, error) { - var err error - villageRequired := findStringWithPrefix(a.Sort, "village.") != "" - if a.Filter.VillageFilter != nil { - q, err = a.Filter.VillageFilter.WhereWithAlias(q, "village") - if err != nil { - return q, err - } - villageRequired = true - } - - oldOwnerRequired := findStringWithPrefix(a.Sort, "old_owner.") != "" - if a.Filter.OldOwnerFilter != nil { - q, err = a.Filter.OldOwnerFilter.WhereWithAlias(q, "old_owner") - if err != nil { - return q, err - } - oldOwnerRequired = true - } - oldOwnerTribeRequired := findStringWithPrefix(a.Sort, "old_owner_tribe.") != "" - if a.Filter.OldOwnerTribeFilter != nil { - q, err = a.Filter.OldOwnerTribeFilter.WhereWithAlias(q, "old_owner_tribe") - if err != nil { - return q, err - } - oldOwnerTribeRequired = true - } - - newOwnerRequired := findStringWithPrefix(a.Sort, "new_owner.") != "" - if a.Filter.NewOwnerFilter != nil { - q, err = a.Filter.NewOwnerFilter.WhereWithAlias(q, "new_owner") - if err != nil { - return q, err - } - newOwnerRequired = true - } - newOwnerTribeRequired := findStringWithPrefix(a.Sort, "new_owner_tribe.") != "" - if a.Filter.NewOwnerTribeFilter != nil { - q, err = a.Filter.NewOwnerTribeFilter.WhereWithAlias(q, "new_owner_tribe") - if err != nil { - return q, err - } - newOwnerTribeRequired = true - } - - if !isZero(a.Sort) { - q = q.Order(a.Sort...) - } - - if villageRequired { - q = q.Relation("Village._") - } - if oldOwnerRequired { - q = q.Relation("OldOwner._") - } - if oldOwnerTribeRequired { - q = q.Relation("OldOwnerTribe._") - } - if newOwnerRequired { - q = q.Relation("NewOwner._") - } - if newOwnerTribeRequired { - q = q.Relation("NewOwnerTribe._") - } - - return q, nil -} diff --git a/tw/twmodel/helpers.go b/tw/twmodel/helpers.go new file mode 100644 index 0000000..a9ffd19 --- /dev/null +++ b/tw/twmodel/helpers.go @@ -0,0 +1,40 @@ +package twmodel + +import ( + "time" +) + +func isZero(v interface{}) bool { + switch c := v.(type) { + case string: + return c == "" + case *string, + []string, + []VersionCode, + []ServerStatus, + *int: + return c == nil + case int: + return c == 0 + case []int: + return c == nil + case float64: + return c == 0 + case *float64: + return c == nil + case float32: + return c == 0 + case *float32: + return c == nil + case bool: + return !c + case *bool: + return c == nil + case time.Time: + return c.IsZero() + case *time.Time: + return c == nil + default: + return false + } +} diff --git a/tw/twmodel/opponents_defeated.go b/tw/twmodel/opponents_defeated.go new file mode 100644 index 0000000..fb0a11e --- /dev/null +++ b/tw/twmodel/opponents_defeated.go @@ -0,0 +1,195 @@ +package twmodel + +import ( + "github.com/Kichiyaki/gopgutil/v10" + "github.com/go-pg/pg/v10/orm" +) + +type OpponentsDefeated struct { + RankAtt int `json:"rankAtt" pg:",use_zero" gqlgen:"rankAtt"` + ScoreAtt int `pg:",use_zero" json:"scoreAtt" gqlgen:"scoreAtt"` + RankDef int `pg:",use_zero" json:"rankDef" gqlgen:"rankDef"` + ScoreDef int `pg:",use_zero" json:"scoreDef" gqlgen:"scoreDef"` + RankSup int `pg:",use_zero" json:"rankSup,omitempty" gqlgen:"rankSup"` + ScoreSup int `pg:",use_zero" json:"scoreSup,omitempty" gqlgen:"scoreSup"` + RankTotal int `pg:",use_zero" json:"rankTotal" gqlgen:"rankTotal"` + ScoreTotal int `pg:",use_zero" json:"scoreTotal" gqlgen:"scoreTotal"` +} + +type OpponentsDefeatedFilter struct { + RankAtt int `json:"rankAtt" gqlgen:"rankAtt"` + RankAttGT int `json:"rankAttGT" gqlgen:"rankAttGT"` + RankAttGTE int `json:"rankAttGTE" gqlgen:"rankAttGTE"` + RankAttLT int `json:"rankAttLT" gqlgen:"rankAttLT"` + RankAttLTE int `json:"rankAttLTE" gqlgen:"rankAttLTE"` + ScoreAtt int `json:"scoreAtt" gqlgen:"scoreAtt"` + ScoreAttGT int `json:"scoreAttGT" gqlgen:"scoreAttGT"` + ScoreAttGTE int `json:"scoreAttGTE" gqlgen:"scoreAttGTE"` + ScoreAttLT int `json:"scoreAttLT" gqlgen:"scoreAttLT"` + ScoreAttLTE int `json:"scoreAttLTE" gqlgen:"scoreAttLTE"` + + RankDef int `json:"rankDef" gqlgen:"rankDef"` + RankDefGT int `json:"rankDefGT" gqlgen:"rankDefGT"` + RankDefGTE int `json:"rankDefGTE" gqlgen:"rankDefGTE"` + RankDefLT int `json:"rankDefLT" gqlgen:"rankDefLT"` + RankDefLTE int `json:"rankDefLTE" gqlgen:"rankDefLTE"` + ScoreDef int `json:"scoreDef" gqlgen:"scoreDef"` + ScoreDefGT int `json:"scoreDefGT" gqlgen:"scoreDefGT"` + ScoreDefGTE int `json:"scoreDefGTE" gqlgen:"scoreDefGTE"` + ScoreDefLT int `json:"scoreDefLT" gqlgen:"scoreDefLT"` + ScoreDefLTE int `json:"scoreDefLTE" gqlgen:"scoreDefLTE"` + + RankSup int `json:"rankSup,omitempty" gqlgen:"rankSup"` + RankSupGT int `json:"rankSupGT,omitempty" gqlgen:"rankSupGT"` + RankSupGTE int `json:"rankSupGTE,omitempty" gqlgen:"rankSupGTE"` + RankSupLT int `json:"rankSupLT,omitempty" gqlgen:"rankSupLT"` + RankSupLTE int `json:"rankSupLTE,omitempty" gqlgen:"rankSupLTE"` + ScoreSup int `json:"scoreSup,omitempty" gqlgen:"scoreSup"` + ScoreSupGT int `json:"scoreSupGT,omitempty" gqlgen:"scoreSupGT"` + ScoreSupGTE int `json:"scoreSupGTE,omitempty" gqlgen:"scoreSupGTE"` + ScoreSupLT int `json:"scoreSupLT,omitempty" gqlgen:"scoreSupLT"` + ScoreSupLTE int `json:"scoreSupLTE,omitempty" gqlgen:"scoreSupLTE"` + + RankTotal int `json:"rankTotal" gqlgen:"rankTotal"` + RankTotalGT int `json:"rankTotalGT" gqlgen:"rankTotalGT"` + RankTotalGTE int `json:"rankTotalGTE" gqlgen:"rankTotalGTE"` + RankTotalLT int `json:"rankTotalLT" gqlgen:"rankTotalLT"` + RankTotalLTE int `json:"rankTotalLTE" gqlgen:"rankTotalLTE"` + ScoreTotal int `json:"scoreTotal" gqlgen:"scoreTotal"` + ScoreTotalGT int `json:"scoreTotalGT" gqlgen:"scoreTotalGT"` + ScoreTotalGTE int `json:"scoreTotalGTE" gqlgen:"scoreTotalGTE"` + ScoreTotalLT int `json:"scoreTotalLT" gqlgen:"scoreTotalLT"` + ScoreTotalLTE int `json:"scoreTotalLTE" gqlgen:"scoreTotalLTE"` +} + +func (f *OpponentsDefeatedFilter) WhereWithAlias(q *orm.Query, alias string) (*orm.Query, error) { + if f == nil { + return q, nil + } + + if !isZero(f.RankAtt) { + q = q.Where(gopgutil.BuildConditionEquals(gopgutil.AddAliasToColumnName("rank_att", alias)), f.RankAtt) + } + if !isZero(f.RankAttGT) { + q = q.Where(gopgutil.BuildConditionGT(gopgutil.AddAliasToColumnName("rank_att", alias)), f.RankAttGT) + } + if !isZero(f.RankAttGTE) { + q = q.Where(gopgutil.BuildConditionGTE(gopgutil.AddAliasToColumnName("rank_att", alias)), f.RankAttGTE) + } + if !isZero(f.RankAttLT) { + q = q.Where(gopgutil.BuildConditionLT(gopgutil.AddAliasToColumnName("rank_att", alias)), f.RankAttLT) + } + if !isZero(f.RankAttLTE) { + q = q.Where(gopgutil.BuildConditionLTE(gopgutil.AddAliasToColumnName("rank_att", alias)), f.RankAttLTE) + } + if !isZero(f.ScoreAtt) { + q = q.Where(gopgutil.BuildConditionEquals(gopgutil.AddAliasToColumnName("score_att", alias)), f.ScoreAtt) + } + if !isZero(f.ScoreAttGT) { + q = q.Where(gopgutil.BuildConditionGT(gopgutil.AddAliasToColumnName("score_att", alias)), f.ScoreAttGT) + } + if !isZero(f.ScoreAttGTE) { + q = q.Where(gopgutil.BuildConditionGTE(gopgutil.AddAliasToColumnName("score_att", alias)), f.ScoreAttGTE) + } + if !isZero(f.ScoreAttLT) { + q = q.Where(gopgutil.BuildConditionLT(gopgutil.AddAliasToColumnName("score_att", alias)), f.ScoreAttLT) + } + if !isZero(f.ScoreAttLTE) { + q = q.Where(gopgutil.BuildConditionLTE(gopgutil.AddAliasToColumnName("score_att", alias)), f.ScoreAttLTE) + } + + if !isZero(f.RankDef) { + q = q.Where(gopgutil.BuildConditionEquals(gopgutil.AddAliasToColumnName("rank_def", alias)), f.RankDef) + } + if !isZero(f.RankDefGT) { + q = q.Where(gopgutil.BuildConditionGT(gopgutil.AddAliasToColumnName("rank_def", alias)), f.RankDefGT) + } + if !isZero(f.RankDefGTE) { + q = q.Where(gopgutil.BuildConditionGTE(gopgutil.AddAliasToColumnName("rank_def", alias)), f.RankDefGTE) + } + if !isZero(f.RankDefLT) { + q = q.Where(gopgutil.BuildConditionLT(gopgutil.AddAliasToColumnName("rank_def", alias)), f.RankDefLT) + } + if !isZero(f.RankDefLTE) { + q = q.Where(gopgutil.BuildConditionLTE(gopgutil.AddAliasToColumnName("rank_def", alias)), f.RankDefLTE) + } + if !isZero(f.ScoreDef) { + q = q.Where(gopgutil.BuildConditionEquals(gopgutil.AddAliasToColumnName("score_def", alias)), f.ScoreDef) + } + if !isZero(f.ScoreDefGT) { + q = q.Where(gopgutil.BuildConditionGT(gopgutil.AddAliasToColumnName("score_def", alias)), f.ScoreDefGT) + } + if !isZero(f.ScoreDefGTE) { + q = q.Where(gopgutil.BuildConditionGTE(gopgutil.AddAliasToColumnName("score_def", alias)), f.ScoreDefGTE) + } + if !isZero(f.ScoreDefLT) { + q = q.Where(gopgutil.BuildConditionLT(gopgutil.AddAliasToColumnName("score_def", alias)), f.ScoreDefLT) + } + if !isZero(f.ScoreDefLTE) { + q = q.Where(gopgutil.BuildConditionLTE(gopgutil.AddAliasToColumnName("score_def", alias)), f.ScoreDefLTE) + } + + if !isZero(f.RankSup) { + q = q.Where(gopgutil.BuildConditionEquals(gopgutil.AddAliasToColumnName("rank_sup", alias)), f.RankSup) + } + if !isZero(f.RankSupGT) { + q = q.Where(gopgutil.BuildConditionGT(gopgutil.AddAliasToColumnName("rank_sup", alias)), f.RankSupGT) + } + if !isZero(f.RankSupGTE) { + q = q.Where(gopgutil.BuildConditionGTE(gopgutil.AddAliasToColumnName("rank_sup", alias)), f.RankSupGTE) + } + if !isZero(f.RankSupLT) { + q = q.Where(gopgutil.BuildConditionLT(gopgutil.AddAliasToColumnName("rank_sup", alias)), f.RankSupLT) + } + if !isZero(f.RankSupLTE) { + q = q.Where(gopgutil.BuildConditionLTE(gopgutil.AddAliasToColumnName("rank_sup", alias)), f.RankSupLTE) + } + if !isZero(f.ScoreSup) { + q = q.Where(gopgutil.BuildConditionEquals(gopgutil.AddAliasToColumnName("score_sup", alias)), f.ScoreSup) + } + if !isZero(f.ScoreSupGT) { + q = q.Where(gopgutil.BuildConditionGT(gopgutil.AddAliasToColumnName("score_sup", alias)), f.ScoreSupGT) + } + if !isZero(f.ScoreSupGTE) { + q = q.Where(gopgutil.BuildConditionGTE(gopgutil.AddAliasToColumnName("score_sup", alias)), f.ScoreSupGTE) + } + if !isZero(f.ScoreSupLT) { + q = q.Where(gopgutil.BuildConditionLT(gopgutil.AddAliasToColumnName("score_sup", alias)), f.ScoreSupLT) + } + if !isZero(f.ScoreSupLTE) { + q = q.Where(gopgutil.BuildConditionLTE(gopgutil.AddAliasToColumnName("score_sup", alias)), f.ScoreSupLTE) + } + + if !isZero(f.RankTotal) { + q = q.Where(gopgutil.BuildConditionEquals(gopgutil.AddAliasToColumnName("rank_total", alias)), f.RankTotal) + } + if !isZero(f.RankTotalGT) { + q = q.Where(gopgutil.BuildConditionGT(gopgutil.AddAliasToColumnName("rank_total", alias)), f.RankTotalGT) + } + if !isZero(f.RankTotalGTE) { + q = q.Where(gopgutil.BuildConditionGTE(gopgutil.AddAliasToColumnName("rank_total", alias)), f.RankTotalGTE) + } + if !isZero(f.RankTotalLT) { + q = q.Where(gopgutil.BuildConditionLT(gopgutil.AddAliasToColumnName("rank_total", alias)), f.RankTotalLT) + } + if !isZero(f.RankTotalLTE) { + q = q.Where(gopgutil.BuildConditionLTE(gopgutil.AddAliasToColumnName("rank_total", alias)), f.RankTotalLTE) + } + if !isZero(f.ScoreTotal) { + q = q.Where(gopgutil.BuildConditionEquals(gopgutil.AddAliasToColumnName("score_total", alias)), f.ScoreTotal) + } + if !isZero(f.ScoreTotalGT) { + q = q.Where(gopgutil.BuildConditionGT(gopgutil.AddAliasToColumnName("score_total", alias)), f.ScoreTotalGT) + } + if !isZero(f.ScoreTotalGTE) { + q = q.Where(gopgutil.BuildConditionGTE(gopgutil.AddAliasToColumnName("score_total", alias)), f.ScoreTotalGTE) + } + if !isZero(f.ScoreTotalLT) { + q = q.Where(gopgutil.BuildConditionLT(gopgutil.AddAliasToColumnName("score_total", alias)), f.ScoreTotalLT) + } + if !isZero(f.ScoreTotalLTE) { + q = q.Where(gopgutil.BuildConditionLTE(gopgutil.AddAliasToColumnName("score_total", alias)), f.ScoreTotalLTE) + } + + return q, nil +} diff --git a/models/player.go b/tw/twmodel/player.go similarity index 59% rename from models/player.go rename to tw/twmodel/player.go index e951fae..e592a4c 100644 --- a/models/player.go +++ b/tw/twmodel/player.go @@ -1,6 +1,7 @@ -package models +package twmodel import ( + "github.com/Kichiyaki/gopgutil/v10" "time" "github.com/go-pg/pg/v10" @@ -8,7 +9,7 @@ import ( ) type Player struct { - tableName struct{} `pg:"?SERVER.players,alias:player" json:"tableName" xml:"tableName" gqlgen:"tableName"` + tableName struct{} `pg:"?SERVER.players,alias:player"` ID int `json:"id" pg:"type:bigint,pk" gqlgen:"id" xml:"id"` Name string `json:"name" gqlgen:"name" xml:"name"` @@ -92,182 +93,167 @@ type PlayerFilter struct { OpponentsDefeatedFilter } -func (f *PlayerFilter) WhereWithAlias(q *orm.Query, alias string) (*orm.Query, error) { +func (f *PlayerFilter) WhereWithAlias(q *orm.Query, alias, tribeRelationName, tribeAlias string) (*orm.Query, error) { + if f == nil { + return q, nil + } + if !isZero(f.ID) { - q = q.Where(buildConditionArray(addAliasToColumnName("id", alias)), pg.Array(f.ID)) + q = q.Where(gopgutil.BuildConditionArray(gopgutil.AddAliasToColumnName("id", alias)), pg.Array(f.ID)) } if !isZero(f.IDNEQ) { - q = q.Where(buildConditionNotInArray(addAliasToColumnName("id", alias)), pg.Array(f.IDNEQ)) + q = q.Where(gopgutil.BuildConditionNotInArray(gopgutil.AddAliasToColumnName("id", alias)), pg.Array(f.IDNEQ)) } if !isZero(f.Exists) { - q = q.Where(buildConditionEquals(addAliasToColumnName("exists", alias)), f.Exists) + q = q.Where(gopgutil.BuildConditionEquals(gopgutil.AddAliasToColumnName("exists", alias)), f.Exists) } if !isZero(f.Name) { - q = q.Where(buildConditionArray(addAliasToColumnName("name", alias)), pg.Array(f.Name)) + q = q.Where(gopgutil.BuildConditionArray(gopgutil.AddAliasToColumnName("name", alias)), pg.Array(f.Name)) } if !isZero(f.NameNEQ) { - q = q.Where(buildConditionNotInArray(addAliasToColumnName("name", alias)), pg.Array(f.NameNEQ)) + q = q.Where(gopgutil.BuildConditionNotInArray(gopgutil.AddAliasToColumnName("name", alias)), pg.Array(f.NameNEQ)) } if !isZero(f.NameMATCH) { - q = q.Where(buildConditionMatch(addAliasToColumnName("name", alias)), f.NameMATCH) + q = q.Where(gopgutil.BuildConditionMatch(gopgutil.AddAliasToColumnName("name", alias)), f.NameMATCH) } if !isZero(f.NameIEQ) { - q = q.Where(buildConditionIEQ(addAliasToColumnName("name", alias)), f.NameIEQ) + q = q.Where(gopgutil.BuildConditionIEQ(gopgutil.AddAliasToColumnName("name", alias)), f.NameIEQ) } if !isZero(f.TotalVillages) { - q = q.Where(buildConditionEquals(addAliasToColumnName("total_villages", alias)), f.TotalVillages) + q = q.Where(gopgutil.BuildConditionEquals(gopgutil.AddAliasToColumnName("total_villages", alias)), f.TotalVillages) } if !isZero(f.TotalVillagesGT) { - q = q.Where(buildConditionGT(addAliasToColumnName("total_villages", alias)), f.TotalVillagesGT) + q = q.Where(gopgutil.BuildConditionGT(gopgutil.AddAliasToColumnName("total_villages", alias)), f.TotalVillagesGT) } if !isZero(f.TotalVillagesGTE) { - q = q.Where(buildConditionGTE(addAliasToColumnName("total_villages", alias)), f.TotalVillagesGTE) + q = q.Where(gopgutil.BuildConditionGTE(gopgutil.AddAliasToColumnName("total_villages", alias)), f.TotalVillagesGTE) } if !isZero(f.TotalVillagesLT) { - q = q.Where(buildConditionLT(addAliasToColumnName("total_villages", alias)), f.TotalVillagesLT) + q = q.Where(gopgutil.BuildConditionLT(gopgutil.AddAliasToColumnName("total_villages", alias)), f.TotalVillagesLT) } if !isZero(f.TotalVillagesLTE) { - q = q.Where(buildConditionLTE(addAliasToColumnName("total_villages", alias)), f.TotalVillagesLTE) + q = q.Where(gopgutil.BuildConditionLTE(gopgutil.AddAliasToColumnName("total_villages", alias)), f.TotalVillagesLTE) } if !isZero(f.Points) { - q = q.Where(buildConditionEquals(addAliasToColumnName("points", alias)), f.Points) + q = q.Where(gopgutil.BuildConditionEquals(gopgutil.AddAliasToColumnName("points", alias)), f.Points) } if !isZero(f.PointsGT) { - q = q.Where(buildConditionGT(addAliasToColumnName("points", alias)), f.PointsGT) + q = q.Where(gopgutil.BuildConditionGT(gopgutil.AddAliasToColumnName("points", alias)), f.PointsGT) } if !isZero(f.PointsGTE) { - q = q.Where(buildConditionGTE(addAliasToColumnName("points", alias)), f.PointsGTE) + q = q.Where(gopgutil.BuildConditionGTE(gopgutil.AddAliasToColumnName("points", alias)), f.PointsGTE) } if !isZero(f.PointsLT) { - q = q.Where(buildConditionLT(addAliasToColumnName("points", alias)), f.PointsLT) + q = q.Where(gopgutil.BuildConditionLT(gopgutil.AddAliasToColumnName("points", alias)), f.PointsLT) } if !isZero(f.PointsLTE) { - q = q.Where(buildConditionLTE(addAliasToColumnName("points", alias)), f.PointsLTE) + q = q.Where(gopgutil.BuildConditionLTE(gopgutil.AddAliasToColumnName("points", alias)), f.PointsLTE) } if !isZero(f.Rank) { - q = q.Where(buildConditionEquals(addAliasToColumnName("rank", alias)), f.Rank) + q = q.Where(gopgutil.BuildConditionEquals(gopgutil.AddAliasToColumnName("rank", alias)), f.Rank) } if !isZero(f.RankGT) { - q = q.Where(buildConditionGT(addAliasToColumnName("rank", alias)), f.RankGT) + q = q.Where(gopgutil.BuildConditionGT(gopgutil.AddAliasToColumnName("rank", alias)), f.RankGT) } if !isZero(f.RankGTE) { - q = q.Where(buildConditionGTE(addAliasToColumnName("rank", alias)), f.RankGTE) + q = q.Where(gopgutil.BuildConditionGTE(gopgutil.AddAliasToColumnName("rank", alias)), f.RankGTE) } if !isZero(f.RankLT) { - q = q.Where(buildConditionLT(addAliasToColumnName("rank", alias)), f.RankLT) + q = q.Where(gopgutil.BuildConditionLT(gopgutil.AddAliasToColumnName("rank", alias)), f.RankLT) } if !isZero(f.RankLTE) { - q = q.Where(buildConditionLTE(addAliasToColumnName("rank", alias)), f.RankLTE) + q = q.Where(gopgutil.BuildConditionLTE(gopgutil.AddAliasToColumnName("rank", alias)), f.RankLTE) } if !isZero(f.DailyGrowth) { - q = q.Where(buildConditionEquals(addAliasToColumnName("daily_growth", alias)), f.DailyGrowth) + q = q.Where(gopgutil.BuildConditionEquals(gopgutil.AddAliasToColumnName("daily_growth", alias)), f.DailyGrowth) } if !isZero(f.DailyGrowthGT) { - q = q.Where(buildConditionGT(addAliasToColumnName("daily_growth", alias)), f.DailyGrowthGT) + q = q.Where(gopgutil.BuildConditionGT(gopgutil.AddAliasToColumnName("daily_growth", alias)), f.DailyGrowthGT) } if !isZero(f.DailyGrowthGTE) { - q = q.Where(buildConditionGTE(addAliasToColumnName("daily_growth", alias)), f.DailyGrowthGTE) + q = q.Where(gopgutil.BuildConditionGTE(gopgutil.AddAliasToColumnName("daily_growth", alias)), f.DailyGrowthGTE) } if !isZero(f.DailyGrowthLT) { - q = q.Where(buildConditionLT(addAliasToColumnName("daily_growth", alias)), f.DailyGrowthLT) + q = q.Where(gopgutil.BuildConditionLT(gopgutil.AddAliasToColumnName("daily_growth", alias)), f.DailyGrowthLT) } if !isZero(f.DailyGrowthLTE) { - q = q.Where(buildConditionLTE(addAliasToColumnName("daily_growth", alias)), f.DailyGrowthLTE) + q = q.Where(gopgutil.BuildConditionLTE(gopgutil.AddAliasToColumnName("daily_growth", alias)), f.DailyGrowthLTE) } if !isZero(f.JoinedAt) { - q = q.Where(buildConditionEquals(addAliasToColumnName("joined_at", alias)), f.JoinedAt) + q = q.Where(gopgutil.BuildConditionEquals(gopgutil.AddAliasToColumnName("joined_at", alias)), f.JoinedAt) } if !isZero(f.JoinedAtGT) { - q = q.Where(buildConditionGT(addAliasToColumnName("joined_at", alias)), f.JoinedAtGT) + q = q.Where(gopgutil.BuildConditionGT(gopgutil.AddAliasToColumnName("joined_at", alias)), f.JoinedAtGT) } if !isZero(f.JoinedAtGTE) { - q = q.Where(buildConditionGTE(addAliasToColumnName("joined_at", alias)), f.JoinedAtGTE) + q = q.Where(gopgutil.BuildConditionGTE(gopgutil.AddAliasToColumnName("joined_at", alias)), f.JoinedAtGTE) } if !isZero(f.JoinedAtLT) { - q = q.Where(buildConditionLT(addAliasToColumnName("joined_at", alias)), f.JoinedAtLT) + q = q.Where(gopgutil.BuildConditionLT(gopgutil.AddAliasToColumnName("joined_at", alias)), f.JoinedAtLT) } if !isZero(f.JoinedAtLTE) { - q = q.Where(buildConditionLTE(addAliasToColumnName("joined_at", alias)), f.JoinedAtLTE) + q = q.Where(gopgutil.BuildConditionLTE(gopgutil.AddAliasToColumnName("joined_at", alias)), f.JoinedAtLTE) } if !isZero(f.LastActivityAt) { - q = q.Where(buildConditionEquals(addAliasToColumnName("last_activity_at", alias)), f.LastActivityAt) + q = q.Where(gopgutil.BuildConditionEquals(gopgutil.AddAliasToColumnName("last_activity_at", alias)), f.LastActivityAt) } if !isZero(f.LastActivityAtGT) { - q = q.Where(buildConditionGT(addAliasToColumnName("last_activity_at", alias)), f.LastActivityAtGT) + q = q.Where(gopgutil.BuildConditionGT(gopgutil.AddAliasToColumnName("last_activity_at", alias)), f.LastActivityAtGT) } if !isZero(f.LastActivityAtGTE) { - q = q.Where(buildConditionGTE(addAliasToColumnName("last_activity_at", alias)), f.LastActivityAtGTE) + q = q.Where(gopgutil.BuildConditionGTE(gopgutil.AddAliasToColumnName("last_activity_at", alias)), f.LastActivityAtGTE) } if !isZero(f.LastActivityAtLT) { - q = q.Where(buildConditionLT(addAliasToColumnName("last_activity_at", alias)), f.LastActivityAtLT) + q = q.Where(gopgutil.BuildConditionLT(gopgutil.AddAliasToColumnName("last_activity_at", alias)), f.LastActivityAtLT) } if !isZero(f.LastActivityAtLTE) { - q = q.Where(buildConditionLTE(addAliasToColumnName("last_activity_at", alias)), f.LastActivityAtLTE) + q = q.Where(gopgutil.BuildConditionLTE(gopgutil.AddAliasToColumnName("last_activity_at", alias)), f.LastActivityAtLTE) } if !isZero(f.DeletedAt) { - q = q.Where(buildConditionEquals(addAliasToColumnName("deleted_at", alias)), f.DeletedAt) + q = q.Where(gopgutil.BuildConditionEquals(gopgutil.AddAliasToColumnName("deleted_at", alias)), f.DeletedAt) } if !isZero(f.DeletedAtGT) { - q = q.Where(buildConditionGT(addAliasToColumnName("deleted_at", alias)), f.DeletedAtGT) + q = q.Where(gopgutil.BuildConditionGT(gopgutil.AddAliasToColumnName("deleted_at", alias)), f.DeletedAtGT) } if !isZero(f.DeletedAtGTE) { - q = q.Where(buildConditionGTE(addAliasToColumnName("deleted_at", alias)), f.DeletedAtGTE) + q = q.Where(gopgutil.BuildConditionGTE(gopgutil.AddAliasToColumnName("deleted_at", alias)), f.DeletedAtGTE) } if !isZero(f.DeletedAtLT) { - q = q.Where(buildConditionLT(addAliasToColumnName("deleted_at", alias)), f.DeletedAtLT) + q = q.Where(gopgutil.BuildConditionLT(gopgutil.AddAliasToColumnName("deleted_at", alias)), f.DeletedAtLT) } if !isZero(f.DeletedAtLTE) { - q = q.Where(buildConditionLTE(addAliasToColumnName("deleted_at", alias)), f.DeletedAtLTE) + q = q.Where(gopgutil.BuildConditionLTE(gopgutil.AddAliasToColumnName("deleted_at", alias)), f.DeletedAtLTE) } if !isZero(f.TribeID) { - q = q.Where(buildConditionArray(addAliasToColumnName("tribe_id", alias)), pg.Array(f.TribeID)) + q = q.Where(gopgutil.BuildConditionArray(gopgutil.AddAliasToColumnName("tribe_id", alias)), pg.Array(f.TribeID)) } if !isZero(f.TribeIDNEQ) { - q = q.Where(buildConditionNotInArray(addAliasToColumnName("tribe_id", alias)), pg.Array(f.TribeIDNEQ)) + 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") -} - -type PlayerRelationshipAndSortAppender struct { - Filter *PlayerFilter - Sort []string -} - -func (a *PlayerRelationshipAndSortAppender) Append(q *orm.Query) (*orm.Query, error) { - var err error - tribeRequired := findStringWithPrefix(a.Sort, "tribe.") != "" - if a.Filter.TribeFilter != nil { - q, err = a.Filter.TribeFilter.WhereWithAlias(q, "tribe") - if err != nil { - return q, err - } - tribeRequired = true - } - - if !isZero(a.Sort) { - q = q.Order(a.Sort...) - } - - if tribeRequired { - q = q.Relation("Tribe._") - } - - return q, nil + return f.WhereWithAlias(q, "player", "Tribe._", "tribe") } type FoundPlayer struct { diff --git a/models/player_history.go b/tw/twmodel/player_history.go similarity index 58% rename from models/player_history.go rename to tw/twmodel/player_history.go index 4c7275f..7812a92 100644 --- a/models/player_history.go +++ b/tw/twmodel/player_history.go @@ -1,6 +1,7 @@ -package models +package twmodel import ( + "github.com/Kichiyaki/gopgutil/v10" "time" "github.com/go-pg/pg/v10" @@ -36,27 +37,35 @@ type PlayerHistoryFilter struct { } func (f *PlayerHistoryFilter) WhereWithAlias(q *orm.Query, alias string) (*orm.Query, error) { + if f == nil { + return q, nil + } + if !isZero(f.CreateDate) { - q = q.Where(buildConditionEquals(addAliasToColumnName("create_date", alias)), f.CreateDate) + q = q.Where(gopgutil.BuildConditionEquals(gopgutil.AddAliasToColumnName("create_date", alias)), f.CreateDate) } if !isZero(f.CreateDateGT) { - q = q.Where(buildConditionGT(addAliasToColumnName("create_date", alias)), f.CreateDateGT) + q = q.Where(gopgutil.BuildConditionGT(gopgutil.AddAliasToColumnName("create_date", alias)), f.CreateDateGT) } if !isZero(f.CreateDateGTE) { - q = q.Where(buildConditionGTE(addAliasToColumnName("create_date", alias)), f.CreateDateGTE) + q = q.Where(gopgutil.BuildConditionGTE(gopgutil.AddAliasToColumnName("create_date", alias)), f.CreateDateGTE) } if !isZero(f.CreateDateLT) { - q = q.Where(buildConditionLT(addAliasToColumnName("create_date", alias)), f.CreateDateLT) + q = q.Where(gopgutil.BuildConditionLT(gopgutil.AddAliasToColumnName("create_date", alias)), f.CreateDateLT) } if !isZero(f.CreateDateLTE) { - q = q.Where(buildConditionLTE(addAliasToColumnName("create_date", alias)), f.CreateDateLTE) + q = q.Where(gopgutil.BuildConditionLTE(gopgutil.AddAliasToColumnName("create_date", alias)), f.CreateDateLTE) } if !isZero(f.PlayerID) { - q = q.Where(buildConditionArray(addAliasToColumnName("player_id", alias)), pg.Array(f.PlayerID)) + q = q.Where(gopgutil.BuildConditionArray(gopgutil.AddAliasToColumnName("player_id", alias)), pg.Array(f.PlayerID)) } if !isZero(f.PlayerIDNEQ) { - q = q.Where(buildConditionNotInArray(addAliasToColumnName("player_id", alias)), pg.Array(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 @@ -65,42 +74,3 @@ func (f *PlayerHistoryFilter) WhereWithAlias(q *orm.Query, alias string) (*orm.Q func (f *PlayerHistoryFilter) Where(q *orm.Query) (*orm.Query, error) { return f.WhereWithAlias(q, "player_history") } - -type PlayerHistoryRelationshipAndSortAppender struct { - Filter *PlayerHistoryFilter - Sort []string -} - -func (a *PlayerHistoryRelationshipAndSortAppender) Append(q *orm.Query) (*orm.Query, error) { - var err error - playerRequired := findStringWithPrefix(a.Sort, "player.") != "" - playerTribeRequired := findStringWithPrefix(a.Sort, "player.tribe.") != "" - if a.Filter.PlayerFilter != nil { - q, err = a.Filter.PlayerFilter.WhereWithAlias(q, "player") - if err != nil { - return q, err - } - playerRequired = true - if a.Filter.PlayerFilter.TribeFilter != nil { - q, err = a.Filter.PlayerFilter.WhereWithAlias(q, "tribe") - if err != nil { - return q, err - } - playerTribeRequired = true - } - } - - if !isZero(a.Sort) { - q = q.Order(a.Sort...) - } - - if playerRequired { - q = q.Relation("Player._") - } - - if playerTribeRequired { - q = q.Join("LEFT JOIN ?SERVER.tribes AS tribe ON tribe.id = player.tribe_id") - } - - return q, nil -} diff --git a/models/player_name_change.go b/tw/twmodel/player_name_change.go similarity index 97% rename from models/player_name_change.go rename to tw/twmodel/player_name_change.go index 0813e73..3ea9703 100644 --- a/models/player_name_change.go +++ b/tw/twmodel/player_name_change.go @@ -1,4 +1,4 @@ -package models +package twmodel import "time" diff --git a/models/player_to_server.go b/tw/twmodel/player_to_server.go similarity index 95% rename from models/player_to_server.go rename to tw/twmodel/player_to_server.go index 44445b9..1fcd014 100644 --- a/models/player_to_server.go +++ b/tw/twmodel/player_to_server.go @@ -1,4 +1,4 @@ -package models +package twmodel type PlayerToServer struct { ID int `json:"id" gqlgen:"id" xml:"id"` diff --git a/models/server.go b/tw/twmodel/server.go similarity index 76% rename from models/server.go rename to tw/twmodel/server.go index 33cdba0..31c2037 100644 --- a/models/server.go +++ b/tw/twmodel/server.go @@ -1,7 +1,8 @@ -package models +package twmodel import ( "fmt" + "github.com/Kichiyaki/gopgutil/v10" "io" "strconv" "strings" @@ -83,31 +84,35 @@ type ServerFilter struct { } func (f *ServerFilter) WhereWithAlias(q *orm.Query, alias string) (*orm.Query, error) { + if f == nil { + return q, nil + } + if !isZero(f.Key) { - q = q.Where(buildConditionArray(addAliasToColumnName("key", alias)), pg.Array(f.Key)) + q = q.Where(gopgutil.BuildConditionArray(gopgutil.AddAliasToColumnName("key", alias)), pg.Array(f.Key)) } if !isZero(f.KeyNEQ) { - q = q.Where(buildConditionNotInArray(addAliasToColumnName("key", alias)), pg.Array(f.KeyNEQ)) + q = q.Where(gopgutil.BuildConditionNotInArray(gopgutil.AddAliasToColumnName("key", alias)), pg.Array(f.KeyNEQ)) } if !isZero(f.KeyMATCH) { - q = q.Where(buildConditionMatch(addAliasToColumnName("key", alias)), f.KeyMATCH) + q = q.Where(gopgutil.BuildConditionMatch(gopgutil.AddAliasToColumnName("key", alias)), f.KeyMATCH) } if !isZero(f.KeyIEQ) { - q = q.Where(buildConditionIEQ(addAliasToColumnName("key", alias)), f.KeyIEQ) + q = q.Where(gopgutil.BuildConditionIEQ(gopgutil.AddAliasToColumnName("key", alias)), f.KeyIEQ) } if !isZero(f.Status) { - q = q.Where(buildConditionArray(addAliasToColumnName("status", alias)), pg.Array(f.Status)) + q = q.Where(gopgutil.BuildConditionArray(gopgutil.AddAliasToColumnName("status", alias)), pg.Array(f.Status)) } if !isZero(f.StatusNEQ) { - q = q.Where(buildConditionNotInArray(addAliasToColumnName("status", alias)), pg.Array(f.StatusNEQ)) + q = q.Where(gopgutil.BuildConditionNotInArray(gopgutil.AddAliasToColumnName("status", alias)), pg.Array(f.StatusNEQ)) } if !isZero(f.VersionCode) { - q = q.Where(buildConditionArray(addAliasToColumnName("version_code", alias)), pg.Array(f.VersionCode)) + q = q.Where(gopgutil.BuildConditionArray(gopgutil.AddAliasToColumnName("version_code", alias)), pg.Array(f.VersionCode)) } if !isZero(f.VersionCodeNEQ) { - q = q.Where(buildConditionNotInArray(addAliasToColumnName("version_code", alias)), pg.Array(f.VersionCodeNEQ)) + q = q.Where(gopgutil.BuildConditionNotInArray(gopgutil.AddAliasToColumnName("version_code", alias)), pg.Array(f.VersionCodeNEQ)) } return q, nil diff --git a/models/server_config.go b/tw/twmodel/server_config.go similarity index 99% rename from models/server_config.go rename to tw/twmodel/server_config.go index bbe0511..dc36b02 100644 --- a/models/server_config.go +++ b/tw/twmodel/server_config.go @@ -1,4 +1,4 @@ -package models +package twmodel import "encoding/xml" diff --git a/models/server_stats.go b/tw/twmodel/server_stats.go similarity index 79% rename from models/server_stats.go rename to tw/twmodel/server_stats.go index d3068ee..5a7c8d4 100644 --- a/models/server_stats.go +++ b/tw/twmodel/server_stats.go @@ -1,7 +1,8 @@ -package models +package twmodel import ( "context" + "github.com/Kichiyaki/gopgutil/v10" "time" "github.com/go-pg/pg/v10/orm" @@ -41,20 +42,24 @@ type ServerStatsFilter struct { } func (f *ServerStatsFilter) WhereWithAlias(q *orm.Query, alias string) (*orm.Query, error) { + if f == nil { + return q, nil + } + if !isZero(f.CreateDate) { - q = q.Where(buildConditionEquals(addAliasToColumnName("create_date", alias)), f.CreateDate) + q = q.Where(gopgutil.BuildConditionEquals(gopgutil.AddAliasToColumnName("create_date", alias)), f.CreateDate) } if !isZero(f.CreateDateGT) { - q = q.Where(buildConditionGT(addAliasToColumnName("create_date", alias)), f.CreateDateGT) + q = q.Where(gopgutil.BuildConditionGT(gopgutil.AddAliasToColumnName("create_date", alias)), f.CreateDateGT) } if !isZero(f.CreateDateGTE) { - q = q.Where(buildConditionGTE(addAliasToColumnName("create_date", alias)), f.CreateDateGTE) + q = q.Where(gopgutil.BuildConditionGTE(gopgutil.AddAliasToColumnName("create_date", alias)), f.CreateDateGTE) } if !isZero(f.CreateDateLT) { - q = q.Where(buildConditionLT(addAliasToColumnName("create_date", alias)), f.CreateDateLT) + q = q.Where(gopgutil.BuildConditionLT(gopgutil.AddAliasToColumnName("create_date", alias)), f.CreateDateLT) } if !isZero(f.CreateDateLTE) { - q = q.Where(buildConditionLTE(addAliasToColumnName("create_date", alias)), f.CreateDateLTE) + q = q.Where(gopgutil.BuildConditionLTE(gopgutil.AddAliasToColumnName("create_date", alias)), f.CreateDateLTE) } return q, nil diff --git a/models/special_server.go b/tw/twmodel/special_server.go similarity index 97% rename from models/special_server.go rename to tw/twmodel/special_server.go index 506fc16..15cc37e 100644 --- a/models/special_server.go +++ b/tw/twmodel/special_server.go @@ -1,4 +1,4 @@ -package models +package twmodel type SpecialServer struct { tableName struct{} `pg:"special_servers,alias:special_server"` diff --git a/models/tribe.go b/tw/twmodel/tribe.go similarity index 56% rename from models/tribe.go rename to tw/twmodel/tribe.go index ae0cc48..cc1ba94 100644 --- a/models/tribe.go +++ b/tw/twmodel/tribe.go @@ -1,6 +1,7 @@ -package models +package twmodel import ( + "github.com/Kichiyaki/gopgutil/v10" "time" "github.com/go-pg/pg/v10" @@ -41,24 +42,26 @@ type TribeFilterOr struct { } func (f *TribeFilterOr) WhereWithAlias(q *orm.Query, alias string) *orm.Query { - q = q.WhereGroup(func(q *orm.Query) (*orm.Query, error) { - if !isZero(f.ID) { - q = q.WhereOr(buildConditionArray(addAliasToColumnName("id", alias)), pg.Array(f.ID)) - } - if !isZero(f.Tag) { - q = q.WhereOr(buildConditionArray(addAliasToColumnName("tag", alias)), pg.Array(f.Tag)) - } - if !isZero(f.TagIEQ) { - q = q.WhereOr(buildConditionIEQ(addAliasToColumnName("tag", alias)), f.TagIEQ) - } - if !isZero(f.Name) { - q = q.WhereOr(buildConditionArray(addAliasToColumnName("name", alias)), pg.Array(f.Name)) - } - if !isZero(f.NameIEQ) { - q = q.WhereOr(buildConditionIEQ(addAliasToColumnName("name", alias)), f.NameIEQ) - } - return q, nil - }) + if f != nil { + q = q.WhereGroup(func(q *orm.Query) (*orm.Query, error) { + if !isZero(f.ID) { + q = q.WhereOr(gopgutil.BuildConditionArray(gopgutil.AddAliasToColumnName("id", alias)), pg.Array(f.ID)) + } + if !isZero(f.Tag) { + q = q.WhereOr(gopgutil.BuildConditionArray(gopgutil.AddAliasToColumnName("tag", alias)), pg.Array(f.Tag)) + } + if !isZero(f.TagIEQ) { + q = q.WhereOr(gopgutil.BuildConditionIEQ(gopgutil.AddAliasToColumnName("tag", alias)), f.TagIEQ) + } + if !isZero(f.Name) { + q = q.WhereOr(gopgutil.BuildConditionArray(gopgutil.AddAliasToColumnName("name", alias)), pg.Array(f.Name)) + } + if !isZero(f.NameIEQ) { + q = q.WhereOr(gopgutil.BuildConditionIEQ(gopgutil.AddAliasToColumnName("name", alias)), f.NameIEQ) + } + return q, nil + }) + } return q } @@ -131,169 +134,173 @@ type TribeFilter struct { } func (f *TribeFilter) WhereWithAlias(q *orm.Query, alias string) (*orm.Query, error) { + if f == nil { + return q, nil + } + if !isZero(f.ID) { - q = q.Where(buildConditionArray(addAliasToColumnName("id", alias)), pg.Array(f.ID)) + q = q.Where(gopgutil.BuildConditionArray(gopgutil.AddAliasToColumnName("id", alias)), pg.Array(f.ID)) } if !isZero(f.IDNEQ) { - q = q.Where(buildConditionNotInArray(addAliasToColumnName("id", alias)), pg.Array(f.IDNEQ)) + q = q.Where(gopgutil.BuildConditionNotInArray(gopgutil.AddAliasToColumnName("id", alias)), pg.Array(f.IDNEQ)) } if !isZero(f.Exists) { - q = q.Where(buildConditionEquals(addAliasToColumnName("exists", alias)), f.Exists) + q = q.Where(gopgutil.BuildConditionEquals(gopgutil.AddAliasToColumnName("exists", alias)), f.Exists) } if !isZero(f.Tag) { - q = q.Where(buildConditionArray(addAliasToColumnName("tag", alias)), pg.Array(f.Tag)) + q = q.Where(gopgutil.BuildConditionArray(gopgutil.AddAliasToColumnName("tag", alias)), pg.Array(f.Tag)) } if !isZero(f.TagNEQ) { - q = q.Where(buildConditionNotInArray(addAliasToColumnName("tag", alias)), pg.Array(f.TagNEQ)) + q = q.Where(gopgutil.BuildConditionNotInArray(gopgutil.AddAliasToColumnName("tag", alias)), pg.Array(f.TagNEQ)) } if !isZero(f.TagMATCH) { - q = q.Where(buildConditionMatch(addAliasToColumnName("tag", alias)), f.TagMATCH) + q = q.Where(gopgutil.BuildConditionMatch(gopgutil.AddAliasToColumnName("tag", alias)), f.TagMATCH) } if !isZero(f.TagIEQ) { - q = q.Where(buildConditionIEQ(addAliasToColumnName("tag", alias)), f.TagIEQ) + q = q.Where(gopgutil.BuildConditionIEQ(gopgutil.AddAliasToColumnName("tag", alias)), f.TagIEQ) } if !isZero(f.Name) { - q = q.Where(buildConditionArray(addAliasToColumnName("name", alias)), pg.Array(f.Name)) + q = q.Where(gopgutil.BuildConditionArray(gopgutil.AddAliasToColumnName("name", alias)), pg.Array(f.Name)) } if !isZero(f.NameNEQ) { - q = q.Where(buildConditionNotInArray(addAliasToColumnName("name", alias)), pg.Array(f.NameNEQ)) + q = q.Where(gopgutil.BuildConditionNotInArray(gopgutil.AddAliasToColumnName("name", alias)), pg.Array(f.NameNEQ)) } if !isZero(f.NameMATCH) { - q = q.Where(buildConditionMatch(addAliasToColumnName("name", alias)), f.NameMATCH) + q = q.Where(gopgutil.BuildConditionMatch(gopgutil.AddAliasToColumnName("name", alias)), f.NameMATCH) } if !isZero(f.NameIEQ) { - q = q.Where(buildConditionIEQ(addAliasToColumnName("name", alias)), f.NameIEQ) + q = q.Where(gopgutil.BuildConditionIEQ(gopgutil.AddAliasToColumnName("name", alias)), f.NameIEQ) } if !isZero(f.TotalMembers) { - q = q.Where(buildConditionEquals(addAliasToColumnName("total_members", alias)), f.TotalMembers) + q = q.Where(gopgutil.BuildConditionEquals(gopgutil.AddAliasToColumnName("total_members", alias)), f.TotalMembers) } if !isZero(f.TotalMembersGT) { - q = q.Where(buildConditionGT(addAliasToColumnName("total_members", alias)), f.TotalMembersGT) + q = q.Where(gopgutil.BuildConditionGT(gopgutil.AddAliasToColumnName("total_members", alias)), f.TotalMembersGT) } if !isZero(f.TotalMembersGTE) { - q = q.Where(buildConditionGTE(addAliasToColumnName("total_members", alias)), f.TotalMembersGTE) + q = q.Where(gopgutil.BuildConditionGTE(gopgutil.AddAliasToColumnName("total_members", alias)), f.TotalMembersGTE) } if !isZero(f.TotalMembersLT) { - q = q.Where(buildConditionLT(addAliasToColumnName("total_members", alias)), f.TotalMembersLT) + q = q.Where(gopgutil.BuildConditionLT(gopgutil.AddAliasToColumnName("total_members", alias)), f.TotalMembersLT) } if !isZero(f.TotalMembersLTE) { - q = q.Where(buildConditionLTE(addAliasToColumnName("total_members", alias)), f.TotalMembersLTE) + q = q.Where(gopgutil.BuildConditionLTE(gopgutil.AddAliasToColumnName("total_members", alias)), f.TotalMembersLTE) } if !isZero(f.TotalVillages) { - q = q.Where(buildConditionEquals(addAliasToColumnName("total_villages", alias)), f.TotalVillages) + q = q.Where(gopgutil.BuildConditionEquals(gopgutil.AddAliasToColumnName("total_villages", alias)), f.TotalVillages) } if !isZero(f.TotalVillagesGT) { - q = q.Where(buildConditionGT(addAliasToColumnName("total_villages", alias)), f.TotalVillagesGT) + q = q.Where(gopgutil.BuildConditionGT(gopgutil.AddAliasToColumnName("total_villages", alias)), f.TotalVillagesGT) } if !isZero(f.TotalVillagesGTE) { - q = q.Where(buildConditionGTE(addAliasToColumnName("total_villages", alias)), f.TotalVillagesGTE) + q = q.Where(gopgutil.BuildConditionGTE(gopgutil.AddAliasToColumnName("total_villages", alias)), f.TotalVillagesGTE) } if !isZero(f.TotalVillagesLT) { - q = q.Where(buildConditionLT(addAliasToColumnName("total_villages", alias)), f.TotalVillagesLT) + q = q.Where(gopgutil.BuildConditionLT(gopgutil.AddAliasToColumnName("total_villages", alias)), f.TotalVillagesLT) } if !isZero(f.TotalVillagesLTE) { - q = q.Where(buildConditionLTE(addAliasToColumnName("total_villages", alias)), f.TotalVillagesLTE) + q = q.Where(gopgutil.BuildConditionLTE(gopgutil.AddAliasToColumnName("total_villages", alias)), f.TotalVillagesLTE) } if !isZero(f.Points) { - q = q.Where(buildConditionEquals(addAliasToColumnName("points", alias)), f.Points) + q = q.Where(gopgutil.BuildConditionEquals(gopgutil.AddAliasToColumnName("points", alias)), f.Points) } if !isZero(f.PointsGT) { - q = q.Where(buildConditionGT(addAliasToColumnName("points", alias)), f.PointsGT) + q = q.Where(gopgutil.BuildConditionGT(gopgutil.AddAliasToColumnName("points", alias)), f.PointsGT) } if !isZero(f.PointsGTE) { - q = q.Where(buildConditionGTE(addAliasToColumnName("points", alias)), f.PointsGTE) + q = q.Where(gopgutil.BuildConditionGTE(gopgutil.AddAliasToColumnName("points", alias)), f.PointsGTE) } if !isZero(f.PointsLT) { - q = q.Where(buildConditionLT(addAliasToColumnName("points", alias)), f.PointsLT) + q = q.Where(gopgutil.BuildConditionLT(gopgutil.AddAliasToColumnName("points", alias)), f.PointsLT) } if !isZero(f.PointsLTE) { - q = q.Where(buildConditionLTE(addAliasToColumnName("points", alias)), f.PointsLTE) + q = q.Where(gopgutil.BuildConditionLTE(gopgutil.AddAliasToColumnName("points", alias)), f.PointsLTE) } if !isZero(f.AllPoints) { - q = q.Where(buildConditionEquals(addAliasToColumnName("all_points", alias)), f.AllPoints) + q = q.Where(gopgutil.BuildConditionEquals(gopgutil.AddAliasToColumnName("all_points", alias)), f.AllPoints) } if !isZero(f.AllPointsGT) { - q = q.Where(buildConditionGT(addAliasToColumnName("all_points", alias)), f.AllPointsGT) + q = q.Where(gopgutil.BuildConditionGT(gopgutil.AddAliasToColumnName("all_points", alias)), f.AllPointsGT) } if !isZero(f.AllPointsGTE) { - q = q.Where(buildConditionGTE(addAliasToColumnName("all_points", alias)), f.AllPointsGTE) + q = q.Where(gopgutil.BuildConditionGTE(gopgutil.AddAliasToColumnName("all_points", alias)), f.AllPointsGTE) } if !isZero(f.AllPointsLT) { - q = q.Where(buildConditionLT(addAliasToColumnName("all_points", alias)), f.AllPointsLT) + q = q.Where(gopgutil.BuildConditionLT(gopgutil.AddAliasToColumnName("all_points", alias)), f.AllPointsLT) } if !isZero(f.AllPointsLTE) { - q = q.Where(buildConditionLTE(addAliasToColumnName("all_points", alias)), f.AllPointsLTE) + q = q.Where(gopgutil.BuildConditionLTE(gopgutil.AddAliasToColumnName("all_points", alias)), f.AllPointsLTE) } if !isZero(f.Rank) { - q = q.Where(buildConditionEquals(addAliasToColumnName("rank", alias)), f.Rank) + q = q.Where(gopgutil.BuildConditionEquals(gopgutil.AddAliasToColumnName("rank", alias)), f.Rank) } if !isZero(f.RankGT) { - q = q.Where(buildConditionGT(addAliasToColumnName("rank", alias)), f.RankGT) + q = q.Where(gopgutil.BuildConditionGT(gopgutil.AddAliasToColumnName("rank", alias)), f.RankGT) } if !isZero(f.RankGTE) { - q = q.Where(buildConditionGTE(addAliasToColumnName("rank", alias)), f.RankGTE) + q = q.Where(gopgutil.BuildConditionGTE(gopgutil.AddAliasToColumnName("rank", alias)), f.RankGTE) } if !isZero(f.RankLT) { - q = q.Where(buildConditionLT(addAliasToColumnName("rank", alias)), f.RankLT) + q = q.Where(gopgutil.BuildConditionLT(gopgutil.AddAliasToColumnName("rank", alias)), f.RankLT) } if !isZero(f.RankLTE) { - q = q.Where(buildConditionLTE(addAliasToColumnName("rank", alias)), f.RankLTE) + q = q.Where(gopgutil.BuildConditionLTE(gopgutil.AddAliasToColumnName("rank", alias)), f.RankLTE) } if !isZero(f.Dominance) { - q = q.Where(buildConditionEquals(addAliasToColumnName("dominance", alias)), f.Dominance) + q = q.Where(gopgutil.BuildConditionEquals(gopgutil.AddAliasToColumnName("dominance", alias)), f.Dominance) } if !isZero(f.DominanceGT) { - q = q.Where(buildConditionGT(addAliasToColumnName("dominance", alias)), f.DominanceGT) + q = q.Where(gopgutil.BuildConditionGT(gopgutil.AddAliasToColumnName("dominance", alias)), f.DominanceGT) } if !isZero(f.DominanceGTE) { - q = q.Where(buildConditionGTE(addAliasToColumnName("dominance", alias)), f.DominanceGTE) + q = q.Where(gopgutil.BuildConditionGTE(gopgutil.AddAliasToColumnName("dominance", alias)), f.DominanceGTE) } if !isZero(f.DominanceLT) { - q = q.Where(buildConditionLT(addAliasToColumnName("dominance", alias)), f.DominanceLT) + q = q.Where(gopgutil.BuildConditionLT(gopgutil.AddAliasToColumnName("dominance", alias)), f.DominanceLT) } if !isZero(f.DominanceLTE) { - q = q.Where(buildConditionLTE(addAliasToColumnName("dominance", alias)), f.DominanceLTE) + q = q.Where(gopgutil.BuildConditionLTE(gopgutil.AddAliasToColumnName("dominance", alias)), f.DominanceLTE) } if !isZero(f.CreatedAt) { - q = q.Where(buildConditionEquals(addAliasToColumnName("created_at", alias)), f.CreatedAt) + q = q.Where(gopgutil.BuildConditionEquals(gopgutil.AddAliasToColumnName("created_at", alias)), f.CreatedAt) } if !isZero(f.CreatedAtGT) { - q = q.Where(buildConditionGT(addAliasToColumnName("created_at", alias)), f.CreatedAtGT) + q = q.Where(gopgutil.BuildConditionGT(gopgutil.AddAliasToColumnName("created_at", alias)), f.CreatedAtGT) } if !isZero(f.CreatedAtGTE) { - q = q.Where(buildConditionGTE(addAliasToColumnName("created_at", alias)), f.CreatedAtGTE) + q = q.Where(gopgutil.BuildConditionGTE(gopgutil.AddAliasToColumnName("created_at", alias)), f.CreatedAtGTE) } if !isZero(f.CreatedAtLT) { - q = q.Where(buildConditionLT(addAliasToColumnName("created_at", alias)), f.CreatedAtLT) + q = q.Where(gopgutil.BuildConditionLT(gopgutil.AddAliasToColumnName("created_at", alias)), f.CreatedAtLT) } if !isZero(f.CreatedAtLTE) { - q = q.Where(buildConditionLTE(addAliasToColumnName("created_at", alias)), f.CreatedAtLTE) + q = q.Where(gopgutil.BuildConditionLTE(gopgutil.AddAliasToColumnName("created_at", alias)), f.CreatedAtLTE) } if !isZero(f.DeletedAt) { - q = q.Where(buildConditionEquals(addAliasToColumnName("deleted_at", alias)), f.DeletedAt) + q = q.Where(gopgutil.BuildConditionEquals(gopgutil.AddAliasToColumnName("deleted_at", alias)), f.DeletedAt) } if !isZero(f.DeletedAtGT) { - q = q.Where(buildConditionGT(addAliasToColumnName("deleted_at", alias)), f.DeletedAtGT) + q = q.Where(gopgutil.BuildConditionGT(gopgutil.AddAliasToColumnName("deleted_at", alias)), f.DeletedAtGT) } if !isZero(f.DeletedAtGTE) { - q = q.Where(buildConditionGTE(addAliasToColumnName("deleted_at", alias)), f.DeletedAtGTE) + q = q.Where(gopgutil.BuildConditionGTE(gopgutil.AddAliasToColumnName("deleted_at", alias)), f.DeletedAtGTE) } if !isZero(f.DeletedAtLT) { - q = q.Where(buildConditionLT(addAliasToColumnName("deleted_at", alias)), f.DeletedAtLT) + q = q.Where(gopgutil.BuildConditionLT(gopgutil.AddAliasToColumnName("deleted_at", alias)), f.DeletedAtLT) } if !isZero(f.DeletedAtLTE) { - q = q.Where(buildConditionLTE(addAliasToColumnName("deleted_at", alias)), f.DeletedAtLTE) + q = q.Where(gopgutil.BuildConditionLTE(gopgutil.AddAliasToColumnName("deleted_at", alias)), f.DeletedAtLTE) } if f.Or != nil { diff --git a/models/tribe_change.go b/tw/twmodel/tribe_change.go similarity index 56% rename from models/tribe_change.go rename to tw/twmodel/tribe_change.go index 09d88d4..c58c6d5 100644 --- a/models/tribe_change.go +++ b/tw/twmodel/tribe_change.go @@ -1,6 +1,7 @@ -package models +package twmodel import ( + "github.com/Kichiyaki/gopgutil/v10" "time" "github.com/go-pg/pg/v10" @@ -26,15 +27,17 @@ type TribeChangeFilterOr struct { } func (f *TribeChangeFilterOr) WhereWithAlias(q *orm.Query, alias string) *orm.Query { - q = q.WhereGroup(func(q *orm.Query) (*orm.Query, error) { - if !isZero(f.OldTribeID) { - q = q.WhereOr(buildConditionArray(addAliasToColumnName("old_tribe_id", alias)), pg.Array(f.OldTribeID)) - } - if !isZero(f.NewTribeID) { - q = q.WhereOr(buildConditionArray(addAliasToColumnName("new_tribe_id", alias)), pg.Array(f.NewTribeID)) - } - return q, nil - }) + if f != nil { + q = q.WhereGroup(func(q *orm.Query) (*orm.Query, error) { + if !isZero(f.OldTribeID) { + q = q.WhereOr(gopgutil.BuildConditionArray(gopgutil.AddAliasToColumnName("old_tribe_id", alias)), pg.Array(f.OldTribeID)) + } + if !isZero(f.NewTribeID) { + q = q.WhereOr(gopgutil.BuildConditionArray(gopgutil.AddAliasToColumnName("new_tribe_id", alias)), pg.Array(f.NewTribeID)) + } + return q, nil + }) + } return q } @@ -61,41 +64,64 @@ type TribeChangeFilter struct { } func (f *TribeChangeFilter) WhereWithAlias(q *orm.Query, alias string) (*orm.Query, error) { + if f == nil { + return q, nil + } + + var err error if !isZero(f.PlayerID) { - q = q.Where(buildConditionArray(addAliasToColumnName("player_id", alias)), pg.Array(f.PlayerID)) + q = q.Where(gopgutil.BuildConditionArray(gopgutil.AddAliasToColumnName("player_id", alias)), pg.Array(f.PlayerID)) } if !isZero(f.PlayerIDNEQ) { - q = q.Where(buildConditionNotInArray(addAliasToColumnName("player_id", alias)), pg.Array(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(buildConditionArray(addAliasToColumnName("old_tribe_id", alias)), pg.Array(f.OldTribeID)) + q = q.Where(gopgutil.BuildConditionArray(gopgutil.AddAliasToColumnName("old_tribe_id", alias)), pg.Array(f.OldTribeID)) } if !isZero(f.OldTribeIDNEQ) { - q = q.Where(buildConditionNotInArray(addAliasToColumnName("old_tribe_id", alias)), pg.Array(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(buildConditionArray(addAliasToColumnName("new_tribe_id", alias)), pg.Array(f.NewTribeID)) + q = q.Where(gopgutil.BuildConditionArray(gopgutil.AddAliasToColumnName("new_tribe_id", alias)), pg.Array(f.NewTribeID)) } if !isZero(f.NewTribeIDNEQ) { - q = q.Where(buildConditionNotInArray(addAliasToColumnName("new_tribe_id", alias)), pg.Array(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(buildConditionEquals(addAliasToColumnName("created_at", alias)), f.CreatedAt) + q = q.Where(gopgutil.BuildConditionEquals(gopgutil.AddAliasToColumnName("created_at", alias)), f.CreatedAt) } if !isZero(f.CreatedAtGT) { - q = q.Where(buildConditionGT(addAliasToColumnName("created_at", alias)), f.CreatedAtGT) + q = q.Where(gopgutil.BuildConditionGT(gopgutil.AddAliasToColumnName("created_at", alias)), f.CreatedAtGT) } if !isZero(f.CreatedAtGTE) { - q = q.Where(buildConditionGTE(addAliasToColumnName("created_at", alias)), f.CreatedAtGTE) + q = q.Where(gopgutil.BuildConditionGTE(gopgutil.AddAliasToColumnName("created_at", alias)), f.CreatedAtGTE) } if !isZero(f.CreatedAtLT) { - q = q.Where(buildConditionLT(addAliasToColumnName("created_at", alias)), f.CreatedAtLT) + q = q.Where(gopgutil.BuildConditionLT(gopgutil.AddAliasToColumnName("created_at", alias)), f.CreatedAtLT) } if !isZero(f.CreatedAtLTE) { - q = q.Where(buildConditionLTE(addAliasToColumnName("created_at", alias)), f.CreatedAtLTE) + q = q.Where(gopgutil.BuildConditionLTE(gopgutil.AddAliasToColumnName("created_at", alias)), f.CreatedAtLTE) } if f.Or != nil { @@ -108,54 +134,3 @@ 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") } - -type TribeChangeRelationshipAndSortAppender struct { - Filter *TribeChangeFilter - Sort []string -} - -func (a *TribeChangeRelationshipAndSortAppender) Append(q *orm.Query) (*orm.Query, error) { - var err error - playerRequired := findStringWithPrefix(a.Sort, "player.") != "" - if a.Filter.PlayerFilter != nil { - q, err = a.Filter.PlayerFilter.WhereWithAlias(q, "player") - if err != nil { - return q, err - } - playerRequired = true - } - - oldTribeRequired := findStringWithPrefix(a.Sort, "old_tribe.") != "" - if a.Filter.OldTribeFilter != nil { - q, err = a.Filter.OldTribeFilter.WhereWithAlias(q, "old_tribe") - if err != nil { - return q, err - } - oldTribeRequired = true - } - - newTribeRequired := findStringWithPrefix(a.Sort, "new_tribe.") != "" - if a.Filter.NewTribeFilter != nil { - q, err = a.Filter.NewTribeFilter.WhereWithAlias(q, "new_tribe") - if err != nil { - return q, err - } - newTribeRequired = true - } - - if !isZero(a.Sort) { - q = q.Order(a.Sort...) - } - - if playerRequired { - q = q.Relation("Tribe._") - } - if oldTribeRequired { - q = q.Relation("OldTribe._") - } - if newTribeRequired { - q = q.Relation("NewTribe._") - } - - return q, nil -} diff --git a/models/tribe_history.go b/tw/twmodel/tribe_history.go similarity index 64% rename from models/tribe_history.go rename to tw/twmodel/tribe_history.go index 196b7d8..ab3d57f 100644 --- a/models/tribe_history.go +++ b/tw/twmodel/tribe_history.go @@ -1,6 +1,7 @@ -package models +package twmodel import ( + "github.com/Kichiyaki/gopgutil/v10" "time" "github.com/go-pg/pg/v10" @@ -37,27 +38,34 @@ type TribeHistoryFilter struct { } func (f *TribeHistoryFilter) WhereWithAlias(q *orm.Query, alias string) (*orm.Query, error) { + if f == nil { + return q, nil + } + if !isZero(f.CreateDate) { - q = q.Where(buildConditionEquals(addAliasToColumnName("create_date", alias)), f.CreateDate) + q = q.Where(gopgutil.BuildConditionEquals(gopgutil.AddAliasToColumnName("create_date", alias)), f.CreateDate) } if !isZero(f.CreateDateGT) { - q = q.Where(buildConditionGT(addAliasToColumnName("create_date", alias)), f.CreateDateGT) + q = q.Where(gopgutil.BuildConditionGT(gopgutil.AddAliasToColumnName("create_date", alias)), f.CreateDateGT) } if !isZero(f.CreateDateGTE) { - q = q.Where(buildConditionGTE(addAliasToColumnName("create_date", alias)), f.CreateDateGTE) + q = q.Where(gopgutil.BuildConditionGTE(gopgutil.AddAliasToColumnName("create_date", alias)), f.CreateDateGTE) } if !isZero(f.CreateDateLT) { - q = q.Where(buildConditionLT(addAliasToColumnName("create_date", alias)), f.CreateDateLT) + q = q.Where(gopgutil.BuildConditionLT(gopgutil.AddAliasToColumnName("create_date", alias)), f.CreateDateLT) } if !isZero(f.CreateDateLTE) { - q = q.Where(buildConditionLTE(addAliasToColumnName("create_date", alias)), f.CreateDateLTE) + q = q.Where(gopgutil.BuildConditionLTE(gopgutil.AddAliasToColumnName("create_date", alias)), f.CreateDateLTE) } if !isZero(f.TribeID) { - q = q.Where(buildConditionArray(addAliasToColumnName("tribe_id", alias)), pg.Array(f.TribeID)) + q = q.Where(gopgutil.BuildConditionArray(gopgutil.AddAliasToColumnName("tribe_id", alias)), pg.Array(f.TribeID)) } if !isZero(f.TribeIDNEQ) { - q = q.Where(buildConditionNotInArray(addAliasToColumnName("tribe_id", alias)), pg.Array(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 @@ -66,30 +74,3 @@ 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") } - -type TribeHistoryRelationshipAndSortAppender struct { - Filter *TribeHistoryFilter - Sort []string -} - -func (a *TribeHistoryRelationshipAndSortAppender) Append(q *orm.Query) (*orm.Query, error) { - var err error - tribeRequired := findStringWithPrefix(a.Sort, "tribe.") != "" - if a.Filter.TribeFilter != nil { - q, err = a.Filter.TribeFilter.WhereWithAlias(q, "tribe") - if err != nil { - return q, err - } - tribeRequired = true - } - - if !isZero(a.Sort) { - q = q.Order(a.Sort...) - } - - if tribeRequired { - q = q.Relation("Tribe._") - } - - return q, nil -} diff --git a/models/unit_config.go b/tw/twmodel/unit_config.go similarity index 99% rename from models/unit_config.go rename to tw/twmodel/unit_config.go index 9e3dbe6..e627d74 100644 --- a/models/unit_config.go +++ b/tw/twmodel/unit_config.go @@ -1,4 +1,4 @@ -package models +package twmodel import "encoding/xml" diff --git a/models/version.go b/tw/twmodel/version.go similarity index 76% rename from models/version.go rename to tw/twmodel/version.go index 507cef0..7b5e9b7 100644 --- a/models/version.go +++ b/tw/twmodel/version.go @@ -1,7 +1,8 @@ -package models +package twmodel import ( "fmt" + "github.com/Kichiyaki/gopgutil/v10" "io" "strconv" "strings" @@ -34,6 +35,13 @@ const ( VersionCodeSK VersionCode = "sk" ) +func VersionCodeFromServerKey(key string) VersionCode { + if len(key) < 2 { + return "" + } + return VersionCode(key[0:2]) +} + func (vc VersionCode) IsValid() bool { switch vc { case VersionCodePL, @@ -102,24 +110,28 @@ type VersionFilter struct { } func (f *VersionFilter) WhereWithAlias(q *orm.Query, alias string) (*orm.Query, error) { + if f == nil { + return q, nil + } + if !isZero(f.Code) { - q = q.Where(buildConditionArray(addAliasToColumnName("code", alias)), pg.Array(f.Code)) + q = q.Where(gopgutil.BuildConditionArray(gopgutil.AddAliasToColumnName("code", alias)), pg.Array(f.Code)) } if !isZero(f.CodeNEQ) { - q = q.Where(buildConditionNotInArray(addAliasToColumnName("code", alias)), pg.Array(f.CodeNEQ)) + q = q.Where(gopgutil.BuildConditionNotInArray(gopgutil.AddAliasToColumnName("code", alias)), pg.Array(f.CodeNEQ)) } if !isZero(f.Host) { - q = q.Where(buildConditionArray(addAliasToColumnName("host", alias)), pg.Array(f.Host)) + q = q.Where(gopgutil.BuildConditionArray(gopgutil.AddAliasToColumnName("host", alias)), pg.Array(f.Host)) } if !isZero(f.HostNEQ) { - q = q.Where(buildConditionNotInArray(addAliasToColumnName("host", alias)), pg.Array(f.HostNEQ)) + q = q.Where(gopgutil.BuildConditionNotInArray(gopgutil.AddAliasToColumnName("host", alias)), pg.Array(f.HostNEQ)) } if !isZero(f.HostMATCH) { - q = q.Where(buildConditionMatch(addAliasToColumnName("host", alias)), f.HostMATCH) + q = q.Where(gopgutil.BuildConditionMatch(gopgutil.AddAliasToColumnName("host", alias)), f.HostMATCH) } if !isZero(f.HostIEQ) { - q = q.Where(buildConditionIEQ(addAliasToColumnName("host", alias)), f.HostIEQ) + q = q.Where(gopgutil.BuildConditionIEQ(gopgutil.AddAliasToColumnName("host", alias)), f.HostIEQ) } return q, nil diff --git a/tw/twmodel/village.go b/tw/twmodel/village.go new file mode 100644 index 0000000..9d2dca6 --- /dev/null +++ b/tw/twmodel/village.go @@ -0,0 +1,199 @@ +package twmodel + +import ( + "fmt" + "github.com/Kichiyaki/gopgutil/v10" + "github.com/go-pg/pg/v10" + "github.com/go-pg/pg/v10/orm" + "strconv" +) + +type Village struct { + tableName struct{} `pg:"?SERVER.villages,alias:village"` + + ID int `json:"id" pg:"type:bigint,pk" gqlgen:"id"` + Name string `json:"name" gqlgen:"name"` + Points int `json:"points" pg:",use_zero" gqlgen:"points"` + X int `json:"x" pg:",use_zero" gqlgen:"x"` + Y int `json:"y" pg:",use_zero" gqlgen:"y"` + Bonus int `json:"bonus" pg:",use_zero" gqlgen:"bonus"` + + PlayerID int `json:"-" pg:",use_zero" gqlgen:"playerID"` + Player *Player `json:"player,omitempty" gqlgen:"-" pg:"rel:has-one"` +} + +func (v *Village) Continent() string { + if v == nil { + return "" + } + return fmt.Sprintf("K%c%c", strconv.FormatInt(int64(v.Y), 10)[0], strconv.FormatInt(int64(v.X), 10)[0]) +} + +func (v *Village) FullName() string { + return fmt.Sprintf("%s (%d|%d) %s", + v.Name, + v.X, + v.Y, + v.Continent()) +} + +type VillageFilter struct { + ID []int `json:"id" gqlgen:"id"` + IDNEQ []int `json:"idNEQ" gqlgen:"idNEQ"` + + Name []string `json:"name" gqlgen:"name"` + NameNEQ []string `json:"nameNEQ" gqlgen:"nameNEQ"` + NameMATCH string `json:"nameMATCH" gqlgen:"nameMATCH"` + NameIEQ string `json:"nameIEQ" gqlgen:"nameIEQ"` + + XGT int `json:"xGT" gqlgen:"xGT"` + XGTE int `json:"xGTE" gqlgen:"xGTE"` + XLT int `json:"xLT" gqlgen:"xLT"` + XLTE int `json:"xLTE" gqlgen:"xLTE"` + YGT int `json:"yGT" gqlgen:"yGT"` + YGTE int `json:"yGTE" gqlgen:"yGTE"` + YLT int `json:"yLT" gqlgen:"yLT"` + YLTE int `json:"yLTE" gqlgen:"yLTE"` + XY []string `json:"xy" gqlgen:"xy"` + + Points int `json:"points" gqlgen:"points"` + PointsGT int `json:"pointsGT" gqlgen:"pointsGT"` + PointsGTE int `json:"pointsGTE" gqlgen:"pointsGTE"` + PointsLT int `json:"pointsLT" gqlgen:"pointsLT"` + PointsLTE int `json:"pointsLTE" gqlgen:"pointsLTE"` + + Bonus int `json:"bonus" gqlgen:"bonus"` + BonusGT int `json:"bonusGT" gqlgen:"bonusGT"` + BonusGTE int `json:"bonusGTE" gqlgen:"bonusGTE"` + BonusLT int `json:"bonusLT" gqlgen:"bonusLT"` + BonusLTE int `json:"bonusLTE" gqlgen:"bonusLTE"` + + PlayerID []int `json:"playerID" gqlgen:"playerID"` + PlayerIDNEQ []int `json:"playerIDNEQ" gqlgen:"playerIDNEQ"` + PlayerFilter *PlayerFilter `json:"playerFilter" gqlgen:"playerFilter"` +} + +func (f *VillageFilter) WhereWithAlias(q *orm.Query, alias, playerRelationName, playerAlias, tribeRelationName, tribeAlias string) (*orm.Query, error) { + if f == nil { + return q, nil + } + + if !isZero(f.ID) { + q = q.Where(gopgutil.BuildConditionArray(gopgutil.AddAliasToColumnName("id", alias)), pg.Array(f.ID)) + } + if !isZero(f.IDNEQ) { + q = q.Where(gopgutil.BuildConditionNotInArray(gopgutil.AddAliasToColumnName("id", alias)), pg.Array(f.IDNEQ)) + } + + if !isZero(f.Name) { + q = q.Where(gopgutil.BuildConditionArray(gopgutil.AddAliasToColumnName("name", alias)), pg.Array(f.Name)) + } + if !isZero(f.NameNEQ) { + q = q.Where(gopgutil.BuildConditionNotInArray(gopgutil.AddAliasToColumnName("name", alias)), pg.Array(f.NameNEQ)) + } + if !isZero(f.NameMATCH) { + q = q.Where(gopgutil.BuildConditionMatch(gopgutil.AddAliasToColumnName("name", alias)), f.NameMATCH) + } + if !isZero(f.NameIEQ) { + q = q.Where(gopgutil.BuildConditionIEQ(gopgutil.AddAliasToColumnName("name", alias)), f.NameIEQ) + } + + if !isZero(f.XGT) { + q = q.Where(gopgutil.BuildConditionGT(gopgutil.AddAliasToColumnName("x", alias)), f.XGT) + } + if !isZero(f.XGTE) { + q = q.Where(gopgutil.BuildConditionGTE(gopgutil.AddAliasToColumnName("x", alias)), f.XGTE) + } + if !isZero(f.XLT) { + q = q.Where(gopgutil.BuildConditionLT(gopgutil.AddAliasToColumnName("x", alias)), f.XLT) + } + if !isZero(f.XLTE) { + q = q.Where(gopgutil.BuildConditionLTE(gopgutil.AddAliasToColumnName("x", alias)), f.XLTE) + } + + if !isZero(f.YGT) { + q = q.Where(gopgutil.BuildConditionGT(gopgutil.AddAliasToColumnName("y", alias)), f.YGT) + } + if !isZero(f.YGTE) { + q = q.Where(gopgutil.BuildConditionGTE(gopgutil.AddAliasToColumnName("y", alias)), f.YGTE) + } + if !isZero(f.YLT) { + q = q.Where(gopgutil.BuildConditionLT(gopgutil.AddAliasToColumnName("y", alias)), f.YLT) + } + if !isZero(f.YLTE) { + q = q.Where(gopgutil.BuildConditionLTE(gopgutil.AddAliasToColumnName("y", alias)), f.YLTE) + } + + if !isZero(f.XY) { + q = q.WhereGroup(func(q *orm.Query) (*orm.Query, error) { + for _, xy := range f.XY { + parsed, err := ParseCoords(xy) + if err != nil { + continue + } + q = q.WhereOrGroup(func(q *orm.Query) (*orm.Query, error) { + q = q.Where("x = ?", parsed.X) + q = q.Where("y = ?", parsed.Y) + return q, nil + }) + } + return q, nil + }) + } + + if !isZero(f.Points) { + q = q.Where(gopgutil.BuildConditionEquals(gopgutil.AddAliasToColumnName("points", alias)), f.Points) + } + if !isZero(f.PointsGT) { + q = q.Where(gopgutil.BuildConditionGT(gopgutil.AddAliasToColumnName("points", alias)), f.PointsGT) + } + if !isZero(f.PointsGTE) { + q = q.Where(gopgutil.BuildConditionGTE(gopgutil.AddAliasToColumnName("points", alias)), f.PointsGTE) + } + if !isZero(f.PointsLT) { + q = q.Where(gopgutil.BuildConditionLT(gopgutil.AddAliasToColumnName("points", alias)), f.PointsLT) + } + if !isZero(f.PointsLTE) { + q = q.Where(gopgutil.BuildConditionLTE(gopgutil.AddAliasToColumnName("points", alias)), f.PointsLTE) + } + + if !isZero(f.Bonus) { + q = q.Where(gopgutil.BuildConditionEquals(gopgutil.AddAliasToColumnName("bonus", alias)), f.Bonus) + } + if !isZero(f.BonusGT) { + q = q.Where(gopgutil.BuildConditionGT(gopgutil.AddAliasToColumnName("bonus", alias)), f.BonusGT) + } + if !isZero(f.BonusGTE) { + q = q.Where(gopgutil.BuildConditionGTE(gopgutil.AddAliasToColumnName("bonus", alias)), f.BonusGTE) + } + if !isZero(f.BonusLT) { + q = q.Where(gopgutil.BuildConditionLT(gopgutil.AddAliasToColumnName("bonus", alias)), f.BonusLT) + } + if !isZero(f.BonusLTE) { + q = q.Where(gopgutil.BuildConditionLTE(gopgutil.AddAliasToColumnName("bonus", alias)), f.BonusLTE) + } + + 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 && 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", + ) +} diff --git a/tw/build_url.go b/tw/twurlbuilder/build_url.go similarity index 97% rename from tw/build_url.go rename to tw/twurlbuilder/build_url.go index 8b57ab7..fcbb354 100644 --- a/tw/build_url.go +++ b/tw/twurlbuilder/build_url.go @@ -1,4 +1,4 @@ -package tw +package twurlbuilder import "fmt" diff --git a/tw/version_code_from_server_key.go b/tw/version_code_from_server_key.go deleted file mode 100644 index ec0d73a..0000000 --- a/tw/version_code_from_server_key.go +++ /dev/null @@ -1,12 +0,0 @@ -package tw - -import ( - "github.com/tribalwarshelp/shared/models" -) - -func VersionCodeFromServerKey(key string) models.VersionCode { - if len(key) < 2 { - return "" - } - return models.VersionCode(key[0:2]) -}