From e6be91cd2f8bc577a836894677f35fa650b47a89 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Timo=20Westk=C3=A4mper?= Date: Tue, 24 Mar 2009 09:14:49 +0000 Subject: [PATCH] refactored AbstractColQuery to use close method and CloseableIterator --- .../query/collections/AbstractColQuery.java | 85 +++++++++++++------ .../com/mysema/query/collections/MiniApi.java | 7 +- .../collections/utils/QueryIteratorUtils.java | 1 + .../query/collections/ColQueryTest.java | 56 ++++++------ .../collections/QueryPerformanceTest.java | 2 +- .../collections/QueryValidationTest.java | 2 +- 6 files changed, 92 insertions(+), 61 deletions(-) diff --git a/querydsl-collections/src/main/java/com/mysema/query/collections/AbstractColQuery.java b/querydsl-collections/src/main/java/com/mysema/query/collections/AbstractColQuery.java index 49faafded..9cb2f9782 100644 --- a/querydsl-collections/src/main/java/com/mysema/query/collections/AbstractColQuery.java +++ b/querydsl-collections/src/main/java/com/mysema/query/collections/AbstractColQuery.java @@ -9,6 +9,7 @@ import static com.mysema.query.collections.utils.QueryIteratorUtils.multiArgFilt import static com.mysema.query.collections.utils.QueryIteratorUtils.toArrayIterator; import static com.mysema.query.collections.utils.QueryIteratorUtils.transform; +import java.io.IOException; import java.util.*; import org.apache.commons.collections15.IteratorUtils; @@ -31,6 +32,7 @@ import com.mysema.query.grammar.OrderSpecifier; import com.mysema.query.grammar.types.Expr; import com.mysema.query.grammar.types.Operation; import com.mysema.query.grammar.types.Expr.EBoolean; +import com.mysema.query.util.CloseableIterator; /** * AbstractColQuery provides a base class for Collection query implementations. @@ -77,6 +79,10 @@ public class AbstractColQuery> { return new DefaultIndexSupport(new SimpleIteratorSource(exprToIt), ops, sources); } + public void close(){ + // overwrite + } + protected SubType alias(Expr path, Iterable col) { exprToIt.put(path, col); return _this; @@ -103,7 +109,7 @@ public class AbstractColQuery> { } @SuppressWarnings("unchecked") - public Iterable iterate(Expr e1, Expr e2, Expr... rest) { + public CloseableIterator iterate(Expr e1, Expr e2, Expr... rest) { // TODO : move this code to querydsl-core final Expr[] full = asArray(new Expr[rest.length + 2], e1, e2, rest); boolean oneType = true; @@ -123,11 +129,11 @@ public class AbstractColQuery> { return iterate(new Expr.EArrayConstructor(type, full)); } - public Iterable iterate(Expr projection) { + public CloseableIterator iterate(Expr projection) { return query.iterate(projection); } // alias variant - public Iterable iterate(RT alias) { + public CloseableIterator iterate(RT alias) { return iterate(MiniApi.getAny(alias)); } @@ -148,11 +154,16 @@ public class AbstractColQuery> { * @return */ public List list(Expr e1, Expr e2, Expr... rest) { - ArrayList rv = new ArrayList(); - for (Object[] v : iterate(e1, e2, rest)){ - rv.add(v); - } - return rv; + try{ + ArrayList rv = new ArrayList(); + CloseableIterator it = iterate(e1, e2, rest); + while (it.hasNext()){ + rv.add(it.next()); + } + return rv; + }finally{ + close(); + } } /** @@ -162,12 +173,17 @@ public class AbstractColQuery> { * @param projection * @return */ - public List list(Expr projection) { - ArrayList rv = new ArrayList(); - for (RT v : query.iterate(projection)){ - rv.add(v); - } - return rv; + public List list(Expr projection) { + try { + ArrayList rv = new ArrayList(); + CloseableIterator it = query.iterate(projection); + while (it.hasNext()){ + rv.add(it.next()); + } + return rv; + }finally{ + close(); + } } // alias variant public List list(RT alias) { @@ -180,7 +196,7 @@ public class AbstractColQuery> { } public RT uniqueResult(Expr expr) { - Iterator it = query.iterate(expr).iterator(); + Iterator it = query.iterate(expr); return it.hasNext() ? it.next() : null; } // alias variant @@ -213,9 +229,26 @@ public class AbstractColQuery> { this.sequentialUnion = sequentialUnion; } + private CloseableIterator wrap(final Iterator it){ + return new CloseableIterator(){ + public boolean hasNext() { + return it.hasNext(); + } + public T next() { + return it.next(); + } + public void remove() { + it.remove(); + } + public void close() throws IOException { + AbstractColQuery.this.close(); + } + }; + } + public class InnerQuery extends QueryBase { - private Iterator createIterator(Expr projection) throws Exception { + private CloseableIterator createIterator(Expr projection) throws Exception { List> sources = new ArrayList>(); // from / where Iterator it; @@ -232,10 +265,10 @@ public class AbstractColQuery> { } // select - return handleSelect(it, sources, projection); + return wrap(handleSelect(it, sources, projection)); }else{ - return Collections.emptyList().iterator(); + return wrap(Collections.emptyList().iterator()); } } @@ -347,17 +380,13 @@ public class AbstractColQuery> { return transform(ops, it, sources, projection); } - public Iterable iterate(final Expr projection) { + public CloseableIterator iterate(final Expr projection) { select(projection); - return new Iterable() { - public Iterator iterator() { - try { - return createIterator(projection); - } catch (Exception e) { - throw new RuntimeException("error", e); - } - } - }; + try { + return createIterator(projection); + } catch (Exception e) { + throw new RuntimeException("error", e); + } } } diff --git a/querydsl-collections/src/main/java/com/mysema/query/collections/MiniApi.java b/querydsl-collections/src/main/java/com/mysema/query/collections/MiniApi.java index 8eff804f0..242f5d588 100644 --- a/querydsl-collections/src/main/java/com/mysema/query/collections/MiniApi.java +++ b/querydsl-collections/src/main/java/com/mysema/query/collections/MiniApi.java @@ -6,6 +6,7 @@ package com.mysema.query.collections; import java.util.Arrays; +import java.util.List; import com.mysema.query.grammar.Grammar; import com.mysema.query.grammar.GrammarWithAlias; @@ -34,13 +35,13 @@ public class MiniApi extends GrammarWithAlias{ } @SuppressWarnings("unchecked") - public static Iterable select(Iterable from, Expr.EBoolean where, OrderSpecifier... order){ + public static List select(Iterable from, Expr.EBoolean where, OrderSpecifier... order){ Expr path = (Expr) new SinglePathExtractor().handle(where).getPath(); ColQuery query = new ColQuery().from(path, from).where(where).orderBy(order); - return query.iterate((Expr)path); + return query.list((Expr)path); } - public static Iterable reject(Iterable from, Expr.EBoolean where, OrderSpecifier...order){ + public static List reject(Iterable from, Expr.EBoolean where, OrderSpecifier...order){ return select(from, Grammar.not(where), order); } diff --git a/querydsl-collections/src/main/java/com/mysema/query/collections/utils/QueryIteratorUtils.java b/querydsl-collections/src/main/java/com/mysema/query/collections/utils/QueryIteratorUtils.java index 20b8ef5e7..d68ae43c1 100644 --- a/querydsl-collections/src/main/java/com/mysema/query/collections/utils/QueryIteratorUtils.java +++ b/querydsl-collections/src/main/java/com/mysema/query/collections/utils/QueryIteratorUtils.java @@ -15,6 +15,7 @@ import com.mysema.query.collections.eval.Evaluator; import com.mysema.query.grammar.JavaOps; import com.mysema.query.grammar.types.Expr; import com.mysema.query.grammar.types.Expr.EBoolean; +import com.mysema.query.util.CloseableIterator; /** * QueryIteratorUtils provides diff --git a/querydsl-collections/src/test/java/com/mysema/query/collections/ColQueryTest.java b/querydsl-collections/src/test/java/com/mysema/query/collections/ColQueryTest.java index 9847abc77..e09b55582 100644 --- a/querydsl-collections/src/test/java/com/mysema/query/collections/ColQueryTest.java +++ b/querydsl-collections/src/test/java/com/mysema/query/collections/ColQueryTest.java @@ -77,26 +77,26 @@ public class ColQueryTest extends AbstractQueryTest{ // 1st QCat cat = new QCat("cat"); for (String name : from(cat,cats).where(cat.kittens.size().gt(0)) - .iterate(cat.name)){ + .list(cat.name)){ System.out.println(name); } // 1st - variation 1 for (String name : from(cat,cats).where(gt(cat.kittens.size(),0)) - .iterate(cat.name)){ + .list(cat.name)){ System.out.println(name); } // 2nd Cat c = alias(Cat.class, "cat"); for (String name : from(c,cats).where($(c.getKittens()).size().gt(0)) - .iterate(c.getName())){ + .list(c.getName())){ System.out.println(name); } // 2nd - variation 1 for (String name : from(c,cats).where($(c.getKittens().size()).gt(0)) - .iterate(c.getName())){ + .list(c.getName())){ System.out.println(name); } @@ -123,14 +123,14 @@ public class ColQueryTest extends AbstractQueryTest{ // 1st QCat cat = new QCat("cat"); for (String name : from(cat,cats).where(cat.name.like("fri%")) - .iterate(cat.name)){ + .list(cat.name)){ System.out.println(name); } // 2nd Cat c = alias(Cat.class, "cat"); for (String name : from(c,cats).where($(c.getName()).like("fri%")) - .iterate(c.getName())){ + .list(c.getName())){ System.out.println(name); } } @@ -141,7 +141,7 @@ public class ColQueryTest extends AbstractQueryTest{ from(c,cats) .where($(c.getBirthdate()).after(new Date())) - .iterate(c).iterator(); + .list(c).iterator(); } @Test @@ -152,7 +152,7 @@ public class ColQueryTest extends AbstractQueryTest{ // TODO : FIXME : Janino compiler doesn't handle generic collections from(c,cats) .where($(c.getKittens().get(0).getBodyWeight()).gt(12)) - .iterate(c.getName()).iterator(); + .list(c.getName()).iterator(); } @Test @@ -162,7 +162,7 @@ public class ColQueryTest extends AbstractQueryTest{ from(c,cats) .where($(c).eq(other)) - .iterate(c).iterator(); + .list(c).iterator(); } @Test @@ -174,7 +174,7 @@ public class ColQueryTest extends AbstractQueryTest{ from(c,cats) .where($(c.getKittens().contains(other))) - .iterate(c).iterator(); + .list(c).iterator(); } @Test @@ -183,7 +183,7 @@ public class ColQueryTest extends AbstractQueryTest{ from(c,cats) .where(c.getKittens().isEmpty()) - .iterate(c).iterator(); + .list(c).iterator(); } @Test @@ -192,7 +192,7 @@ public class ColQueryTest extends AbstractQueryTest{ from(c,cats) .where($(c.getName()).startsWith("B")) - .iterate(c).iterator(); + .list(c).iterator(); } @@ -203,7 +203,7 @@ public class ColQueryTest extends AbstractQueryTest{ from(c,cats) .where($(c.getName()).toUpperCase().eq("MOE")) - .iterate(c).iterator(); + .list(c).iterator(); } @Test @@ -224,7 +224,7 @@ public class ColQueryTest extends AbstractQueryTest{ @Test public void testAPIMethods(){ query().from(cat, c1, c2).list(cat); - query().from(cat, c1, c2).iterate(cat).iterator(); + query().from(cat, c1, c2).list(cat).iterator(); } @Test @@ -258,7 +258,7 @@ public class ColQueryTest extends AbstractQueryTest{ List lines = Arrays.asList("1;10;100","2;20;200","3;30;300"); // 1st - for (String[] row : query().from($(""), lines).iterate($("").split(";"))){ + for (String[] row : query().from($(""), lines).list($("").split(";"))){ for (String col : row){ System.out.println(col); } @@ -266,8 +266,8 @@ public class ColQueryTest extends AbstractQueryTest{ // 2nd Path.PStringArray strs = $(new String[]{}); - Iterable csvData1 = query().from($(""), lines).iterate($("").split(";")); - for (String s : query().from(strs, csvData1).iterate(strs.get(0).add("-").add(strs.get(1)))){ + Iterable csvData1 = query().from($(""), lines).list($("").split(";")); + for (String s : query().from(strs, csvData1).list(strs.get(0).add("-").add(strs.get(1)))){ System.out.println(s); } } @@ -295,12 +295,12 @@ public class ColQueryTest extends AbstractQueryTest{ // 1st PEntity> e = $(map.entrySet().iterator().next()); - for (Map.Entry entry : from(e, map.entrySet()).iterate(e)){ + for (Map.Entry entry : from(e, map.entrySet()).list(e)){ System.out.println(entry.getKey() + " > " + entry.getValue()); } // 2nd -// for (String[] kv : from($("k"), $("v"), map).iterate($("k"),$("v"))){ +// for (String[] kv : from($("k"), $("v"), map).list($("k"),$("v"))){ // System.out.println(kv[0] + " > " + kv[1]); // } } @@ -311,7 +311,7 @@ public class ColQueryTest extends AbstractQueryTest{ Expr i = new Expr.EConstant(1); Expr d = new Expr.EConstant(1.0); from(c, cats) - .iterate( + .list( QMath.abs(i), QMath.acos(d), QMath.asin(d), @@ -409,7 +409,7 @@ public class ColQueryTest extends AbstractQueryTest{ Iterable data2 = Arrays.asList("PETer", "thOMAS", "JOhan"); Iterator res = Arrays.asList("petER - PETer","THomas - thOMAS", "joHAN - JOhan").iterator(); - for (Object[] arr : query().from($("a"), data1).from($("b"), data2).where($("a").equalsIgnoreCase($("b"))).iterate($("a"),$("b"))){ + for (Object[] arr : query().from($("a"), data1).from($("b"), data2).where($("a").equalsIgnoreCase($("b"))).list($("a"),$("b"))){ assertEquals(res.next(), arr[0]+" - "+arr[1]); } } @@ -418,7 +418,7 @@ public class ColQueryTest extends AbstractQueryTest{ public void testVarious(){ for(Object[] strs : from($("a"), "aa","bb","cc").from($("b"), "a","b") .where($("a").startsWith($("b"))) - .iterate($("a"),$("b"))){ + .list($("a"),$("b"))){ System.out.println(Arrays.asList(strs)); } @@ -441,7 +441,7 @@ public class ColQueryTest extends AbstractQueryTest{ public void testVarious1(){ for(String s : from($("str"), "a","ab","cd","de") .where($("str").startsWith("a")) - .iterate($("str"))){ + .list($("str"))){ assertTrue(s.equals("a") || s.equals("ab")); System.out.println(s); } @@ -449,7 +449,7 @@ public class ColQueryTest extends AbstractQueryTest{ @Test public void testVarious2(){ - for (Object o : from($(),1,2,"abc",5,3).where($().ne("abc")).iterate($())){ + for (Object o : from($(),1,2,"abc",5,3).where($().ne("abc")).list($())){ int i = (Integer)o; assertTrue(i > 0 && i < 6); System.out.println(o); @@ -458,7 +458,7 @@ public class ColQueryTest extends AbstractQueryTest{ @Test public void testVarious3(){ - for (Integer i : from($(0),1,2,3,4).where($(0).lt(4)).iterate($(0))){ + for (Integer i : from($(0),1,2,3,4).where($(0).lt(4)).list($(0))){ System.out.println(i); } } @@ -478,7 +478,7 @@ public class ColQueryTest extends AbstractQueryTest{ ColQuery query = new ColQuery().from(cat, cats1).from(otherCat, cats2); query.setWrapIterators(false); - for (Object[] objects : MiniApi.from(cat, cats1).from(otherCat, cats2).where(where).iterate(cat, otherCat)){ + for (Object[] objects : MiniApi.from(cat, cats1).from(otherCat, cats2).where(where).list(cat, otherCat)){ System.out.println(Arrays.asList(objects)); } @@ -487,14 +487,14 @@ public class ColQueryTest extends AbstractQueryTest{ private static class TestQuery extends AbstractColQuery{ List res = new ArrayList(); void select(Expr projection){ - for (Object o : iterate(projection)){ + for (Object o : list(projection)){ System.out.println(o); res.add(o); } System.out.println(); } void select(Expr p1, Expr p2, Expr... rest){ - for (Object[] o : iterate(p1, p2, rest)){ + for (Object[] o : list(p1, p2, rest)){ System.out.println(Arrays.asList(o)); res.add(o); } diff --git a/querydsl-collections/src/test/java/com/mysema/query/collections/QueryPerformanceTest.java b/querydsl-collections/src/test/java/com/mysema/query/collections/QueryPerformanceTest.java index 5eb0b18e5..6b663ace4 100644 --- a/querydsl-collections/src/test/java/com/mysema/query/collections/QueryPerformanceTest.java +++ b/querydsl-collections/src/test/java/com/mysema/query/collections/QueryPerformanceTest.java @@ -114,7 +114,7 @@ public class QueryPerformanceTest extends AbstractQueryTest{ private long query(ColQuery query, EBoolean condition, List cats1, List cats2){ long start = System.currentTimeMillis(); - Iterator it = query.from(cat, cats1).from(otherCat, cats2).where(condition).iterate(cat).iterator(); + Iterator it = query.from(cat, cats1).from(otherCat, cats2).where(condition).iterate(cat); results = 0; while (it.hasNext()){ results++; diff --git a/querydsl-collections/src/test/java/com/mysema/query/collections/QueryValidationTest.java b/querydsl-collections/src/test/java/com/mysema/query/collections/QueryValidationTest.java index 837b2bc6d..9d826d95b 100644 --- a/querydsl-collections/src/test/java/com/mysema/query/collections/QueryValidationTest.java +++ b/querydsl-collections/src/test/java/com/mysema/query/collections/QueryValidationTest.java @@ -154,7 +154,7 @@ public class QueryValidationTest extends AbstractQueryTest{ ColQuery query = new ColQueryWithoutIndexing(); query.setSortSources(false); for (Object[] cats : query.from(cat, cats1).from(otherCat, cats2) - .where(condition).iterate(cat, otherCat)){ + .where(condition).list(cat, otherCat)){ System.out.println(Arrays.asList(cats)); } }