mirror of
https://github.com/Suwayomi/Suwayomi-Server.git
synced 2026-07-04 11:24:35 -05:00
Switch to a new Ktlint Formatter (#705)
* Switch to new Ktlint plugin * Add ktlintCheck to PR builds * Run formatter * Put ktlint version in libs toml * Fix lint * Use Zip4Java from libs.toml
This commit is contained in:
@@ -8,21 +8,22 @@ import suwayomi.tachidesk.manga.impl.backup.proto.ProtoBackupValidator
|
||||
|
||||
class BackupQuery {
|
||||
data class ValidateBackupInput(
|
||||
val backup: UploadedFile
|
||||
val backup: UploadedFile,
|
||||
)
|
||||
|
||||
data class ValidateBackupSource(
|
||||
val id: Long,
|
||||
val name: String
|
||||
val name: String,
|
||||
)
|
||||
|
||||
data class ValidateBackupResult(
|
||||
val missingSources: List<ValidateBackupSource>
|
||||
val missingSources: List<ValidateBackupSource>,
|
||||
)
|
||||
fun validateBackup(
|
||||
input: ValidateBackupInput
|
||||
): ValidateBackupResult {
|
||||
|
||||
fun validateBackup(input: ValidateBackupInput): ValidateBackupResult {
|
||||
val result = ProtoBackupValidator.validate(input.backup.content)
|
||||
return ValidateBackupResult(
|
||||
result.missingSourceIds.map { ValidateBackupSource(it.first, it.second) }
|
||||
result.missingSourceIds.map { ValidateBackupSource(it.first, it.second) },
|
||||
)
|
||||
}
|
||||
|
||||
|
||||
@@ -46,14 +46,18 @@ import suwayomi.tachidesk.manga.model.table.CategoryTable
|
||||
import java.util.concurrent.CompletableFuture
|
||||
|
||||
class CategoryQuery {
|
||||
fun category(dataFetchingEnvironment: DataFetchingEnvironment, id: Int): CompletableFuture<CategoryType> {
|
||||
fun category(
|
||||
dataFetchingEnvironment: DataFetchingEnvironment,
|
||||
id: Int,
|
||||
): CompletableFuture<CategoryType> {
|
||||
return dataFetchingEnvironment.getValueFromDataLoader("CategoryDataLoader", id)
|
||||
}
|
||||
|
||||
enum class CategoryOrderBy(override val column: Column<out Comparable<*>>) : OrderBy<CategoryType> {
|
||||
ID(CategoryTable.id),
|
||||
NAME(CategoryTable.name),
|
||||
ORDER(CategoryTable.order);
|
||||
ORDER(CategoryTable.order),
|
||||
;
|
||||
|
||||
override fun greater(cursor: Cursor): Op<Boolean> {
|
||||
return when (this) {
|
||||
@@ -72,11 +76,12 @@ class CategoryQuery {
|
||||
}
|
||||
|
||||
override fun asCursor(type: CategoryType): Cursor {
|
||||
val value = when (this) {
|
||||
ID -> type.id.toString()
|
||||
NAME -> type.id.toString() + "-" + type.name
|
||||
ORDER -> type.id.toString() + "-" + type.order
|
||||
}
|
||||
val value =
|
||||
when (this) {
|
||||
ID -> type.id.toString()
|
||||
NAME -> type.id.toString() + "-" + type.name
|
||||
ORDER -> type.id.toString() + "-" + type.order
|
||||
}
|
||||
return Cursor(value)
|
||||
}
|
||||
}
|
||||
@@ -85,7 +90,7 @@ class CategoryQuery {
|
||||
val id: Int? = null,
|
||||
val order: Int? = null,
|
||||
val name: String? = null,
|
||||
val default: Boolean? = null
|
||||
val default: Boolean? = null,
|
||||
) : HasGetOp {
|
||||
override fun getOp(): Op<Boolean>? {
|
||||
val opAnd = OpAnd()
|
||||
@@ -105,14 +110,14 @@ class CategoryQuery {
|
||||
val default: BooleanFilter? = null,
|
||||
override val and: List<CategoryFilter>? = null,
|
||||
override val or: List<CategoryFilter>? = null,
|
||||
override val not: CategoryFilter? = null
|
||||
override val not: CategoryFilter? = null,
|
||||
) : Filter<CategoryFilter> {
|
||||
override fun getOpList(): List<Op<Boolean>> {
|
||||
return listOfNotNull(
|
||||
andFilterWithCompareEntity(CategoryTable.id, id),
|
||||
andFilterWithCompare(CategoryTable.order, order),
|
||||
andFilterWithCompareString(CategoryTable.name, name),
|
||||
andFilterWithCompare(CategoryTable.isDefault, default)
|
||||
andFilterWithCompare(CategoryTable.isDefault, default),
|
||||
)
|
||||
}
|
||||
}
|
||||
@@ -126,55 +131,56 @@ class CategoryQuery {
|
||||
after: Cursor? = null,
|
||||
first: Int? = null,
|
||||
last: Int? = null,
|
||||
offset: Int? = null
|
||||
offset: Int? = null,
|
||||
): CategoryNodeList {
|
||||
val queryResults = transaction {
|
||||
val res = CategoryTable.selectAll()
|
||||
val queryResults =
|
||||
transaction {
|
||||
val res = CategoryTable.selectAll()
|
||||
|
||||
res.applyOps(condition, filter)
|
||||
res.applyOps(condition, filter)
|
||||
|
||||
if (orderBy != null || (last != null || before != null)) {
|
||||
val orderByColumn = orderBy?.column ?: CategoryTable.id
|
||||
val orderType = orderByType.maybeSwap(last ?: before)
|
||||
if (orderBy != null || (last != null || before != null)) {
|
||||
val orderByColumn = orderBy?.column ?: CategoryTable.id
|
||||
val orderType = orderByType.maybeSwap(last ?: before)
|
||||
|
||||
if (orderBy == CategoryOrderBy.ID || orderBy == null) {
|
||||
res.orderBy(orderByColumn to orderType)
|
||||
} else {
|
||||
res.orderBy(
|
||||
orderByColumn to orderType,
|
||||
CategoryTable.id to SortOrder.ASC
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
val total = res.count()
|
||||
val firstResult = res.firstOrNull()?.get(CategoryTable.id)?.value
|
||||
val lastResult = res.lastOrNull()?.get(CategoryTable.id)?.value
|
||||
|
||||
if (after != null) {
|
||||
res.andWhere {
|
||||
when (orderByType) {
|
||||
DESC, DESC_NULLS_FIRST, DESC_NULLS_LAST -> (orderBy ?: CategoryOrderBy.ID).less(after)
|
||||
null, ASC, ASC_NULLS_FIRST, ASC_NULLS_LAST -> (orderBy ?: CategoryOrderBy.ID).greater(after)
|
||||
if (orderBy == CategoryOrderBy.ID || orderBy == null) {
|
||||
res.orderBy(orderByColumn to orderType)
|
||||
} else {
|
||||
res.orderBy(
|
||||
orderByColumn to orderType,
|
||||
CategoryTable.id to SortOrder.ASC,
|
||||
)
|
||||
}
|
||||
}
|
||||
} else if (before != null) {
|
||||
res.andWhere {
|
||||
when (orderByType) {
|
||||
DESC, DESC_NULLS_FIRST, DESC_NULLS_LAST -> (orderBy ?: CategoryOrderBy.ID).greater(before)
|
||||
null, ASC, ASC_NULLS_FIRST, ASC_NULLS_LAST -> (orderBy ?: CategoryOrderBy.ID).less(before)
|
||||
|
||||
val total = res.count()
|
||||
val firstResult = res.firstOrNull()?.get(CategoryTable.id)?.value
|
||||
val lastResult = res.lastOrNull()?.get(CategoryTable.id)?.value
|
||||
|
||||
if (after != null) {
|
||||
res.andWhere {
|
||||
when (orderByType) {
|
||||
DESC, DESC_NULLS_FIRST, DESC_NULLS_LAST -> (orderBy ?: CategoryOrderBy.ID).less(after)
|
||||
null, ASC, ASC_NULLS_FIRST, ASC_NULLS_LAST -> (orderBy ?: CategoryOrderBy.ID).greater(after)
|
||||
}
|
||||
}
|
||||
} else if (before != null) {
|
||||
res.andWhere {
|
||||
when (orderByType) {
|
||||
DESC, DESC_NULLS_FIRST, DESC_NULLS_LAST -> (orderBy ?: CategoryOrderBy.ID).greater(before)
|
||||
null, ASC, ASC_NULLS_FIRST, ASC_NULLS_LAST -> (orderBy ?: CategoryOrderBy.ID).less(before)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (first != null) {
|
||||
res.limit(first, offset?.toLong() ?: 0)
|
||||
} else if (last != null) {
|
||||
res.limit(last)
|
||||
}
|
||||
if (first != null) {
|
||||
res.limit(first, offset?.toLong() ?: 0)
|
||||
} else if (last != null) {
|
||||
res.limit(last)
|
||||
}
|
||||
|
||||
QueryResults(total, firstResult, lastResult, res.toList())
|
||||
}
|
||||
QueryResults(total, firstResult, lastResult, res.toList())
|
||||
}
|
||||
|
||||
val getAsCursor: (CategoryType) -> Cursor = (orderBy ?: CategoryOrderBy.ID)::asCursor
|
||||
|
||||
@@ -189,24 +195,25 @@ class CategoryQuery {
|
||||
resultsAsType.firstOrNull()?.let {
|
||||
CategoryNodeList.CategoryEdge(
|
||||
getAsCursor(it),
|
||||
it
|
||||
it,
|
||||
)
|
||||
},
|
||||
resultsAsType.lastOrNull()?.let {
|
||||
CategoryNodeList.CategoryEdge(
|
||||
getAsCursor(it),
|
||||
it
|
||||
it,
|
||||
)
|
||||
}
|
||||
},
|
||||
)
|
||||
},
|
||||
pageInfo = PageInfo(
|
||||
hasNextPage = queryResults.lastKey != resultsAsType.lastOrNull()?.id,
|
||||
hasPreviousPage = queryResults.firstKey != resultsAsType.firstOrNull()?.id,
|
||||
startCursor = resultsAsType.firstOrNull()?.let { getAsCursor(it) },
|
||||
endCursor = resultsAsType.lastOrNull()?.let { getAsCursor(it) }
|
||||
),
|
||||
totalCount = queryResults.total.toInt()
|
||||
pageInfo =
|
||||
PageInfo(
|
||||
hasNextPage = queryResults.lastKey != resultsAsType.lastOrNull()?.id,
|
||||
hasPreviousPage = queryResults.firstKey != resultsAsType.firstOrNull()?.id,
|
||||
startCursor = resultsAsType.firstOrNull()?.let { getAsCursor(it) },
|
||||
endCursor = resultsAsType.lastOrNull()?.let { getAsCursor(it) },
|
||||
),
|
||||
totalCount = queryResults.total.toInt(),
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -55,7 +55,10 @@ import java.util.concurrent.CompletableFuture
|
||||
* - Get page list?
|
||||
*/
|
||||
class ChapterQuery {
|
||||
fun chapter(dataFetchingEnvironment: DataFetchingEnvironment, id: Int): CompletableFuture<ChapterType> {
|
||||
fun chapter(
|
||||
dataFetchingEnvironment: DataFetchingEnvironment,
|
||||
id: Int,
|
||||
): CompletableFuture<ChapterType> {
|
||||
return dataFetchingEnvironment.getValueFromDataLoader("ChapterDataLoader", id)
|
||||
}
|
||||
|
||||
@@ -66,7 +69,8 @@ class ChapterQuery {
|
||||
UPLOAD_DATE(ChapterTable.date_upload),
|
||||
CHAPTER_NUMBER(ChapterTable.chapter_number),
|
||||
LAST_READ_AT(ChapterTable.lastReadAt),
|
||||
FETCHED_AT(ChapterTable.fetchedAt);
|
||||
FETCHED_AT(ChapterTable.fetchedAt),
|
||||
;
|
||||
|
||||
override fun greater(cursor: Cursor): Op<Boolean> {
|
||||
return when (this) {
|
||||
@@ -93,15 +97,16 @@ class ChapterQuery {
|
||||
}
|
||||
|
||||
override fun asCursor(type: ChapterType): Cursor {
|
||||
val value = when (this) {
|
||||
ID -> type.id.toString()
|
||||
SOURCE_ORDER -> type.id.toString() + "-" + type.sourceOrder
|
||||
NAME -> type.id.toString() + "-" + type.name
|
||||
UPLOAD_DATE -> type.id.toString() + "-" + type.uploadDate
|
||||
CHAPTER_NUMBER -> type.id.toString() + "-" + type.chapterNumber
|
||||
LAST_READ_AT -> type.id.toString() + "-" + type.lastReadAt
|
||||
FETCHED_AT -> type.id.toString() + "-" + type.fetchedAt
|
||||
}
|
||||
val value =
|
||||
when (this) {
|
||||
ID -> type.id.toString()
|
||||
SOURCE_ORDER -> type.id.toString() + "-" + type.sourceOrder
|
||||
NAME -> type.id.toString() + "-" + type.name
|
||||
UPLOAD_DATE -> type.id.toString() + "-" + type.uploadDate
|
||||
CHAPTER_NUMBER -> type.id.toString() + "-" + type.chapterNumber
|
||||
LAST_READ_AT -> type.id.toString() + "-" + type.lastReadAt
|
||||
FETCHED_AT -> type.id.toString() + "-" + type.fetchedAt
|
||||
}
|
||||
return Cursor(value)
|
||||
}
|
||||
}
|
||||
@@ -122,7 +127,7 @@ class ChapterQuery {
|
||||
val realUrl: String? = null,
|
||||
val fetchedAt: Long? = null,
|
||||
val isDownloaded: Boolean? = null,
|
||||
val pageCount: Int? = null
|
||||
val pageCount: Int? = null,
|
||||
) : HasGetOp {
|
||||
override fun getOp(): Op<Boolean>? {
|
||||
val opAnd = OpAnd()
|
||||
@@ -167,7 +172,7 @@ class ChapterQuery {
|
||||
val inLibrary: BooleanFilter? = null,
|
||||
override val and: List<ChapterFilter>? = null,
|
||||
override val or: List<ChapterFilter>? = null,
|
||||
override val not: ChapterFilter? = null
|
||||
override val not: ChapterFilter? = null,
|
||||
) : Filter<ChapterFilter> {
|
||||
override fun getOpList(): List<Op<Boolean>> {
|
||||
return listOfNotNull(
|
||||
@@ -186,7 +191,7 @@ class ChapterQuery {
|
||||
andFilterWithCompareString(ChapterTable.realUrl, realUrl),
|
||||
andFilterWithCompare(ChapterTable.fetchedAt, fetchedAt),
|
||||
andFilterWithCompare(ChapterTable.isDownloaded, isDownloaded),
|
||||
andFilterWithCompare(ChapterTable.pageCount, pageCount)
|
||||
andFilterWithCompare(ChapterTable.pageCount, pageCount),
|
||||
)
|
||||
}
|
||||
|
||||
@@ -202,63 +207,64 @@ class ChapterQuery {
|
||||
after: Cursor? = null,
|
||||
first: Int? = null,
|
||||
last: Int? = null,
|
||||
offset: Int? = null
|
||||
offset: Int? = null,
|
||||
): ChapterNodeList {
|
||||
val queryResults = transaction {
|
||||
val res = ChapterTable.selectAll()
|
||||
val queryResults =
|
||||
transaction {
|
||||
val res = ChapterTable.selectAll()
|
||||
|
||||
val libraryOp = filter?.getLibraryOp()
|
||||
if (libraryOp != null) {
|
||||
res.adjustColumnSet {
|
||||
innerJoin(MangaTable)
|
||||
val libraryOp = filter?.getLibraryOp()
|
||||
if (libraryOp != null) {
|
||||
res.adjustColumnSet {
|
||||
innerJoin(MangaTable)
|
||||
}
|
||||
res.andWhere { libraryOp }
|
||||
}
|
||||
res.andWhere { libraryOp }
|
||||
}
|
||||
|
||||
res.applyOps(condition, filter)
|
||||
res.applyOps(condition, filter)
|
||||
|
||||
if (orderBy != null || (last != null || before != null)) {
|
||||
val orderByColumn = orderBy?.column ?: ChapterTable.id
|
||||
val orderType = orderByType.maybeSwap(last ?: before)
|
||||
if (orderBy != null || (last != null || before != null)) {
|
||||
val orderByColumn = orderBy?.column ?: ChapterTable.id
|
||||
val orderType = orderByType.maybeSwap(last ?: before)
|
||||
|
||||
if (orderBy == ChapterOrderBy.ID || orderBy == null) {
|
||||
res.orderBy(orderByColumn to orderType)
|
||||
} else {
|
||||
res.orderBy(
|
||||
orderByColumn to orderType,
|
||||
ChapterTable.id to SortOrder.ASC
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
val total = res.count()
|
||||
val firstResult = res.firstOrNull()?.get(ChapterTable.id)?.value
|
||||
val lastResult = res.lastOrNull()?.get(ChapterTable.id)?.value
|
||||
|
||||
if (after != null) {
|
||||
res.andWhere {
|
||||
when (orderByType) {
|
||||
DESC, DESC_NULLS_FIRST, DESC_NULLS_LAST -> (orderBy ?: ID).less(after)
|
||||
null, ASC, ASC_NULLS_FIRST, ASC_NULLS_LAST -> (orderBy ?: ID).greater(after)
|
||||
if (orderBy == ChapterOrderBy.ID || orderBy == null) {
|
||||
res.orderBy(orderByColumn to orderType)
|
||||
} else {
|
||||
res.orderBy(
|
||||
orderByColumn to orderType,
|
||||
ChapterTable.id to SortOrder.ASC,
|
||||
)
|
||||
}
|
||||
}
|
||||
} else if (before != null) {
|
||||
res.andWhere {
|
||||
when (orderByType) {
|
||||
DESC, DESC_NULLS_FIRST, DESC_NULLS_LAST -> (orderBy ?: ID).greater(before)
|
||||
null, ASC, ASC_NULLS_FIRST, ASC_NULLS_LAST -> (orderBy ?: ID).less(before)
|
||||
|
||||
val total = res.count()
|
||||
val firstResult = res.firstOrNull()?.get(ChapterTable.id)?.value
|
||||
val lastResult = res.lastOrNull()?.get(ChapterTable.id)?.value
|
||||
|
||||
if (after != null) {
|
||||
res.andWhere {
|
||||
when (orderByType) {
|
||||
DESC, DESC_NULLS_FIRST, DESC_NULLS_LAST -> (orderBy ?: ID).less(after)
|
||||
null, ASC, ASC_NULLS_FIRST, ASC_NULLS_LAST -> (orderBy ?: ID).greater(after)
|
||||
}
|
||||
}
|
||||
} else if (before != null) {
|
||||
res.andWhere {
|
||||
when (orderByType) {
|
||||
DESC, DESC_NULLS_FIRST, DESC_NULLS_LAST -> (orderBy ?: ID).greater(before)
|
||||
null, ASC, ASC_NULLS_FIRST, ASC_NULLS_LAST -> (orderBy ?: ID).less(before)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (first != null) {
|
||||
res.limit(first, offset?.toLong() ?: 0)
|
||||
} else if (last != null) {
|
||||
res.limit(last)
|
||||
}
|
||||
if (first != null) {
|
||||
res.limit(first, offset?.toLong() ?: 0)
|
||||
} else if (last != null) {
|
||||
res.limit(last)
|
||||
}
|
||||
|
||||
QueryResults(total, firstResult, lastResult, res.toList())
|
||||
}
|
||||
QueryResults(total, firstResult, lastResult, res.toList())
|
||||
}
|
||||
|
||||
val getAsCursor: (ChapterType) -> Cursor = (orderBy ?: ChapterOrderBy.ID)::asCursor
|
||||
|
||||
@@ -273,24 +279,25 @@ class ChapterQuery {
|
||||
resultsAsType.firstOrNull()?.let {
|
||||
ChapterNodeList.ChapterEdge(
|
||||
getAsCursor(it),
|
||||
it
|
||||
it,
|
||||
)
|
||||
},
|
||||
resultsAsType.lastOrNull()?.let {
|
||||
ChapterNodeList.ChapterEdge(
|
||||
getAsCursor(it),
|
||||
it
|
||||
it,
|
||||
)
|
||||
}
|
||||
},
|
||||
)
|
||||
},
|
||||
pageInfo = PageInfo(
|
||||
hasNextPage = queryResults.lastKey != resultsAsType.lastOrNull()?.id,
|
||||
hasPreviousPage = queryResults.firstKey != resultsAsType.firstOrNull()?.id,
|
||||
startCursor = resultsAsType.firstOrNull()?.let { getAsCursor(it) },
|
||||
endCursor = resultsAsType.lastOrNull()?.let { getAsCursor(it) }
|
||||
),
|
||||
totalCount = queryResults.total.toInt()
|
||||
pageInfo =
|
||||
PageInfo(
|
||||
hasNextPage = queryResults.lastKey != resultsAsType.lastOrNull()?.id,
|
||||
hasPreviousPage = queryResults.firstKey != resultsAsType.firstOrNull()?.id,
|
||||
startCursor = resultsAsType.firstOrNull()?.let { getAsCursor(it) },
|
||||
endCursor = resultsAsType.lastOrNull()?.let { getAsCursor(it) },
|
||||
),
|
||||
totalCount = queryResults.total.toInt(),
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -7,7 +7,6 @@ import suwayomi.tachidesk.server.JavalinSetup.future
|
||||
import java.util.concurrent.CompletableFuture
|
||||
|
||||
class DownloadQuery {
|
||||
|
||||
fun downloadStatus(): CompletableFuture<DownloadStatus> {
|
||||
return future {
|
||||
DownloadStatus(DownloadManager.status.first())
|
||||
|
||||
@@ -47,14 +47,18 @@ import suwayomi.tachidesk.manga.model.table.ExtensionTable
|
||||
import java.util.concurrent.CompletableFuture
|
||||
|
||||
class ExtensionQuery {
|
||||
fun extension(dataFetchingEnvironment: DataFetchingEnvironment, pkgName: String): CompletableFuture<ExtensionType> {
|
||||
fun extension(
|
||||
dataFetchingEnvironment: DataFetchingEnvironment,
|
||||
pkgName: String,
|
||||
): CompletableFuture<ExtensionType> {
|
||||
return dataFetchingEnvironment.getValueFromDataLoader("ExtensionDataLoader", pkgName)
|
||||
}
|
||||
|
||||
enum class ExtensionOrderBy(override val column: Column<out Comparable<*>>) : OrderBy<ExtensionType> {
|
||||
PKG_NAME(ExtensionTable.pkgName),
|
||||
NAME(ExtensionTable.name),
|
||||
APK_NAME(ExtensionTable.apkName);
|
||||
APK_NAME(ExtensionTable.apkName),
|
||||
;
|
||||
|
||||
override fun greater(cursor: Cursor): Op<Boolean> {
|
||||
return when (this) {
|
||||
@@ -73,11 +77,12 @@ class ExtensionQuery {
|
||||
}
|
||||
|
||||
override fun asCursor(type: ExtensionType): Cursor {
|
||||
val value = when (this) {
|
||||
PKG_NAME -> type.pkgName
|
||||
NAME -> type.pkgName + "\\-" + type.name
|
||||
APK_NAME -> type.pkgName + "\\-" + type.apkName
|
||||
}
|
||||
val value =
|
||||
when (this) {
|
||||
PKG_NAME -> type.pkgName
|
||||
NAME -> type.pkgName + "\\-" + type.name
|
||||
APK_NAME -> type.pkgName + "\\-" + type.apkName
|
||||
}
|
||||
return Cursor(value)
|
||||
}
|
||||
}
|
||||
@@ -93,7 +98,7 @@ class ExtensionQuery {
|
||||
val isNsfw: Boolean? = null,
|
||||
val isInstalled: Boolean? = null,
|
||||
val hasUpdate: Boolean? = null,
|
||||
val isObsolete: Boolean? = null
|
||||
val isObsolete: Boolean? = null,
|
||||
) : HasGetOp {
|
||||
override fun getOp(): Op<Boolean>? {
|
||||
val opAnd = OpAnd()
|
||||
@@ -126,7 +131,7 @@ class ExtensionQuery {
|
||||
val isObsolete: BooleanFilter? = null,
|
||||
override val and: List<ExtensionFilter>? = null,
|
||||
override val or: List<ExtensionFilter>? = null,
|
||||
override val not: ExtensionFilter? = null
|
||||
override val not: ExtensionFilter? = null,
|
||||
) : Filter<ExtensionFilter> {
|
||||
override fun getOpList(): List<Op<Boolean>> {
|
||||
return listOfNotNull(
|
||||
@@ -140,7 +145,7 @@ class ExtensionQuery {
|
||||
andFilterWithCompare(ExtensionTable.isNsfw, isNsfw),
|
||||
andFilterWithCompare(ExtensionTable.isInstalled, isInstalled),
|
||||
andFilterWithCompare(ExtensionTable.hasUpdate, hasUpdate),
|
||||
andFilterWithCompare(ExtensionTable.isObsolete, isObsolete)
|
||||
andFilterWithCompare(ExtensionTable.isObsolete, isObsolete),
|
||||
)
|
||||
}
|
||||
}
|
||||
@@ -154,57 +159,58 @@ class ExtensionQuery {
|
||||
after: Cursor? = null,
|
||||
first: Int? = null,
|
||||
last: Int? = null,
|
||||
offset: Int? = null
|
||||
offset: Int? = null,
|
||||
): ExtensionNodeList {
|
||||
val queryResults = transaction {
|
||||
val res = ExtensionTable.selectAll()
|
||||
val queryResults =
|
||||
transaction {
|
||||
val res = ExtensionTable.selectAll()
|
||||
|
||||
res.adjustWhere { ExtensionTable.name neq LocalSource.EXTENSION_NAME }
|
||||
res.adjustWhere { ExtensionTable.name neq LocalSource.EXTENSION_NAME }
|
||||
|
||||
res.applyOps(condition, filter)
|
||||
res.applyOps(condition, filter)
|
||||
|
||||
if (orderBy != null || (last != null || before != null)) {
|
||||
val orderByColumn = orderBy?.column ?: ExtensionTable.pkgName
|
||||
val orderType = orderByType.maybeSwap(last ?: before)
|
||||
if (orderBy != null || (last != null || before != null)) {
|
||||
val orderByColumn = orderBy?.column ?: ExtensionTable.pkgName
|
||||
val orderType = orderByType.maybeSwap(last ?: before)
|
||||
|
||||
if (orderBy == ExtensionOrderBy.PKG_NAME || orderBy == null) {
|
||||
res.orderBy(orderByColumn to orderType)
|
||||
} else {
|
||||
res.orderBy(
|
||||
orderByColumn to orderType,
|
||||
ExtensionTable.pkgName to SortOrder.ASC
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
val total = res.count()
|
||||
val firstResult = res.firstOrNull()?.get(ExtensionTable.pkgName)
|
||||
val lastResult = res.lastOrNull()?.get(ExtensionTable.pkgName)
|
||||
|
||||
if (after != null) {
|
||||
res.andWhere {
|
||||
when (orderByType) {
|
||||
DESC, DESC_NULLS_FIRST, DESC_NULLS_LAST -> (orderBy ?: ExtensionOrderBy.PKG_NAME).less(after)
|
||||
null, ASC, ASC_NULLS_FIRST, ASC_NULLS_LAST -> (orderBy ?: ExtensionOrderBy.PKG_NAME).greater(after)
|
||||
if (orderBy == ExtensionOrderBy.PKG_NAME || orderBy == null) {
|
||||
res.orderBy(orderByColumn to orderType)
|
||||
} else {
|
||||
res.orderBy(
|
||||
orderByColumn to orderType,
|
||||
ExtensionTable.pkgName to SortOrder.ASC,
|
||||
)
|
||||
}
|
||||
}
|
||||
} else if (before != null) {
|
||||
res.andWhere {
|
||||
when (orderByType) {
|
||||
DESC, DESC_NULLS_FIRST, DESC_NULLS_LAST -> (orderBy ?: ExtensionOrderBy.PKG_NAME).greater(before)
|
||||
null, ASC, ASC_NULLS_FIRST, ASC_NULLS_LAST -> (orderBy ?: ExtensionOrderBy.PKG_NAME).less(before)
|
||||
|
||||
val total = res.count()
|
||||
val firstResult = res.firstOrNull()?.get(ExtensionTable.pkgName)
|
||||
val lastResult = res.lastOrNull()?.get(ExtensionTable.pkgName)
|
||||
|
||||
if (after != null) {
|
||||
res.andWhere {
|
||||
when (orderByType) {
|
||||
DESC, DESC_NULLS_FIRST, DESC_NULLS_LAST -> (orderBy ?: ExtensionOrderBy.PKG_NAME).less(after)
|
||||
null, ASC, ASC_NULLS_FIRST, ASC_NULLS_LAST -> (orderBy ?: ExtensionOrderBy.PKG_NAME).greater(after)
|
||||
}
|
||||
}
|
||||
} else if (before != null) {
|
||||
res.andWhere {
|
||||
when (orderByType) {
|
||||
DESC, DESC_NULLS_FIRST, DESC_NULLS_LAST -> (orderBy ?: ExtensionOrderBy.PKG_NAME).greater(before)
|
||||
null, ASC, ASC_NULLS_FIRST, ASC_NULLS_LAST -> (orderBy ?: ExtensionOrderBy.PKG_NAME).less(before)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (first != null) {
|
||||
res.limit(first, offset?.toLong() ?: 0)
|
||||
} else if (last != null) {
|
||||
res.limit(last)
|
||||
}
|
||||
if (first != null) {
|
||||
res.limit(first, offset?.toLong() ?: 0)
|
||||
} else if (last != null) {
|
||||
res.limit(last)
|
||||
}
|
||||
|
||||
QueryResults(total, firstResult, lastResult, res.toList())
|
||||
}
|
||||
QueryResults(total, firstResult, lastResult, res.toList())
|
||||
}
|
||||
|
||||
val getAsCursor: (ExtensionType) -> Cursor = (orderBy ?: ExtensionOrderBy.PKG_NAME)::asCursor
|
||||
|
||||
@@ -219,24 +225,25 @@ class ExtensionQuery {
|
||||
resultsAsType.firstOrNull()?.let {
|
||||
ExtensionNodeList.ExtensionEdge(
|
||||
getAsCursor(it),
|
||||
it
|
||||
it,
|
||||
)
|
||||
},
|
||||
resultsAsType.lastOrNull()?.let {
|
||||
ExtensionNodeList.ExtensionEdge(
|
||||
getAsCursor(it),
|
||||
it
|
||||
it,
|
||||
)
|
||||
}
|
||||
},
|
||||
)
|
||||
},
|
||||
pageInfo = PageInfo(
|
||||
hasNextPage = queryResults.lastKey != resultsAsType.lastOrNull()?.pkgName,
|
||||
hasPreviousPage = queryResults.firstKey != resultsAsType.firstOrNull()?.pkgName,
|
||||
startCursor = resultsAsType.firstOrNull()?.let { getAsCursor(it) },
|
||||
endCursor = resultsAsType.lastOrNull()?.let { getAsCursor(it) }
|
||||
),
|
||||
totalCount = queryResults.total.toInt()
|
||||
pageInfo =
|
||||
PageInfo(
|
||||
hasNextPage = queryResults.lastKey != resultsAsType.lastOrNull()?.pkgName,
|
||||
hasPreviousPage = queryResults.firstKey != resultsAsType.firstOrNull()?.pkgName,
|
||||
startCursor = resultsAsType.firstOrNull()?.let { getAsCursor(it) },
|
||||
endCursor = resultsAsType.lastOrNull()?.let { getAsCursor(it) },
|
||||
),
|
||||
totalCount = queryResults.total.toInt(),
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -3,8 +3,8 @@ package suwayomi.tachidesk.graphql.queries
|
||||
import suwayomi.tachidesk.global.impl.AppUpdate
|
||||
import suwayomi.tachidesk.graphql.types.WebUIUpdateInfo
|
||||
import suwayomi.tachidesk.graphql.types.WebUIUpdateStatus
|
||||
import suwayomi.tachidesk.server.BuildConfig
|
||||
import suwayomi.tachidesk.server.JavalinSetup.future
|
||||
import suwayomi.tachidesk.server.generated.BuildConfig
|
||||
import suwayomi.tachidesk.server.serverConfig
|
||||
import suwayomi.tachidesk.server.util.WebInterfaceManager
|
||||
import java.util.concurrent.CompletableFuture
|
||||
@@ -17,7 +17,7 @@ class InfoQuery {
|
||||
val buildType: String,
|
||||
val buildTime: Long,
|
||||
val github: String,
|
||||
val discord: String
|
||||
val discord: String,
|
||||
)
|
||||
|
||||
fun about(): AboutPayload {
|
||||
@@ -28,7 +28,7 @@ class InfoQuery {
|
||||
BuildConfig.BUILD_TYPE,
|
||||
BuildConfig.BUILD_TIME,
|
||||
BuildConfig.GITHUB,
|
||||
BuildConfig.DISCORD
|
||||
BuildConfig.DISCORD,
|
||||
)
|
||||
}
|
||||
|
||||
@@ -36,7 +36,7 @@ class InfoQuery {
|
||||
/** [channel] mirrors [suwayomi.tachidesk.server.BuildConfig.BUILD_TYPE] */
|
||||
val channel: String,
|
||||
val tag: String,
|
||||
val url: String
|
||||
val url: String,
|
||||
)
|
||||
|
||||
fun checkForServerUpdates(): CompletableFuture<List<CheckForServerUpdatesPayload>> {
|
||||
@@ -45,7 +45,7 @@ class InfoQuery {
|
||||
CheckForServerUpdatesPayload(
|
||||
channel = it.channel,
|
||||
tag = it.tag,
|
||||
url = it.url
|
||||
url = it.url,
|
||||
)
|
||||
}
|
||||
}
|
||||
@@ -57,7 +57,7 @@ class InfoQuery {
|
||||
WebUIUpdateInfo(
|
||||
channel = serverConfig.webUIChannel.value,
|
||||
tag = version,
|
||||
updateAvailable
|
||||
updateAvailable,
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -49,7 +49,10 @@ import suwayomi.tachidesk.manga.model.table.MangaTable
|
||||
import java.util.concurrent.CompletableFuture
|
||||
|
||||
class MangaQuery {
|
||||
fun manga(dataFetchingEnvironment: DataFetchingEnvironment, id: Int): CompletableFuture<MangaType> {
|
||||
fun manga(
|
||||
dataFetchingEnvironment: DataFetchingEnvironment,
|
||||
id: Int,
|
||||
): CompletableFuture<MangaType> {
|
||||
return dataFetchingEnvironment.getValueFromDataLoader("MangaDataLoader", id)
|
||||
}
|
||||
|
||||
@@ -57,7 +60,8 @@ class MangaQuery {
|
||||
ID(MangaTable.id),
|
||||
TITLE(MangaTable.title),
|
||||
IN_LIBRARY_AT(MangaTable.inLibraryAt),
|
||||
LAST_FETCHED_AT(MangaTable.lastFetchedAt);
|
||||
LAST_FETCHED_AT(MangaTable.lastFetchedAt),
|
||||
;
|
||||
|
||||
override fun greater(cursor: Cursor): Op<Boolean> {
|
||||
return when (this) {
|
||||
@@ -78,12 +82,13 @@ class MangaQuery {
|
||||
}
|
||||
|
||||
override fun asCursor(type: MangaType): Cursor {
|
||||
val value = when (this) {
|
||||
ID -> type.id.toString()
|
||||
TITLE -> type.id.toString() + "-" + type.title
|
||||
IN_LIBRARY_AT -> type.id.toString() + "-" + type.inLibraryAt.toString()
|
||||
LAST_FETCHED_AT -> type.id.toString() + "-" + type.lastFetchedAt.toString()
|
||||
}
|
||||
val value =
|
||||
when (this) {
|
||||
ID -> type.id.toString()
|
||||
TITLE -> type.id.toString() + "-" + type.title
|
||||
IN_LIBRARY_AT -> type.id.toString() + "-" + type.inLibraryAt.toString()
|
||||
LAST_FETCHED_AT -> type.id.toString() + "-" + type.lastFetchedAt.toString()
|
||||
}
|
||||
return Cursor(value)
|
||||
}
|
||||
}
|
||||
@@ -104,7 +109,7 @@ class MangaQuery {
|
||||
val inLibraryAt: Long? = null,
|
||||
val realUrl: String? = null,
|
||||
val lastFetchedAt: Long? = null,
|
||||
val chaptersLastFetchedAt: Long? = null
|
||||
val chaptersLastFetchedAt: Long? = null,
|
||||
) : HasGetOp {
|
||||
override fun getOp(): Op<Boolean>? {
|
||||
val opAnd = OpAnd()
|
||||
@@ -140,21 +145,21 @@ class MangaQuery {
|
||||
override val lessThan: MangaStatus? = null,
|
||||
override val lessThanOrEqualTo: MangaStatus? = null,
|
||||
override val greaterThan: MangaStatus? = null,
|
||||
override val greaterThanOrEqualTo: MangaStatus? = null
|
||||
override val greaterThanOrEqualTo: MangaStatus? = null,
|
||||
) : ComparableScalarFilter<MangaStatus> {
|
||||
fun asIntFilter() = IntFilter(
|
||||
equalTo = equalTo?.value,
|
||||
notEqualTo = notEqualTo?.value,
|
||||
distinctFrom = distinctFrom?.value,
|
||||
notDistinctFrom = notDistinctFrom?.value,
|
||||
`in` = `in`?.map { it.value },
|
||||
notIn = notIn?.map { it.value },
|
||||
lessThan = lessThan?.value,
|
||||
lessThanOrEqualTo = lessThanOrEqualTo?.value,
|
||||
greaterThan = greaterThan?.value,
|
||||
greaterThanOrEqualTo = greaterThanOrEqualTo?.value
|
||||
|
||||
)
|
||||
fun asIntFilter() =
|
||||
IntFilter(
|
||||
equalTo = equalTo?.value,
|
||||
notEqualTo = notEqualTo?.value,
|
||||
distinctFrom = distinctFrom?.value,
|
||||
notDistinctFrom = notDistinctFrom?.value,
|
||||
`in` = `in`?.map { it.value },
|
||||
notIn = notIn?.map { it.value },
|
||||
lessThan = lessThan?.value,
|
||||
lessThanOrEqualTo = lessThanOrEqualTo?.value,
|
||||
greaterThan = greaterThan?.value,
|
||||
greaterThanOrEqualTo = greaterThanOrEqualTo?.value,
|
||||
)
|
||||
}
|
||||
|
||||
data class MangaFilter(
|
||||
@@ -176,7 +181,7 @@ class MangaQuery {
|
||||
val chaptersLastFetchedAt: LongFilter? = null,
|
||||
override val and: List<MangaFilter>? = null,
|
||||
override val or: List<MangaFilter>? = null,
|
||||
override val not: MangaFilter? = null
|
||||
override val not: MangaFilter? = null,
|
||||
) : Filter<MangaFilter> {
|
||||
override fun getOpList(): List<Op<Boolean>> {
|
||||
return listOfNotNull(
|
||||
@@ -194,7 +199,7 @@ class MangaQuery {
|
||||
andFilterWithCompare(MangaTable.inLibraryAt, inLibraryAt),
|
||||
andFilterWithCompareString(MangaTable.realUrl, realUrl),
|
||||
andFilterWithCompare(MangaTable.lastFetchedAt, lastFetchedAt),
|
||||
andFilterWithCompare(MangaTable.chaptersLastFetchedAt, chaptersLastFetchedAt)
|
||||
andFilterWithCompare(MangaTable.chaptersLastFetchedAt, chaptersLastFetchedAt),
|
||||
)
|
||||
}
|
||||
}
|
||||
@@ -208,55 +213,56 @@ class MangaQuery {
|
||||
after: Cursor? = null,
|
||||
first: Int? = null,
|
||||
last: Int? = null,
|
||||
offset: Int? = null
|
||||
offset: Int? = null,
|
||||
): MangaNodeList {
|
||||
val queryResults = transaction {
|
||||
val res = MangaTable.selectAll()
|
||||
val queryResults =
|
||||
transaction {
|
||||
val res = MangaTable.selectAll()
|
||||
|
||||
res.applyOps(condition, filter)
|
||||
res.applyOps(condition, filter)
|
||||
|
||||
if (orderBy != null || (last != null || before != null)) {
|
||||
val orderByColumn = orderBy?.column ?: MangaTable.id
|
||||
val orderType = orderByType.maybeSwap(last ?: before)
|
||||
if (orderBy != null || (last != null || before != null)) {
|
||||
val orderByColumn = orderBy?.column ?: MangaTable.id
|
||||
val orderType = orderByType.maybeSwap(last ?: before)
|
||||
|
||||
if (orderBy == MangaOrderBy.ID || orderBy == null) {
|
||||
res.orderBy(orderByColumn to orderType)
|
||||
} else {
|
||||
res.orderBy(
|
||||
orderByColumn to orderType,
|
||||
MangaTable.id to SortOrder.ASC
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
val total = res.count()
|
||||
val firstResult = res.firstOrNull()?.get(MangaTable.id)?.value
|
||||
val lastResult = res.lastOrNull()?.get(MangaTable.id)?.value
|
||||
|
||||
if (after != null) {
|
||||
res.andWhere {
|
||||
when (orderByType) {
|
||||
DESC, DESC_NULLS_FIRST, DESC_NULLS_LAST -> (orderBy ?: MangaOrderBy.ID).less(after)
|
||||
null, ASC, ASC_NULLS_FIRST, ASC_NULLS_LAST -> (orderBy ?: MangaOrderBy.ID).greater(after)
|
||||
if (orderBy == MangaOrderBy.ID || orderBy == null) {
|
||||
res.orderBy(orderByColumn to orderType)
|
||||
} else {
|
||||
res.orderBy(
|
||||
orderByColumn to orderType,
|
||||
MangaTable.id to SortOrder.ASC,
|
||||
)
|
||||
}
|
||||
}
|
||||
} else if (before != null) {
|
||||
res.andWhere {
|
||||
when (orderByType) {
|
||||
DESC, DESC_NULLS_FIRST, DESC_NULLS_LAST -> (orderBy ?: MangaOrderBy.ID).greater(before)
|
||||
null, ASC, ASC_NULLS_FIRST, ASC_NULLS_LAST -> (orderBy ?: MangaOrderBy.ID).less(before)
|
||||
|
||||
val total = res.count()
|
||||
val firstResult = res.firstOrNull()?.get(MangaTable.id)?.value
|
||||
val lastResult = res.lastOrNull()?.get(MangaTable.id)?.value
|
||||
|
||||
if (after != null) {
|
||||
res.andWhere {
|
||||
when (orderByType) {
|
||||
DESC, DESC_NULLS_FIRST, DESC_NULLS_LAST -> (orderBy ?: MangaOrderBy.ID).less(after)
|
||||
null, ASC, ASC_NULLS_FIRST, ASC_NULLS_LAST -> (orderBy ?: MangaOrderBy.ID).greater(after)
|
||||
}
|
||||
}
|
||||
} else if (before != null) {
|
||||
res.andWhere {
|
||||
when (orderByType) {
|
||||
DESC, DESC_NULLS_FIRST, DESC_NULLS_LAST -> (orderBy ?: MangaOrderBy.ID).greater(before)
|
||||
null, ASC, ASC_NULLS_FIRST, ASC_NULLS_LAST -> (orderBy ?: MangaOrderBy.ID).less(before)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (first != null) {
|
||||
res.limit(first, offset?.toLong() ?: 0)
|
||||
} else if (last != null) {
|
||||
res.limit(last)
|
||||
}
|
||||
if (first != null) {
|
||||
res.limit(first, offset?.toLong() ?: 0)
|
||||
} else if (last != null) {
|
||||
res.limit(last)
|
||||
}
|
||||
|
||||
QueryResults(total, firstResult, lastResult, res.toList())
|
||||
}
|
||||
QueryResults(total, firstResult, lastResult, res.toList())
|
||||
}
|
||||
|
||||
val getAsCursor: (MangaType) -> Cursor = (orderBy ?: MangaOrderBy.ID)::asCursor
|
||||
|
||||
@@ -271,24 +277,25 @@ class MangaQuery {
|
||||
resultsAsType.firstOrNull()?.let {
|
||||
MangaNodeList.MangaEdge(
|
||||
getAsCursor(it),
|
||||
it
|
||||
it,
|
||||
)
|
||||
},
|
||||
resultsAsType.lastOrNull()?.let {
|
||||
MangaNodeList.MangaEdge(
|
||||
getAsCursor(it),
|
||||
it
|
||||
it,
|
||||
)
|
||||
}
|
||||
},
|
||||
)
|
||||
},
|
||||
pageInfo = PageInfo(
|
||||
hasNextPage = queryResults.lastKey != resultsAsType.lastOrNull()?.id,
|
||||
hasPreviousPage = queryResults.firstKey != resultsAsType.firstOrNull()?.id,
|
||||
startCursor = resultsAsType.firstOrNull()?.let { getAsCursor(it) },
|
||||
endCursor = resultsAsType.lastOrNull()?.let { getAsCursor(it) }
|
||||
),
|
||||
totalCount = queryResults.total.toInt()
|
||||
pageInfo =
|
||||
PageInfo(
|
||||
hasNextPage = queryResults.lastKey != resultsAsType.lastOrNull()?.id,
|
||||
hasPreviousPage = queryResults.firstKey != resultsAsType.firstOrNull()?.id,
|
||||
startCursor = resultsAsType.firstOrNull()?.let { getAsCursor(it) },
|
||||
endCursor = resultsAsType.lastOrNull()?.let { getAsCursor(it) },
|
||||
),
|
||||
totalCount = queryResults.total.toInt(),
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -42,13 +42,17 @@ import suwayomi.tachidesk.graphql.types.GlobalMetaType
|
||||
import java.util.concurrent.CompletableFuture
|
||||
|
||||
class MetaQuery {
|
||||
fun meta(dataFetchingEnvironment: DataFetchingEnvironment, key: String): CompletableFuture<GlobalMetaType> {
|
||||
fun meta(
|
||||
dataFetchingEnvironment: DataFetchingEnvironment,
|
||||
key: String,
|
||||
): CompletableFuture<GlobalMetaType> {
|
||||
return dataFetchingEnvironment.getValueFromDataLoader("GlobalMetaDataLoader", key)
|
||||
}
|
||||
|
||||
enum class MetaOrderBy(override val column: Column<out Comparable<*>>) : OrderBy<GlobalMetaType> {
|
||||
KEY(GlobalMetaTable.key),
|
||||
VALUE(GlobalMetaTable.value);
|
||||
VALUE(GlobalMetaTable.value),
|
||||
;
|
||||
|
||||
override fun greater(cursor: Cursor): Op<Boolean> {
|
||||
return when (this) {
|
||||
@@ -65,17 +69,18 @@ class MetaQuery {
|
||||
}
|
||||
|
||||
override fun asCursor(type: GlobalMetaType): Cursor {
|
||||
val value = when (this) {
|
||||
KEY -> type.key
|
||||
VALUE -> type.key + "\\-" + type.value
|
||||
}
|
||||
val value =
|
||||
when (this) {
|
||||
KEY -> type.key
|
||||
VALUE -> type.key + "\\-" + type.value
|
||||
}
|
||||
return Cursor(value)
|
||||
}
|
||||
}
|
||||
|
||||
data class MetaCondition(
|
||||
val key: String? = null,
|
||||
val value: String? = null
|
||||
val value: String? = null,
|
||||
) : HasGetOp {
|
||||
override fun getOp(): Op<Boolean>? {
|
||||
val opAnd = OpAnd()
|
||||
@@ -91,12 +96,12 @@ class MetaQuery {
|
||||
val value: StringFilter? = null,
|
||||
override val and: List<MetaFilter>? = null,
|
||||
override val or: List<MetaFilter>? = null,
|
||||
override val not: MetaFilter? = null
|
||||
override val not: MetaFilter? = null,
|
||||
) : Filter<MetaFilter> {
|
||||
override fun getOpList(): List<Op<Boolean>> {
|
||||
return listOfNotNull(
|
||||
andFilterWithCompareString(GlobalMetaTable.key, key),
|
||||
andFilterWithCompareString(GlobalMetaTable.value, value)
|
||||
andFilterWithCompareString(GlobalMetaTable.value, value),
|
||||
)
|
||||
}
|
||||
}
|
||||
@@ -110,55 +115,56 @@ class MetaQuery {
|
||||
after: Cursor? = null,
|
||||
first: Int? = null,
|
||||
last: Int? = null,
|
||||
offset: Int? = null
|
||||
offset: Int? = null,
|
||||
): GlobalMetaNodeList {
|
||||
val queryResults = transaction {
|
||||
val res = GlobalMetaTable.selectAll()
|
||||
val queryResults =
|
||||
transaction {
|
||||
val res = GlobalMetaTable.selectAll()
|
||||
|
||||
res.applyOps(condition, filter)
|
||||
res.applyOps(condition, filter)
|
||||
|
||||
if (orderBy != null || (last != null || before != null)) {
|
||||
val orderByColumn = orderBy?.column ?: GlobalMetaTable.key
|
||||
val orderType = orderByType.maybeSwap(last ?: before)
|
||||
if (orderBy != null || (last != null || before != null)) {
|
||||
val orderByColumn = orderBy?.column ?: GlobalMetaTable.key
|
||||
val orderType = orderByType.maybeSwap(last ?: before)
|
||||
|
||||
if (orderBy == MetaOrderBy.KEY || orderBy == null) {
|
||||
res.orderBy(orderByColumn to orderType)
|
||||
} else {
|
||||
res.orderBy(
|
||||
orderByColumn to orderType,
|
||||
GlobalMetaTable.key to SortOrder.ASC
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
val total = res.count()
|
||||
val firstResult = res.firstOrNull()?.get(GlobalMetaTable.key)
|
||||
val lastResult = res.lastOrNull()?.get(GlobalMetaTable.key)
|
||||
|
||||
if (after != null) {
|
||||
res.andWhere {
|
||||
when (orderByType) {
|
||||
DESC, DESC_NULLS_FIRST, DESC_NULLS_LAST -> (orderBy ?: MetaOrderBy.KEY).less(after)
|
||||
null, ASC, ASC_NULLS_FIRST, ASC_NULLS_LAST -> (orderBy ?: MetaOrderBy.KEY).greater(after)
|
||||
if (orderBy == MetaOrderBy.KEY || orderBy == null) {
|
||||
res.orderBy(orderByColumn to orderType)
|
||||
} else {
|
||||
res.orderBy(
|
||||
orderByColumn to orderType,
|
||||
GlobalMetaTable.key to SortOrder.ASC,
|
||||
)
|
||||
}
|
||||
}
|
||||
} else if (before != null) {
|
||||
res.andWhere {
|
||||
when (orderByType) {
|
||||
DESC, DESC_NULLS_FIRST, DESC_NULLS_LAST -> (orderBy ?: MetaOrderBy.KEY).greater(before)
|
||||
null, ASC, ASC_NULLS_FIRST, ASC_NULLS_LAST -> (orderBy ?: MetaOrderBy.KEY).less(before)
|
||||
|
||||
val total = res.count()
|
||||
val firstResult = res.firstOrNull()?.get(GlobalMetaTable.key)
|
||||
val lastResult = res.lastOrNull()?.get(GlobalMetaTable.key)
|
||||
|
||||
if (after != null) {
|
||||
res.andWhere {
|
||||
when (orderByType) {
|
||||
DESC, DESC_NULLS_FIRST, DESC_NULLS_LAST -> (orderBy ?: MetaOrderBy.KEY).less(after)
|
||||
null, ASC, ASC_NULLS_FIRST, ASC_NULLS_LAST -> (orderBy ?: MetaOrderBy.KEY).greater(after)
|
||||
}
|
||||
}
|
||||
} else if (before != null) {
|
||||
res.andWhere {
|
||||
when (orderByType) {
|
||||
DESC, DESC_NULLS_FIRST, DESC_NULLS_LAST -> (orderBy ?: MetaOrderBy.KEY).greater(before)
|
||||
null, ASC, ASC_NULLS_FIRST, ASC_NULLS_LAST -> (orderBy ?: MetaOrderBy.KEY).less(before)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (first != null) {
|
||||
res.limit(first, offset?.toLong() ?: 0)
|
||||
} else if (last != null) {
|
||||
res.limit(last)
|
||||
}
|
||||
if (first != null) {
|
||||
res.limit(first, offset?.toLong() ?: 0)
|
||||
} else if (last != null) {
|
||||
res.limit(last)
|
||||
}
|
||||
|
||||
QueryResults(total, firstResult, lastResult, res.toList())
|
||||
}
|
||||
QueryResults(total, firstResult, lastResult, res.toList())
|
||||
}
|
||||
|
||||
val getAsCursor: (GlobalMetaType) -> Cursor = (orderBy ?: MetaOrderBy.KEY)::asCursor
|
||||
|
||||
@@ -173,24 +179,25 @@ class MetaQuery {
|
||||
resultsAsType.firstOrNull()?.let {
|
||||
GlobalMetaNodeList.MetaEdge(
|
||||
getAsCursor(it),
|
||||
it
|
||||
it,
|
||||
)
|
||||
},
|
||||
resultsAsType.lastOrNull()?.let {
|
||||
GlobalMetaNodeList.MetaEdge(
|
||||
getAsCursor(it),
|
||||
it
|
||||
it,
|
||||
)
|
||||
}
|
||||
},
|
||||
)
|
||||
},
|
||||
pageInfo = PageInfo(
|
||||
hasNextPage = queryResults.lastKey != resultsAsType.lastOrNull()?.key,
|
||||
hasPreviousPage = queryResults.firstKey != resultsAsType.firstOrNull()?.key,
|
||||
startCursor = resultsAsType.firstOrNull()?.let { getAsCursor(it) },
|
||||
endCursor = resultsAsType.lastOrNull()?.let { getAsCursor(it) }
|
||||
),
|
||||
totalCount = queryResults.total.toInt()
|
||||
pageInfo =
|
||||
PageInfo(
|
||||
hasNextPage = queryResults.lastKey != resultsAsType.lastOrNull()?.key,
|
||||
hasPreviousPage = queryResults.firstKey != resultsAsType.firstOrNull()?.key,
|
||||
startCursor = resultsAsType.firstOrNull()?.let { getAsCursor(it) },
|
||||
endCursor = resultsAsType.lastOrNull()?.let { getAsCursor(it) },
|
||||
),
|
||||
totalCount = queryResults.total.toInt(),
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -46,14 +46,18 @@ import suwayomi.tachidesk.manga.model.table.SourceTable
|
||||
import java.util.concurrent.CompletableFuture
|
||||
|
||||
class SourceQuery {
|
||||
fun source(dataFetchingEnvironment: DataFetchingEnvironment, id: Long): CompletableFuture<SourceType> {
|
||||
fun source(
|
||||
dataFetchingEnvironment: DataFetchingEnvironment,
|
||||
id: Long,
|
||||
): CompletableFuture<SourceType> {
|
||||
return dataFetchingEnvironment.getValueFromDataLoader("SourceDataLoader", id)
|
||||
}
|
||||
|
||||
enum class SourceOrderBy(override val column: Column<out Comparable<*>>) : OrderBy<SourceType> {
|
||||
ID(SourceTable.id),
|
||||
NAME(SourceTable.name),
|
||||
LANG(SourceTable.lang);
|
||||
LANG(SourceTable.lang),
|
||||
;
|
||||
|
||||
override fun greater(cursor: Cursor): Op<Boolean> {
|
||||
return when (this) {
|
||||
@@ -72,11 +76,12 @@ class SourceQuery {
|
||||
}
|
||||
|
||||
override fun asCursor(type: SourceType): Cursor {
|
||||
val value = when (this) {
|
||||
ID -> type.id.toString()
|
||||
NAME -> type.id.toString() + "-" + type.name
|
||||
LANG -> type.id.toString() + "-" + type.lang
|
||||
}
|
||||
val value =
|
||||
when (this) {
|
||||
ID -> type.id.toString()
|
||||
NAME -> type.id.toString() + "-" + type.name
|
||||
LANG -> type.id.toString() + "-" + type.lang
|
||||
}
|
||||
return Cursor(value)
|
||||
}
|
||||
}
|
||||
@@ -85,7 +90,7 @@ class SourceQuery {
|
||||
val id: Long? = null,
|
||||
val name: String? = null,
|
||||
val lang: String? = null,
|
||||
val isNsfw: Boolean? = null
|
||||
val isNsfw: Boolean? = null,
|
||||
) : HasGetOp {
|
||||
override fun getOp(): Op<Boolean>? {
|
||||
val opAnd = OpAnd()
|
||||
@@ -105,14 +110,14 @@ class SourceQuery {
|
||||
val isNsfw: BooleanFilter? = null,
|
||||
override val and: List<SourceFilter>? = null,
|
||||
override val or: List<SourceFilter>? = null,
|
||||
override val not: SourceFilter? = null
|
||||
override val not: SourceFilter? = null,
|
||||
) : Filter<SourceFilter> {
|
||||
override fun getOpList(): List<Op<Boolean>> {
|
||||
return listOfNotNull(
|
||||
andFilterWithCompareEntity(SourceTable.id, id),
|
||||
andFilterWithCompareString(SourceTable.name, name),
|
||||
andFilterWithCompareString(SourceTable.lang, lang),
|
||||
andFilterWithCompare(SourceTable.isNsfw, isNsfw)
|
||||
andFilterWithCompare(SourceTable.isNsfw, isNsfw),
|
||||
)
|
||||
}
|
||||
}
|
||||
@@ -126,57 +131,58 @@ class SourceQuery {
|
||||
after: Cursor? = null,
|
||||
first: Int? = null,
|
||||
last: Int? = null,
|
||||
offset: Int? = null
|
||||
offset: Int? = null,
|
||||
): SourceNodeList {
|
||||
val (queryResults, resultsAsType) = transaction {
|
||||
val res = SourceTable.selectAll()
|
||||
val (queryResults, resultsAsType) =
|
||||
transaction {
|
||||
val res = SourceTable.selectAll()
|
||||
|
||||
res.applyOps(condition, filter)
|
||||
res.applyOps(condition, filter)
|
||||
|
||||
if (orderBy != null || (last != null || before != null)) {
|
||||
val orderByColumn = orderBy?.column ?: SourceTable.id
|
||||
val orderType = orderByType.maybeSwap(last ?: before)
|
||||
if (orderBy != null || (last != null || before != null)) {
|
||||
val orderByColumn = orderBy?.column ?: SourceTable.id
|
||||
val orderType = orderByType.maybeSwap(last ?: before)
|
||||
|
||||
if (orderBy == SourceOrderBy.ID || orderBy == null) {
|
||||
res.orderBy(orderByColumn to orderType)
|
||||
} else {
|
||||
res.orderBy(
|
||||
orderByColumn to orderType,
|
||||
SourceTable.id to SortOrder.ASC
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
val total = res.count()
|
||||
val firstResult = res.firstOrNull()?.get(SourceTable.id)?.value
|
||||
val lastResult = res.lastOrNull()?.get(SourceTable.id)?.value
|
||||
|
||||
if (after != null) {
|
||||
res.andWhere {
|
||||
when (orderByType) {
|
||||
DESC, DESC_NULLS_FIRST, DESC_NULLS_LAST -> (orderBy ?: SourceOrderBy.ID).less(after)
|
||||
null, ASC, ASC_NULLS_FIRST, ASC_NULLS_LAST -> (orderBy ?: SourceOrderBy.ID).greater(after)
|
||||
if (orderBy == SourceOrderBy.ID || orderBy == null) {
|
||||
res.orderBy(orderByColumn to orderType)
|
||||
} else {
|
||||
res.orderBy(
|
||||
orderByColumn to orderType,
|
||||
SourceTable.id to SortOrder.ASC,
|
||||
)
|
||||
}
|
||||
}
|
||||
} else if (before != null) {
|
||||
res.andWhere {
|
||||
when (orderByType) {
|
||||
DESC, DESC_NULLS_FIRST, DESC_NULLS_LAST -> (orderBy ?: SourceOrderBy.ID).greater(before)
|
||||
null, ASC, ASC_NULLS_FIRST, ASC_NULLS_LAST -> (orderBy ?: SourceOrderBy.ID).less(before)
|
||||
|
||||
val total = res.count()
|
||||
val firstResult = res.firstOrNull()?.get(SourceTable.id)?.value
|
||||
val lastResult = res.lastOrNull()?.get(SourceTable.id)?.value
|
||||
|
||||
if (after != null) {
|
||||
res.andWhere {
|
||||
when (orderByType) {
|
||||
DESC, DESC_NULLS_FIRST, DESC_NULLS_LAST -> (orderBy ?: SourceOrderBy.ID).less(after)
|
||||
null, ASC, ASC_NULLS_FIRST, ASC_NULLS_LAST -> (orderBy ?: SourceOrderBy.ID).greater(after)
|
||||
}
|
||||
}
|
||||
} else if (before != null) {
|
||||
res.andWhere {
|
||||
when (orderByType) {
|
||||
DESC, DESC_NULLS_FIRST, DESC_NULLS_LAST -> (orderBy ?: SourceOrderBy.ID).greater(before)
|
||||
null, ASC, ASC_NULLS_FIRST, ASC_NULLS_LAST -> (orderBy ?: SourceOrderBy.ID).less(before)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (first != null) {
|
||||
res.limit(first, offset?.toLong() ?: 0)
|
||||
} else if (last != null) {
|
||||
res.limit(last)
|
||||
}
|
||||
if (first != null) {
|
||||
res.limit(first, offset?.toLong() ?: 0)
|
||||
} else if (last != null) {
|
||||
res.limit(last)
|
||||
}
|
||||
|
||||
QueryResults(total, firstResult, lastResult, res.toList()).let {
|
||||
it to it.results.mapNotNull { SourceType(it) }
|
||||
QueryResults(total, firstResult, lastResult, res.toList()).let {
|
||||
it to it.results.mapNotNull { SourceType(it) }
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
val getAsCursor: (SourceType) -> Cursor = (orderBy ?: SourceOrderBy.ID)::asCursor
|
||||
|
||||
@@ -189,24 +195,25 @@ class SourceQuery {
|
||||
resultsAsType.firstOrNull()?.let {
|
||||
SourceNodeList.SourceEdge(
|
||||
getAsCursor(it),
|
||||
it
|
||||
it,
|
||||
)
|
||||
},
|
||||
resultsAsType.lastOrNull()?.let {
|
||||
SourceNodeList.SourceEdge(
|
||||
getAsCursor(it),
|
||||
it
|
||||
it,
|
||||
)
|
||||
}
|
||||
},
|
||||
)
|
||||
},
|
||||
pageInfo = PageInfo(
|
||||
hasNextPage = queryResults.lastKey != resultsAsType.lastOrNull()?.id,
|
||||
hasPreviousPage = queryResults.firstKey != resultsAsType.firstOrNull()?.id,
|
||||
startCursor = resultsAsType.firstOrNull()?.let { getAsCursor(it) },
|
||||
endCursor = resultsAsType.lastOrNull()?.let { getAsCursor(it) }
|
||||
),
|
||||
totalCount = queryResults.total.toInt()
|
||||
pageInfo =
|
||||
PageInfo(
|
||||
hasNextPage = queryResults.lastKey != resultsAsType.lastOrNull()?.id,
|
||||
hasPreviousPage = queryResults.firstKey != resultsAsType.firstOrNull()?.id,
|
||||
startCursor = resultsAsType.firstOrNull()?.let { getAsCursor(it) },
|
||||
endCursor = resultsAsType.lastOrNull()?.let { getAsCursor(it) },
|
||||
),
|
||||
totalCount = queryResults.total.toInt(),
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -17,7 +17,11 @@ import org.jetbrains.exposed.sql.or
|
||||
import org.jetbrains.exposed.sql.stringParam
|
||||
import org.jetbrains.exposed.sql.upperCase
|
||||
|
||||
class ILikeEscapeOp(expr1: Expression<*>, expr2: Expression<*>, like: Boolean, val escapeChar: Char?) : ComparisonOp(expr1, expr2, if (like) "ILIKE" else "NOT ILIKE") {
|
||||
class ILikeEscapeOp(expr1: Expression<*>, expr2: Expression<*>, like: Boolean, val escapeChar: Char?) : ComparisonOp(
|
||||
expr1,
|
||||
expr2,
|
||||
if (like) "ILIKE" else "NOT ILIKE",
|
||||
) {
|
||||
override fun toQueryBuilder(queryBuilder: QueryBuilder) {
|
||||
super.toQueryBuilder(queryBuilder)
|
||||
if (escapeChar != null) {
|
||||
@@ -29,43 +33,93 @@ class ILikeEscapeOp(expr1: Expression<*>, expr2: Expression<*>, like: Boolean, v
|
||||
}
|
||||
|
||||
companion object {
|
||||
fun <T : String?> iLike(expression: Expression<T>, pattern: String): ILikeEscapeOp = iLike(expression, LikePattern(pattern))
|
||||
fun <T : String?> iNotLike(expression: Expression<T>, pattern: String): ILikeEscapeOp = iNotLike(expression, LikePattern(pattern))
|
||||
fun <T : String?> iLike(expression: Expression<T>, pattern: LikePattern): ILikeEscapeOp = ILikeEscapeOp(expression, stringParam(pattern.pattern), true, pattern.escapeChar)
|
||||
fun <T : String?> iNotLike(expression: Expression<T>, pattern: LikePattern): ILikeEscapeOp = ILikeEscapeOp(expression, stringParam(pattern.pattern), false, pattern.escapeChar)
|
||||
fun <T : String?> iLike(
|
||||
expression: Expression<T>,
|
||||
pattern: String,
|
||||
): ILikeEscapeOp = iLike(expression, LikePattern(pattern))
|
||||
|
||||
fun <T : String?> iNotLike(
|
||||
expression: Expression<T>,
|
||||
pattern: String,
|
||||
): ILikeEscapeOp = iNotLike(expression, LikePattern(pattern))
|
||||
|
||||
fun <T : String?> iLike(
|
||||
expression: Expression<T>,
|
||||
pattern: LikePattern,
|
||||
): ILikeEscapeOp =
|
||||
ILikeEscapeOp(
|
||||
expression,
|
||||
stringParam(pattern.pattern),
|
||||
true,
|
||||
pattern.escapeChar,
|
||||
)
|
||||
|
||||
fun <T : String?> iNotLike(
|
||||
expression: Expression<T>,
|
||||
pattern: LikePattern,
|
||||
): ILikeEscapeOp =
|
||||
ILikeEscapeOp(
|
||||
expression,
|
||||
stringParam(pattern.pattern),
|
||||
false,
|
||||
pattern.escapeChar,
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
class DistinctFromOp(expr1: Expression<*>, expr2: Expression<*>, not: Boolean) : ComparisonOp(expr1, expr2, if (not) "IS NOT DISTINCT FROM" else "IS DISTINCT FROM") {
|
||||
class DistinctFromOp(expr1: Expression<*>, expr2: Expression<*>, not: Boolean) : ComparisonOp(
|
||||
expr1,
|
||||
expr2,
|
||||
if (not) "IS NOT DISTINCT FROM" else "IS DISTINCT FROM",
|
||||
) {
|
||||
companion object {
|
||||
fun <T> distinctFrom(expression: ExpressionWithColumnType<T>, t: T): DistinctFromOp = DistinctFromOp(
|
||||
expression,
|
||||
with(SqlExpressionBuilder) {
|
||||
expression.wrap(t)
|
||||
},
|
||||
false
|
||||
)
|
||||
fun <T> notDistinctFrom(expression: ExpressionWithColumnType<T>, t: T): DistinctFromOp = DistinctFromOp(
|
||||
expression,
|
||||
with(SqlExpressionBuilder) {
|
||||
expression.wrap(t)
|
||||
},
|
||||
true
|
||||
)
|
||||
fun <T : Comparable<T>> distinctFrom(expression: ExpressionWithColumnType<EntityID<T>>, t: T): DistinctFromOp = DistinctFromOp(
|
||||
expression,
|
||||
with(SqlExpressionBuilder) {
|
||||
expression.wrap(t)
|
||||
},
|
||||
false
|
||||
)
|
||||
fun <T : Comparable<T>> notDistinctFrom(expression: ExpressionWithColumnType<EntityID<T>>, t: T): DistinctFromOp = DistinctFromOp(
|
||||
expression,
|
||||
with(SqlExpressionBuilder) {
|
||||
expression.wrap(t)
|
||||
},
|
||||
true
|
||||
)
|
||||
fun <T> distinctFrom(
|
||||
expression: ExpressionWithColumnType<T>,
|
||||
t: T,
|
||||
): DistinctFromOp =
|
||||
DistinctFromOp(
|
||||
expression,
|
||||
with(SqlExpressionBuilder) {
|
||||
expression.wrap(t)
|
||||
},
|
||||
false,
|
||||
)
|
||||
|
||||
fun <T> notDistinctFrom(
|
||||
expression: ExpressionWithColumnType<T>,
|
||||
t: T,
|
||||
): DistinctFromOp =
|
||||
DistinctFromOp(
|
||||
expression,
|
||||
with(SqlExpressionBuilder) {
|
||||
expression.wrap(t)
|
||||
},
|
||||
true,
|
||||
)
|
||||
|
||||
fun <T : Comparable<T>> distinctFrom(
|
||||
expression: ExpressionWithColumnType<EntityID<T>>,
|
||||
t: T,
|
||||
): DistinctFromOp =
|
||||
DistinctFromOp(
|
||||
expression,
|
||||
with(SqlExpressionBuilder) {
|
||||
expression.wrap(t)
|
||||
},
|
||||
false,
|
||||
)
|
||||
|
||||
fun <T : Comparable<T>> notDistinctFrom(
|
||||
expression: ExpressionWithColumnType<EntityID<T>>,
|
||||
t: T,
|
||||
): DistinctFromOp =
|
||||
DistinctFromOp(
|
||||
expression,
|
||||
with(SqlExpressionBuilder) {
|
||||
expression.wrap(t)
|
||||
},
|
||||
true,
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -88,9 +142,10 @@ interface Filter<T : Filter<T>> : HasGetOp {
|
||||
|
||||
override fun getOp(): Op<Boolean>? {
|
||||
var op: Op<Boolean>? = null
|
||||
|
||||
fun newOp(
|
||||
otherOp: Op<Boolean>?,
|
||||
operator: (Op<Boolean>, Op<Boolean>) -> Op<Boolean>
|
||||
operator: (Op<Boolean>, Op<Boolean>) -> Op<Boolean>,
|
||||
) {
|
||||
when {
|
||||
op == null && otherOp == null -> Unit
|
||||
@@ -99,9 +154,11 @@ interface Filter<T : Filter<T>> : HasGetOp {
|
||||
op != null && otherOp != null -> op = operator(op!!, otherOp)
|
||||
}
|
||||
}
|
||||
|
||||
fun andOp(andOp: Op<Boolean>?) {
|
||||
newOp(andOp, Op<Boolean>::and)
|
||||
}
|
||||
|
||||
fun orOp(orOp: Op<Boolean>?) {
|
||||
newOp(orOp, Op<Boolean>::or)
|
||||
}
|
||||
@@ -127,6 +184,8 @@ interface ScalarFilter<T> {
|
||||
val notEqualTo: T?
|
||||
val distinctFrom: T?
|
||||
val notDistinctFrom: T?
|
||||
|
||||
@Suppress("ktlint:standard:property-naming")
|
||||
val `in`: List<T>?
|
||||
val notIn: List<T>?
|
||||
}
|
||||
@@ -155,7 +214,7 @@ data class LongFilter(
|
||||
override val lessThan: Long? = null,
|
||||
override val lessThanOrEqualTo: Long? = null,
|
||||
override val greaterThan: Long? = null,
|
||||
override val greaterThanOrEqualTo: Long? = null
|
||||
override val greaterThanOrEqualTo: Long? = null,
|
||||
) : ComparableScalarFilter<Long>
|
||||
|
||||
data class BooleanFilter(
|
||||
@@ -169,7 +228,7 @@ data class BooleanFilter(
|
||||
override val lessThan: Boolean? = null,
|
||||
override val lessThanOrEqualTo: Boolean? = null,
|
||||
override val greaterThan: Boolean? = null,
|
||||
override val greaterThanOrEqualTo: Boolean? = null
|
||||
override val greaterThanOrEqualTo: Boolean? = null,
|
||||
) : ComparableScalarFilter<Boolean>
|
||||
|
||||
data class IntFilter(
|
||||
@@ -183,7 +242,7 @@ data class IntFilter(
|
||||
override val lessThan: Int? = null,
|
||||
override val lessThanOrEqualTo: Int? = null,
|
||||
override val greaterThan: Int? = null,
|
||||
override val greaterThanOrEqualTo: Int? = null
|
||||
override val greaterThanOrEqualTo: Int? = null,
|
||||
) : ComparableScalarFilter<Int>
|
||||
|
||||
data class FloatFilter(
|
||||
@@ -197,7 +256,7 @@ data class FloatFilter(
|
||||
override val lessThan: Float? = null,
|
||||
override val lessThanOrEqualTo: Float? = null,
|
||||
override val greaterThan: Float? = null,
|
||||
override val greaterThanOrEqualTo: Float? = null
|
||||
override val greaterThanOrEqualTo: Float? = null,
|
||||
) : ComparableScalarFilter<Float>
|
||||
|
||||
data class StringFilter(
|
||||
@@ -235,7 +294,7 @@ data class StringFilter(
|
||||
val lessThanInsensitive: String? = null,
|
||||
val lessThanOrEqualToInsensitive: String? = null,
|
||||
val greaterThanInsensitive: String? = null,
|
||||
val greaterThanOrEqualToInsensitive: String? = null
|
||||
val greaterThanOrEqualToInsensitive: String? = null,
|
||||
) : ComparableScalarFilter<String>
|
||||
|
||||
data class StringListFilter(
|
||||
@@ -251,13 +310,13 @@ data class StringListFilter(
|
||||
override val hasNone: List<String>? = null,
|
||||
val hasAnyInsensitive: List<String>? = null,
|
||||
val hasAllInsensitive: List<String>? = null,
|
||||
val hasNoneInsensitive: List<String>? = null
|
||||
val hasNoneInsensitive: List<String>? = null,
|
||||
) : ListScalarFilter<String, List<String>>
|
||||
|
||||
@Suppress("UNCHECKED_CAST")
|
||||
fun <T : String, S : T?> andFilterWithCompareString(
|
||||
column: Column<S>,
|
||||
filter: StringFilter?
|
||||
filter: StringFilter?,
|
||||
): Op<Boolean>? {
|
||||
filter ?: return null
|
||||
val opAnd = OpAnd()
|
||||
@@ -314,19 +373,29 @@ fun <T : String, S : T?> andFilterWithCompareString(
|
||||
}
|
||||
|
||||
class OpAnd(var op: Op<Boolean>? = null) {
|
||||
fun <T> andWhere(value: T?, andPart: SqlExpressionBuilder.(T & Any) -> Op<Boolean>) {
|
||||
fun <T> andWhere(
|
||||
value: T?,
|
||||
andPart: SqlExpressionBuilder.(T & Any) -> Op<Boolean>,
|
||||
) {
|
||||
value ?: return
|
||||
val expr = Op.build { andPart(value) }
|
||||
op = if (op == null) expr else (op!! and expr)
|
||||
}
|
||||
|
||||
fun <T> eq(value: T?, column: Column<T>) = andWhere(value) { column eq it }
|
||||
fun <T : Comparable<T>> eq(value: T?, column: Column<EntityID<T>>) = andWhere(value) { column eq it }
|
||||
fun <T> eq(
|
||||
value: T?,
|
||||
column: Column<T>,
|
||||
) = andWhere(value) { column eq it }
|
||||
|
||||
fun <T : Comparable<T>> eq(
|
||||
value: T?,
|
||||
column: Column<EntityID<T>>,
|
||||
) = andWhere(value) { column eq it }
|
||||
}
|
||||
|
||||
fun <T : Comparable<T>> andFilterWithCompare(
|
||||
column: Column<T>,
|
||||
filter: ComparableScalarFilter<T>?
|
||||
filter: ComparableScalarFilter<T>?,
|
||||
): Op<Boolean>? {
|
||||
filter ?: return null
|
||||
val opAnd = OpAnd(andFilter(column, filter))
|
||||
@@ -341,7 +410,7 @@ fun <T : Comparable<T>> andFilterWithCompare(
|
||||
|
||||
fun <T : Comparable<T>> andFilterWithCompareEntity(
|
||||
column: Column<EntityID<T>>,
|
||||
filter: ComparableScalarFilter<T>?
|
||||
filter: ComparableScalarFilter<T>?,
|
||||
): Op<Boolean>? {
|
||||
filter ?: return null
|
||||
val opAnd = OpAnd(andFilterEntity(column, filter))
|
||||
@@ -356,7 +425,7 @@ fun <T : Comparable<T>> andFilterWithCompareEntity(
|
||||
|
||||
fun <T : Comparable<T>> andFilter(
|
||||
column: Column<T>,
|
||||
filter: ScalarFilter<T>?
|
||||
filter: ScalarFilter<T>?,
|
||||
): Op<Boolean>? {
|
||||
filter ?: return null
|
||||
val opAnd = OpAnd()
|
||||
@@ -377,7 +446,7 @@ fun <T : Comparable<T>> andFilter(
|
||||
|
||||
fun <T : Comparable<T>> andFilterEntity(
|
||||
column: Column<EntityID<T>>,
|
||||
filter: ScalarFilter<T>?
|
||||
filter: ScalarFilter<T>?,
|
||||
): Op<Boolean>? {
|
||||
filter ?: return null
|
||||
val opAnd = OpAnd()
|
||||
|
||||
Reference in New Issue
Block a user