diff --git a/querydsl-collections/src/main/java/com/mysema/query/collections/ExprFactory.java b/querydsl-collections/src/main/java/com/mysema/query/collections/ExprFactory.java index 910a9e417..8a6a6c652 100644 --- a/querydsl-collections/src/main/java/com/mysema/query/collections/ExprFactory.java +++ b/querydsl-collections/src/main/java/com/mysema/query/collections/ExprFactory.java @@ -5,6 +5,8 @@ */ package com.mysema.query.collections; +import java.util.Arrays; +import java.util.List; import java.util.Map; import java.util.WeakHashMap; @@ -25,12 +27,21 @@ import com.mysema.query.grammar.types.Path.*; // TODO : consider moving this later to querydsl-core class ExprFactory { - final ExtString strExt = new ExtString(PathMetadata.forVariable("str")); - - private final Map> simToPath = new PathFactory>(new Transformer>(){ + private long counter = 0; + + private final ExtString strExt = new ExtString(PathMetadata.forVariable("str")); + + private final Map baToPath = new PathFactory(new Transformer(){ @SuppressWarnings("unchecked") - public PSimple transform(Object arg) { - return new PSimple(arg.getClass(), md()); + public PBooleanArray transform(Object arg) { + return new PBooleanArray(md()); + } + }); + + private final Map> caToPath = new PathFactory>(new Transformer>(){ + @SuppressWarnings("unchecked") + public PComparableArray transform(Object arg) { + return new PComparableArray(((List)arg).get(0).getClass(), md()); } }); @@ -41,48 +52,56 @@ class ExprFactory { } }); + private final Map saToPath = new PathFactory(new Transformer(){ + public PStringArray transform(Object arg) { + return new PStringArray(md()); + } + }); + + private final Map> simToPath = new PathFactory>(new Transformer>(){ + @SuppressWarnings("unchecked") + public PSimple transform(Object arg) { + return new PSimple(arg.getClass(), md()); + } + }); + private final Map strToExtPath = new PathFactory(new Transformer(){ public ExtString transform(String str) { return new ExtString(md()); } }); - private long counter = 0; - public PBoolean create(Boolean arg){ // NOTE : we can't really cache Booleans, since there are only two values, // but possibly more variables to be tracked return new PBoolean(md()); } + public PBooleanArray create(Boolean[] args){ + return baToPath.get(Arrays.asList(args)); + } + @SuppressWarnings("unchecked") public > PComparable create(D arg){ return (PComparable) comToPath.get(arg); } - public ExtString create(String arg){ - return StringUtils.isEmpty(arg) ? strExt : strToExtPath.get(arg); - } - @SuppressWarnings("unchecked") public PSimple create(D arg){ return (PSimple) simToPath.get(arg); } - public PBooleanArray create(Boolean[] args){ - // TODO : cache - return new PBooleanArray(md()); - } - @SuppressWarnings("unchecked") public > PComparableArray create(D[] args){ - // TODO : cache - return new PComparableArray(args[0].getClass(),md()); + return (PComparableArray) caToPath.get(Arrays.asList(args)); + } + + public ExtString create(String arg){ + return StringUtils.isEmpty(arg) ? strExt : strToExtPath.get(arg); } public PStringArray create(String[] args){ - // TODO : cache - return new PStringArray(md()); + return saToPath.get(Arrays.asList(args)); } private PathMetadata md(){