Skip to content

Commit

Permalink
feat : implement current date & time function
Browse files Browse the repository at this point in the history
  • Loading branch information
meengi07 committed Feb 2, 2024
1 parent 4219a32 commit 25d6557
Show file tree
Hide file tree
Showing 11 changed files with 321 additions and 0 deletions.
22 changes: 22 additions & 0 deletions dsl/jpql/src/main/kotlin/com/linecorp/kotlinjdsl/dsl/jpql/Jpql.kt
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,8 @@ import com.linecorp.kotlinjdsl.querymodel.jpql.select.SelectQuery
import com.linecorp.kotlinjdsl.querymodel.jpql.sort.Sort
import java.math.BigDecimal
import java.math.BigInteger
import java.time.LocalDate
import java.time.LocalTime
import kotlin.internal.Exact
import kotlin.internal.LowPriorityInOverloadResolution
import kotlin.reflect.KClass
Expand Down Expand Up @@ -486,6 +488,26 @@ open class Jpql : JpqlDsl {
return Expressions.times(this.toExpression(), value.toExpression())
}

/**
* Creates an expression that represents the current date.
*
* This is the same as ```CURRENT_DATE```.
*/
@SinceJdsl("3.4.0")
fun currentDate(): Expression<LocalDate> {
return Expressions.currentDate()
}

/**
* Creates an expression that represents the current time.
*
* This is the same as ```CURRENT_TIME```.
*/
@SinceJdsl("3.4.0")
fun currentTime(): Expression<LocalTime> {
return Expressions.currentTime()
}

/**
* Creates an expression that represents the divide of values.
* The values are each enclosed in parentheses.
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
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.WithAssertions
import org.junit.jupiter.api.Test
import java.time.LocalDate

class CurrentDateDslTest : WithAssertions {
@Test
fun `currentDate() with a property`() {
// when
val expression = queryPart {
currentDate()
}.toExpression()

val actual: Expression<LocalDate> = expression // for type check

// then
val expected = Expressions.currentDate()

assertThat(actual).isEqualTo(expected)
}

@Test
fun `currentDate() with a expression`() {
// when
val expression = queryPart {
currentDate()
}.toExpression()

val actual: Expression<LocalDate> = expression // for type check

// then
val expected = Expressions.currentDate()

assertThat(actual).isEqualTo(expected)
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
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.WithAssertions
import org.junit.jupiter.api.Test
import java.time.LocalTime

class CurrentTimeDslTest : WithAssertions {
@Test
fun `currentDate() with a property`() {
// when
val expression = queryPart {
currentTime()
}.toExpression()

val actual: Expression<LocalTime> = expression // for type check

// then
val expected = Expressions.currentTime()

assertThat(actual).isEqualTo(expected)
}

@Test
fun `currentDate() with a expression`() {
// when
val expression = queryPart {
currentTime()
}.toExpression()

val actual: Expression<LocalTime> = expression // for type check

// then
val expected = Expressions.currentTime()

assertThat(actual).isEqualTo(expected)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ import com.linecorp.kotlinjdsl.querymodel.jpql.expression.impl.JpqlCaseWhen
import com.linecorp.kotlinjdsl.querymodel.jpql.expression.impl.JpqlCoalesce
import com.linecorp.kotlinjdsl.querymodel.jpql.expression.impl.JpqlConcat
import com.linecorp.kotlinjdsl.querymodel.jpql.expression.impl.JpqlCount
import com.linecorp.kotlinjdsl.querymodel.jpql.expression.impl.JpqlCurrent
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
Expand Down Expand Up @@ -44,6 +45,8 @@ import com.linecorp.kotlinjdsl.querymodel.jpql.select.SelectQuery
import com.linecorp.kotlinjdsl.querymodel.jpql.select.impl.JpqlSelectQuery
import java.math.BigDecimal
import java.math.BigInteger
import java.time.LocalDate
import java.time.LocalTime
import kotlin.internal.Exact
import kotlin.reflect.KClass

Expand Down Expand Up @@ -633,4 +636,20 @@ object Expressions {
fun <T : Any> parentheses(expr: Expression<T>): Expression<T> {
return JpqlExpressionParentheses(expr)
}

/**
* Creates an expression that represents the current date.
*/
@SinceJdsl("3.4.0")
fun currentDate(): Expression<LocalDate> {
return JpqlCurrent.CurrentDate
}

/**
* Creates an expression that represents the current time.
*/
@SinceJdsl("3.4.0")
fun currentTime(): Expression<LocalTime> {
return JpqlCurrent.CurrentTime
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
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
import java.time.LocalTime

/**
* Expression that represents the current date & time.
*/
@Internal
sealed interface JpqlCurrent<T : Any> : Expression<T> {

object CurrentDate : JpqlCurrent<LocalDate>

object CurrentTime : JpqlCurrent<LocalTime>
}
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ import com.linecorp.kotlinjdsl.querymodel.jpql.expression.impl.JpqlCaseWhen
import com.linecorp.kotlinjdsl.querymodel.jpql.expression.impl.JpqlCoalesce
import com.linecorp.kotlinjdsl.querymodel.jpql.expression.impl.JpqlConcat
import com.linecorp.kotlinjdsl.querymodel.jpql.expression.impl.JpqlCount
import com.linecorp.kotlinjdsl.querymodel.jpql.expression.impl.JpqlCurrent
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
Expand Down Expand Up @@ -318,6 +319,28 @@ class ExpressionsTest : WithAssertions {
assertThat(actual).isEqualTo(expected)
}

@Test
fun currentDate() {
// when
val actual = Expressions.currentDate()

// then
val expected = JpqlCurrent.CurrentDate

assertThat(actual).isEqualTo(expected)
}

@Test
fun currentTime() {
// when
val actual = Expressions.currentTime()

// then
val expected = JpqlCurrent.CurrentTime

assertThat(actual).isEqualTo(expected)
}

@Test
fun div() {
// when
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,8 @@ import com.linecorp.kotlinjdsl.render.jpql.serializer.impl.JpqlCaseWhenSerialize
import com.linecorp.kotlinjdsl.render.jpql.serializer.impl.JpqlCoalesceSerializer
import com.linecorp.kotlinjdsl.render.jpql.serializer.impl.JpqlConcatSerializer
import com.linecorp.kotlinjdsl.render.jpql.serializer.impl.JpqlCountSerializer
import com.linecorp.kotlinjdsl.render.jpql.serializer.impl.JpqlCurrentDateSerializer
import com.linecorp.kotlinjdsl.render.jpql.serializer.impl.JpqlCurrentTimeSerializer
import com.linecorp.kotlinjdsl.render.jpql.serializer.impl.JpqlCustomExpressionSerializer
import com.linecorp.kotlinjdsl.render.jpql.serializer.impl.JpqlCustomPredicateSerializer
import com.linecorp.kotlinjdsl.render.jpql.serializer.impl.JpqlDeleteQuerySerializer
Expand Down Expand Up @@ -267,6 +269,8 @@ private class DefaultModule : JpqlRenderModule {
JpqlCoalesceSerializer(),
JpqlConcatSerializer(),
JpqlCountSerializer(),
JpqlCurrentDateSerializer(),
JpqlCurrentTimeSerializer(),
JpqlCustomExpressionSerializer(),
JpqlCustomPredicateSerializer(),
JpqlDeleteQuerySerializer(),
Expand Down
Original file line number Diff line number Diff line change
@@ -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.JpqlCurrent
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 JpqlCurrentDateSerializer : JpqlSerializer<JpqlCurrent.CurrentDate> {
override fun handledType(): KClass<JpqlCurrent.CurrentDate> {
return JpqlCurrent.CurrentDate::class
}

override fun serialize(part: JpqlCurrent.CurrentDate, writer: JpqlWriter, context: RenderContext) {
val delegate = context.getValue(JpqlRenderSerializer)

writer.write("CURRENT_DATE")

writer.writeParentheses {
delegate.serialize(part, writer, context)
}
}
}
Original file line number Diff line number Diff line change
@@ -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.JpqlCurrent
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 JpqlCurrentTimeSerializer : JpqlSerializer<JpqlCurrent.CurrentTime> {
override fun handledType(): KClass<JpqlCurrent.CurrentTime> {
return JpqlCurrent.CurrentTime::class
}

override fun serialize(part: JpqlCurrent.CurrentTime, writer: JpqlWriter, context: RenderContext) {
val delegate = context.getValue(JpqlRenderSerializer)

writer.write("CURRENT_TIME")

writer.writeParentheses {
delegate.serialize(part, writer, context)
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
package com.linecorp.kotlinjdsl.render.jpql.serializer.impl

import com.linecorp.kotlinjdsl.querymodel.jpql.expression.Expressions
import com.linecorp.kotlinjdsl.querymodel.jpql.expression.Expressions.currentDate
import com.linecorp.kotlinjdsl.querymodel.jpql.expression.impl.JpqlCurrent
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.WithAssertions
import org.junit.jupiter.api.Test

@JpqlSerializerTest
class JpqlCurrentDateSerializerTest : WithAssertions {

private val sut = JpqlCurrentDateSerializer()

@MockK
private lateinit var writer: JpqlWriter

@MockK
private lateinit var serializer: JpqlRenderSerializer

private val expression = currentDate()

@Test
fun handledType() { // when
val actual = sut.handledType()

// then
assertThat(actual).isEqualTo(JpqlCurrent.CurrentDate::class)
}

@Test
fun serialize() {
// given
val part = Expressions.currentDate()
val context = TestRenderContext(serializer)

// when
sut.serialize(part as JpqlCurrent.CurrentDate, writer, context)

// then
verifySequence {
writer.write("CURRENT_DATE")
writer.writeParentheses(any())
serializer.serialize(expression, writer, context)
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
package com.linecorp.kotlinjdsl.render.jpql.serializer.impl

import com.linecorp.kotlinjdsl.querymodel.jpql.expression.Expressions
import com.linecorp.kotlinjdsl.querymodel.jpql.expression.Expressions.currentTime
import com.linecorp.kotlinjdsl.querymodel.jpql.expression.impl.JpqlCurrent
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.WithAssertions
import org.junit.jupiter.api.Test

@JpqlSerializerTest
class JpqlCurrentTimeSerializerTest : WithAssertions {

private val sut = JpqlCurrentTimeSerializer()

@MockK
private lateinit var writer: JpqlWriter

@MockK
private lateinit var serializer: JpqlRenderSerializer

private val expression = currentTime()

@Test
fun handledType() { // when
val actual = sut.handledType()

// then
assertThat(actual).isEqualTo(JpqlCurrent.CurrentTime::class)
}

@Test
fun serialize() {
// given
val part = Expressions.currentTime()
val context = TestRenderContext(serializer)

// when
sut.serialize(part as JpqlCurrent.CurrentTime, writer, context)

// then
verifySequence {
writer.write("CURRENT_TIME")
writer.writeParentheses(any())
serializer.serialize(expression, writer, context)
}
}
}

0 comments on commit 25d6557

Please sign in to comment.