Skip to content

Commit e70730e

Browse files
authored
Query for mangas in specific categories (#712)
1 parent 0ba6c88 commit e70730e

File tree

2 files changed

+27
-1
lines changed

2 files changed

+27
-1
lines changed

server/src/main/kotlin/suwayomi/tachidesk/graphql/queries/MangaQuery.kt

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ import suwayomi.tachidesk.graphql.server.primitives.lessNotUnique
4444
import suwayomi.tachidesk.graphql.server.primitives.maybeSwap
4545
import suwayomi.tachidesk.graphql.types.MangaNodeList
4646
import suwayomi.tachidesk.graphql.types.MangaType
47+
import suwayomi.tachidesk.manga.model.table.CategoryMangaTable
4748
import suwayomi.tachidesk.manga.model.table.MangaStatus
4849
import suwayomi.tachidesk.manga.model.table.MangaTable
4950
import java.util.concurrent.CompletableFuture
@@ -110,6 +111,7 @@ class MangaQuery {
110111
val realUrl: String? = null,
111112
val lastFetchedAt: Long? = null,
112113
val chaptersLastFetchedAt: Long? = null,
114+
val categoryIds: List<Int>? = null,
113115
) : HasGetOp {
114116
override fun getOp(): Op<Boolean>? {
115117
val opAnd = OpAnd()
@@ -129,6 +131,7 @@ class MangaQuery {
129131
opAnd.eq(realUrl, MangaTable.realUrl)
130132
opAnd.eq(lastFetchedAt, MangaTable.lastFetchedAt)
131133
opAnd.eq(chaptersLastFetchedAt, MangaTable.chaptersLastFetchedAt)
134+
opAnd.inList(categoryIds, CategoryMangaTable.category)
132135

133136
return opAnd.op
134137
}
@@ -179,6 +182,7 @@ class MangaQuery {
179182
val realUrl: StringFilter? = null,
180183
val lastFetchedAt: LongFilter? = null,
181184
val chaptersLastFetchedAt: LongFilter? = null,
185+
val categoryId: IntFilter? = null,
182186
override val and: List<MangaFilter>? = null,
183187
override val or: List<MangaFilter>? = null,
184188
override val not: MangaFilter? = null,
@@ -201,6 +205,7 @@ class MangaQuery {
201205
andFilterWithCompareString(MangaTable.realUrl, realUrl),
202206
andFilterWithCompare(MangaTable.lastFetchedAt, lastFetchedAt),
203207
andFilterWithCompare(MangaTable.chaptersLastFetchedAt, chaptersLastFetchedAt),
208+
andFilterWithCompareEntity(CategoryMangaTable.category, categoryId),
204209
)
205210
}
206211
}
@@ -218,7 +223,7 @@ class MangaQuery {
218223
): MangaNodeList {
219224
val queryResults =
220225
transaction {
221-
val res = MangaTable.selectAll()
226+
val res = MangaTable.leftJoin(CategoryMangaTable).selectAll()
222227

223228
res.applyOps(condition, filter)
224229

server/src/main/kotlin/suwayomi/tachidesk/graphql/queries/filter/Filter.kt

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -382,6 +382,15 @@ class OpAnd(var op: Op<Boolean>? = null) {
382382
op = if (op == null) expr else (op!! and expr)
383383
}
384384

385+
fun <T : Any> andWhere(
386+
values: List<T>?,
387+
andPart: SqlExpressionBuilder.(List<T>) -> Op<Boolean>,
388+
) {
389+
values ?: return
390+
val expr = Op.build { andPart(values) }
391+
op = if (op == null) expr else (op!! and expr)
392+
}
393+
385394
fun <T> eq(
386395
value: T?,
387396
column: Column<T>,
@@ -392,10 +401,22 @@ class OpAnd(var op: Op<Boolean>? = null) {
392401
column: Column<EntityID<T>>,
393402
) = andWhere(value) { column eq it }
394403

404+
fun <T> inList(
405+
values: List<T>?,
406+
column: Column<T>,
407+
) = andWhere(values) { column inList it }
408+
409+
@JvmName("inListComparable")
410+
fun <T : Comparable<T>> inList(
411+
values: List<T>?,
412+
column: Column<EntityID<T>>,
413+
) = andWhere(values) { column inList it }
414+
395415
fun like(
396416
value: String?,
397417
column: Column<String?>,
398418
) = andWhere(value) { column like it }
419+
399420
}
400421

401422
fun <T : Comparable<T>> andFilterWithCompare(

0 commit comments

Comments
 (0)