From 7feb12a05b0921c2f0e46f087faa3b3e27e0b3ed Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Timo=20Westk=C3=A4mper?= Date: Tue, 2 Feb 2016 21:02:29 +0200 Subject: [PATCH] Improve with serialization --- .../java/com/querydsl/sql/SQLSerializer.java | 34 +++++++++++++----- .../java/com/querydsl/sql/SelectBase.java | 36 +++++++++---------- .../com/querydsl/sql/SerializationTest.java | 18 ++++++++-- 3 files changed, 59 insertions(+), 29 deletions(-) diff --git a/querydsl-sql/src/main/java/com/querydsl/sql/SQLSerializer.java b/querydsl-sql/src/main/java/com/querydsl/sql/SQLSerializer.java index 54b3ea90b..0a9e52fe5 100644 --- a/querydsl-sql/src/main/java/com/querydsl/sql/SQLSerializer.java +++ b/querydsl-sql/src/main/java/com/querydsl/sql/SQLSerializer.java @@ -50,6 +50,8 @@ public class SQLSerializer extends SerializerBase { private final List constants = new ArrayList(); + private final Set> withAliases = Sets.newHashSet(); + private final boolean dml; protected Stage stage = Stage.SELECT; @@ -190,17 +192,23 @@ public class SQLSerializer extends SerializerBase { if (je.getTarget() instanceof RelationalPath && templates.isSupportsAlias()) { final RelationalPath pe = (RelationalPath) je.getTarget(); if (pe.getMetadata().getParent() == null) { - SchemaAndTable schemaAndTable = getSchemaAndTable(pe); - boolean precededByDot; - if (templates.isPrintSchema()) { - appendSchemaName(schemaAndTable.getSchema()); - append("."); - precededByDot = true; + if (withAliases.contains(pe)) { + String name = pe.getMetadata().getName(); + appendTableName(pe.getMetadata().getName(), false); + append(templates.getTableAlias()); } else { - precededByDot = false; + SchemaAndTable schemaAndTable = getSchemaAndTable(pe); + boolean precededByDot; + if (templates.isPrintSchema()) { + appendSchemaName(schemaAndTable.getSchema()); + append("."); + precededByDot = true; + } else { + precededByDot = false; + } + appendTableName(schemaAndTable.getTable(), precededByDot); + append(templates.getTableAlias()); } - appendTableName(schemaAndTable.getTable(), precededByDot); - append(templates.getTableAlias()); } } inJoin = true; @@ -968,6 +976,14 @@ public class SQLSerializer extends SerializerBase { } else { super.visitOperation(type, operator, args); } + + if (operator == SQLOps.WITH_ALIAS || operator == SQLOps.WITH_COLUMNS) { + if (args.get(0) instanceof Path) { + withAliases.add((Path) args.get(0)); + } else { + withAliases.add((Path) ((Operation) args.get(0)).getArg(0)); + } + } } public void setUseLiterals(boolean useLiterals) { diff --git a/querydsl-sql/src/test/java/com/querydsl/sql/SelectBase.java b/querydsl-sql/src/test/java/com/querydsl/sql/SelectBase.java index 76ee67219..c72c9995c 100644 --- a/querydsl-sql/src/test/java/com/querydsl/sql/SelectBase.java +++ b/querydsl-sql/src/test/java/com/querydsl/sql/SelectBase.java @@ -1864,8 +1864,8 @@ public class SelectBase extends AbstractBaseTest { @Test @IncludeIn({HSQLDB, ORACLE, POSTGRESQL}) public void with() { - assertEquals(100, query().with(employee2, query().from(employee) - .where(employee.firstname.eq("Tom")) + assertEquals(10, query().with(employee2, query().from(employee) + .where(employee.firstname.eq("Jim")) .select(Wildcard.all)) .from(employee, employee2) .select(employee.id, employee2.id).fetch().size()); @@ -1875,11 +1875,11 @@ public class SelectBase extends AbstractBaseTest { @IncludeIn({HSQLDB, ORACLE, POSTGRESQL}) public void with2() { QEmployee employee3 = new QEmployee("e3"); - assertEquals(1000, query().with(employee2, query().from(employee) - .where(employee.firstname.eq("Tom")) + assertEquals(100, query().with(employee2, query().from(employee) + .where(employee.firstname.eq("Jim")) .select(Wildcard.all)) .with(employee2, query().from(employee) - .where(employee.firstname.eq("Tom")) + .where(employee.firstname.eq("Jim")) .select(Wildcard.all)) .from(employee, employee2, employee3) .select(employee.id, employee2.id, employee3.id).fetch().size()); @@ -1888,9 +1888,9 @@ public class SelectBase extends AbstractBaseTest { @Test @IncludeIn({HSQLDB, ORACLE, POSTGRESQL}) public void with3() { - assertEquals(100, query().with(employee2, employee2.all()).as( + assertEquals(10, query().with(employee2, employee2.all()).as( query().from(employee) - .where(employee.firstname.eq("Tom")) + .where(employee.firstname.eq("Jim")) .select(Wildcard.all)) .from(employee, employee2) .select(employee.id, employee2.id).fetch().size()); @@ -1899,12 +1899,12 @@ public class SelectBase extends AbstractBaseTest { @Test @IncludeIn({HSQLDB, ORACLE, POSTGRESQL}) public void with_limit() { - assertEquals(50, query().with(employee2, employee2.all()).as( + assertEquals(5, query().with(employee2, employee2.all()).as( query().from(employee) - .where(employee.firstname.eq("Tom")) + .where(employee.firstname.eq("Jim")) .select(Wildcard.all)) .from(employee, employee2) - .limit(50) + .limit(5) .orderBy(employee.id.asc(), employee2.id.asc()) .select(employee.id, employee2.id).fetch().size()); } @@ -1912,13 +1912,13 @@ public class SelectBase extends AbstractBaseTest { @Test @IncludeIn({HSQLDB, ORACLE, POSTGRESQL}) public void with_limitOffset() { - assertEquals(50, query().with(employee2, employee2.all()).as( + assertEquals(5, query().with(employee2, employee2.all()).as( query().from(employee) - .where(employee.firstname.eq("Tom")) + .where(employee.firstname.eq("Jim")) .select(Wildcard.all)) .from(employee, employee2) - .limit(50) - .offset(10) + .limit(10) + .offset(5) .orderBy(employee.id.asc(), employee2.id.asc()) .select(employee.id, employee2.id).fetch().size()); } @@ -1926,8 +1926,8 @@ public class SelectBase extends AbstractBaseTest { @Test @IncludeIn({ORACLE, POSTGRESQL}) public void with_recursive() { - assertEquals(100, query().withRecursive(employee2, query().from(employee) - .where(employee.firstname.eq("Tom")) + assertEquals(10, query().withRecursive(employee2, query().from(employee) + .where(employee.firstname.eq("Jim")) .select(Wildcard.all)) .from(employee, employee2) .select(employee.id, employee2.id).fetch().size()); @@ -1937,9 +1937,9 @@ public class SelectBase extends AbstractBaseTest { @Test @IncludeIn({ORACLE, POSTGRESQL}) public void with_recursive2() { - assertEquals(100, query().withRecursive(employee2, employee2.all()).as( + assertEquals(10, query().withRecursive(employee2, employee2.all()).as( query().from(employee) - .where(employee.firstname.eq("Tom")) + .where(employee.firstname.eq("Jim")) .select(Wildcard.all)) .from(employee, employee2) .select(employee.id, employee2.id).fetch().size()); diff --git a/querydsl-sql/src/test/java/com/querydsl/sql/SerializationTest.java b/querydsl-sql/src/test/java/com/querydsl/sql/SerializationTest.java index 7b3429c63..2b582ce31 100644 --- a/querydsl-sql/src/test/java/com/querydsl/sql/SerializationTest.java +++ b/querydsl-sql/src/test/java/com/querydsl/sql/SerializationTest.java @@ -205,8 +205,22 @@ public class SerializationTest { select(survey2.id, survey2.name).from(survey2)); assertEquals("with SURVEY (ID, NAME) as (select survey2.ID, survey2.NAME\n" + - "from SURVEY survey2)\n\n" + - "from dual", q.toString()); + "from SURVEY survey2)\n\n" + + "from dual", q.toString()); + } + + @Test + public void with_complex() { + QSurvey s = new QSurvey("s"); + SQLQuery q = new SQLQuery(); + q.with(s, s.id, s.name).as( + select(survey.id, survey.name).from(survey)) + .select(s.id, s.name, survey.id, survey.name).from(s, survey); + + assertEquals("with s (ID, NAME) as (select SURVEY.ID, SURVEY.NAME\n" + + "from SURVEY SURVEY)\n" + + "select s.ID, s.NAME, SURVEY.ID, SURVEY.NAME\n" + + "from s s, SURVEY SURVEY", q.toString()); } @Test