From cad88abc434678d3b54abec3de6efc8c24618adc Mon Sep 17 00:00:00 2001 From: Jake Son Date: Thu, 1 Feb 2024 06:52:10 +0900 Subject: [PATCH 1/6] feat: implement exp function --- .../com/linecorp/kotlinjdsl/dsl/jpql/Jpql.kt | 16 +++++++ .../dsl/jpql/expression/ExpDslTest.kt | 47 +++++++++++++++++++ .../querymodel/jpql/expression/Expressions.kt | 9 ++++ .../jpql/expression/impl/JpqlExp.kt | 12 +++++ .../jpql/expression/ExpressionsTest.kt | 14 ++++++ 5 files changed, 98 insertions(+) create mode 100644 dsl/jpql/src/test/kotlin/com/linecorp/kotlinjdsl/dsl/jpql/expression/ExpDslTest.kt create mode 100644 query-model/jpql/src/main/kotlin/com/linecorp/kotlinjdsl/querymodel/jpql/expression/impl/JpqlExp.kt diff --git a/dsl/jpql/src/main/kotlin/com/linecorp/kotlinjdsl/dsl/jpql/Jpql.kt b/dsl/jpql/src/main/kotlin/com/linecorp/kotlinjdsl/dsl/jpql/Jpql.kt index 75b37025d..9e372a559 100644 --- a/dsl/jpql/src/main/kotlin/com/linecorp/kotlinjdsl/dsl/jpql/Jpql.kt +++ b/dsl/jpql/src/main/kotlin/com/linecorp/kotlinjdsl/dsl/jpql/Jpql.kt @@ -568,6 +568,22 @@ open class Jpql : JpqlDsl { return Expressions.ceiling(value.toExpression()) } + /** + * Creates an expression that represents the exponential value. + */ + @SinceJdsl("3.4.0") + fun exp(expr: KProperty1): Expression { + return Expressions.exp(Paths.path(expr)) + } + + /** + * Creates an expression that represents the exponential value. + */ + @SinceJdsl("3.4.0") + fun exp(value: Expressionable): Expression { + return Expressions.exp(value.toExpression()) + } + /** * Creates an expression that is enclosed in floor. */ diff --git a/dsl/jpql/src/test/kotlin/com/linecorp/kotlinjdsl/dsl/jpql/expression/ExpDslTest.kt b/dsl/jpql/src/test/kotlin/com/linecorp/kotlinjdsl/dsl/jpql/expression/ExpDslTest.kt new file mode 100644 index 000000000..f8068a8ff --- /dev/null +++ b/dsl/jpql/src/test/kotlin/com/linecorp/kotlinjdsl/dsl/jpql/expression/ExpDslTest.kt @@ -0,0 +1,47 @@ +package com.linecorp.kotlinjdsl.dsl.jpql.expression + +import com.linecorp.kotlinjdsl.dsl.jpql.entity.book.Book +import com.linecorp.kotlinjdsl.dsl.jpql.queryPart +import com.linecorp.kotlinjdsl.querymodel.jpql.expression.Expression +import com.linecorp.kotlinjdsl.querymodel.jpql.expression.Expressions +import com.linecorp.kotlinjdsl.querymodel.jpql.path.Paths +import org.assertj.core.api.WithAssertions +import org.junit.jupiter.api.Test + +class ExpDslTest : WithAssertions { + private val expression1 = Paths.path(Book::salePrice) + + @Test + fun `exp() with a property`() { + // when + val expression = queryPart { + exp(Book::price) + }.toExpression() + + val actual: Expression = expression // for type check + + // then + val expected = Expressions.exp( + value = Paths.path(Book::price), + ) + + assertThat(actual).isEqualTo(expected) + } + + @Test + fun `exp() with a expression`() { + // when + val expression = queryPart { + exp(expression1) + }.toExpression() + + val actual: Expression = expression // for type check + + // then + val expected = Expressions.exp( + value = expression1, + ) + + assertThat(actual).isEqualTo(expected) + } +} diff --git a/query-model/jpql/src/main/kotlin/com/linecorp/kotlinjdsl/querymodel/jpql/expression/Expressions.kt b/query-model/jpql/src/main/kotlin/com/linecorp/kotlinjdsl/querymodel/jpql/expression/Expressions.kt index 045d93ea7..991c6fcac 100644 --- a/query-model/jpql/src/main/kotlin/com/linecorp/kotlinjdsl/querymodel/jpql/expression/Expressions.kt +++ b/query-model/jpql/src/main/kotlin/com/linecorp/kotlinjdsl/querymodel/jpql/expression/Expressions.kt @@ -14,6 +14,7 @@ import com.linecorp.kotlinjdsl.querymodel.jpql.expression.impl.JpqlCount import com.linecorp.kotlinjdsl.querymodel.jpql.expression.impl.JpqlCustomExpression import com.linecorp.kotlinjdsl.querymodel.jpql.expression.impl.JpqlDivide import com.linecorp.kotlinjdsl.querymodel.jpql.expression.impl.JpqlEntityType +import com.linecorp.kotlinjdsl.querymodel.jpql.expression.impl.JpqlExp import com.linecorp.kotlinjdsl.querymodel.jpql.expression.impl.JpqlExpression import com.linecorp.kotlinjdsl.querymodel.jpql.expression.impl.JpqlExpressionParentheses import com.linecorp.kotlinjdsl.querymodel.jpql.expression.impl.JpqlFloor @@ -227,6 +228,14 @@ object Expressions { return JpqlCeiling(value) } + /** + * Creates an expression that represents the exponential value. + */ + @SinceJdsl("3.4.0") + fun exp(value: Expression): Expression { + return JpqlExp(value) + } + /** * Creates an expression that is enclosed in floor. */ diff --git a/query-model/jpql/src/main/kotlin/com/linecorp/kotlinjdsl/querymodel/jpql/expression/impl/JpqlExp.kt b/query-model/jpql/src/main/kotlin/com/linecorp/kotlinjdsl/querymodel/jpql/expression/impl/JpqlExp.kt new file mode 100644 index 000000000..a9fa75de7 --- /dev/null +++ b/query-model/jpql/src/main/kotlin/com/linecorp/kotlinjdsl/querymodel/jpql/expression/impl/JpqlExp.kt @@ -0,0 +1,12 @@ +package com.linecorp.kotlinjdsl.querymodel.jpql.expression.impl + +import com.linecorp.kotlinjdsl.Internal +import com.linecorp.kotlinjdsl.querymodel.jpql.expression.Expression + +/** + * Expression that applies exponential function to [value]. + */ +@Internal +data class JpqlExp internal constructor( + val value: Expression, +) : Expression diff --git a/query-model/jpql/src/test/kotlin/com/linecorp/kotlinjdsl/querymodel/jpql/expression/ExpressionsTest.kt b/query-model/jpql/src/test/kotlin/com/linecorp/kotlinjdsl/querymodel/jpql/expression/ExpressionsTest.kt index 9fb1f6b87..79e3a3ad6 100644 --- a/query-model/jpql/src/test/kotlin/com/linecorp/kotlinjdsl/querymodel/jpql/expression/ExpressionsTest.kt +++ b/query-model/jpql/src/test/kotlin/com/linecorp/kotlinjdsl/querymodel/jpql/expression/ExpressionsTest.kt @@ -16,6 +16,7 @@ import com.linecorp.kotlinjdsl.querymodel.jpql.expression.impl.JpqlCount import com.linecorp.kotlinjdsl.querymodel.jpql.expression.impl.JpqlCustomExpression import com.linecorp.kotlinjdsl.querymodel.jpql.expression.impl.JpqlDivide import com.linecorp.kotlinjdsl.querymodel.jpql.expression.impl.JpqlEntityType +import com.linecorp.kotlinjdsl.querymodel.jpql.expression.impl.JpqlExp import com.linecorp.kotlinjdsl.querymodel.jpql.expression.impl.JpqlExpression import com.linecorp.kotlinjdsl.querymodel.jpql.expression.impl.JpqlExpressionParentheses import com.linecorp.kotlinjdsl.querymodel.jpql.expression.impl.JpqlFloor @@ -363,6 +364,19 @@ class ExpressionsTest : WithAssertions { assertThat(actual).isEqualTo(expected) } + @Test + fun exp() { + // when + val actual = Expressions.exp(doubleExpression1) + + // then + val expected = JpqlExp( + doubleExpression1, + ) + + assertThat(actual).isEqualTo(expected) + } + @Test fun floor() { // when From cdcea0b238d0f092b010ef296bbff6c25771e427 Mon Sep 17 00:00:00 2001 From: Jake Son Date: Thu, 1 Feb 2024 06:54:11 +0900 Subject: [PATCH 2/6] feat: implement exp function serializer --- .../render/jpql/JpqlRenderContext.kt | 2 + .../jpql/serializer/impl/JpqlExpSerializer.kt | 26 +++++++++ .../serializer/impl/JpqlExpSerializerTest.kt | 55 +++++++++++++++++++ 3 files changed, 83 insertions(+) create mode 100644 render/jpql/src/main/kotlin/com/linecorp/kotlinjdsl/render/jpql/serializer/impl/JpqlExpSerializer.kt create mode 100644 render/jpql/src/test/kotlin/com/linecorp/kotlinjdsl/render/jpql/serializer/impl/JpqlExpSerializerTest.kt diff --git a/render/jpql/src/main/kotlin/com/linecorp/kotlinjdsl/render/jpql/JpqlRenderContext.kt b/render/jpql/src/main/kotlin/com/linecorp/kotlinjdsl/render/jpql/JpqlRenderContext.kt index 094735378..d00405e24 100644 --- a/render/jpql/src/main/kotlin/com/linecorp/kotlinjdsl/render/jpql/JpqlRenderContext.kt +++ b/render/jpql/src/main/kotlin/com/linecorp/kotlinjdsl/render/jpql/JpqlRenderContext.kt @@ -37,6 +37,7 @@ import com.linecorp.kotlinjdsl.render.jpql.serializer.impl.JpqlEqualAllSerialize import com.linecorp.kotlinjdsl.render.jpql.serializer.impl.JpqlEqualAnySerializer import com.linecorp.kotlinjdsl.render.jpql.serializer.impl.JpqlEqualSerializer import com.linecorp.kotlinjdsl.render.jpql.serializer.impl.JpqlExistsSerializer +import com.linecorp.kotlinjdsl.render.jpql.serializer.impl.JpqlExpSerializer import com.linecorp.kotlinjdsl.render.jpql.serializer.impl.JpqlExpressionParenthesesSerializer import com.linecorp.kotlinjdsl.render.jpql.serializer.impl.JpqlExpressionSerializer import com.linecorp.kotlinjdsl.render.jpql.serializer.impl.JpqlFloorSerializer @@ -287,6 +288,7 @@ private class DefaultModule : JpqlRenderModule { JpqlEqualAnySerializer(), JpqlEqualSerializer(), JpqlExistsSerializer(), + JpqlExpSerializer(), JpqlExpressionParenthesesSerializer(), JpqlExpressionSerializer(), JpqlFloorSerializer(), diff --git a/render/jpql/src/main/kotlin/com/linecorp/kotlinjdsl/render/jpql/serializer/impl/JpqlExpSerializer.kt b/render/jpql/src/main/kotlin/com/linecorp/kotlinjdsl/render/jpql/serializer/impl/JpqlExpSerializer.kt new file mode 100644 index 000000000..ccafd08f7 --- /dev/null +++ b/render/jpql/src/main/kotlin/com/linecorp/kotlinjdsl/render/jpql/serializer/impl/JpqlExpSerializer.kt @@ -0,0 +1,26 @@ +package com.linecorp.kotlinjdsl.render.jpql.serializer.impl + +import com.linecorp.kotlinjdsl.Internal +import com.linecorp.kotlinjdsl.querymodel.jpql.expression.impl.JpqlExp +import com.linecorp.kotlinjdsl.render.RenderContext +import com.linecorp.kotlinjdsl.render.jpql.serializer.JpqlRenderSerializer +import com.linecorp.kotlinjdsl.render.jpql.serializer.JpqlSerializer +import com.linecorp.kotlinjdsl.render.jpql.writer.JpqlWriter +import kotlin.reflect.KClass + +@Internal +class JpqlExpSerializer : JpqlSerializer> { + override fun handledType(): KClass> { + return JpqlExp::class + } + + override fun serialize(part: JpqlExp<*>, writer: JpqlWriter, context: RenderContext) { + val delegate = context.getValue(JpqlRenderSerializer) + + writer.write("EXP") + + writer.writeParentheses { + delegate.serialize(part.value, writer, context) + } + } +} diff --git a/render/jpql/src/test/kotlin/com/linecorp/kotlinjdsl/render/jpql/serializer/impl/JpqlExpSerializerTest.kt b/render/jpql/src/test/kotlin/com/linecorp/kotlinjdsl/render/jpql/serializer/impl/JpqlExpSerializerTest.kt new file mode 100644 index 000000000..3317eba54 --- /dev/null +++ b/render/jpql/src/test/kotlin/com/linecorp/kotlinjdsl/render/jpql/serializer/impl/JpqlExpSerializerTest.kt @@ -0,0 +1,55 @@ +package com.linecorp.kotlinjdsl.render.jpql.serializer.impl + +import com.linecorp.kotlinjdsl.querymodel.jpql.expression.Expressions +import com.linecorp.kotlinjdsl.querymodel.jpql.expression.impl.JpqlExp +import com.linecorp.kotlinjdsl.querymodel.jpql.path.Paths +import com.linecorp.kotlinjdsl.render.TestRenderContext +import com.linecorp.kotlinjdsl.render.jpql.entity.book.Book +import com.linecorp.kotlinjdsl.render.jpql.serializer.JpqlRenderSerializer +import com.linecorp.kotlinjdsl.render.jpql.serializer.JpqlSerializerTest +import com.linecorp.kotlinjdsl.render.jpql.writer.JpqlWriter +import io.mockk.impl.annotations.MockK +import io.mockk.verifySequence +import org.assertj.core.api.WithAssertions +import org.junit.jupiter.api.Test + +@JpqlSerializerTest +class JpqlExpSerializerTest : WithAssertions { + private val sut = JpqlExpSerializer() + + @MockK + private lateinit var writer: JpqlWriter + + @MockK + private lateinit var serializer: JpqlRenderSerializer + + private val expression1 = Paths.path(Book::price) + + @Test + fun handledType() { + // when + val actual = sut.handledType() + + // then + assertThat(actual).isEqualTo(JpqlExp::class) + } + + @Test + fun serialize() { + // given + val part = Expressions.exp( + value = expression1, + ) + val context = TestRenderContext(serializer) + + // when + sut.serialize(part as JpqlExp<*>, writer, context) + + // then + verifySequence { + writer.write("EXP") + writer.writeParentheses(any()) + serializer.serialize(expression1, writer, context) + } + } +} From b385fa119fd422476659be5dfa67d635a5cbc0c8 Mon Sep 17 00:00:00 2001 From: Jake Son Date: Thu, 1 Feb 2024 06:55:37 +0900 Subject: [PATCH 3/6] docs: add exp function description --- docs/en/jpql-with-kotlin-jdsl/expressions.md | 4 +++- docs/ko/jpql-with-kotlin-jdsl/expressions.md | 4 +++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/docs/en/jpql-with-kotlin-jdsl/expressions.md b/docs/en/jpql-with-kotlin-jdsl/expressions.md index 287f4e195..7246176b5 100644 --- a/docs/en/jpql-with-kotlin-jdsl/expressions.md +++ b/docs/en/jpql-with-kotlin-jdsl/expressions.md @@ -225,6 +225,7 @@ Use the following functions to build arithmetic functions: * ABS (abs) * CEILING (ceiling) +* EXP (exp) * FLOOR (floor) * ROUND (round) * SQRT (sqrt) @@ -234,6 +235,8 @@ abs(path(Book::price)) ceiling(path(Book::price)) +exp(path(Book::price)) + floor(path(Book::price)) round(path(Book::price), 2) @@ -243,7 +246,6 @@ sqrt(path(Book::price)) | Function | DSL function | |----------|--------------| -| EXP | not yet | | FLOOR | not yet | | LN | not yet | | MOD | not yet | diff --git a/docs/ko/jpql-with-kotlin-jdsl/expressions.md b/docs/ko/jpql-with-kotlin-jdsl/expressions.md index 9c13e1c98..5313adc51 100644 --- a/docs/ko/jpql-with-kotlin-jdsl/expressions.md +++ b/docs/ko/jpql-with-kotlin-jdsl/expressions.md @@ -221,6 +221,7 @@ locate("Book", path(Book::title)) * ABS (abs) * CEILING (ceiling) +* EXP (exp) * FLOOR (floor) * ROUND (round) * SQRT (sqrt) @@ -230,6 +231,8 @@ abs(path(Book::price)) ceiling(path(Book::price)) +exp(path(Book::price)) + floor(path(Book::price)) round(path(Book::price), 2) @@ -239,7 +242,6 @@ sqrt(path(Book::price)) | Function | DSL function | |----------|--------------| -| EXP | not yet | | FLOOR | not yet | | LN | not yet | | MOD | not yet | From d2af51455070ae4a7f47b4c92ed5b8abbbdd8d89 Mon Sep 17 00:00:00 2001 From: Jake Son Date: Thu, 1 Feb 2024 21:48:24 +0900 Subject: [PATCH 4/6] style: reorder code --- .../com/linecorp/kotlinjdsl/render/jpql/JpqlRenderContext.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/render/jpql/src/main/kotlin/com/linecorp/kotlinjdsl/render/jpql/JpqlRenderContext.kt b/render/jpql/src/main/kotlin/com/linecorp/kotlinjdsl/render/jpql/JpqlRenderContext.kt index d00405e24..a64860996 100644 --- a/render/jpql/src/main/kotlin/com/linecorp/kotlinjdsl/render/jpql/JpqlRenderContext.kt +++ b/render/jpql/src/main/kotlin/com/linecorp/kotlinjdsl/render/jpql/JpqlRenderContext.kt @@ -288,9 +288,9 @@ private class DefaultModule : JpqlRenderModule { JpqlEqualAnySerializer(), JpqlEqualSerializer(), JpqlExistsSerializer(), - JpqlExpSerializer(), JpqlExpressionParenthesesSerializer(), JpqlExpressionSerializer(), + JpqlExpSerializer(), JpqlFloorSerializer(), JpqlFunctionExpressionSerializer(), JpqlFunctionPredicateSerializer(), From 61bbed70560c9412bd3e1d3ebdf4794d4441dbbc Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 2 Feb 2024 20:17:43 +0000 Subject: [PATCH 5/6] chore(deps): update dependency gradle to v8.6 --- gradle/wrapper/gradle-wrapper.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 1af9e0930..a80b22ce5 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.5-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.6-bin.zip networkTimeout=10000 validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME From 3ff64490c05500bed4e24eb97e5d8be971adbe02 Mon Sep 17 00:00:00 2001 From: "jonghyon.s" Date: Mon, 5 Feb 2024 09:54:32 +0900 Subject: [PATCH 6/6] chore: hibernate-core v6.4.3 --- libs.example.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libs.example.versions.toml b/libs.example.versions.toml index b84f250b5..406c3230e 100644 --- a/libs.example.versions.toml +++ b/libs.example.versions.toml @@ -28,7 +28,7 @@ spring-batch4-test = { module = "org.springframework.batch:spring-batch-test", v # hibernate hibernate5-core = { module = "org.hibernate:hibernate-core", version = "5.6.15.Final" } -hibernate6-core = { module = "org.hibernate:hibernate-core", version = "6.4.2.Final" } +hibernate6-core = { module = "org.hibernate:hibernate-core", version = "6.4.3.Final" } # hibernate-reactive hibernate-reactive1-core = { module = "org.hibernate.reactive:hibernate-reactive-core", version = "1.1.9.Final" }