Skip to content

Commit

Permalink
Add has_{title, women_title, other_titles} filter
Browse files Browse the repository at this point in the history
  • Loading branch information
lenguyenthanh committed Feb 18, 2025
1 parent bc76539 commit 7edfbc2
Show file tree
Hide file tree
Showing 6 changed files with 62 additions and 15 deletions.
6 changes: 6 additions & 0 deletions modules/api/src/main/smithy/_global.smithy
Original file line number Diff line number Diff line change
Expand Up @@ -225,4 +225,10 @@ structure FilterMixin {
birthYearMin: BirthYear
@httpQuery("birth_year[lte]")
birthYearMax: BirthYear
@httpQuery("has_title")
hasTitle: Boolean
@httpQuery("has_women_title")
hasWomenTitle: Boolean
@httpQuery("has_other_title")
hasOtherTitle: Boolean
}
10 changes: 8 additions & 2 deletions modules/backend/src/main/scala/service.federation.scala
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,10 @@ class FederationServiceImpl(db: Db)(using Logger[IO]) extends FederationService[
otherTitles: Option[List[OtherTitle]],
gender: Option[Gender],
birthYearMin: Option[BirthYear],
birthYearMax: Option[BirthYear]
birthYearMax: Option[BirthYear],
hasTitle: Option[Boolean],
hasWomenTitle: Option[Boolean],
hasOtherTitle: Option[Boolean]
): IO[GetFederationPlayersByIdOutput] =

val paging = Models.Pagination(page, pageSize)
Expand All @@ -58,7 +61,10 @@ class FederationServiceImpl(db: Db)(using Logger[IO]) extends FederationService[
otherTitles.map(_.map(_.to[domain.OtherTitle])),
gender.map(_.to[domain.Gender]),
birthYearMin,
birthYearMax
birthYearMax,
hasTitle,
hasWomenTitle,
hasOtherTitle
)
db.allPlayers(sorting, paging, filter)
.handleErrorWith: e =>
Expand Down
9 changes: 8 additions & 1 deletion modules/backend/src/main/scala/service.player.scala
Original file line number Diff line number Diff line change
Expand Up @@ -43,8 +43,12 @@ class PlayerServiceImpl(db: Db)(using Logger[IO]) extends PlayerService[IO]:
gender: Option[Gender],
birthYearMin: Option[BirthYear],
birthYearMax: Option[BirthYear],
hasTitle: Option[Boolean],
hasWomenTitle: Option[Boolean],
hasOtherTitle: Option[Boolean],
federationId: Option[FederationId]
): IO[GetPlayersOutput] =

val paging = Models.Pagination(page, pageSize)
val sorting = Models.Sorting.fromOption(sortBy.map(_.to[Models.SortBy]), order.map(_.to[Models.Order]))
val filter = Models.PlayerFilter(
Expand All @@ -58,7 +62,10 @@ class PlayerServiceImpl(db: Db)(using Logger[IO]) extends PlayerService[IO]:
otherTitles.map(_.map(_.to[domain.OtherTitle])),
gender.map(_.to[domain.Gender]),
birthYearMin,
birthYearMax
birthYearMax,
hasTitle,
hasWomenTitle,
hasOtherTitle
)
db.allPlayers(sorting, paging, filter)
.handleErrorWith: e =>
Expand Down
26 changes: 16 additions & 10 deletions modules/backend/src/test/scala/Arbitraries.scala
Original file line number Diff line number Diff line change
Expand Up @@ -126,15 +126,18 @@ object Arbitraries:

given Arbitrary[PlayerFilter] = Arbitrary:
for
name <- Gen.option(genName) // real name
isActive <- genIsActive
triple <- Arbitrary.arbitrary[(RatingRange, RatingRange, RatingRange)]
federationId <- genFederationId
titles <- genTitles
otherTitles <- genOtherTitles
gender <- genGender
minBirthYear <- genBirthYear
maxBirthYear <- genBirthYear
name <- Gen.option(genName) // real name
isActive <- genIsActive
triple <- Arbitrary.arbitrary[(RatingRange, RatingRange, RatingRange)]
federationId <- genFederationId
titles <- genTitles
otherTitles <- genOtherTitles
gender <- genGender
minBirthYear <- genBirthYear
maxBirthYear <- genBirthYear
hasTitle <- genIsActive
hasWomenTitle <- genIsActive
hasOtherTitle <- genIsActive
yield PlayerFilter(
name,
isActive,
Expand All @@ -146,5 +149,8 @@ object Arbitraries:
otherTitles,
gender,
minBirthYear,
maxBirthYear
maxBirthYear,
hasTitle,
hasWomenTitle,
hasOtherTitle
)
18 changes: 17 additions & 1 deletion modules/db/src/main/scala/Db.scala
Original file line number Diff line number Diff line change
Expand Up @@ -223,7 +223,10 @@ private object Sql:
filter.titles.map(xs => playersByTitles(xs.size)(xs, xs)),
filter.otherTitles.map(xs => playersByOtherTitles(xs.size)(xs)),
filter.gender.map(filterGender),
between("birth_year", filter.birthYearMin, filter.birthYearMax)
between("birth_year", filter.birthYearMin, filter.birthYearMax),
filter.hasTitle.map(hasTitle),
filter.hasWomenTitle.map(hasWomenTitle),
filter.hasOtherTitle.map(hasOtherTitle)
) match
case Nil => none
case xs => xs.intercalate(and).some
Expand All @@ -238,6 +241,19 @@ private object Sql:
val titles = title.values.list(n)
sql"(p.title IN ($titles) OR p.women_title in ($titles))"

private def hasTitle: Boolean => AppliedFragment =
case true => sql"p.title IS NOT NULL".apply(Void)
case false => sql"p.title IS NULL".apply(Void)

private def hasWomenTitle: Boolean => AppliedFragment =
case true => sql"p.women_title IS NOT NULL".apply(Void)
case false => sql"p.women_title IS NULL".apply(Void)

private def hasOtherTitle: Boolean => AppliedFragment =
case true => sql"cardinality(p.other_titles) != 0".apply(Void)
case false => sql"cardinality(p.other_titles) = 0".apply(Void)

// https://www.postgresql.org/docs/current/functions-array.html#FUNCTIONS-ARRAY
// select * from player where other_titles && array['IA','FA']::other_title[]
def playersByOtherTitles(n: Int): Fragment[List[OtherTitle]] =
val otherTitles = otherTitle.values.list(n)
Expand Down
8 changes: 7 additions & 1 deletion modules/domain/src/main/scala/Models.scala
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,10 @@ object Models:
otherTitles: Option[List[OtherTitle]],
gender: Option[Gender],
birthYearMin: Option[BirthYear],
birthYearMax: Option[BirthYear]
birthYearMax: Option[BirthYear],
hasTitle: Option[Boolean],
hasWomenTitle: Option[Boolean],
hasOtherTitle: Option[Boolean]
)

object PlayerFilter:
Expand All @@ -68,6 +71,9 @@ object Models:
None,
None,
None,
None,
None,
None,
None
)

Expand Down

0 comments on commit 7edfbc2

Please sign in to comment.