From eb84f97f250796d8c14e9683c68cce2f78bf7684 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Timo=20Westk=C3=A4mper?= Date: Fri, 14 Dec 2012 09:12:40 +0200 Subject: [PATCH] #314 added duplicate removal to QTuple --- .../java/com/mysema/query/types/QTuple.java | 33 +++++++++++++++---- .../com/mysema/query/types/QTupleTest.java | 14 ++++++++ 2 files changed, 40 insertions(+), 7 deletions(-) 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 cf069ddf7..9b5304b22 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 @@ -13,9 +13,11 @@ */ package com.mysema.query.types; -import java.util.ArrayList; import java.util.Arrays; +import java.util.HashSet; +import java.util.LinkedHashSet; import java.util.List; +import java.util.Set; import com.google.common.collect.ImmutableList; import com.mysema.query.Tuple; @@ -34,6 +36,8 @@ import com.mysema.query.Tuple; * } * * + * Duplicate expressions are removed in the constructor. + * * @author tiwe * */ @@ -99,8 +103,15 @@ public class QTuple extends ExpressionBase implements FactoryExpression... args) { - super(Tuple.class); - this.args = ImmutableList.copyOf(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(); } /** @@ -108,9 +119,16 @@ public class QTuple extends ExpressionBase implements FactoryExpression> args) { + public QTuple(List> args) { super(Tuple.class); - this.args = args; + 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(); } /** @@ -120,10 +138,11 @@ public class QTuple extends ExpressionBase implements FactoryExpression[]... args) { super(Tuple.class); - this.args = new ArrayList>(); + Set> argsSet = new LinkedHashSet>(); for (Expression[] exprs: args){ - this.args.addAll(Arrays.asList(exprs)); + argsSet.addAll(Arrays.asList(exprs)); } + this.args = ImmutableList.copyOf(argsSet); } @Override 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 d94a3ecd8..215f3dd94 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 @@ -80,4 +80,18 @@ public class QTupleTest { QTuple expr = new QTuple(str1, str2); assertEquals(expr.newInstance("str1", "str2").hashCode(), expr.newInstance("str1", "str2").hashCode()); } + + @Test + public void Duplicates() { + QTuple expr = new QTuple(str1, str1); + assertEquals(1, expr.getArgs().size()); + assertEquals(str1, expr.getArgs().get(0)); + } + + @Test + public void Duplicates2() { + QTuple expr = new QTuple(Arrays.asList(str1, str1)); + assertEquals(1, expr.getArgs().size()); + assertEquals(str1, expr.getArgs().get(0)); + } }