Skip to content

Commit 77cb87f

Browse files
committed
fix: apply reviews
1 parent bef6134 commit 77cb87f

File tree

9 files changed

+183
-17
lines changed

9 files changed

+183
-17
lines changed

docs/en/jpql-with-kotlin-jdsl/expressions.md

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -220,8 +220,11 @@ length(path(Book::title))
220220

221221
locate("Book", path(Book::title))
222222

223-
cast(path(Book::price), String::class)
224-
cast<String>(path(Book::price))
223+
cast(path(Book::price)).asString()
224+
cast(path(Book::authorId)).asInt()
225+
cast(path(Book::authorId)).asLong()
226+
cast(path(Book::authorId)).asDouble()
227+
cast(path(Book::authorId)).asFloat()
225228

226229
left(path(Book::title), 3)
227230
left(path(Book::title), literal(3))
@@ -230,6 +233,10 @@ right(path(Book::title), 3)
230233
right(path(Book::title), literal(3))
231234

232235
replace(path(Book::title), "old", "new")
236+
replace(path(Book::title), stringLiteral("old"), "new")
237+
replace(path(Book::title), path(Book::name), "new")
238+
replace(path(Book::title), "old", stringLiteral("new"))
239+
replace(path(Book::title), "old", path(Book::name))
233240
replace(path(Book::title), literal("old"), literal("new"))
234241
```
235242

docs/ko/jpql-with-kotlin-jdsl/expressions.md

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -218,8 +218,11 @@ length(path(Book::title))
218218

219219
locate("Book", path(Book::title))
220220

221-
cast(path(Book::price), String::class)
222-
cast<String>(path(Book::price))
221+
cast(path(Book::price)).asString()
222+
cast(path(Book::authorId)).asInt()
223+
cast(path(Book::authorId)).asLong()
224+
cast(path(Book::authorId)).asDouble()
225+
cast(path(Book::authorId)).asFloat()
223226

224227
left(path(Book::title), 3)
225228
left(path(Book::title), literal(3))
@@ -228,6 +231,10 @@ right(path(Book::title), 3)
228231
right(path(Book::title), literal(3))
229232

230233
replace(path(Book::title), "old", "new")
234+
replace(path(Book::title), stringLiteral("old"), "new")
235+
replace(path(Book::title), path(Book::name), "new")
236+
replace(path(Book::title), "old", stringLiteral("new"))
237+
replace(path(Book::title), "old", path(Book::name))
231238
replace(path(Book::title), literal("old"), literal("new"))
232239
```
233240

dsl/jpql/src/main/kotlin/com/linecorp/kotlinjdsl/dsl/jpql/Jpql.kt

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,13 @@ import com.linecorp.kotlinjdsl.dsl.jpql.delete.DeleteQueryWhereStep
55
import com.linecorp.kotlinjdsl.dsl.jpql.delete.impl.DeleteQueryDsl
66
import com.linecorp.kotlinjdsl.dsl.jpql.expression.CaseThenFirstStep
77
import com.linecorp.kotlinjdsl.dsl.jpql.expression.CaseValueWhenFirstStep
8+
import com.linecorp.kotlinjdsl.dsl.jpql.expression.CastStep
9+
import com.linecorp.kotlinjdsl.dsl.jpql.expression.StringCastStep
810
import com.linecorp.kotlinjdsl.dsl.jpql.expression.TrimFromStep
911
import com.linecorp.kotlinjdsl.dsl.jpql.expression.impl.CaseThenFirstStepDsl
1012
import com.linecorp.kotlinjdsl.dsl.jpql.expression.impl.CaseValueWhenFirstStepDsl
13+
import com.linecorp.kotlinjdsl.dsl.jpql.expression.impl.JpqlCastStep
14+
import com.linecorp.kotlinjdsl.dsl.jpql.expression.impl.JpqlStringCastStep
1115
import com.linecorp.kotlinjdsl.dsl.jpql.expression.impl.TrimBothFromStepDsl
1216
import com.linecorp.kotlinjdsl.dsl.jpql.expression.impl.TrimFromStepDsl
1317
import com.linecorp.kotlinjdsl.dsl.jpql.expression.impl.TrimLeadingFromStepDsl
@@ -1706,19 +1710,19 @@ open class Jpql : JpqlDsl {
17061710
}
17071711

17081712
/**
1709-
* Creates an expression that represents the casting of a value to a different type.
1713+
* Creates a step to cast a string expression to another type.
17101714
*/
17111715
@SinceJdsl("3.6.0")
1712-
fun <T : Any> cast(value: Expressionable<*>, type: KClass<T>): Expression<T> {
1713-
return Expressions.cast(value.toExpression(), type)
1716+
fun cast(value: Expressionable<String>): CastStep {
1717+
return JpqlCastStep(value.toExpression())
17141718
}
17151719

17161720
/**
1717-
* Creates an expression that represents the casting of a value to a different type.
1721+
* Creates a step to cast a scalar expression to a string.
17181722
*/
17191723
@SinceJdsl("3.6.0")
1720-
inline fun <reified T : Any> cast(value: Expressionable<*>): Expression<T> {
1721-
return Expressions.cast(value.toExpression(), T::class)
1724+
fun <T : Any> cast(value: Expressionable<T>): StringCastStep {
1725+
return JpqlStringCastStep(value.toExpression())
17221726
}
17231727

17241728
/**
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
package com.linecorp.kotlinjdsl.dsl.jpql.expression
2+
3+
import com.linecorp.kotlinjdsl.SinceJdsl
4+
import com.linecorp.kotlinjdsl.querymodel.jpql.expression.Expressionable
5+
6+
/**
7+
* A step to specify the target type for a cast from a string expression.
8+
* This corresponds to the BNF: CAST(string_expression AS {type})
9+
*/
10+
@SinceJdsl("3.6.0")
11+
interface CastStep {
12+
/**
13+
* Casts the expression to an INTEGER.
14+
*/
15+
@SinceJdsl("3.6.0")
16+
fun asInteger(): Expressionable<Int>
17+
18+
/**
19+
* Casts the expression to a LONG.
20+
*/
21+
@SinceJdsl("3.6.0")
22+
fun asLong(): Expressionable<Long>
23+
24+
/**
25+
* Casts the expression to a FLOAT.
26+
*/
27+
@SinceJdsl("3.6.0")
28+
fun asFloat(): Expressionable<Float>
29+
30+
/**
31+
* Casts the expression to a DOUBLE.
32+
*/
33+
@SinceJdsl("3.6.0")
34+
fun asDouble(): Expressionable<Double>
35+
}
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
package com.linecorp.kotlinjdsl.dsl.jpql.expression
2+
3+
import com.linecorp.kotlinjdsl.SinceJdsl
4+
import com.linecorp.kotlinjdsl.querymodel.jpql.expression.Expressionable
5+
6+
/**
7+
* A step to cast a scalar expression to a STRING.
8+
* This corresponds to the BNF: CAST(scalar_expression AS STRING)
9+
*/
10+
@SinceJdsl("3.6.0")
11+
interface StringCastStep {
12+
/**
13+
* Casts the expression to a STRING.
14+
*/
15+
@SinceJdsl("3.6.0")
16+
fun asString(): Expressionable<String>
17+
}
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
package com.linecorp.kotlinjdsl.dsl.jpql.expression.impl
2+
3+
import com.linecorp.kotlinjdsl.dsl.jpql.expression.CastStep
4+
import com.linecorp.kotlinjdsl.querymodel.jpql.expression.Expression
5+
import com.linecorp.kotlinjdsl.querymodel.jpql.expression.Expressionable
6+
import com.linecorp.kotlinjdsl.querymodel.jpql.expression.impl.JpqlCast
7+
8+
@PublishedApi
9+
internal data class JpqlCastStep(
10+
private val expression: Expression<String>,
11+
) : CastStep {
12+
override fun asInteger(): Expressionable<Int> {
13+
return JpqlCast(expression, Int::class)
14+
}
15+
16+
override fun asLong(): Expressionable<Long> {
17+
return JpqlCast(expression, Long::class)
18+
}
19+
20+
override fun asFloat(): Expressionable<Float> {
21+
return JpqlCast(expression, Float::class)
22+
}
23+
24+
override fun asDouble(): Expressionable<Double> {
25+
return JpqlCast(expression, Double::class)
26+
}
27+
}
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
package com.linecorp.kotlinjdsl.dsl.jpql.expression.impl
2+
3+
import com.linecorp.kotlinjdsl.dsl.jpql.expression.StringCastStep
4+
import com.linecorp.kotlinjdsl.querymodel.jpql.expression.Expression
5+
import com.linecorp.kotlinjdsl.querymodel.jpql.expression.Expressionable
6+
import com.linecorp.kotlinjdsl.querymodel.jpql.expression.impl.JpqlCast
7+
8+
@PublishedApi
9+
internal data class JpqlStringCastStep<T : Any>(
10+
private val expression: Expression<T>,
11+
) : StringCastStep {
12+
override fun asString(): Expressionable<String> {
13+
return JpqlCast(expression, String::class)
14+
}
15+
}

dsl/jpql/src/test/kotlin/com/linecorp/kotlinjdsl/dsl/jpql/expression/ExpressionDslTest.kt

Lines changed: 60 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -46,10 +46,10 @@ class ExpressionDslTest : WithAssertions {
4646
}
4747

4848
@Test
49-
fun `cast() with a expression and a class`() {
49+
fun `cast() with a string expression as Integer`() {
5050
// when
5151
val expression = queryPart {
52-
cast(expression(String::class, alias1), Int::class)
52+
cast(expression(String::class, alias1)).asInteger()
5353
}.toExpression()
5454

5555
val actual: Expression<Int> = expression // for type check
@@ -64,18 +64,72 @@ class ExpressionDslTest : WithAssertions {
6464
}
6565

6666
@Test
67-
fun `inline cast() with a expression and a class`() {
67+
fun `cast() with a string expression as Long`() {
6868
// when
6969
val expression = queryPart {
70-
cast<Int>(expression(String::class, alias1))
70+
cast(expression(String::class, alias1)).asLong()
7171
}.toExpression()
7272

73-
val actual: Expression<Int> = expression // for type check
73+
val actual: Expression<Long> = expression // for type check
7474

7575
// then
7676
val expected = Expressions.cast(
7777
Expressions.expression(String::class, alias1),
78-
Int::class,
78+
Long::class,
79+
)
80+
81+
assertThat(actual).isEqualTo(expected)
82+
}
83+
84+
@Test
85+
fun `cast() with a string expression as Float`() {
86+
// when
87+
val expression = queryPart {
88+
cast(expression(String::class, alias1)).asFloat()
89+
}.toExpression()
90+
91+
val actual: Expression<Float> = expression // for type check
92+
93+
// then
94+
val expected = Expressions.cast(
95+
Expressions.expression(String::class, alias1),
96+
Float::class,
97+
)
98+
99+
assertThat(actual).isEqualTo(expected)
100+
}
101+
102+
@Test
103+
fun `cast() with a string expression as Double`() {
104+
// when
105+
val expression = queryPart {
106+
cast(expression(String::class, alias1)).asDouble()
107+
}.toExpression()
108+
109+
val actual: Expression<Double> = expression // for type check
110+
111+
// then
112+
val expected = Expressions.cast(
113+
Expressions.expression(String::class, alias1),
114+
Double::class,
115+
)
116+
117+
assertThat(actual).isEqualTo(expected)
118+
}
119+
120+
@Test
121+
fun `cast() with scalar expression as String`() {
122+
// when
123+
val expression = queryPart {
124+
cast(expression(Int::class, alias1)).asString()
125+
}.toExpression()
126+
127+
val actual: Expression<String> = expression // for type check
128+
129+
// then
130+
val expected = Expressions.cast(
131+
Expressions.expression(Int::class, alias1),
132+
String::class,
79133
)
80134

81135
assertThat(actual).isEqualTo(expected)

query-model/jpql/src/main/kotlin/com/linecorp/kotlinjdsl/querymodel/jpql/expression/impl/JpqlCast.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import com.linecorp.kotlinjdsl.querymodel.jpql.expression.Expression
55
import kotlin.reflect.KClass
66

77
@Internal
8-
data class JpqlCast<T : Any> internal constructor(
8+
data class JpqlCast<T : Any>(
99
val value: Expression<*>,
1010
val type: KClass<T>,
1111
) : Expression<T>

0 commit comments

Comments
 (0)