From 0ba6c88d69fa8a80cfb077baf56ef7bcf5d6c944 Mon Sep 17 00:00:00 2001 From: schroda <50052685+schroda@users.noreply.github.com> Date: Mon, 16 Oct 2023 02:14:20 +0200 Subject: [PATCH] Fix/graphql mangas query genre based filtering (#713) * Filter mangas based on each genre of the genre condition Genres are stored as a comma separated string in the database. Thus, unless the correct string was passed in the condition, no manga would match the condition. * Query mangas based on genre filter --- .../kotlin/suwayomi/tachidesk/graphql/queries/MangaQuery.kt | 5 +++-- .../suwayomi/tachidesk/graphql/queries/filter/Filter.kt | 5 +++++ 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/server/src/main/kotlin/suwayomi/tachidesk/graphql/queries/MangaQuery.kt b/server/src/main/kotlin/suwayomi/tachidesk/graphql/queries/MangaQuery.kt index af5aa8ad..9a9a7520 100644 --- a/server/src/main/kotlin/suwayomi/tachidesk/graphql/queries/MangaQuery.kt +++ b/server/src/main/kotlin/suwayomi/tachidesk/graphql/queries/MangaQuery.kt @@ -122,7 +122,7 @@ class MangaQuery { opAnd.eq(artist, MangaTable.artist) opAnd.eq(author, MangaTable.author) opAnd.eq(description, MangaTable.description) - opAnd.eq(genre?.joinToString(), MangaTable.genre) + genre?.forEach { opAnd.like("%$it%", MangaTable.genre) } opAnd.eq(status?.value, MangaTable.status) opAnd.eq(inLibrary, MangaTable.inLibrary) opAnd.eq(inLibraryAt, MangaTable.inLibraryAt) @@ -172,7 +172,7 @@ class MangaQuery { val artist: StringFilter? = null, val author: StringFilter? = null, val description: StringFilter? = null, - // val genre: List? = null, // todo + val genre: StringFilter? = null, val status: MangaStatusFilter? = null, val inLibrary: BooleanFilter? = null, val inLibraryAt: LongFilter? = null, @@ -194,6 +194,7 @@ class MangaQuery { andFilterWithCompareString(MangaTable.artist, artist), andFilterWithCompareString(MangaTable.author, author), andFilterWithCompareString(MangaTable.description, description), + andFilterWithCompareString(MangaTable.genre, genre), andFilterWithCompare(MangaTable.status, status?.asIntFilter()), andFilterWithCompare(MangaTable.inLibrary, inLibrary), andFilterWithCompare(MangaTable.inLibraryAt, inLibraryAt), diff --git a/server/src/main/kotlin/suwayomi/tachidesk/graphql/queries/filter/Filter.kt b/server/src/main/kotlin/suwayomi/tachidesk/graphql/queries/filter/Filter.kt index 6c482432..6c706395 100644 --- a/server/src/main/kotlin/suwayomi/tachidesk/graphql/queries/filter/Filter.kt +++ b/server/src/main/kotlin/suwayomi/tachidesk/graphql/queries/filter/Filter.kt @@ -391,6 +391,11 @@ class OpAnd(var op: Op? = null) { value: T?, column: Column>, ) = andWhere(value) { column eq it } + + fun like( + value: String?, + column: Column, + ) = andWhere(value) { column like it } } fun > andFilterWithCompare(