diff --git a/querydsl-core/src/main/java/com/mysema/query/types/FactoryExpressionBase.java b/querydsl-core/src/main/java/com/mysema/query/types/FactoryExpressionBase.java new file mode 100644 index 000000000..fe24da58c --- /dev/null +++ b/querydsl-core/src/main/java/com/mysema/query/types/FactoryExpressionBase.java @@ -0,0 +1,65 @@ +package com.mysema.query.types; + +import javax.annotation.Nullable; +import java.util.List; + +/** + * Common superclass for FactoryExpression implementations + * + * @param + */ +public abstract class FactoryExpressionBase extends ExpressionBase implements FactoryExpression { + + private static class FactoryExpressionWrapper extends ExpressionBase implements FactoryExpression { + private final FactoryExpression expr; + + public FactoryExpressionWrapper(FactoryExpression expr) { + super(expr.getType()); + this.expr = expr; + } + + @Override + public List> getArgs() { + return expr.getArgs(); + } + + @Nullable + @Override + public T newInstance(Object... args) { + if (args != null) { + for (Object arg : args) { + if (arg != null) { + return expr.newInstance(args); + } + } + } + return null; + } + + @Nullable + @Override + public R accept(Visitor v, @Nullable C context) { + return expr.accept(v, context); + } + + @Override + public boolean equals(Object o) { + return expr.equals(o); + } + + } + + public FactoryExpressionBase(Class type) { + super(type); + } + + /** + * Returns a wrapper expression which returns null if all arguments to newInstance are null + * + * @return + */ + public FactoryExpression skipNulls() { + return new FactoryExpressionWrapper(this); + } + +} diff --git a/querydsl-core/src/main/java/com/mysema/query/types/QBean.java b/querydsl-core/src/main/java/com/mysema/query/types/QBean.java index 958249023..085b93eb8 100644 --- a/querydsl-core/src/main/java/com/mysema/query/types/QBean.java +++ b/querydsl-core/src/main/java/com/mysema/query/types/QBean.java @@ -46,7 +46,7 @@ import com.google.common.primitives.Primitives; * * @param bean type */ -public class QBean extends ExpressionBase implements FactoryExpression { +public class QBean extends FactoryExpressionBase implements FactoryExpression { private static final long serialVersionUID = -8210214512730989778L; diff --git a/querydsl-core/src/main/java/com/mysema/query/types/QList.java b/querydsl-core/src/main/java/com/mysema/query/types/QList.java index 94fd5284b..f17f2d49c 100644 --- a/querydsl-core/src/main/java/com/mysema/query/types/QList.java +++ b/querydsl-core/src/main/java/com/mysema/query/types/QList.java @@ -13,12 +13,11 @@ */ package com.mysema.query.types; +import javax.annotation.Nullable; import java.util.Arrays; import java.util.Collections; import java.util.List; -import javax.annotation.Nullable; - import com.google.common.collect.ImmutableList; /** @@ -27,7 +26,7 @@ import com.google.common.collect.ImmutableList; * @author tiwe * */ -public class QList extends ExpressionBase> implements FactoryExpression> { +public class QList extends FactoryExpressionBase> implements FactoryExpression> { private static final long serialVersionUID = -7545994090073480810L; diff --git a/querydsl-core/src/main/java/com/mysema/query/types/QMap.java b/querydsl-core/src/main/java/com/mysema/query/types/QMap.java index f5d837f3e..9a8159ad8 100644 --- a/querydsl-core/src/main/java/com/mysema/query/types/QMap.java +++ b/querydsl-core/src/main/java/com/mysema/query/types/QMap.java @@ -37,7 +37,7 @@ import com.google.common.collect.Maps; * @author tiwe * */ -public class QMap extends ExpressionBase,?>> implements FactoryExpression,?>>{ +public class QMap extends FactoryExpressionBase,?>> implements FactoryExpression,?>>{ private static final long serialVersionUID = -7545994090073480810L; 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 6a994fc65..4c7526828 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,13 +13,12 @@ */ package com.mysema.query.types; +import javax.annotation.concurrent.Immutable; import java.io.Serializable; import java.util.Arrays; import java.util.List; import java.util.Map; -import javax.annotation.concurrent.Immutable; - import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableMap; import com.google.common.collect.Maps; @@ -53,7 +52,7 @@ import com.mysema.query.Tuple; * */ @Immutable -public class QTuple extends ExpressionBase implements FactoryExpression { +public class QTuple extends FactoryExpressionBase implements FactoryExpression { private static ImmutableMap, Integer> createBindings(List> exprs) { Map, Integer> map = Maps.newHashMap(); 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 7266e3898..a48a8d06c 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 @@ -13,16 +13,16 @@ */ package com.mysema.query.types; -import static org.junit.Assert.assertEquals; - import java.util.Arrays; -import org.junit.Ignore; -import org.junit.Test; - import com.google.common.collect.ImmutableList; import com.mysema.query.Tuple; import com.mysema.query.types.path.StringPath; +import org.junit.Ignore; +import org.junit.Test; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertNull; public class QTupleTest { @@ -108,4 +108,10 @@ public class QTupleTest { assertEquals(1, expr.getArgs().size()); assertEquals(str1, expr.getArgs().get(0)); } + + @Test + public void NewInstance() { + assertNotNull(new QTuple(str1, str1).newInstance(null, null)); + assertNull(new QTuple(str1, str1).skipNulls().newInstance(null, null)); + } }