Я предоставляю метод, который позволяет использовать несколько параметров фильтрации при запросе к таблице books
. Первая часть запроса выполняет поиск по всем книгам или только по тем, которые принадлежат текущему пользователю.
val allBookQuery = if(searchParameters.isOnShelf == true) {
val context = environment.getContext<AuthorizedContext>()
context?.currentUser ?: throw GraphQLException("No Current User Authenticated")
val userUUID = UUID.fromString(context.currentUser.uuid)
select.from(BOOKS, USER_BOOKS, USERS)
.where(USERS.UUID.eq(userUUID))
.and(USERS.ID.eq(USER_BOOKS.USER_ID))
.and(USER_BOOKS.BOOK_ID.eq(BOOKS.ID))
.and(BOOKS.IS_ARCHIVED.eq(false))
} else {
select.from(BOOKS).where(true)
}
Выражение .where(true)
используется для сохранения согласованности типа allBookQuery
, чтобы впоследствии я мог добавлять другие условия без проверки типов.
val filteredBooksQuery = if (searchParameters.bookIds != null) {
allBookQuery.and(BOOKS.ID.`in`(searchParameters.bookIds))
} else {
allBookQuery
}
val finalQuery = if (searchParameters.isAcademic == true) {
filteredBooksQuery.and(BOOKS.IS_ACADEMIC.eq((true)))
} else {
filteredBooksQuery
}
К сожалению, метод where(Boolean)
устарел. Так что пока это работает, я хотел бы заменить это операцией NOOP, которая не считается устаревшей.