mirror of
https://github.com/querydsl/querydsl.git
synced 2026-06-13 21:01:01 +08:00
refactored AbstractColQuery to use close method and CloseableIterator
This commit is contained in:
parent
8972e6d87c
commit
e6be91cd2f
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -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);
|
||||
}
|
||||
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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);
|
||||
}
|
||||
|
||||
@ -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++;
|
||||
|
||||
@ -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));
|
||||
}
|
||||
}
|
||||
|
||||
Loading…
Reference in New Issue
Block a user