From ca5256dec0a552bfbf935e5331f8d042303f3f1a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Timo=20Westk=C3=A4mper?= Date: Thu, 6 Dec 2012 14:50:34 +0200 Subject: [PATCH] #304 improved SQL query and join flags serialization --- .../mysema/query/support/SerializerBase.java | 4 +- .../com/mysema/query/sql/SQLSerializer.java | 88 +++++++++++++------ 2 files changed, 63 insertions(+), 29 deletions(-) diff --git a/querydsl-core/src/main/java/com/mysema/query/support/SerializerBase.java b/querydsl-core/src/main/java/com/mysema/query/support/SerializerBase.java index 2c9b7fdd0..735ae6603 100644 --- a/querydsl-core/src/main/java/com/mysema/query/support/SerializerBase.java +++ b/querydsl-core/src/main/java/com/mysema/query/support/SerializerBase.java @@ -138,7 +138,7 @@ public abstract class SerializerBase> implements Vis } } - protected boolean serialize(QueryFlag.Position position, Set flags) { + protected final boolean serialize(QueryFlag.Position position, Set flags) { boolean handled = false; for (QueryFlag flag : flags) { if (flag.getPosition() == position) { @@ -149,7 +149,7 @@ public abstract class SerializerBase> implements Vis return handled; } - protected boolean serialize(JoinFlag.Position position, Set flags){ + protected final boolean serialize(JoinFlag.Position position, Set flags){ boolean handled = false; for (JoinFlag flag : flags) { if (flag.getPosition() == position) { diff --git a/querydsl-sql/src/main/java/com/mysema/query/sql/SQLSerializer.java b/querydsl-sql/src/main/java/com/mysema/query/sql/SQLSerializer.java index e44ee574c..6bd8d3def 100644 --- a/querydsl-sql/src/main/java/com/mysema/query/sql/SQLSerializer.java +++ b/querydsl-sql/src/main/java/com/mysema/query/sql/SQLSerializer.java @@ -178,6 +178,7 @@ public class SQLSerializer extends SerializerBase { Predicate having = metadata.getHaving(); List> orderBy = metadata.getOrderBy(); Set flags = metadata.getFlags(); + final boolean hasFlags = !flags.isEmpty(); List> sqlSelect = new ArrayList>(select.size()); for (Expression selectExpr : select) { @@ -190,14 +191,18 @@ public class SQLSerializer extends SerializerBase { } // start - serialize(Position.START, flags); + if (hasFlags) { + serialize(Position.START, flags); + } // select Stage oldStage = stage; stage = Stage.SELECT; if (forCountRow) { - append(templates.getSelect()); - serialize(Position.AFTER_SELECT, flags); + append(templates.getSelect()); + if (hasFlags) { + serialize(Position.AFTER_SELECT, flags); + } if (!metadata.isDistinct()) { append(templates.getCountStar()); @@ -217,11 +222,15 @@ public class SQLSerializer extends SerializerBase { } else { append(templates.getSelectDistinct()); } - serialize(Position.AFTER_SELECT, flags); + if (hasFlags) { + serialize(Position.AFTER_SELECT, flags); + } handle(COMMA, sqlSelect); } - serialize(Position.AFTER_PROJECTION, flags); + if (hasFlags) { + serialize(Position.AFTER_PROJECTION, flags); + } // from stage = Stage.FROM; @@ -229,31 +238,45 @@ public class SQLSerializer extends SerializerBase { // where stage = Stage.WHERE; - serialize(Position.BEFORE_FILTERS, flags); + if (hasFlags) { + serialize(Position.BEFORE_FILTERS, flags); + } if (where != null) { append(templates.getWhere()).handle(where); - serialize(Position.AFTER_FILTERS, flags); + if (hasFlags) { + serialize(Position.AFTER_FILTERS, flags); + } } // group by stage = Stage.GROUP_BY; - serialize(Position.BEFORE_GROUP_BY, flags); + if (hasFlags) { + serialize(Position.BEFORE_GROUP_BY, flags); + } if (!groupBy.isEmpty()) { append(templates.getGroupBy()).handle(COMMA, groupBy); - serialize(Position.AFTER_GROUP_BY, flags); + if (hasFlags) { + serialize(Position.AFTER_GROUP_BY, flags); + } } // having stage = Stage.HAVING; - serialize(Position.BEFORE_HAVING, flags); + if (hasFlags) { + serialize(Position.BEFORE_HAVING, flags); + } if (having != null) { append(templates.getHaving()).handle(having); - serialize(Position.AFTER_HAVING, flags); + if (hasFlags) { + serialize(Position.AFTER_HAVING, flags); + } } // order by stage = Stage.ORDER_BY; - serialize(Position.BEFORE_ORDER, flags); + if (hasFlags) { + serialize(Position.BEFORE_ORDER, flags); + } if (!orderBy.isEmpty() && !forCountRow) { append(templates.getOrderBy()); boolean first = true; @@ -265,7 +288,9 @@ public class SQLSerializer extends SerializerBase { append(os.getOrder() == Order.ASC ? templates.getAsc() : templates.getDesc()); first = false; } - serialize(Position.AFTER_ORDER, flags); + if (hasFlags) { + serialize(Position.AFTER_ORDER, flags); + } } if (!forCountRow && metadata.getModifiers().isRestricting() && !joins.isEmpty()) { @@ -273,7 +298,9 @@ public class SQLSerializer extends SerializerBase { } // end - serialize(Position.END, flags); + if (hasFlags) { + serialize(Position.END, flags); + } // reset stage stage = oldStage; @@ -434,20 +461,27 @@ public class SQLSerializer extends SerializerBase { append(templates.getFrom()); for (int i = 0; i < joins.size(); i++) { JoinExpression je = joins.get(i); - serialize(JoinFlag.Position.START, je.getFlags()); - if (!serialize(JoinFlag.Position.OVERRIDE, je.getFlags()) && i > 0) { - append(templates.getJoinSymbol(je.getType())); + if (je.getFlags().isEmpty()) { + if (i > 0) { + append(templates.getJoinSymbol(je.getType())); + } + handleJoinTarget(je); + if (je.getCondition() != null) { + append(templates.getOn()).handle(je.getCondition()); + } + } else { + serialize(JoinFlag.Position.START, je.getFlags()); + if (!serialize(JoinFlag.Position.OVERRIDE, je.getFlags()) && i > 0) { + append(templates.getJoinSymbol(je.getType())); + } + serialize(JoinFlag.Position.BEFORE_TARGET, je.getFlags()); + handleJoinTarget(je); + serialize(JoinFlag.Position.BEFORE_CONDITION, je.getFlags()); + if (je.getCondition() != null) { + append(templates.getOn()).handle(je.getCondition()); + } + serialize(JoinFlag.Position.END, je.getFlags()); } - - serialize(JoinFlag.Position.BEFORE_TARGET, je.getFlags()); - handleJoinTarget(je); - - serialize(JoinFlag.Position.BEFORE_CONDITION, je.getFlags()); - if (je.getCondition() != null) { - append(templates.getOn()).handle(je.getCondition()); - } - - serialize(JoinFlag.Position.END, je.getFlags()); } } }