refactored AbstractColQuery to use close method and CloseableIterator

This commit is contained in:
Timo Westkämper 2009-03-24 09:14:49 +00:00
parent 8972e6d87c
commit e6be91cd2f
6 changed files with 92 additions and 61 deletions

View File

@ -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<SubType extends AbstractColQuery<SubType>> {
return new DefaultIndexSupport(new SimpleIteratorSource(exprToIt), ops, sources);
}
public void close(){
// overwrite
}
protected <A> SubType alias(Expr<A> path, Iterable<A> col) {
exprToIt.put(path, col);
return _this;
@ -103,7 +109,7 @@ public class AbstractColQuery<SubType extends AbstractColQuery<SubType>> {
}
@SuppressWarnings("unchecked")
public Iterable<Object[]> iterate(Expr<?> e1, Expr<?> e2, Expr<?>... rest) {
public CloseableIterator<Object[]> 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<SubType extends AbstractColQuery<SubType>> {
return iterate(new Expr.EArrayConstructor(type, full));
}
public <RT> Iterable<RT> iterate(Expr<RT> projection) {
public <RT> CloseableIterator<RT> iterate(Expr<RT> projection) {
return query.iterate(projection);
}
// alias variant
public <RT> Iterable<RT> iterate(RT alias) {
public <RT> CloseableIterator<RT> iterate(RT alias) {
return iterate(MiniApi.getAny(alias));
}
@ -148,11 +154,16 @@ public class AbstractColQuery<SubType extends AbstractColQuery<SubType>> {
* @return
*/
public List<Object[]> list(Expr<?> e1, Expr<?> e2, Expr<?>... rest) {
ArrayList<Object[]> rv = new ArrayList<Object[]>();
for (Object[] v : iterate(e1, e2, rest)){
rv.add(v);
}
return rv;
try{
ArrayList<Object[]> rv = new ArrayList<Object[]>();
CloseableIterator<Object[]> it = iterate(e1, e2, rest);
while (it.hasNext()){
rv.add(it.next());
}
return rv;
}finally{
close();
}
}
/**
@ -162,12 +173,17 @@ public class AbstractColQuery<SubType extends AbstractColQuery<SubType>> {
* @param projection
* @return
*/
public <RT> List<RT> list(Expr<RT> projection) {
ArrayList<RT> rv = new ArrayList<RT>();
for (RT v : query.iterate(projection)){
rv.add(v);
}
return rv;
public <RT> List<RT> list(Expr<RT> projection) {
try {
ArrayList<RT> rv = new ArrayList<RT>();
CloseableIterator<RT> it = query.iterate(projection);
while (it.hasNext()){
rv.add(it.next());
}
return rv;
}finally{
close();
}
}
// alias variant
public <RT> List<RT> list(RT alias) {
@ -180,7 +196,7 @@ public class AbstractColQuery<SubType extends AbstractColQuery<SubType>> {
}
public <RT> RT uniqueResult(Expr<RT> expr) {
Iterator<RT> it = query.iterate(expr).iterator();
Iterator<RT> it = query.iterate(expr);
return it.hasNext() ? it.next() : null;
}
// alias variant
@ -213,9 +229,26 @@ public class AbstractColQuery<SubType extends AbstractColQuery<SubType>> {
this.sequentialUnion = sequentialUnion;
}
private <T> CloseableIterator<T> wrap(final Iterator<T> it){
return new CloseableIterator<T>(){
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<Object, InnerQuery> {
private <RT> Iterator<RT> createIterator(Expr<RT> projection) throws Exception {
private <RT> CloseableIterator<RT> createIterator(Expr<RT> projection) throws Exception {
List<Expr<?>> sources = new ArrayList<Expr<?>>();
// from / where
Iterator<?> it;
@ -232,10 +265,10 @@ public class AbstractColQuery<SubType extends AbstractColQuery<SubType>> {
}
// select
return handleSelect(it, sources, projection);
return wrap(handleSelect(it, sources, projection));
}else{
return Collections.<RT>emptyList().iterator();
return wrap(Collections.<RT>emptyList().iterator());
}
}
@ -347,17 +380,13 @@ public class AbstractColQuery<SubType extends AbstractColQuery<SubType>> {
return transform(ops, it, sources, projection);
}
public <RT> Iterable<RT> iterate(final Expr<RT> projection) {
public <RT> CloseableIterator<RT> iterate(final Expr<RT> projection) {
select(projection);
return new Iterable<RT>() {
public Iterator<RT> 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);
}
}
}

View File

@ -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 <A> Iterable<A> select(Iterable<A> from, Expr.EBoolean where, OrderSpecifier<?>... order){
public static <A> List<A> select(Iterable<A> from, Expr.EBoolean where, OrderSpecifier<?>... order){
Expr<A> path = (Expr<A>) new SinglePathExtractor().handle(where).getPath();
ColQuery query = new ColQuery().from(path, from).where(where).orderBy(order);
return query.iterate((Expr<A>)path);
return query.list((Expr<A>)path);
}
public static <A> Iterable<A> reject(Iterable<A> from, Expr.EBoolean where, OrderSpecifier<?>...order){
public static <A> List<A> reject(Iterable<A> from, Expr.EBoolean where, OrderSpecifier<?>...order){
return select(from, Grammar.not(where), order);
}

View File

@ -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

View File

@ -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<String> 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<String[]> csvData1 = query().from($(""), lines).iterate($("").split(";"));
for (String s : query().from(strs, csvData1).iterate(strs.get(0).add("-").add(strs.get(1)))){
Iterable<String[]> 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<Map.Entry<String,String>> e = $(map.entrySet().iterator().next());
for (Map.Entry<String,String> entry : from(e, map.entrySet()).iterate(e)){
for (Map.Entry<String,String> 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<Integer> i = new Expr.EConstant<Integer>(1);
Expr<Double> d = new Expr.EConstant<Double>(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<String> data2 = Arrays.asList("PETer", "thOMAS", "JOhan");
Iterator<String> 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<TestQuery>{
List<Object> res = new ArrayList<Object>();
<RT> void select(Expr<RT> projection){
for (Object o : iterate(projection)){
for (Object o : list(projection)){
System.out.println(o);
res.add(o);
}
System.out.println();
}
<RT> void select(Expr<RT> p1, Expr<RT> p2, Expr<RT>... rest){
for (Object[] o : iterate(p1, p2, rest)){
for (Object[] o : list(p1, p2, rest)){
System.out.println(Arrays.asList(o));
res.add(o);
}

View File

@ -114,7 +114,7 @@ public class QueryPerformanceTest extends AbstractQueryTest{
private long query(ColQuery query, EBoolean condition, List<Cat> cats1, List<Cat> cats2){
long start = System.currentTimeMillis();
Iterator<Cat> it = query.from(cat, cats1).from(otherCat, cats2).where(condition).iterate(cat).iterator();
Iterator<Cat> it = query.from(cat, cats1).from(otherCat, cats2).where(condition).iterate(cat);
results = 0;
while (it.hasNext()){
results++;

View File

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