From be572ff5567f50f802411b94c8933fea172fb91c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Timo=20Westk=C3=A4mper?= Date: Mon, 16 Feb 2015 20:37:27 +0200 Subject: [PATCH 1/2] Move literal serialization to JPQLTemplates Add more tests and test assertions --- .../java/com/querydsl/jpa/JPQLSerializer.java | 35 +----------- .../java/com/querydsl/jpa/JPQLTemplates.java | 31 ++++++++++ .../com/querydsl/jpa/AbstractJPATest.java | 56 +++++++++++++++++++ 3 files changed, 88 insertions(+), 34 deletions(-) diff --git a/querydsl-jpa/src/main/java/com/querydsl/jpa/JPQLSerializer.java b/querydsl-jpa/src/main/java/com/querydsl/jpa/JPQLSerializer.java index 7913b21e2..7fc02cb73 100644 --- a/querydsl-jpa/src/main/java/com/querydsl/jpa/JPQLSerializer.java +++ b/querydsl-jpa/src/main/java/com/querydsl/jpa/JPQLSerializer.java @@ -329,40 +329,7 @@ public class JPQLSerializer extends SerializerBase { } public void visitLiteral(Object constant) { - if (constant instanceof Boolean) { - append(constant.toString()); - } else if (constant instanceof Number) { - append(constant.toString()); - } else if (constant instanceof String) { - append("'"); - append(escapeLiteral(constant.toString())); - append("'"); - } else if (constant instanceof Enum) { - append(constant.getClass().getName()); - append("."); - append(((Enum) constant).name()); - } else { - // TODO date time literals - throw new IllegalArgumentException("Unsupported constant " + constant); - } - } - - private String escapeLiteral(String str) { - StringBuilder builder = new StringBuilder(); - for (char ch : str.toCharArray()) { - if (ch == '\n') { - builder.append("\\n"); - continue; - } else if (ch == '\r') { - builder.append("\\r"); - continue; - } else if (ch == '\'') { - builder.append("''"); - continue; - } - builder.append(ch); - } - return builder.toString(); + append(templates.asLiteral(constant)); } @Override diff --git a/querydsl-jpa/src/main/java/com/querydsl/jpa/JPQLTemplates.java b/querydsl-jpa/src/main/java/com/querydsl/jpa/JPQLTemplates.java index b89e2dcc0..881c3e912 100644 --- a/querydsl-jpa/src/main/java/com/querydsl/jpa/JPQLTemplates.java +++ b/querydsl-jpa/src/main/java/com/querydsl/jpa/JPQLTemplates.java @@ -190,4 +190,35 @@ public class JPQLTemplates extends Templates { return false; } + public String asLiteral(Object constant) { + if (constant instanceof Boolean) { + return constant.toString(); + } else if (constant instanceof Number) { + return constant.toString(); + } else if (constant instanceof String) { + return "'" + escapeLiteral(constant.toString()) + "'"; + } else if (constant instanceof Enum) { + return constant.getClass().getName() + "." + ((Enum) constant).name(); + } else { + return "'" + constant.toString() + "'"; + } + } + + private String escapeLiteral(String str) { + StringBuilder builder = new StringBuilder(); + for (char ch : str.toCharArray()) { + if (ch == '\n') { + builder.append("\\n"); + continue; + } else if (ch == '\r') { + builder.append("\\r"); + continue; + } else if (ch == '\'') { + builder.append("''"); + continue; + } + builder.append(ch); + } + return builder.toString(); + } } diff --git a/querydsl-jpa/src/test/java/com/querydsl/jpa/AbstractJPATest.java b/querydsl-jpa/src/test/java/com/querydsl/jpa/AbstractJPATest.java index 99f49bf6a..358d9ed9f 100644 --- a/querydsl-jpa/src/test/java/com/querydsl/jpa/AbstractJPATest.java +++ b/querydsl-jpa/src/test/java/com/querydsl/jpa/AbstractJPATest.java @@ -23,6 +23,9 @@ import java.util.*; import java.util.Calendar; import java.util.Map.Entry; +import org.joda.time.DateTime; +import org.joda.time.LocalDate; +import org.joda.time.LocalTime; import org.junit.Before; import org.junit.Ignore; import org.junit.Test; @@ -311,6 +314,53 @@ public abstract class AbstractJPATest { assertEquals(ImmutableList.of(1L, 2L, 2L, 2L, 2L, 2L), query().from(cat).orderBy(cat.id.asc()) .select(cat.name.when("Bob123").then(1L).otherwise(2L)).fetch()); + List rv = query().from(cat).select(cat.name.when("Bob").then(1).otherwise(2)).fetch(); + assertInstancesOf(Integer.class, rv); + } + + @Test + @NoEclipseLink + public void Case_Date() { + List rv = query().from(cat).select(cat.name.when("Bob").then(new LocalDate()) + .otherwise(new LocalDate().plusDays(1))).fetch(); + assertInstancesOf(LocalDate.class, rv); + } + + @Test + public void Case_Date2() { + List rv = query().from(cat).select(cat.name.when("Bob").then(new java.sql.Date(0)) + .otherwise(new java.sql.Date(0))).fetch(); + assertInstancesOf(java.sql.Date.class, rv); + } + + @Test + @NoEclipseLink + public void Case_Time() { + List rv = query().from(cat).select(cat.name.when("Bob").then(new LocalTime()) + .otherwise(new LocalTime().plusHours(1))).fetch(); + assertInstancesOf(LocalTime.class, rv); + } + + @Test + public void Case_Time2() { + List rv = query().from(cat).select(cat.name.when("Bob").then(new java.sql.Time(0)) + .otherwise(new java.sql.Time(0))).fetch(); + assertInstancesOf(java.sql.Time.class, rv); + } + + @Test + @NoEclipseLink + public void Case_Timestamp() { + List rv = query().from(cat).select(cat.name.when("Bob").then(new DateTime()) + .otherwise(new DateTime().plusHours(1))).fetch(); + assertInstancesOf(DateTime.class, rv); + } + + @Test + public void Case_Timestamp2() { + List rv = query().from(cat).select(cat.name.when("Bob").then(new java.sql.Timestamp(0)) + .otherwise(new java.sql.Timestamp(0))).fetch(); + assertInstancesOf(java.sql.Timestamp.class, rv); } @Test @@ -350,6 +400,12 @@ public abstract class AbstractJPATest { .select(cat.mate.when(savedCats.get(0)).then(0).otherwise(1)).fetch()); } + private static void assertInstancesOf(Class clazz, Iterable rows) { + for (T row : rows) { + assertEquals(row.toString(), clazz, row.getClass()); + } + } + @Test public void CaseBuilder() { QCat cat2 = new QCat("cat2"); From 46ae2bdce03a3630ddb57133e858456dcc483b57 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Timo=20Westk=C3=A4mper?= Date: Wed, 22 Jul 2015 23:07:54 +0300 Subject: [PATCH 2/2] Ignore tests for Hibernate --- .../src/test/java/com/querydsl/jpa/AbstractJPATest.java | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/querydsl-jpa/src/test/java/com/querydsl/jpa/AbstractJPATest.java b/querydsl-jpa/src/test/java/com/querydsl/jpa/AbstractJPATest.java index 358d9ed9f..572c01250 100644 --- a/querydsl-jpa/src/test/java/com/querydsl/jpa/AbstractJPATest.java +++ b/querydsl-jpa/src/test/java/com/querydsl/jpa/AbstractJPATest.java @@ -320,6 +320,7 @@ public abstract class AbstractJPATest { @Test @NoEclipseLink + @NoHibernate // https://hibernate.atlassian.net/browse/HHH-8653 public void Case_Date() { List rv = query().from(cat).select(cat.name.when("Bob").then(new LocalDate()) .otherwise(new LocalDate().plusDays(1))).fetch(); @@ -327,6 +328,8 @@ public abstract class AbstractJPATest { } @Test + @NoHibernate // https://hibernate.atlassian.net/browse/HHH-8653 + @NoEclipseLink({MYSQL, POSTGRESQL}) public void Case_Date2() { List rv = query().from(cat).select(cat.name.when("Bob").then(new java.sql.Date(0)) .otherwise(new java.sql.Date(0))).fetch(); @@ -335,6 +338,7 @@ public abstract class AbstractJPATest { @Test @NoEclipseLink + @NoHibernate // https://hibernate.atlassian.net/browse/HHH-8653 public void Case_Time() { List rv = query().from(cat).select(cat.name.when("Bob").then(new LocalTime()) .otherwise(new LocalTime().plusHours(1))).fetch(); @@ -342,6 +346,8 @@ public abstract class AbstractJPATest { } @Test + @NoHibernate // https://hibernate.atlassian.net/browse/HHH-8653 + @NoEclipseLink({MYSQL, POSTGRESQL}) public void Case_Time2() { List rv = query().from(cat).select(cat.name.when("Bob").then(new java.sql.Time(0)) .otherwise(new java.sql.Time(0))).fetch(); @@ -350,6 +356,7 @@ public abstract class AbstractJPATest { @Test @NoEclipseLink + @NoHibernate // https://hibernate.atlassian.net/browse/HHH-8653 public void Case_Timestamp() { List rv = query().from(cat).select(cat.name.when("Bob").then(new DateTime()) .otherwise(new DateTime().plusHours(1))).fetch(); @@ -357,6 +364,8 @@ public abstract class AbstractJPATest { } @Test + @NoHibernate // https://hibernate.atlassian.net/browse/HHH-8653 + @NoEclipseLink({MYSQL, POSTGRESQL}) public void Case_Timestamp2() { List rv = query().from(cat).select(cat.name.when("Bob").then(new java.sql.Timestamp(0)) .otherwise(new java.sql.Timestamp(0))).fetch();