From a6ae9f1b7ef4f3f70bf3dac1469deb46b8a0fd3b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Timo=20Westk=C3=A4mper?= Date: Tue, 6 Jan 2009 20:58:12 +0000 Subject: [PATCH] --- .../mysema/query/collections/InnerQuery.java | 32 +++++++++++++++++-- .../mysema/query/grammar/JavaSerializer.java | 1 - .../mysema/query/collections/MiniApiTest.java | 10 ++++++ 3 files changed, 39 insertions(+), 4 deletions(-) diff --git a/querydsl-collections/src/main/java/com/mysema/query/collections/InnerQuery.java b/querydsl-collections/src/main/java/com/mysema/query/collections/InnerQuery.java index 5c29b38ae..79a037e67 100644 --- a/querydsl-collections/src/main/java/com/mysema/query/collections/InnerQuery.java +++ b/querydsl-collections/src/main/java/com/mysema/query/collections/InnerQuery.java @@ -20,6 +20,8 @@ import com.mysema.query.collections.iterators.FilteringIterator; import com.mysema.query.collections.iterators.MultiIterator; import com.mysema.query.collections.iterators.ProjectingIterator; import com.mysema.query.grammar.JavaSerializer; +import com.mysema.query.grammar.Order; +import com.mysema.query.grammar.OrderSpecifier; import com.mysema.query.grammar.types.Expr; import com.mysema.query.grammar.types.Path; import com.mysema.query.serialization.OperationPatterns; @@ -56,11 +58,35 @@ public class InnerQuery extends QueryBase { private Iterator createIterator(Expr projection) throws Exception { // from List> sources = new ArrayList>(); - MultiIterator multiIt = new MultiIterator(); + MultiIterator multiIt = new MultiIterator(); + + // order + Map,Order> orders = null; + boolean sortOnIterate = !orderBy.isEmpty(); + if (sortOnIterate){ + orders = new HashMap,Order>(); + for (OrderSpecifier order : orderBy){ + if (!(order.target instanceof Path)) sortOnIterate = false; + orders.put((Path)order.target, order.order); + } + } + for (JoinExpression join : joins) { sources.add(join.getTarget()); - multiIt.add(pathToIterable.get(join.getTarget())); } + if (sortOnIterate){ + for (JoinExpression join : joins) { + Iterable iterable = pathToIterable.get(join.getTarget()); + if (orders.containsKey(join.getTarget())){ + // TODO : reorder the iterable instance + } + multiIt.add(iterable); + } + }else{ + for (JoinExpression join : joins) { + multiIt.add(pathToIterable.get(join.getTarget())); + } + } Iterator it = multiIt.init(); // where @@ -70,7 +96,7 @@ public class InnerQuery extends QueryBase { boolean.class); it = new FilteringIterator(it, ev); } - + // select ExpressionEvaluator ev = new JavaSerializer(ops).handle( projection).createExpressionEvaluator(sources, diff --git a/querydsl-collections/src/main/java/com/mysema/query/grammar/JavaSerializer.java b/querydsl-collections/src/main/java/com/mysema/query/grammar/JavaSerializer.java index 88efe786d..f1e37bb01 100644 --- a/querydsl-collections/src/main/java/com/mysema/query/grammar/JavaSerializer.java +++ b/querydsl-collections/src/main/java/com/mysema/query/grammar/JavaSerializer.java @@ -22,7 +22,6 @@ import org.codehaus.janino.Scanner.ScanException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import com.mysema.query.grammar.Ops.Op; import com.mysema.query.grammar.types.Expr; import com.mysema.query.grammar.types.Path; import com.mysema.query.grammar.types.Alias.ASimple; diff --git a/querydsl-collections/src/test/java/com/mysema/query/collections/MiniApiTest.java b/querydsl-collections/src/test/java/com/mysema/query/collections/MiniApiTest.java index 005963e08..0baa87734 100644 --- a/querydsl-collections/src/test/java/com/mysema/query/collections/MiniApiTest.java +++ b/querydsl-collections/src/test/java/com/mysema/query/collections/MiniApiTest.java @@ -179,6 +179,16 @@ public class MiniApiTest { .iterate($(c)).iterator(); } + @Test + public void testAlias8(){ + Cat c = alias(Cat.class, "cat"); + + from($(c),cats) + .where($(c.getMate().getName()).startsWith("B")) + .orderBy($(c.getName()).desc()) + .iterate($(c)).iterator(); + } + @Test public void testMapUsage(){ Map map = new HashMap();