From 6bb7a2864989b3a8030ce64e01ea0915a1cd6bf4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Timo=20Westk=C3=A4mper?= Date: Tue, 1 Mar 2016 19:00:07 +0200 Subject: [PATCH] Improve SimpleExpression.in(...) signature --- .../querydsl/core/types/dsl/Expressions.java | 27 +++++++++++++++++++ .../core/types/dsl/SimpleExpression.java | 10 +++++++ .../java/com/querydsl/sql/SQLSerializer.java | 8 +++++- .../java/com/querydsl/sql/SelectBase.java | 11 ++++++++ 4 files changed, 55 insertions(+), 1 deletion(-) diff --git a/querydsl-core/src/main/java/com/querydsl/core/types/dsl/Expressions.java b/querydsl-core/src/main/java/com/querydsl/core/types/dsl/Expressions.java index f4b5e9ac9..bce38b7a1 100644 --- a/querydsl-core/src/main/java/com/querydsl/core/types/dsl/Expressions.java +++ b/querydsl-core/src/main/java/com/querydsl/core/types/dsl/Expressions.java @@ -1263,6 +1263,33 @@ public final class Expressions { return rv; } + + /** + * Combine the given expressions into a list expression + * + * @param clazz type of list expression + * @param exprs list elements + * @return list expression + */ + @SuppressWarnings("unchecked") + public static Expression list(Class clazz, Expression... exprs) { + Expression rv = (Expression) exprs[0]; + for (int i = 1; i < exprs.length; i++) { + rv = new SimpleOperation(clazz, Ops.LIST, rv, exprs[i]); + } + return rv; + } + + /** + * Combine the given expressions into a list expression + * + * @param exprs list elements + * @return list expression + */ + public static Expression list(Expression... exprs) { + return list(Tuple.class, exprs); + } + /** * Create a null expression for the specified type * diff --git a/querydsl-core/src/main/java/com/querydsl/core/types/dsl/SimpleExpression.java b/querydsl-core/src/main/java/com/querydsl/core/types/dsl/SimpleExpression.java index 31b4dbeb1..c84e23fc2 100644 --- a/querydsl-core/src/main/java/com/querydsl/core/types/dsl/SimpleExpression.java +++ b/querydsl-core/src/main/java/com/querydsl/core/types/dsl/SimpleExpression.java @@ -229,6 +229,16 @@ public abstract class SimpleExpression extends DslExpression { return Expressions.booleanOperation(Ops.IN, mixin, right); } + /** + * Create a {@code this in right} expression + * + * @param right rhs of the comparison + * @return this in right + */ + public BooleanExpression in(Expression... right) { + return Expressions.booleanOperation(Ops.IN, mixin, Expressions.list(right)); + } + /** * Create a {@code this <> right} expression * 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 1ecf505d9..c82200435 100644 --- a/querydsl-sql/src/main/java/com/querydsl/sql/SQLSerializer.java +++ b/querydsl-sql/src/main/java/com/querydsl/sql/SQLSerializer.java @@ -890,7 +890,13 @@ public class SQLSerializer extends SerializerBase { } } - if (operator == SQLOps.UNION || operator == SQLOps.UNION_ALL) { + if (operator == Ops.LIST && args.get(0) instanceof SubQueryExpression) { + boolean oldUnion = inUnion; + inUnion = true; + super.visitOperation(type, SQLOps.UNION, args); + inUnion = oldUnion; + + } else if (operator == SQLOps.UNION || operator == SQLOps.UNION_ALL) { boolean oldUnion = inUnion; inUnion = true; super.visitOperation(type, operator, args); 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 c72c9995c..8eaba49f0 100644 --- a/querydsl-sql/src/test/java/com/querydsl/sql/SelectBase.java +++ b/querydsl-sql/src/test/java/com/querydsl/sql/SelectBase.java @@ -895,6 +895,17 @@ public class SelectBase extends AbstractBaseTest { assertEquals(0, query().from(employee).where(employee.id.in(ImmutableList.of())).fetchCount()); } + @Test + @ExcludeIn({MYSQL, TERADATA}) + public void in_subqueries() { + QEmployee e1 = new QEmployee("e1"); + QEmployee e2 = new QEmployee("e2"); + assertEquals(2, query().from(employee).where(employee.id.in( + query().from(e1).where(e1.firstname.eq("Mike")).select(e1.id), + query().from(e2).where(e2.firstname.eq("Mary")).select(e2.id) + )).fetchCount()); + } + @Test public void notIn_empty() { long count = query().from(employee).fetchCount();