From ca4f0ca55da28b140bc7329c670fa8e006be846b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Timo=20Westk=C3=A4mper?= Date: Fri, 14 Dec 2012 10:42:08 +0200 Subject: [PATCH] #314 move duplicate removal to MappingProjection, since QTuple is used internally in nearly all query implementations --- .../mysema/query/types/ExpressionUtils.java | 34 +++++++++++++++++++ .../mysema/query/types/MappingProjection.java | 4 +-- .../java/com/mysema/query/types/QTuple.java | 28 ++++----------- .../query/types/MappingProjectionTest.java | 13 +++++++ .../com/mysema/query/types/QTupleTest.java | 5 ++- 5 files changed, 59 insertions(+), 25 deletions(-) diff --git a/querydsl-core/src/main/java/com/mysema/query/types/ExpressionUtils.java b/querydsl-core/src/main/java/com/mysema/query/types/ExpressionUtils.java index b0f5d0275..bb6d3feac 100644 --- a/querydsl-core/src/main/java/com/mysema/query/types/ExpressionUtils.java +++ b/querydsl-core/src/main/java/com/mysema/query/types/ExpressionUtils.java @@ -14,7 +14,9 @@ package com.mysema.query.types; import java.util.Collection; +import java.util.HashSet; import java.util.List; +import java.util.Set; import javax.annotation.Nullable; @@ -393,6 +395,38 @@ public final class ExpressionUtils { return PredicateOperation.create(Ops.OR, left, right); } + /** + * @param args + * @return + */ + public static List> distinctList(Expression... args) { + final ImmutableList.Builder> builder = ImmutableList.builder(); + final Set> set = new HashSet>(args.length); + for (Expression arg : args) { + if (set.add(arg)) { + builder.add(arg); + } + } + return builder.build(); + } + + /** + * @param args + * @return + */ + public static List> distinctList(Expression[]... args) { + final ImmutableList.Builder> builder = ImmutableList.builder(); + final Set> set = new HashSet>(); + for (Expression[] arr : args) { + for (Expression arg : arr) { + if (set.add(arg)) { + builder.add(arg); + } + } + } + return builder.build(); + } + private ExpressionUtils(){} } diff --git a/querydsl-core/src/main/java/com/mysema/query/types/MappingProjection.java b/querydsl-core/src/main/java/com/mysema/query/types/MappingProjection.java index 72d80b1d5..674d4a905 100644 --- a/querydsl-core/src/main/java/com/mysema/query/types/MappingProjection.java +++ b/querydsl-core/src/main/java/com/mysema/query/types/MappingProjection.java @@ -50,7 +50,7 @@ public abstract class MappingProjection extends ExpressionBase implements @SuppressWarnings("unchecked") public MappingProjection(Class type, Expression... args) { super((Class)type); - qTuple = new QTuple(args); + qTuple = new QTuple(ExpressionUtils.distinctList(args)); } /** @@ -62,7 +62,7 @@ public abstract class MappingProjection extends ExpressionBase implements @SuppressWarnings("unchecked") public MappingProjection(Class type, Expression[]... args) { super((Class)type); - qTuple = new QTuple(args); + qTuple = new QTuple(ExpressionUtils.distinctList(args)); } public T newInstance(Object... values) { diff --git a/querydsl-core/src/main/java/com/mysema/query/types/QTuple.java b/querydsl-core/src/main/java/com/mysema/query/types/QTuple.java index 9b5304b22..b3f8b524a 100644 --- a/querydsl-core/src/main/java/com/mysema/query/types/QTuple.java +++ b/querydsl-core/src/main/java/com/mysema/query/types/QTuple.java @@ -36,8 +36,6 @@ import com.mysema.query.Tuple; * } * * - * Duplicate expressions are removed in the constructor. - * * @author tiwe * */ @@ -104,14 +102,7 @@ public class QTuple extends ExpressionBase implements FactoryExpression... args) { super(Tuple.class); - Set> set = new HashSet>(args.length); - ImmutableList.Builder> builder = ImmutableList.builder(); - for (Expression arg : args) { - if (set.add(arg)) { - builder.add(arg); - } - } - this.args = builder.build(); + this.args = ImmutableList.copyOf(args); } /** @@ -119,16 +110,9 @@ public class QTuple extends ExpressionBase implements FactoryExpression> args) { + public QTuple(List> args) { super(Tuple.class); - ImmutableList.Builder> builder = ImmutableList.builder(); - for (int i = 0; i < args.size(); i++) { - Expression arg = args.get(i); - if (args.indexOf(arg) == i) { - builder.add(arg); - } - } - this.args = builder.build(); + this.args = args; } /** @@ -138,11 +122,11 @@ public class QTuple extends ExpressionBase implements FactoryExpression[]... args) { super(Tuple.class); - Set> argsSet = new LinkedHashSet>(); + ImmutableList.Builder> builder = ImmutableList.builder(); for (Expression[] exprs: args){ - argsSet.addAll(Arrays.asList(exprs)); + builder.addAll(Arrays.asList(exprs)); } - this.args = ImmutableList.copyOf(argsSet); + this.args = builder.build(); } @Override diff --git a/querydsl-core/src/test/java/com/mysema/query/types/MappingProjectionTest.java b/querydsl-core/src/test/java/com/mysema/query/types/MappingProjectionTest.java index 91e2d3d20..5822f978d 100644 --- a/querydsl-core/src/test/java/com/mysema/query/types/MappingProjectionTest.java +++ b/querydsl-core/src/test/java/com/mysema/query/types/MappingProjectionTest.java @@ -54,4 +54,17 @@ public class MappingProjectionTest { assertEquals("1", mapping.newInstance("1")); } + @Test + public void Distinct_Expressions() { + MappingProjection> mapping = new MappingProjection>(Pair.class, str1, str1) { + @Override + protected Pair map(Tuple row) { + return Pair.of(row.get(str1), row.get(str1)); + } + }; + + assertEquals(1, mapping.getArgs().size()); + assertEquals(Pair.of("1", "1"), mapping.newInstance("1")); + } + } diff --git a/querydsl-core/src/test/java/com/mysema/query/types/QTupleTest.java b/querydsl-core/src/test/java/com/mysema/query/types/QTupleTest.java index 215f3dd94..53c8d72f4 100644 --- a/querydsl-core/src/test/java/com/mysema/query/types/QTupleTest.java +++ b/querydsl-core/src/test/java/com/mysema/query/types/QTupleTest.java @@ -17,6 +17,7 @@ import static org.junit.Assert.assertEquals; import java.util.Arrays; +import org.junit.Ignore; import org.junit.Test; import com.mysema.query.types.path.StringPath; @@ -82,6 +83,7 @@ public class QTupleTest { } @Test + @Ignore public void Duplicates() { QTuple expr = new QTuple(str1, str1); assertEquals(1, expr.getArgs().size()); @@ -89,8 +91,9 @@ public class QTupleTest { } @Test + @Ignore public void Duplicates2() { - QTuple expr = new QTuple(Arrays.asList(str1, str1)); + QTuple expr = new QTuple(Arrays.>asList(str1, str1)); assertEquals(1, expr.getArgs().size()); assertEquals(str1, expr.getArgs().get(0)); }