diff --git a/docs/en/jpql-with-kotlin-jdsl/expressions.md b/docs/en/jpql-with-kotlin-jdsl/expressions.md index c6c34d44b..9a9c0be40 100644 --- a/docs/en/jpql-with-kotlin-jdsl/expressions.md +++ b/docs/en/jpql-with-kotlin-jdsl/expressions.md @@ -271,7 +271,7 @@ currentTime() | Function | DSL function | |--------------------|--------------| | CURRENT\_TIMESTAMP | not yet | -| LOCAL DATE | not yet | +| LOCAL DATE | support | | LOCAL TIME | not yet | | LOCAL DATETIME | not yet | | EXTRACT | not yet | diff --git a/docs/ko/jpql-with-kotlin-jdsl/expressions.md b/docs/ko/jpql-with-kotlin-jdsl/expressions.md index 21835e830..330ea3a8c 100644 --- a/docs/ko/jpql-with-kotlin-jdsl/expressions.md +++ b/docs/ko/jpql-with-kotlin-jdsl/expressions.md @@ -267,7 +267,7 @@ currentTime() | Function | DSL function | |--------------------|--------------| | CURRENT\_TIMESTAMP | not yet | -| LOCAL DATE | not yet | +| LOCAL DATE | support | | LOCAL TIME | not yet | | LOCAL DATETIME | not yet | | EXTRACT | not yet | 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 5b8b1b549..2545750dc 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 @@ -46,6 +46,7 @@ import java.math.BigDecimal import java.math.BigInteger import java.sql.Date import java.sql.Time +import java.time.LocalDate import kotlin.internal.Exact import kotlin.internal.LowPriorityInOverloadResolution import kotlin.reflect.KClass @@ -1570,6 +1571,16 @@ open class Jpql : JpqlDsl { return Expressions.currentTime() } + /** + * Creates an expression that represents the local date. + * + * This is the same as ```LOCAL DATE```. + */ + @SinceJdsl("3.4.0") + fun localDate(): Expression { + return Expressions.localDate() + } + /** * Creates an expression that represents predefined database functions and user-defined database functions. */ diff --git a/dsl/jpql/src/test/kotlin/com/linecorp/kotlinjdsl/dsl/jpql/expression/LocalDateDslTest.kt b/dsl/jpql/src/test/kotlin/com/linecorp/kotlinjdsl/dsl/jpql/expression/LocalDateDslTest.kt new file mode 100644 index 000000000..f7261ce2a --- /dev/null +++ b/dsl/jpql/src/test/kotlin/com/linecorp/kotlinjdsl/dsl/jpql/expression/LocalDateDslTest.kt @@ -0,0 +1,26 @@ +package com.linecorp.kotlinjdsl.dsl.jpql.expression + +import com.linecorp.kotlinjdsl.dsl.jpql.queryPart +import com.linecorp.kotlinjdsl.querymodel.jpql.expression.Expression +import com.linecorp.kotlinjdsl.querymodel.jpql.expression.Expressions +import org.assertj.core.api.Assertions.assertThat +import org.junit.jupiter.api.Test +import java.time.LocalDate + +class LocalDateDslTest { + + @Test + fun localDate() { + // when + val expression = queryPart { + localDate() + }.toExpression() + + val actual: Expression = expression // for type check + + // then + val expected = Expressions.localDate() + + 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 372f4f6fd..924ee2e1c 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 @@ -24,6 +24,7 @@ import com.linecorp.kotlinjdsl.querymodel.jpql.expression.impl.JpqlFunctionExpre import com.linecorp.kotlinjdsl.querymodel.jpql.expression.impl.JpqlLength import com.linecorp.kotlinjdsl.querymodel.jpql.expression.impl.JpqlLiteral import com.linecorp.kotlinjdsl.querymodel.jpql.expression.impl.JpqlLn +import com.linecorp.kotlinjdsl.querymodel.jpql.expression.impl.JpqlLocalDate import com.linecorp.kotlinjdsl.querymodel.jpql.expression.impl.JpqlLocate import com.linecorp.kotlinjdsl.querymodel.jpql.expression.impl.JpqlLower import com.linecorp.kotlinjdsl.querymodel.jpql.expression.impl.JpqlMax @@ -57,6 +58,7 @@ import java.math.BigDecimal import java.math.BigInteger import java.sql.Date import java.sql.Time +import java.time.LocalDate import kotlin.internal.Exact import kotlin.reflect.KClass @@ -628,6 +630,14 @@ object Expressions { return JpqlLocate(substring, string, start) } + /** + * Creates an expression that represents the local date. + */ + @SinceJdsl("3.4.0") + fun localDate(): Expression { + return JpqlLocalDate + } + /** * Creates an expression that represents predefined database functions and user-defined database functions. */ diff --git a/query-model/jpql/src/main/kotlin/com/linecorp/kotlinjdsl/querymodel/jpql/expression/impl/JpqlLocalDate.kt b/query-model/jpql/src/main/kotlin/com/linecorp/kotlinjdsl/querymodel/jpql/expression/impl/JpqlLocalDate.kt new file mode 100644 index 000000000..019389e77 --- /dev/null +++ b/query-model/jpql/src/main/kotlin/com/linecorp/kotlinjdsl/querymodel/jpql/expression/impl/JpqlLocalDate.kt @@ -0,0 +1,8 @@ +package com.linecorp.kotlinjdsl.querymodel.jpql.expression.impl + +import com.linecorp.kotlinjdsl.Internal +import com.linecorp.kotlinjdsl.querymodel.jpql.expression.Expression +import java.time.LocalDate + +@Internal +object JpqlLocalDate : 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 2f6fe3666..7da2541df 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 @@ -26,6 +26,7 @@ import com.linecorp.kotlinjdsl.querymodel.jpql.expression.impl.JpqlFunctionExpre import com.linecorp.kotlinjdsl.querymodel.jpql.expression.impl.JpqlLength import com.linecorp.kotlinjdsl.querymodel.jpql.expression.impl.JpqlLiteral import com.linecorp.kotlinjdsl.querymodel.jpql.expression.impl.JpqlLn +import com.linecorp.kotlinjdsl.querymodel.jpql.expression.impl.JpqlLocalDate import com.linecorp.kotlinjdsl.querymodel.jpql.expression.impl.JpqlLocate import com.linecorp.kotlinjdsl.querymodel.jpql.expression.impl.JpqlLower import com.linecorp.kotlinjdsl.querymodel.jpql.expression.impl.JpqlMax @@ -926,6 +927,17 @@ class ExpressionsTest : WithAssertions { assertThat(actual).isEqualTo(expected) } + @Test + fun localDate() { + // when + val actual = Expressions.localDate() + + // then + val expected = JpqlLocalDate + + assertThat(actual).isEqualTo(expected) + } + @Test fun function() { // when 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 b15cc7f40..c82c166b2 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 @@ -76,6 +76,7 @@ import com.linecorp.kotlinjdsl.render.jpql.serializer.impl.JpqlLessThanSerialize import com.linecorp.kotlinjdsl.render.jpql.serializer.impl.JpqlLikeSerializer import com.linecorp.kotlinjdsl.render.jpql.serializer.impl.JpqlLiteralSerializer import com.linecorp.kotlinjdsl.render.jpql.serializer.impl.JpqlLnSerializer +import com.linecorp.kotlinjdsl.render.jpql.serializer.impl.JpqlLocalDateSerializer import com.linecorp.kotlinjdsl.render.jpql.serializer.impl.JpqlLocateSerializer import com.linecorp.kotlinjdsl.render.jpql.serializer.impl.JpqlLowerSerializer import com.linecorp.kotlinjdsl.render.jpql.serializer.impl.JpqlMaxSerializer @@ -332,6 +333,7 @@ private class DefaultModule : JpqlRenderModule { JpqlLikeSerializer(), JpqlLiteralSerializer(), JpqlLnSerializer(), + JpqlLocalDateSerializer(), JpqlLocateSerializer(), JpqlLowerSerializer(), JpqlMaxSerializer(), diff --git a/render/jpql/src/main/kotlin/com/linecorp/kotlinjdsl/render/jpql/serializer/impl/JpqlLocalDateSerializer.kt b/render/jpql/src/main/kotlin/com/linecorp/kotlinjdsl/render/jpql/serializer/impl/JpqlLocalDateSerializer.kt new file mode 100644 index 000000000..651856951 --- /dev/null +++ b/render/jpql/src/main/kotlin/com/linecorp/kotlinjdsl/render/jpql/serializer/impl/JpqlLocalDateSerializer.kt @@ -0,0 +1,20 @@ +package com.linecorp.kotlinjdsl.render.jpql.serializer.impl + +import com.linecorp.kotlinjdsl.Internal +import com.linecorp.kotlinjdsl.querymodel.jpql.expression.impl.JpqlLocalDate +import com.linecorp.kotlinjdsl.render.RenderContext +import com.linecorp.kotlinjdsl.render.jpql.serializer.JpqlSerializer +import com.linecorp.kotlinjdsl.render.jpql.writer.JpqlWriter +import kotlin.reflect.KClass + +@Internal +class JpqlLocalDateSerializer : JpqlSerializer { + + override fun handledType(): KClass { + return JpqlLocalDate::class + } + + override fun serialize(part: JpqlLocalDate, writer: JpqlWriter, context: RenderContext) { + writer.write("LOCAL DATE") + } +} diff --git a/render/jpql/src/test/kotlin/com/linecorp/kotlinjdsl/render/jpql/serializer/impl/JpqlLocalDateSerializerTest.kt b/render/jpql/src/test/kotlin/com/linecorp/kotlinjdsl/render/jpql/serializer/impl/JpqlLocalDateSerializerTest.kt new file mode 100644 index 000000000..b3f3a2dea --- /dev/null +++ b/render/jpql/src/test/kotlin/com/linecorp/kotlinjdsl/render/jpql/serializer/impl/JpqlLocalDateSerializerTest.kt @@ -0,0 +1,46 @@ +package com.linecorp.kotlinjdsl.render.jpql.serializer.impl + +import com.linecorp.kotlinjdsl.querymodel.jpql.expression.impl.JpqlLocalDate +import com.linecorp.kotlinjdsl.render.TestRenderContext +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.Assertions.assertThat +import org.junit.jupiter.api.Test + +@JpqlSerializerTest +class JpqlLocalDateSerializerTest { + private val sut = JpqlLocalDateSerializer() + + @MockK + private lateinit var writer: JpqlWriter + + @MockK + private lateinit var serializer: JpqlRenderSerializer + + @Test + fun handle() { + // when + val actual = sut.handledType() + + // then + assertThat(actual).isEqualTo(JpqlLocalDate::class) + } + + @Test + fun serialize() { + // given + val part = JpqlLocalDate + val context = TestRenderContext(serializer) + + // when + sut.serialize(part, writer, context) + + // then + verifySequence { + writer.write("LOCAL DATE") + } + } +}