diff --git a/src/main/java/io/ebean/OrderBy.java b/src/main/java/io/ebean/OrderBy.java index 7ce78f340..10e6baf37 100644 --- a/src/main/java/io/ebean/OrderBy.java +++ b/src/main/java/io/ebean/OrderBy.java @@ -4,7 +4,6 @@ import io.ebean.util.StringHelper; import java.io.Serializable; import java.util.ArrayList; -import java.util.Arrays; import java.util.List; import java.util.Objects; @@ -412,15 +411,15 @@ public final class OrderBy implements Serializable { String[] chunks = orderByClause.split(","); for (String chunk : chunks) { - String[] pairs = chunk.split(" "); - Property p = parseProperty(pairs); + Property p = parseProperty(chunk); if (p != null) { list.add(p); } } } - private Property parseProperty(String[] pairs) { + private Property parseProperty(String chunk) { + String[] pairs = chunk.split(" "); if (pairs.length == 0) { return null; } @@ -446,8 +445,7 @@ public final class OrderBy implements Serializable { boolean asc = isAscending(wordList.get(1)); return new Property(wordList.get(0), asc, wordList.get(2), wordList.get(3)); } - String m = "Expecting a 1, 2 or 4 words in [" + Arrays.toString(pairs) + "] but got " + wordList; - throw new RuntimeException(m); + return new Property(chunk.trim(), true); } private boolean isAscending(String s) { diff --git a/src/test/java/org/tests/query/orderby/TestOrderByOnComplex.java b/src/test/java/org/tests/query/orderby/TestOrderByOnComplex.java index ab983c7d4..34b029448 100644 --- a/src/test/java/org/tests/query/orderby/TestOrderByOnComplex.java +++ b/src/test/java/org/tests/query/orderby/TestOrderByOnComplex.java @@ -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 query = Ebean.find(Order.class) + .orderBy("case when status=3 then 10 when status=2 then 11 else 99 end"); + + List 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(); + } + } diff --git a/src/test/java/org/tests/unitinternal/TestOrderByParse.java b/src/test/java/org/tests/unitinternal/TestOrderByParse.java index 450cdea1e..6cd43c5be 100644 --- a/src/test/java/org/tests/unitinternal/TestOrderByParse.java +++ b/src/test/java/org/tests/unitinternal/TestOrderByParse.java @@ -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 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() {