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 9a9a7520..698b9ea5 100644 --- a/server/src/main/kotlin/suwayomi/tachidesk/graphql/queries/MangaQuery.kt +++ b/server/src/main/kotlin/suwayomi/tachidesk/graphql/queries/MangaQuery.kt @@ -44,6 +44,7 @@ import suwayomi.tachidesk.graphql.server.primitives.lessNotUnique import suwayomi.tachidesk.graphql.server.primitives.maybeSwap import suwayomi.tachidesk.graphql.types.MangaNodeList import suwayomi.tachidesk.graphql.types.MangaType +import suwayomi.tachidesk.manga.model.table.CategoryMangaTable import suwayomi.tachidesk.manga.model.table.MangaStatus import suwayomi.tachidesk.manga.model.table.MangaTable import java.util.concurrent.CompletableFuture @@ -110,6 +111,7 @@ class MangaQuery { val realUrl: String? = null, val lastFetchedAt: Long? = null, val chaptersLastFetchedAt: Long? = null, + val categoryIds: List? = null, ) : HasGetOp { override fun getOp(): Op? { val opAnd = OpAnd() @@ -129,6 +131,7 @@ class MangaQuery { opAnd.eq(realUrl, MangaTable.realUrl) opAnd.eq(lastFetchedAt, MangaTable.lastFetchedAt) opAnd.eq(chaptersLastFetchedAt, MangaTable.chaptersLastFetchedAt) + opAnd.inList(categoryIds, CategoryMangaTable.category) return opAnd.op } @@ -179,6 +182,7 @@ class MangaQuery { val realUrl: StringFilter? = null, val lastFetchedAt: LongFilter? = null, val chaptersLastFetchedAt: LongFilter? = null, + val categoryId: IntFilter? = null, override val and: List? = null, override val or: List? = null, override val not: MangaFilter? = null, @@ -201,6 +205,7 @@ class MangaQuery { andFilterWithCompareString(MangaTable.realUrl, realUrl), andFilterWithCompare(MangaTable.lastFetchedAt, lastFetchedAt), andFilterWithCompare(MangaTable.chaptersLastFetchedAt, chaptersLastFetchedAt), + andFilterWithCompareEntity(CategoryMangaTable.category, categoryId), ) } } @@ -218,7 +223,7 @@ class MangaQuery { ): MangaNodeList { val queryResults = transaction { - val res = MangaTable.selectAll() + val res = MangaTable.leftJoin(CategoryMangaTable).selectAll() res.applyOps(condition, filter) 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 6c706395..b81ab72c 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 @@ -382,6 +382,15 @@ class OpAnd(var op: Op? = null) { op = if (op == null) expr else (op!! and expr) } + fun andWhere( + values: List?, + andPart: SqlExpressionBuilder.(List) -> Op, + ) { + values ?: return + val expr = Op.build { andPart(values) } + op = if (op == null) expr else (op!! and expr) + } + fun eq( value: T?, column: Column, @@ -392,10 +401,22 @@ class OpAnd(var op: Op? = null) { column: Column>, ) = andWhere(value) { column eq it } + fun inList( + values: List?, + column: Column, + ) = andWhere(values) { column inList it } + + @JvmName("inListComparable") + fun > inList( + values: List?, + column: Column>, + ) = andWhere(values) { column inList it } + fun like( value: String?, column: Column, ) = andWhere(value) { column like it } + } fun > andFilterWithCompare(