( - val hints: Map-) : JpaQueryHintClause { - override fun apply(query: Q) { - hints.forEach { (hintName, value) -> query.setHint(hintName, value) } - } -} diff --git a/core-jakarta/src/main/kotlin/com/linecorp/kotlinjdsl/query/clause/limit/LimitClause.kt b/core-jakarta/src/main/kotlin/com/linecorp/kotlinjdsl/query/clause/limit/LimitClause.kt deleted file mode 100644 index 8c5b5097d..000000000 --- a/core-jakarta/src/main/kotlin/com/linecorp/kotlinjdsl/query/clause/limit/LimitClause.kt +++ /dev/null @@ -1,20 +0,0 @@ -package com.linecorp.kotlinjdsl.query.clause.limit - -import jakarta.persistence.Query - -data class LimitClause( - private val offset: Int?, - private val maxResults: Int?, -) : QueryLimitClause{ - companion object { - val empty = LimitClause(null, null) - - @Suppress("UNCHECKED_CAST") - fun empty(): LimitClause = empty as LimitClause - } - - override fun apply(query: Q) { - offset?.run { query.firstResult = this } - maxResults?.run { query.maxResults = this } - } -} diff --git a/core-jakarta/src/main/kotlin/com/linecorp/kotlinjdsl/query/creator/CriteriaQueryCreator.kt b/core-jakarta/src/main/kotlin/com/linecorp/kotlinjdsl/query/creator/CriteriaQueryCreator.kt deleted file mode 100644 index 2c6c9149c..000000000 --- a/core-jakarta/src/main/kotlin/com/linecorp/kotlinjdsl/query/creator/CriteriaQueryCreator.kt +++ /dev/null @@ -1,13 +0,0 @@ -package com.linecorp.kotlinjdsl.query.creator - -import com.linecorp.kotlinjdsl.query.CriteriaDeleteQuerySpec -import com.linecorp.kotlinjdsl.query.CriteriaQuerySpec -import com.linecorp.kotlinjdsl.query.CriteriaUpdateQuerySpec -import jakarta.persistence.Query -import jakarta.persistence.TypedQuery - -interface CriteriaQueryCreator { - fun createQuery(spec: CriteriaQuerySpec >): TypedQuery - fun createQuery(spec: CriteriaUpdateQuerySpec ): Query - fun createQuery(spec: CriteriaDeleteQuerySpec ): Query -} diff --git a/core-jakarta/src/main/kotlin/com/linecorp/kotlinjdsl/query/creator/CriteriaQueryCreatorImpl.kt b/core-jakarta/src/main/kotlin/com/linecorp/kotlinjdsl/query/creator/CriteriaQueryCreatorImpl.kt deleted file mode 100644 index 388f1e878..000000000 --- a/core-jakarta/src/main/kotlin/com/linecorp/kotlinjdsl/query/creator/CriteriaQueryCreatorImpl.kt +++ /dev/null @@ -1,21 +0,0 @@ -package com.linecorp.kotlinjdsl.query.creator - -import com.linecorp.kotlinjdsl.query.CriteriaDeleteQuerySpec -import com.linecorp.kotlinjdsl.query.CriteriaQuerySpec -import com.linecorp.kotlinjdsl.query.CriteriaUpdateQuerySpec -import jakarta.persistence.EntityManager -import jakarta.persistence.Query -import jakarta.persistence.TypedQuery - -class CriteriaQueryCreatorImpl( - private val em: EntityManager, -) : CriteriaQueryCreator { - override fun createQuery(spec: CriteriaQuerySpec >): TypedQuery = - JpaCriteriaQueryBuilder.createQuery(spec, em.criteriaBuilder, em::createQuery) - - override fun createQuery(spec: CriteriaUpdateQuerySpec ): Query = - JpaCriteriaQueryBuilder.createQuery(spec, em.criteriaBuilder, em::createQuery) - - override fun createQuery(spec: CriteriaDeleteQuerySpec ): Query = - JpaCriteriaQueryBuilder.createQuery(spec, em.criteriaBuilder, em::createQuery) -} diff --git a/core-jakarta/src/main/kotlin/com/linecorp/kotlinjdsl/querydsl/QueryDslImpl.kt b/core-jakarta/src/main/kotlin/com/linecorp/kotlinjdsl/querydsl/QueryDslImpl.kt deleted file mode 100644 index add603bc9..000000000 --- a/core-jakarta/src/main/kotlin/com/linecorp/kotlinjdsl/querydsl/QueryDslImpl.kt +++ /dev/null @@ -1,386 +0,0 @@ -package com.linecorp.kotlinjdsl.querydsl - -import com.linecorp.kotlinjdsl.query.CriteriaDeleteQuerySpec -import com.linecorp.kotlinjdsl.query.CriteriaQuerySpec -import com.linecorp.kotlinjdsl.query.CriteriaUpdateQuerySpec -import com.linecorp.kotlinjdsl.query.SubquerySpec -import com.linecorp.kotlinjdsl.query.clause.from.FromClause -import com.linecorp.kotlinjdsl.query.clause.from.JoinClause -import com.linecorp.kotlinjdsl.query.clause.from.SimpleAssociatedJoinClause -import com.linecorp.kotlinjdsl.query.clause.groupby.CriteriaQueryGroupByClause -import com.linecorp.kotlinjdsl.query.clause.groupby.GroupByClause -import com.linecorp.kotlinjdsl.query.clause.groupby.SubqueryGroupByClause -import com.linecorp.kotlinjdsl.query.clause.having.CriteriaQueryHavingClause -import com.linecorp.kotlinjdsl.query.clause.having.HavingClause -import com.linecorp.kotlinjdsl.query.clause.having.SubqueryHavingClause -import com.linecorp.kotlinjdsl.query.clause.hint.JpaQueryHintClause -import com.linecorp.kotlinjdsl.query.clause.hint.JpaQueryHintClauseImpl -import com.linecorp.kotlinjdsl.query.clause.hint.SqlQueryHintClause -import com.linecorp.kotlinjdsl.query.clause.limit.LimitClause -import com.linecorp.kotlinjdsl.query.clause.limit.QueryLimitClause -import com.linecorp.kotlinjdsl.query.clause.orderby.CriteriaQueryOrderByClause -import com.linecorp.kotlinjdsl.query.clause.orderby.OrderByClause -import com.linecorp.kotlinjdsl.query.clause.select.CriteriaQuerySelectClause -import com.linecorp.kotlinjdsl.query.clause.select.MultiSelectClause -import com.linecorp.kotlinjdsl.query.clause.select.SingleSelectClause -import com.linecorp.kotlinjdsl.query.clause.select.SubquerySelectClause -import com.linecorp.kotlinjdsl.query.clause.set.SetClause -import com.linecorp.kotlinjdsl.query.clause.where.CriteriaQueryWhereClause -import com.linecorp.kotlinjdsl.query.clause.where.SubqueryWhereClause -import com.linecorp.kotlinjdsl.query.clause.where.WhereClause -import com.linecorp.kotlinjdsl.query.spec.* -import com.linecorp.kotlinjdsl.query.spec.expression.ColumnSpec -import com.linecorp.kotlinjdsl.query.spec.expression.EntitySpec -import com.linecorp.kotlinjdsl.query.spec.expression.ExpressionSpec -import com.linecorp.kotlinjdsl.query.spec.predicate.AndSpec -import com.linecorp.kotlinjdsl.query.spec.predicate.OrSpec -import com.linecorp.kotlinjdsl.query.spec.predicate.PredicateSpec -import com.linecorp.kotlinjdsl.querydsl.from.Relation -import com.linecorp.kotlinjdsl.querydsl.hint.SqlQueryHintClauseProvider -import jakarta.persistence.Query -import jakarta.persistence.TypedQuery -import jakarta.persistence.criteria.JoinType - -/** - * Internal DSL Implementation - * - * Don't use this directly because it's an **INTERNAL** class. - * It does not support backward compatibility. - * This class should be used with the understanding that it is not thread safe and therefore not suitable for parallel processing. - */ -open class QueryDslImpl ( - private val returnType: Class , -) : CriteriaQueryDsl , SubqueryDsl , CriteriaUpdateQueryDsl, CriteriaDeleteQueryDsl { - private var singleSelectClause: SingleSelectClause ? = null - private var multiSelectClause: MultiSelectClause ? = null - private var fromClause: FromClause<*>? = null - private var joins: MutableList >? = null - private var wheres: MutableList ? = null - private var groupBys: MutableList >? = null - private var havings: MutableList ? = null - private var orderBys: MutableList ? = null - private var offset: Int? = null - private var maxResults: Int? = null - private var sqlHints: MutableList ? = null - private var jpaHints: MutableMap ? = null - private var params: MutableMap , Any?>? = null - - private fun lazyJoins() = (joins ?: mutableListOf >().apply { joins = this }) - private fun lazyWheres() = (wheres ?: mutableListOf ().apply { wheres = this }) - private fun lazyGroupBys() = (groupBys ?: mutableListOf >().apply { groupBys = this }) - private fun lazyHavings() = (havings ?: mutableListOf ().apply { havings = this }) - private fun lazyOrderBys() = (orderBys ?: mutableListOf ().apply { orderBys = this }) - private fun lazySqlHints() = (sqlHints ?: mutableListOf ().apply { sqlHints = this }) - private fun lazyJpaHints() = (jpaHints ?: mutableMapOf ().apply { jpaHints = this }) - private fun lazyParams() = (params ?: mutableMapOf , Any?>().apply { params = this }) - - override fun select(distinct: Boolean, expression: ExpressionSpec ): SingleSelectClause { - return SingleSelectClause( - returnType = returnType, - distinct = distinct, - expression = expression, - ).also { singleSelectClause = it } - } - - override fun select(distinct: Boolean, expressions: List >): MultiSelectClause { - return MultiSelectClause( - returnType = returnType, - distinct = distinct, - expressions = expressions, - ).also { multiSelectClause = it } - } - - override fun from(entity: EntitySpec<*>) { - fromClause = FromClause(entity) - } - - override fun join(left: EntitySpec , right: EntitySpec , relation: Relation , joinType: JoinType) { - lazyJoins().add(SimpleJoinSpec(left = left, right = right, path = relation.path, joinType = joinType)) - } - - override fun join(entity: EntitySpec , predicate: PredicateSpec) { - lazyJoins().add(CrossJoinSpec(entity)) - lazyWheres().add(predicate) - } - - override fun associate( - left: EntitySpec , - right: EntitySpec , - relation: Relation , - joinType: JoinType - ) { - lazyJoins().add(SimpleAssociatedJoinSpec(left = left, right = right, path = relation.path)) - } - - override fun treat( - root: ColumnSpec<*>, - parent: EntitySpec
, - child: EntitySpec
, - parentJoinType: JoinType - ) { - lazyJoins().add(TreatJoinSpec(parent, child, parentJoinType, root)) - } - - override fun fetch( - left: EntitySpec , - right: EntitySpec , - relation: Relation , - joinType: JoinType - ) { - lazyJoins().add(FetchJoinSpec(left = left, right = right, path = relation.path, joinType = joinType)) - } - - override fun where(predicate: PredicateSpec?) { - predicate?.run { lazyWheres().add(this) } - } - - override fun whereAnd(predicates: List ) { - predicates.filterNotNull() - .takeIf { it.isNotEmpty() } - ?.run { where(AndSpec(this)) } - } - - override fun whereOr(predicates: List ) { - predicates.filterNotNull() - .takeIf { it.isNotEmpty() } - ?.run { where(OrSpec(this)) } - } - - override fun groupBy(columns: List >) { - lazyGroupBys().addAll(columns) - } - - override fun having(predicate: PredicateSpec) { - lazyHavings().add(predicate) - } - - override fun orderBy(orders: List ) { - lazyOrderBys().addAll(orders) - } - - override fun offset(offset: Int) { - this.offset = offset - } - - override fun maxResults(maxResults: Int) { - this.maxResults = maxResults - } - - override fun sqlHints(hints: List ) { - lazySqlHints().addAll(hints) - } - - override fun hints(hints: Map ) { - lazyJpaHints().putAll(hints) - } - - override fun setParams(params: Map , Any?>) { - lazyParams().putAll(params) - } - - override fun set(column: ColumnSpec<*>, value: Any?) { - lazyParams()[column] = value - } - - fun createCriteriaQuerySpec(): CriteriaQuerySpec > { - return CriteriaQuerySpecImpl( - select = getCriteriaQuerySelectClause(), - from = getFromClause(), - join = getJoinClause(), - where = getWhereClause(), - groupBy = getGroupByClause(), - having = getHavingClause(), - orderBy = getOrderByClause(), - limit = getLimitClause(), - sqlHint = getSqlQueryHintClause(), - jpaHint = getJpaQueryHintClause(), - ) - } - - @Suppress("UNCHECKED_CAST") - fun createCriteriaUpdateQuerySpec(): CriteriaUpdateQuerySpec { - return CriteriaUpdateQuerySpecImpl( - targetEntity = returnType, - from = getFromClause() as FromClause , - associate = getSimpleAssociatedJoinClauseOnly(), - where = getWhereClause(), - sqlHint = getSqlQueryHintClause(), - jpaHint = getJpaQueryHintClause(), - set = getSetClause() - ) - } - - @Suppress("MemberVisibilityCanBePrivate") - protected fun getSetClause() = SetClause(params.orEmpty()) - - @Suppress("UNCHECKED_CAST") - fun createCriteriaDeleteQuerySpec(): CriteriaDeleteQuerySpec { - return CriteriaDeleteQuerySpecImpl( - targetEntity = returnType, - from = getFromClause() as FromClause , - associate = getSimpleAssociatedJoinClauseOnly(), - where = getWhereClause(), - sqlHint = getSqlQueryHintClause(), - jpaHint = getJpaQueryHintClause() - ) - } - - fun createSubquerySpec(): SubquerySpec { - return SubquerySpecImpl( - select = getSubquerySelectClause(), - from = getFromClause(), - join = getJoinClauseDoesNotHaveFetch(), - where = getWhereClause(), - groupBy = getGroupByClause(), - having = getHavingClause(), - ) - } - - protected fun getCriteriaQuerySelectClause(): CriteriaQuerySelectClause { - mustBe(singleSelectClause != null || multiSelectClause != null) { - "There is no select clause in query" - } - - return singleSelectClause ?: multiSelectClause!! - } - - @Suppress("MemberVisibilityCanBePrivate") - protected fun getSubquerySelectClause(): SubquerySelectClause { - mustBe(singleSelectClause != null) { "There is no select clause in query" } - - return singleSelectClause!! - } - - protected fun getFromClause(): FromClause<*> { - mustBe(fromClause != null) { "There is no from clause in query" } - - return fromClause!! - } - - @Suppress("MemberVisibilityCanBePrivate") - protected fun getJoinClause(): JoinClause { - return JoinClause(joins.orEmpty()) - } - - @Suppress("MemberVisibilityCanBePrivate") - protected fun getJoinClauseDoesNotHaveFetch(): JoinClause { - mustBe(joins.orEmpty().filterIsInstance >().isEmpty()) { "This query does not support fetch" } - - return getJoinClause() - } - - @Suppress("MemberVisibilityCanBePrivate") - protected fun getSimpleAssociatedJoinClauseOnly(): SimpleAssociatedJoinClause { - val joins = joins.orEmpty() - return joins.filterIsInstance >().let { - mustBe(it.size == joins.size) { "This query only support associate" } - SimpleAssociatedJoinClause(it) - } - } - - protected fun getWhereClause(): WhereClause { - return WhereClause(wheres.orEmpty().merge()) - } - - @Suppress("MemberVisibilityCanBePrivate") - protected fun getGroupByClause(): GroupByClause { - return GroupByClause(groupBys.orEmpty()) - } - - protected fun getEmptyGroupByClause(): GroupByClause { - return GroupByClause(emptyList()) - } - - @Suppress("MemberVisibilityCanBePrivate") - protected fun getHavingClause(): HavingClause { - return HavingClause(havings.orEmpty().merge()) - } - - protected fun getEmptyHavingClause(): HavingClause { - return HavingClause(PredicateSpec.empty) - } - - @Suppress("MemberVisibilityCanBePrivate") - protected fun getOrderByClause(): CriteriaQueryOrderByClause { - return OrderByClause(orderBys.orEmpty()) - } - - protected fun getEmptyOrderByClause(): CriteriaQueryOrderByClause { - return OrderByClause.empty - } - - @Suppress("MemberVisibilityCanBePrivate") - protected fun getLimitClause(): QueryLimitClause{ - return LimitClause(offset, maxResults) - } - - protected fungetEmptyLimitClause(): QueryLimitClause{ - return LimitClause.empty() - } - - protected fungetJpaQueryHintClause(): JpaQueryHintClause{ - return JpaQueryHintClauseImpl(jpaHints.orEmpty()) - } - - @Suppress("UNCHECKED_CAST") - protected fungetSqlQueryHintClause(): SqlQueryHintClause{ - return SqlQueryHintClauseProvider.provide(sqlHints.orEmpty()) as SqlQueryHintClause- } - - @Suppress("MemberVisibilityCanBePrivate") - protected fun List.merge(): PredicateSpec { - return when { - isEmpty() -> PredicateSpec.empty - size == 1 -> first() - else -> AndSpec(this) - } - } - - @Suppress("MemberVisibilityCanBePrivate") - protected fun mustBe(condition: Boolean, lazyMessage: () -> String) { - if (!condition) { - throw IllegalStateException(lazyMessage()) - } - } - - data class CriteriaQuerySpecImpl ( - override val select: CriteriaQuerySelectClause , - override val from: FromClause<*>, - override val join: JoinClause, - override val where: CriteriaQueryWhereClause, - override val groupBy: CriteriaQueryGroupByClause, - override val having: CriteriaQueryHavingClause, - override val orderBy: CriteriaQueryOrderByClause, - override val limit: QueryLimitClause >, - override val jpaHint: JpaQueryHintClause >, - override val sqlHint: SqlQueryHintClause >, - ) : CriteriaQuerySpec > - - data class CriteriaUpdateQuerySpecImpl ( - override val targetEntity: Class , - override val from: FromClause , - override val associate: SimpleAssociatedJoinClause, - override val where: CriteriaQueryWhereClause, - override val jpaHint: JpaQueryHintClause , - override val sqlHint: SqlQueryHintClause, - override val set: SetClause - ) : CriteriaUpdateQuerySpec- - data class CriteriaDeleteQuerySpecImpl ( - override val targetEntity: Class , - override val from: FromClause , - override val associate: SimpleAssociatedJoinClause, - override val where: CriteriaQueryWhereClause, - override val jpaHint: JpaQueryHintClause , - override val sqlHint: SqlQueryHintClause- ) : CriteriaDeleteQuerySpec- - data class SubquerySpecImpl ( - override val select: SubquerySelectClause , - override val from: FromClause<*>, - override val join: JoinClause, - override val where: SubqueryWhereClause, - override val groupBy: SubqueryGroupByClause, - override val having: SubqueryHavingClause - ) : SubquerySpec -} diff --git a/core-jakarta/src/main/kotlin/com/linecorp/kotlinjdsl/querydsl/hint/SqlQueryHintClauseProvider.kt b/core-jakarta/src/main/kotlin/com/linecorp/kotlinjdsl/querydsl/hint/SqlQueryHintClauseProvider.kt deleted file mode 100644 index 423fff8ff..000000000 --- a/core-jakarta/src/main/kotlin/com/linecorp/kotlinjdsl/querydsl/hint/SqlQueryHintClauseProvider.kt +++ /dev/null @@ -1,33 +0,0 @@ -package com.linecorp.kotlinjdsl.querydsl.hint - -import com.linecorp.kotlinjdsl.query.clause.hint.EmptySqlQueryHintClause -import com.linecorp.kotlinjdsl.query.clause.hint.SqlQueryHintClause -import org.slf4j.LoggerFactory -import java.util.* -import jakarta.persistence.Query - -interface SqlQueryHintClauseFactoryProvider { - fun factory(): (List ) -> SqlQueryHintClause - - companion object { - private val log = LoggerFactory.getLogger(SqlQueryHintClauseFactoryProvider::class.java) - val loadedFactory by lazy { - ServiceLoader.load(SqlQueryHintClauseFactoryProvider::class.java).checkDuplicate().firstOrNull()?.factory() - } - - private fun ServiceLoader .checkDuplicate(): ServiceLoader { - takeIf { count() > 1 } - ?.run { log.warn("Duplicate Factory implementation detected") } - return this - } - } -} - -object SqlQueryHintClauseProvider { - val provide: (List ) -> SqlQueryHintClause - - init { - val factory = SqlQueryHintClauseFactoryProvider.loadedFactory ?: { EmptySqlQueryHintClause } - provide = { factory.invoke(it) } - } -} diff --git a/core-jakarta/src/test/kotlin/com/linecorp/kotlinjdsl/QueryFactoryExtensionsTest.kt b/core-jakarta/src/test/kotlin/com/linecorp/kotlinjdsl/QueryFactoryExtensionsTest.kt deleted file mode 100644 index 4c489d629..000000000 --- a/core-jakarta/src/test/kotlin/com/linecorp/kotlinjdsl/QueryFactoryExtensionsTest.kt +++ /dev/null @@ -1,203 +0,0 @@ -package com.linecorp.kotlinjdsl - -import com.linecorp.kotlinjdsl.query.spec.expression.SubqueryExpressionSpec -import com.linecorp.kotlinjdsl.querydsl.CriteriaDeleteQueryDsl -import com.linecorp.kotlinjdsl.querydsl.CriteriaQueryDsl -import com.linecorp.kotlinjdsl.querydsl.CriteriaUpdateQueryDsl -import com.linecorp.kotlinjdsl.querydsl.SubqueryDsl -import com.linecorp.kotlinjdsl.querydsl.expression.col -import com.linecorp.kotlinjdsl.test.WithKotlinJdslAssertions -import io.mockk.confirmVerified -import io.mockk.every -import io.mockk.impl.annotations.MockK -import io.mockk.junit5.MockKExtension -import io.mockk.verify -import org.junit.jupiter.api.Test -import org.junit.jupiter.api.extension.ExtendWith -import java.util.stream.Stream -import jakarta.persistence.Query -import jakarta.persistence.TypedQuery -import kotlin.streams.toList - -@ExtendWith(MockKExtension::class) -internal class QueryFactoryExtensionsTest : WithKotlinJdslAssertions { - @MockK - private lateinit var queryFactory: QueryFactory - - @MockK - private lateinit var typedQuery: TypedQuery - - @MockK - private lateinit var subqueryExpressionSpec: SubqueryExpressionSpec - - @Test - fun singleQuery() { - // given - every { queryFactory.selectQuery (any(), any()) } returns typedQuery - every { typedQuery.singleResult } returns Data1() - - val dsl: CriteriaQueryDsl .() -> Unit = { - select(entity(Data1::class)) - from(entity(Data1::class)) - } - - // when - val actual: Data1 = queryFactory.singleQuery(dsl) - - // then - assertThat(actual).isEqualTo(Data1()) - - verify(exactly = 1) { - queryFactory.selectQuery(Data1::class.java, dsl) - typedQuery.singleResult - } - - confirmVerified(queryFactory, typedQuery) - } - - @Test - fun listQuery() { - // given - every { queryFactory.selectQuery (any(), any()) } returns typedQuery - every { typedQuery.resultList } returns listOf(Data1()) - - val dsl: CriteriaQueryDsl .() -> Unit = { - select(entity(Data1::class)) - from(entity(Data1::class)) - } - - // when - val actual: List = queryFactory.listQuery(dsl) - - // then - assertThat(actual).isEqualTo(listOf(Data1())) - - verify(exactly = 1) { - queryFactory.selectQuery(Data1::class.java, dsl) - typedQuery.resultList - } - - confirmVerified(queryFactory, typedQuery) - } - - @Test - fun streamQuery() { - // given - every { queryFactory.selectQuery (any(), any()) } returns typedQuery - every { typedQuery.resultStream } returns Stream.of(Data1()) - - val dsl: CriteriaQueryDsl .() -> Unit = { - select(entity(Data1::class)) - from(entity(Data1::class)) - } - - // when - val actual = queryFactory.streamQuery(dsl).toList() - - // then - assertThat(actual).contains(Data1()) - - verify(exactly = 1) { - queryFactory.selectQuery(Data1::class.java, dsl) - typedQuery.resultStream - } - - confirmVerified(queryFactory, typedQuery) - } - - @Test - fun selectQuery() { - // given - every { queryFactory.selectQuery (any(), any()) } returns typedQuery - - val dsl: CriteriaQueryDsl .() -> Unit = { - select(entity(Data1::class)) - from(entity(Data1::class)) - } - - // when - val actual: TypedQuery = queryFactory.selectQuery(dsl) - - // then - assertThat(actual).isEqualTo(typedQuery) - - verify(exactly = 1) { - queryFactory.selectQuery(Data1::class.java, dsl) - } - - confirmVerified(queryFactory) - } - - @Test - fun updateQuery() { - // given - every { queryFactory.updateQuery (any(), any()) } returns typedQuery - - val dsl: CriteriaUpdateQueryDsl.() -> Unit = { - set(col(Data1::id), 1) - where(col(Data1::id).equal(2)) - } - - // when - val actual: Query = queryFactory.updateQuery (dsl) - - // then - assertThat(actual).isEqualTo(typedQuery) - - verify(exactly = 1) { - queryFactory.updateQuery(Data1::class, dsl) - } - - confirmVerified(queryFactory) - } - - @Test - fun deleteQuery() { - // given - every { queryFactory.deleteQuery (any(), any()) } returns typedQuery - - val dsl: CriteriaDeleteQueryDsl.() -> Unit = { - where(col(Data1::id).equal(1)) - } - - // when - val actual: Query = queryFactory.deleteQuery (dsl) - - // then - assertThat(actual).isEqualTo(typedQuery) - - verify(exactly = 1) { - queryFactory.deleteQuery(Data1::class, dsl) - } - - confirmVerified(queryFactory) - } - - - @Test - fun subquery() { - // given - every { queryFactory.subquery (any(), any()) } returns subqueryExpressionSpec - - val dsl: SubqueryDsl .() -> Unit = { - select(entity(Data1::class)) - from(entity(Data1::class)) - } - - // when - val actual: SubqueryExpressionSpec = queryFactory.subquery(dsl) - - // then - assertThat(actual).isEqualTo(subqueryExpressionSpec) - - verify(exactly = 1) { - queryFactory.subquery(Data1::class.java, dsl) - } - - confirmVerified(queryFactory) - } - - data class Data1( - val id: Int = 100 - ) -} diff --git a/core-jakarta/src/test/kotlin/com/linecorp/kotlinjdsl/QueryFactoryImplTest.kt b/core-jakarta/src/test/kotlin/com/linecorp/kotlinjdsl/QueryFactoryImplTest.kt deleted file mode 100644 index 70dac32cc..000000000 --- a/core-jakarta/src/test/kotlin/com/linecorp/kotlinjdsl/QueryFactoryImplTest.kt +++ /dev/null @@ -1,184 +0,0 @@ -package com.linecorp.kotlinjdsl - -import com.linecorp.kotlinjdsl.query.clause.from.FromClause -import com.linecorp.kotlinjdsl.query.clause.from.JoinClause -import com.linecorp.kotlinjdsl.query.clause.from.SimpleAssociatedJoinClause -import com.linecorp.kotlinjdsl.query.clause.groupby.GroupByClause -import com.linecorp.kotlinjdsl.query.clause.having.HavingClause -import com.linecorp.kotlinjdsl.query.clause.hint.EmptySqlQueryHintClause -import com.linecorp.kotlinjdsl.query.clause.hint.JpaQueryHintClauseImpl -import com.linecorp.kotlinjdsl.query.clause.hint.emptySqlHintClause -import com.linecorp.kotlinjdsl.query.clause.limit.LimitClause -import com.linecorp.kotlinjdsl.query.clause.orderby.OrderByClause -import com.linecorp.kotlinjdsl.query.clause.select.SingleSelectClause -import com.linecorp.kotlinjdsl.query.clause.set.SetClause -import com.linecorp.kotlinjdsl.query.clause.where.WhereClause -import com.linecorp.kotlinjdsl.query.creator.CriteriaQueryCreator -import com.linecorp.kotlinjdsl.query.creator.SubqueryCreator -import com.linecorp.kotlinjdsl.query.spec.expression.ColumnSpec -import com.linecorp.kotlinjdsl.query.spec.expression.EntitySpec -import com.linecorp.kotlinjdsl.query.spec.expression.SubqueryExpressionSpec -import com.linecorp.kotlinjdsl.query.spec.predicate.EqualValueSpec -import com.linecorp.kotlinjdsl.query.spec.predicate.PredicateSpec -import com.linecorp.kotlinjdsl.querydsl.QueryDslImpl -import com.linecorp.kotlinjdsl.querydsl.expression.col -import com.linecorp.kotlinjdsl.test.WithKotlinJdslAssertions -import io.mockk.confirmVerified -import io.mockk.every -import io.mockk.impl.annotations.InjectMockKs -import io.mockk.impl.annotations.MockK -import io.mockk.junit5.MockKExtension -import io.mockk.mockk -import io.mockk.verify -import org.junit.jupiter.api.Test -import org.junit.jupiter.api.extension.ExtendWith -import jakarta.persistence.Query -import jakarta.persistence.TypedQuery - -@ExtendWith(MockKExtension::class) -internal class QueryFactoryImplTest : WithKotlinJdslAssertions { - @InjectMockKs - private lateinit var sut: QueryFactoryImpl - - @MockK - private lateinit var criteriaQueryCreator: CriteriaQueryCreator - - @MockK - private lateinit var subqueryCreator: SubqueryCreator - - @Test - fun selectQuery() { - // given - val typedQuery: TypedQuery = mockk() - - every { criteriaQueryCreator.createQuery(any >()) } returns typedQuery - - // when - - val actual = sut.selectQuery(Data1::class.java) { - select(entity(Data1::class)) - from(entity(Data1::class)) - } - - // then - assertThat(actual).isEqualTo(typedQuery) - - verify(exactly = 1) { - criteriaQueryCreator.createQuery( - QueryDslImpl.CriteriaQuerySpecImpl( - select = SingleSelectClause( - Data1::class.java, - distinct = false, - EntitySpec(Data1::class.java) - ), - from = FromClause(EntitySpec(Data1::class.java)), - join = JoinClause(emptyList()), - where = WhereClause(PredicateSpec.empty), - groupBy = GroupByClause(emptyList()), - having = HavingClause(PredicateSpec.empty), - orderBy = OrderByClause(emptyList()), - limit = LimitClause.empty(), - jpaHint = JpaQueryHintClauseImpl(emptyMap()), - sqlHint = emptySqlHintClause(), - ) - ) - } - - confirmVerified(criteriaQueryCreator) - } - - @Test - fun updateQuery() { - // given - val query: Query = mockk() - - every { criteriaQueryCreator.createQuery(any >()) } returns query - - // when - val actual = sut.updateQuery(Data1::class) { - where(col(Data1::id).equal(1)) - set(col(Data1::id), 2) - } - - // then - assertThat(actual).isEqualTo(query) - - verify(exactly = 1) { - val columnSpec = ColumnSpec (EntitySpec(Data1::class.java), Data1::id.name) - criteriaQueryCreator.createQuery( - QueryDslImpl.CriteriaUpdateQuerySpecImpl( - from = FromClause(EntitySpec(Data1::class.java)), - associate = SimpleAssociatedJoinClause(emptyList()), - where = WhereClause(EqualValueSpec(columnSpec, 1)), - jpaHint = JpaQueryHintClauseImpl(emptyMap()), - sqlHint = EmptySqlQueryHintClause, - set = SetClause(mapOf(columnSpec to 2)), - targetEntity = Data1::class.java - ) - ) - } - - confirmVerified(criteriaQueryCreator) - } - - @Test - fun deleteQuery() { - // given - val query: Query = mockk() - - every { criteriaQueryCreator.createQuery(any >()) } returns query - - // when - val actual = sut.deleteQuery(Data1::class) { - where(col(Data1::id).equal(1)) - } - - // then - assertThat(actual).isEqualTo(query) - - verify(exactly = 1) { - val columnSpec = ColumnSpec (EntitySpec(Data1::class.java), Data1::id.name) - criteriaQueryCreator.createQuery( - QueryDslImpl.CriteriaDeleteQuerySpecImpl( - from = FromClause(EntitySpec(Data1::class.java)), - associate = SimpleAssociatedJoinClause(emptyList()), - where = WhereClause(EqualValueSpec(columnSpec, 1)), - jpaHint = JpaQueryHintClauseImpl(emptyMap()), - sqlHint = EmptySqlQueryHintClause, - targetEntity = Data1::class.java - ) - ) - } - - confirmVerified(criteriaQueryCreator) - } - - @Test - fun subquery() { - // when - val actual = sut.subquery(Data1::class.java) { - select(entity(Data1::class)) - from(entity(Data1::class)) - } - - // then - val subquerySpec = QueryDslImpl.SubquerySpecImpl( - select = SingleSelectClause( - Data1::class.java, - distinct = false, - EntitySpec(Data1::class.java) - ), - from = FromClause(EntitySpec(Data1::class.java)), - join = JoinClause(emptyList()), - where = WhereClause(PredicateSpec.empty), - groupBy = GroupByClause(emptyList()), - having = HavingClause(PredicateSpec.empty), - ) - - assertThat(actual).isEqualTo(SubqueryExpressionSpec(subquerySpec, subqueryCreator)) - } - - data class Data1( - val id: Int = 1 - ) -} diff --git a/core-jakarta/src/test/kotlin/com/linecorp/kotlinjdsl/query/clause/hint/JpaQueryHintClauseImplTest.kt b/core-jakarta/src/test/kotlin/com/linecorp/kotlinjdsl/query/clause/hint/JpaQueryHintClauseImplTest.kt deleted file mode 100644 index e71b70a7a..000000000 --- a/core-jakarta/src/test/kotlin/com/linecorp/kotlinjdsl/query/clause/hint/JpaQueryHintClauseImplTest.kt +++ /dev/null @@ -1,39 +0,0 @@ -package com.linecorp.kotlinjdsl.query.clause.hint - -import com.linecorp.kotlinjdsl.test.WithKotlinJdslAssertions -import io.mockk.confirmVerified -import io.mockk.every -import io.mockk.impl.annotations.MockK -import io.mockk.junit5.MockKExtension -import io.mockk.verify -import org.junit.jupiter.api.Test -import org.junit.jupiter.api.extension.ExtendWith -import jakarta.persistence.Query - -@ExtendWith(MockKExtension::class) -internal class JpaQueryHintClauseImplTest : WithKotlinJdslAssertions { - @MockK - private lateinit var query: Query - - @Test - fun apply() { - // given - val hints = mapOf ( - "cacheable" to true, - "sql.hint" to "index" - ) - - every { query.setHint(any(), any()) } returns query - - // when - JpaQueryHintClauseImpl (hints).apply(query) - - // then - verify(exactly = 1) { - query.setHint("cacheable", true) - query.setHint("sql.hint", "index") - } - - confirmVerified(query) - } -} diff --git a/core-jakarta/src/test/kotlin/com/linecorp/kotlinjdsl/query/clause/limit/LimitClauseTest.kt b/core-jakarta/src/test/kotlin/com/linecorp/kotlinjdsl/query/clause/limit/LimitClauseTest.kt deleted file mode 100644 index 450302daa..000000000 --- a/core-jakarta/src/test/kotlin/com/linecorp/kotlinjdsl/query/clause/limit/LimitClauseTest.kt +++ /dev/null @@ -1,51 +0,0 @@ -package com.linecorp.kotlinjdsl.query.clause.limit - -import com.linecorp.kotlinjdsl.test.WithKotlinJdslAssertions -import io.mockk.confirmVerified -import io.mockk.every -import io.mockk.impl.annotations.MockK -import io.mockk.junit5.MockKExtension -import io.mockk.verify -import org.junit.jupiter.api.Test -import org.junit.jupiter.api.extension.ExtendWith -import jakarta.persistence.Query - -@ExtendWith(MockKExtension::class) -internal class LimitClauseTest : WithKotlinJdslAssertions { - @MockK - private lateinit var query: Query - - @Test - fun apply() { - // given - val offset = 10 - val maxResults = 20 - - every { query.setFirstResult(10) } returns query - every { query.setMaxResults(20) } returns query - - // when - LimitClause (offset, maxResults).apply(query) - - // then - verify(exactly = 1) { - query.firstResult = offset - query.maxResults = maxResults - } - - confirmVerified(query) - } - - @Test - fun `apply - null`() { - // given - val offset: Int? = null - val maxResults: Int? = null - - // when - LimitClause (offset, maxResults).apply(query) - - // then - confirmVerified(query) - } -} diff --git a/core-jakarta/src/test/kotlin/com/linecorp/kotlinjdsl/query/creator/CriteriaQueryCreatorImplTest.kt b/core-jakarta/src/test/kotlin/com/linecorp/kotlinjdsl/query/creator/CriteriaQueryCreatorImplTest.kt deleted file mode 100644 index c009bd750..000000000 --- a/core-jakarta/src/test/kotlin/com/linecorp/kotlinjdsl/query/creator/CriteriaQueryCreatorImplTest.kt +++ /dev/null @@ -1,263 +0,0 @@ -package com.linecorp.kotlinjdsl.query.creator - -import com.linecorp.kotlinjdsl.query.CriteriaDeleteQuerySpec -import com.linecorp.kotlinjdsl.query.CriteriaQuerySpec -import com.linecorp.kotlinjdsl.query.CriteriaUpdateQuerySpec -import com.linecorp.kotlinjdsl.query.clause.from.FromClause -import com.linecorp.kotlinjdsl.query.clause.from.JoinClause -import com.linecorp.kotlinjdsl.query.clause.from.SimpleAssociatedJoinClause -import com.linecorp.kotlinjdsl.query.clause.groupby.CriteriaQueryGroupByClause -import com.linecorp.kotlinjdsl.query.clause.having.CriteriaQueryHavingClause -import com.linecorp.kotlinjdsl.query.clause.hint.JpaQueryHintClause -import com.linecorp.kotlinjdsl.query.clause.hint.SqlQueryHintClause -import com.linecorp.kotlinjdsl.query.clause.limit.QueryLimitClause -import com.linecorp.kotlinjdsl.query.clause.orderby.CriteriaQueryOrderByClause -import com.linecorp.kotlinjdsl.query.clause.select.CriteriaQuerySelectClause -import com.linecorp.kotlinjdsl.query.clause.set.SetClause -import com.linecorp.kotlinjdsl.query.clause.where.CriteriaQueryWhereClause -import com.linecorp.kotlinjdsl.query.spec.Froms -import com.linecorp.kotlinjdsl.test.WithKotlinJdslAssertions -import io.mockk.* -import io.mockk.impl.annotations.InjectMockKs -import io.mockk.impl.annotations.MockK -import io.mockk.junit5.MockKExtension -import org.junit.jupiter.api.Test -import org.junit.jupiter.api.extension.ExtendWith -import jakarta.persistence.EntityManager -import jakarta.persistence.Query -import jakarta.persistence.TypedQuery -import jakarta.persistence.criteria.* - -@Suppress("UnusedEquals") -@ExtendWith(MockKExtension::class) -internal class CriteriaQueryCreatorImplTest : WithKotlinJdslAssertions { - @InjectMockKs - private lateinit var sut: CriteriaQueryCreatorImpl - - @MockK - private lateinit var em: EntityManager - - @MockK - private lateinit var froms: Froms - - @MockK - private lateinit var criteriaBuilder: CriteriaBuilder - - @Test - fun createQuery() { - data class TestCriteriaQuerySpec ( - override val select: CriteriaQuerySelectClause , - override val from: FromClause<*>, - override val join: JoinClause, - override val where: CriteriaQueryWhereClause, - override val groupBy: CriteriaQueryGroupByClause, - override val having: CriteriaQueryHavingClause, - override val orderBy: CriteriaQueryOrderByClause, - override val limit: QueryLimitClause >, - override val jpaHint: JpaQueryHintClause >, - override val sqlHint: SqlQueryHintClause >, - ) : CriteriaQuerySpec > - // given - val createdQuery: CriteriaQuery = mockk() - val typedQuery: TypedQuery = mockk() - - val select: CriteriaQuerySelectClause = mockk { - every { returnType } returns Int::class.java - } - val from: FromClause<*> = mockk() - val join: JoinClause = mockk() - val where: CriteriaQueryWhereClause = mockk() - val groupBy: CriteriaQueryGroupByClause = mockk() - val having: CriteriaQueryHavingClause = mockk() - val orderBy: CriteriaQueryOrderByClause = mockk() - val limit: QueryLimitClause > = mockk() - val jpaHint: JpaQueryHintClause > = mockk() - val sqlHint: SqlQueryHintClause > = mockk() - - val spec: CriteriaQuerySpec > = TestCriteriaQuerySpec( - from = from, - join = join, - where = where, - groupBy = groupBy, - having = having, - orderBy = orderBy, - limit = limit, - jpaHint = jpaHint, - sqlHint = sqlHint, - select = select - ) - - every { em.criteriaBuilder } returns criteriaBuilder - every { em.createQuery(createdQuery) } returns typedQuery - every { criteriaBuilder.createQuery(Int::class.java) } returns createdQuery - every { from.join(join, createdQuery, criteriaBuilder) } returns froms - every { select.apply(froms, createdQuery, criteriaBuilder) } just runs - every { where.apply(froms, createdQuery, criteriaBuilder) } just runs - every { groupBy.apply(froms, createdQuery, criteriaBuilder) } just runs - every { having.apply(froms, createdQuery, criteriaBuilder) } just runs - every { orderBy.apply(froms, createdQuery, criteriaBuilder) } just runs - every { limit.apply(typedQuery) } just runs - every { jpaHint.apply(typedQuery) } just runs - every { sqlHint.apply(typedQuery) } just runs - - // when - val actual = sut.createQuery(spec) - - // then - assertThat(actual).isEqualTo(typedQuery) - - verify(exactly = 1) { - em.criteriaBuilder - em.createQuery(createdQuery) - criteriaBuilder.createQuery(Int::class.java) - from.join(join, createdQuery, criteriaBuilder) - select.returnType - select.apply(froms, createdQuery, criteriaBuilder) - where.apply(froms, createdQuery, criteriaBuilder) - groupBy.apply(froms, createdQuery, criteriaBuilder) - having.apply(froms, createdQuery, criteriaBuilder) - orderBy.apply(froms, createdQuery, criteriaBuilder) - limit.apply(typedQuery) - jpaHint.apply(typedQuery) - sqlHint.apply(typedQuery) - typedQuery == typedQuery - } - - confirmVerified( - select, from, join, where, groupBy, having, orderBy, limit, jpaHint, sqlHint, - createdQuery, typedQuery, - em, froms, criteriaBuilder - ) - } - - @Test - fun createUpdateQuery() { - data class TestCriteriaUpdateQuerySpec