#314 added duplicate removal to QTuple

This commit is contained in:
Timo Westkämper 2012-12-14 09:12:40 +02:00
parent b9b832bbe1
commit eb84f97f25
2 changed files with 40 additions and 7 deletions

View File

@ -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;
* }
* </pre>
*
* Duplicate expressions are removed in the constructor.
*
* @author tiwe
*
*/
@ -99,8 +103,15 @@ public class QTuple extends ExpressionBase<Tuple> implements FactoryExpression<T
* @param args
*/
public QTuple(Expression<?>... args) {
super(Tuple.class);
this.args = ImmutableList.copyOf(args);
super(Tuple.class);
Set<Expression<?>> set = new HashSet<Expression<?>>(args.length);
ImmutableList.Builder<Expression<?>> 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<Tuple> implements FactoryExpression<T
*
* @param args
*/
public QTuple(List<Expression<?>> args) {
public QTuple(List<? extends Expression<?>> args) {
super(Tuple.class);
this.args = args;
ImmutableList.Builder<Expression<?>> 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<Tuple> implements FactoryExpression<T
*/
public QTuple(Expression<?>[]... args) {
super(Tuple.class);
this.args = new ArrayList<Expression<?>>();
Set<Expression<?>> argsSet = new LinkedHashSet<Expression<?>>();
for (Expression<?>[] exprs: args){
this.args.addAll(Arrays.asList(exprs));
argsSet.addAll(Arrays.asList(exprs));
}
this.args = ImmutableList.copyOf(argsSet);
}
@Override

View File

@ -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));
}
}