#1620 - Support case statement in order by clause

This commit is contained in:
rob bygrave
2019-01-23 22:28:53 +13:00
parent d89a58482c
commit 5052afbd07
3 changed files with 35 additions and 8 deletions
@@ -3,10 +3,14 @@ package org.tests.query.orderby;
import io.ebean.BaseTestCase;
import io.ebean.Ebean;
import io.ebean.Query;
import org.tests.model.basic.Order;
import org.tests.model.basic.ResetBasicData;
import org.junit.Assert;
import org.junit.Test;
import org.tests.model.basic.Order;
import org.tests.model.basic.ResetBasicData;
import java.util.List;
import static org.assertj.core.api.Assertions.assertThat;
public class TestOrderByOnComplex extends BaseTestCase {
@@ -24,4 +28,18 @@ public class TestOrderByOnComplex extends BaseTestCase {
}
@Test
public void testOrderByCase() {
ResetBasicData.reset();
Query<Order> query = Ebean.find(Order.class)
.orderBy("case when status=3 then 10 when status=2 then 11 else 99 end");
List<Order> list = query.findList();
assertThat(sqlOf(query)).contains("select t0.id, t0.status, t0.order_date, t0.ship_date, t1.name, t0.cretime, t0.updtime, t0.kcustomer_id from o_order t0 join o_customer t1 on t1.id = t0.kcustomer_id order by case when t0.status=3 then 10 when t0.status=2 then 11 else 99 end");
assertThat(list).isNotEmpty();
}
}
@@ -4,6 +4,7 @@ import io.ebean.BaseTestCase;
import io.ebean.OrderBy;
import org.junit.Test;
import static org.assertj.core.api.Assertions.assertThat;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotEquals;
@@ -15,6 +16,16 @@ import static org.junit.Assert.assertTrue;
*/
public class TestOrderByParse extends BaseTestCase {
@Test
public void testParseRaw() {
OrderBy<Object> o1 = new OrderBy<>("case when status='N' then 1 when status='F' then 2 else 99 end");
assertEquals(1, o1.getProperties().size());
assertTrue(o1.getProperties().get(0).isAscending());
assertThat(o1.toStringFormat()).isEqualTo("case when status='N' then 1 when status='F' then 2 else 99 end");
assertThat(o1.getProperties().get(0).getProperty()).isEqualTo("case when status='N' then 1 when status='F' then 2 else 99 end");
}
@Test
public void testParsingOne() {