Skip to content

Commit a246309

Browse files
authored
Merge pull request #70 from ergon/bugfix/dope-260-fix-order-by
DOPE-260: add support for ordering by OrderExpression directly
2 parents c710fcd + 7edb811 commit a246309

3 files changed

Lines changed: 45 additions & 6 deletions

File tree

core/src/main/kotlin/ch/ergon/dope/resolvable/clause/ISelectClause.kt

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -45,10 +45,9 @@ interface ISelectOrderByClause<T : ValidType> : ISelectLimitClause<T> {
4545
}
4646

4747
interface ISelectGroupByClause<T : ValidType> : ISelectOrderByClause<T> {
48-
fun orderBy(expression: TypeExpression<out ValidType>, orderByType: OrderByType? = null) = SelectOrderByClause(
49-
OrderExpression(expression, orderByType),
50-
parentClause = this,
51-
)
48+
fun orderBy(orderExpression: OrderExpression, vararg additionalOrderExpressions: OrderExpression) =
49+
SelectOrderByClause(orderExpression, *additionalOrderExpressions, parentClause = this)
50+
fun orderBy(expression: TypeExpression<out ValidType>, orderByType: OrderByType? = null) = orderBy(OrderExpression(expression, orderByType))
5251
}
5352

5453
interface ISelectWhereClause<T : ValidType> : ISelectGroupByClause<T> {

core/src/main/kotlin/ch/ergon/dope/resolvable/clause/model/OrderByClause.kt

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -39,13 +39,16 @@ class SelectOrderByClause<T : ValidType>(
3939
)
4040
}
4141

42-
fun thenOrderBy(typeExpression: TypeExpression<out ValidType>, orderByType: OrderByType? = null) =
42+
fun thenOrderBy(orderExpression: OrderExpression) =
4343
SelectOrderByClause(
4444
this.orderExpression,
4545
*additionalOrderExpressions,
46-
OrderExpression(typeExpression, orderByType),
46+
orderExpression,
4747
parentClause = this.parentClause,
4848
)
49+
50+
fun thenOrderBy(typeExpression: TypeExpression<out ValidType>, orderByType: OrderByType? = null) =
51+
thenOrderBy(OrderExpression(typeExpression, orderByType))
4952
}
5053

5154
class OrderExpression(private val expression: TypeExpression<out ValidType>, private val orderByType: OrderByType? = null) : Resolvable {

core/src/test/kotlin/ch/ergon/dope/resolvable/clause/OrderByClauseTest.kt

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -245,6 +245,43 @@ class OrderByClauseTest : ManagerDependentTest {
245245
assertEquals(expected.toDopeQuery(manager), actual.toDopeQuery(manager))
246246
}
247247

248+
@Test
249+
fun `should support order by function with orderExpression`() {
250+
val stringField = someStringField()
251+
val parentClause = someSelectClause()
252+
val orderExpression = OrderExpression(stringField)
253+
val expected = SelectOrderByClause(orderExpression, parentClause = parentClause)
254+
255+
val actual = parentClause.orderBy(orderExpression)
256+
257+
assertEquals(expected.toDopeQuery(manager), actual.toDopeQuery(manager))
258+
}
259+
260+
@Test
261+
fun `should support order by function with multiple orderExpressions`() {
262+
val parentClause = someSelectClause()
263+
val orderExpression1 = OrderExpression(someStringField())
264+
val orderExpression2 = OrderExpression(someNumberField(), ASC)
265+
val expected = SelectOrderByClause(orderExpression1, orderExpression2, parentClause = parentClause)
266+
267+
val actual = parentClause.orderBy(orderExpression1, orderExpression2)
268+
269+
assertEquals(expected.toDopeQuery(manager), actual.toDopeQuery(manager))
270+
}
271+
272+
@Test
273+
fun `should support order by function with then order by with orderExpression`() {
274+
val stringField = someStringField()
275+
val parentClause = someSelectClause()
276+
val orderType = ASC
277+
val orderExpression = OrderExpression(someNumberField())
278+
val expected = SelectOrderByClause(OrderExpression(stringField, orderType), orderExpression, parentClause = parentClause)
279+
280+
val actual = parentClause.orderBy(stringField, orderType).thenOrderBy(orderExpression)
281+
282+
assertEquals(expected.toDopeQuery(manager), actual.toDopeQuery(manager))
283+
}
284+
248285
@Test
249286
fun `should support order by function with then order by`() {
250287
val stringField = someStringField()

0 commit comments

Comments
 (0)