Repository: jena
Updated Branches:
  refs/heads/master bb30cae54 -> e8b771b7f


Changes for JENA-1144

refactored handlers
Added AggregationHandler
Added HandlerBlock to consistently  handle dependencies between handlers.


Project: http://git-wip-us.apache.org/repos/asf/jena/repo
Commit: http://git-wip-us.apache.org/repos/asf/jena/commit/e8b771b7
Tree: http://git-wip-us.apache.org/repos/asf/jena/tree/e8b771b7
Diff: http://git-wip-us.apache.org/repos/asf/jena/diff/e8b771b7

Branch: refs/heads/master
Commit: e8b771b7fcd040e29d055cc0864ebdce290bf09e
Parents: bb30cae
Author: Claude Warren <[email protected]>
Authored: Sun Mar 6 14:15:48 2016 +0000
Committer: Claude Warren <[email protected]>
Committed: Sun Mar 6 14:15:48 2016 +0000

----------------------------------------------------------------------
 .../arq/querybuilder/AbstractQueryBuilder.java  |  89 +++--------
 .../jena/arq/querybuilder/AskBuilder.java       |  77 +++++----
 .../jena/arq/querybuilder/ConstructBuilder.java |  81 +++++-----
 .../jena/arq/querybuilder/SelectBuilder.java    |  91 +++++------
 .../handlers/AggregationHandler.java            |  78 +++++++++
 .../arq/querybuilder/handlers/HandlerBlock.java | 158 +++++++++++++++++++
 .../querybuilder/handlers/PrologHandler.java    |  12 ++
 .../querybuilder/handlers/SelectHandler.java    |  23 ++-
 .../arq/querybuilder/handlers/WhereHandler.java |  48 +++---
 .../querybuilder/rewriters/ElementRewriter.java |   4 +-
 .../querybuilder/AbstractQueryBuilderTest.java  |  17 ++
 .../arq/querybuilder/SelectBuilderTest.java     |  78 +++++++++
 .../querybuilder/clauses/WhereClauseTest.java   |   2 +-
 .../handlers/SelectHandlerTest.java             |   9 +-
 14 files changed, 534 insertions(+), 233 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/jena/blob/e8b771b7/jena-extras/jena-querybuilder/src/main/java/org/apache/jena/arq/querybuilder/AbstractQueryBuilder.java
----------------------------------------------------------------------
diff --git 
a/jena-extras/jena-querybuilder/src/main/java/org/apache/jena/arq/querybuilder/AbstractQueryBuilder.java
 
b/jena-extras/jena-querybuilder/src/main/java/org/apache/jena/arq/querybuilder/AbstractQueryBuilder.java
index b05fc4e..f366d85 100644
--- 
a/jena-extras/jena-querybuilder/src/main/java/org/apache/jena/arq/querybuilder/AbstractQueryBuilder.java
+++ 
b/jena-extras/jena-querybuilder/src/main/java/org/apache/jena/arq/querybuilder/AbstractQueryBuilder.java
@@ -27,9 +27,11 @@ import org.apache.jena.arq.querybuilder.clauses.PrologClause;
 import org.apache.jena.arq.querybuilder.clauses.SelectClause;
 import org.apache.jena.arq.querybuilder.clauses.SolutionModifierClause;
 import org.apache.jena.arq.querybuilder.clauses.WhereClause;
+import org.apache.jena.arq.querybuilder.handlers.AggregationHandler;
 import org.apache.jena.arq.querybuilder.handlers.ConstructHandler;
 import org.apache.jena.arq.querybuilder.handlers.DatasetHandler;
 import org.apache.jena.arq.querybuilder.handlers.Handler;
+import org.apache.jena.arq.querybuilder.handlers.HandlerBlock;
 import org.apache.jena.arq.querybuilder.handlers.PrologHandler;
 import org.apache.jena.arq.querybuilder.handlers.SelectHandler;
 import org.apache.jena.arq.querybuilder.handlers.SolutionModifierHandler;
@@ -58,8 +60,6 @@ import org.apache.jena.sparql.util.NodeFactoryExtra ;
 public abstract class AbstractQueryBuilder<T extends AbstractQueryBuilder<T>>
                implements Cloneable, PrologClause<T> {
 
-       // all queries have prologs
-       protected PrologHandler prologHandler;
        // the query this builder is building
        protected Query query;
        // a map of vars to nodes for replacement during build.
@@ -175,9 +175,16 @@ public abstract class AbstractQueryBuilder<T extends 
AbstractQueryBuilder<T>>
         */
        protected AbstractQueryBuilder() {
                query = new Query();
-               prologHandler = new PrologHandler(query);
                values = new HashMap<Var, Node>();
        }
+       
+       public abstract HandlerBlock getHandlerBlock();
+       
+       
+       public final PrologHandler getPrologHandler() {
+               return getHandlerBlock().getPrologHandler();
+       }
+
 
        /**
         * Set a variable replacement. During build all instances of var in the
@@ -221,11 +228,6 @@ public abstract class AbstractQueryBuilder<T extends 
AbstractQueryBuilder<T>>
        }
 
        @Override
-       public PrologHandler getPrologHandler() {
-               return prologHandler;
-       }
-
-       @Override
        public T addPrefix(String pfx, Resource uri) {
                return addPrefix(pfx, uri.getURI());
        }
@@ -238,21 +240,21 @@ public abstract class AbstractQueryBuilder<T extends 
AbstractQueryBuilder<T>>
        @SuppressWarnings("unchecked")
        @Override
        public T addPrefix(String pfx, String uri) {
-               prologHandler.addPrefix(pfx, uri);
+               getPrologHandler().addPrefix(pfx, uri);
                return (T) this;
        }
 
        @SuppressWarnings("unchecked")
        @Override
        public T addPrefixes(Map<String, String> prefixes) {
-               prologHandler.addPrefixes(prefixes);
+               getPrologHandler().addPrefixes(prefixes);
                return (T) this;
        }
 
        @SuppressWarnings("unchecked")
        @Override
        public T setBase(String base) {
-               prologHandler.setBase(base);
+               getPrologHandler().setBase(base);
                return (T) this;
        }
 
@@ -303,51 +305,17 @@ public abstract class AbstractQueryBuilder<T extends 
AbstractQueryBuilder<T>>
                        throw new IllegalStateException( "Internal query is not 
a known type: "+q.getQueryType());                      
                }
                
-               Stack<Handler> handlerStack = new Stack<Handler>();
-               PrologHandler ph = new PrologHandler(q);
-               handlerStack.push(ph);
-               ph.addAll(prologHandler);
-               ph.setVars(values);
-               if (this instanceof SelectClause) {
-                       SelectHandler sh = new SelectHandler(q);
-                       sh.addAll(((SelectClause<?>) this).getSelectHandler());
-                       sh.setVars(values);
-                       handlerStack.push(sh);
-               }
-               if (this instanceof ConstructClause) {
-                       ConstructHandler ch = new ConstructHandler(q);
-                       ch.addAll(((ConstructClause<?>) 
this).getConstructHandler());
-                       ch.setVars(values);
-                       handlerStack.push(ch);
-               }
-               if (this instanceof DatasetClause) {
-                       DatasetHandler dh = new DatasetHandler(q);
-                       dh.addAll(((DatasetClause<?>) 
this).getDatasetHandler());
-                       dh.setVars(values);
-                       handlerStack.push(dh);
-               }
-               if (this instanceof SolutionModifierClause) {
-                       SolutionModifierHandler smh = new 
SolutionModifierHandler(q);
-                       smh.addAll(((SolutionModifierClause<?>) this)
-                                       .getSolutionModifierHandler());
-                       smh.setVars(values);
-                       handlerStack.push(smh);
-               }
-               if (this instanceof WhereClause) {
-                       WhereHandler wh = new WhereHandler(q);
-                       wh.addAll(((WhereClause<?>) this).getWhereHandler());
-                       wh.setVars(values);
-                       handlerStack.push(wh);
-               }
-
+               HandlerBlock handlerBlock = new HandlerBlock(q);
+               handlerBlock.addAll( getHandlerBlock() );
+               handlerBlock.setVars(values);
+               
                //  make sure we have a query pattern before we start building.
                if (q.getQueryPattern() == null)
                {
                        q.setQueryPattern( new ElementGroup() );
                }
-               while (!handlerStack.isEmpty()) {
-                       handlerStack.pop().build();
-               }
+               
+               handlerBlock.build();
 
                return q;
        }
@@ -378,13 +346,10 @@ public abstract class AbstractQueryBuilder<T extends 
AbstractQueryBuilder<T>>
                retval.setQueryConstructType();
            }
            
-               new PrologHandler(retval).addAll(new PrologHandler(q2));
-               new ConstructHandler(retval).addAll(new ConstructHandler(q2));
-               new DatasetHandler(retval).addAll(new DatasetHandler(q2));
-               new SolutionModifierHandler(retval).addAll(new 
SolutionModifierHandler(
-                               q2));
-               new WhereHandler(retval).addAll(new WhereHandler(q2));
-               new SelectHandler(retval).addAll(new SelectHandler(q2));
+           HandlerBlock hb = new HandlerBlock( retval );
+           HandlerBlock hb2 = new HandlerBlock( q2 );
+           hb.addAll(hb2);
+               
                return retval;
        }
 
@@ -398,12 +363,8 @@ public abstract class AbstractQueryBuilder<T extends 
AbstractQueryBuilder<T>>
         * @return The new query with the specified vars replaced.
         */
        public static Query rewrite(Query q2, Map<Var, Node> values) {
-               new PrologHandler(q2).setVars(values);
-               new ConstructHandler(q2).setVars(values);
-               new DatasetHandler(q2).setVars(values);
-               new SolutionModifierHandler(q2).setVars(values);
-               new WhereHandler(q2).setVars(values);
-               new SelectHandler(q2).setVars(values);
+               HandlerBlock hb = new HandlerBlock(q2);
+               hb.setVars(values);
                return q2;
        }
 }

http://git-wip-us.apache.org/repos/asf/jena/blob/e8b771b7/jena-extras/jena-querybuilder/src/main/java/org/apache/jena/arq/querybuilder/AskBuilder.java
----------------------------------------------------------------------
diff --git 
a/jena-extras/jena-querybuilder/src/main/java/org/apache/jena/arq/querybuilder/AskBuilder.java
 
b/jena-extras/jena-querybuilder/src/main/java/org/apache/jena/arq/querybuilder/AskBuilder.java
index 1e2c437..064a995 100644
--- 
a/jena-extras/jena-querybuilder/src/main/java/org/apache/jena/arq/querybuilder/AskBuilder.java
+++ 
b/jena-extras/jena-querybuilder/src/main/java/org/apache/jena/arq/querybuilder/AskBuilder.java
@@ -23,6 +23,8 @@ import org.apache.jena.arq.querybuilder.clauses.DatasetClause;
 import org.apache.jena.arq.querybuilder.clauses.SolutionModifierClause;
 import org.apache.jena.arq.querybuilder.clauses.WhereClause;
 import org.apache.jena.arq.querybuilder.handlers.DatasetHandler;
+import org.apache.jena.arq.querybuilder.handlers.HandlerBlock;
+import org.apache.jena.arq.querybuilder.handlers.PrologHandler;
 import org.apache.jena.arq.querybuilder.handlers.SolutionModifierHandler;
 import org.apache.jena.arq.querybuilder.handlers.WhereHandler;
 import org.apache.jena.graph.FrontsTriple ;
@@ -38,12 +40,8 @@ import org.apache.jena.sparql.lang.sparql_11.ParseException ;
 public class AskBuilder extends AbstractQueryBuilder<AskBuilder> implements
                DatasetClause<AskBuilder>, WhereClause<AskBuilder>,
                SolutionModifierClause<AskBuilder> {
-       // the dataset handler
-       private final DatasetHandler datasetHandler;
-       // the where handler.
-       private final WhereHandler whereHandler;
-       // the solution modifier handler.
-       private final SolutionModifierHandler solutionModifier;
+       
+       private final HandlerBlock handlerBlock;
 
        /**
         * The constructor
@@ -51,63 +49,65 @@ public class AskBuilder extends 
AbstractQueryBuilder<AskBuilder> implements
        public AskBuilder() {
                super();
                query.setQueryAskType();
-               datasetHandler = new DatasetHandler(query);
-               whereHandler = new WhereHandler(query);
-               solutionModifier = new SolutionModifierHandler(query);
+               handlerBlock = new HandlerBlock( query );
        }
-
+       
+       @Override
+       public HandlerBlock getHandlerBlock()
+       {
+               return handlerBlock;
+       }
+       
        @Override
        public DatasetHandler getDatasetHandler() {
-               return datasetHandler;
+               return handlerBlock.getDatasetHandler();
        }
 
        @Override
        public WhereHandler getWhereHandler() {
-               return whereHandler;
+               return handlerBlock.getWhereHandler();
        }
 
        @Override
        public AskBuilder clone() {
                AskBuilder qb = new AskBuilder();
-               qb.prologHandler.addAll(prologHandler);
-               qb.datasetHandler.addAll(datasetHandler);
-               qb.solutionModifier.addAll(solutionModifier);
+               qb.handlerBlock.addAll( handlerBlock );
                return qb;
        }
 
        @Override
        public AskBuilder fromNamed(String graphName) {
-               datasetHandler.fromNamed(graphName);
+               getDatasetHandler().fromNamed(graphName);
                return this;
        }
 
        @Override
        public AskBuilder fromNamed(Collection<String> graphNames) {
-               datasetHandler.fromNamed(graphNames);
+               getDatasetHandler().fromNamed(graphNames);
                return this;
        }
 
        @Override
        public AskBuilder from(String graphName) {
-               datasetHandler.from(graphName);
+               getDatasetHandler().from(graphName);
                return this;
        }
 
        @Override
        public AskBuilder from(Collection<String> graphName) {
-               datasetHandler.from(graphName);
+               getDatasetHandler().from(graphName);
                return this;
        }
 
        @Override
        public AskBuilder addWhere(Triple t) {
-               whereHandler.addWhere(t);
+               getWhereHandler().addWhere(t);
                return this;
        }
 
        @Override
        public AskBuilder addWhere(FrontsTriple t) {
-               whereHandler.addWhere(t.asTriple());
+               getWhereHandler().addWhere(t.asTriple());
                return this;
        }
 
@@ -119,20 +119,20 @@ public class AskBuilder extends 
AbstractQueryBuilder<AskBuilder> implements
 
        @Override
        public AskBuilder addOptional(Triple t) {
-               whereHandler.addOptional(t);
+               getWhereHandler().addOptional(t);
                return this;
        }
        
        @Override
        public AskBuilder addOptional(SelectBuilder t)
        {
-               whereHandler.addOptional(t.getWhereHandler());
+               getWhereHandler().addOptional(t.getWhereHandler());
                return this;
        }
 
        @Override
        public AskBuilder addOptional(FrontsTriple t) {
-               whereHandler.addOptional(t.asTriple());
+               getWhereHandler().addOptional(t.asTriple());
                return this;
        }
 
@@ -144,78 +144,77 @@ public class AskBuilder extends 
AbstractQueryBuilder<AskBuilder> implements
 
        @Override
        public AskBuilder addFilter(String s) throws ParseException {
-               whereHandler.addFilter(s);
+               getWhereHandler().addFilter(s);
                return this;
        }
 
        @Override
        public AskBuilder addSubQuery(SelectBuilder subQuery) {
-               prologHandler.addAll(subQuery.getPrologHandler());
-               whereHandler.addSubQuery(subQuery);
+               getWhereHandler().addSubQuery(subQuery);
                return this;
        }
 
        @Override
        public AskBuilder addUnion(SelectBuilder subQuery) {
-               whereHandler.addUnion(subQuery);
+               getWhereHandler().addUnion(subQuery);
                return this;
        }
 
        @Override
        public AskBuilder addGraph(Object graph, SelectBuilder subQuery) {
-               prologHandler.addAll(subQuery.getPrologHandler());
-               whereHandler.addGraph(makeNode(graph), 
subQuery.getWhereHandler());
+               getPrologHandler().addAll(subQuery.getPrologHandler());
+               getWhereHandler().addGraph(makeNode(graph), 
subQuery.getWhereHandler());
                return this;
        }
        
        @Override
        public AskBuilder addBind(Expr expression, Object var) {
-               whereHandler.addBind( expression, makeVar(var) );
+               getWhereHandler().addBind( expression, makeVar(var) );
                return this;
        }
 
        @Override
        public AskBuilder addBind(String expression, Object var) throws 
ParseException {
-               whereHandler.addBind( expression, makeVar(var) );
+               getWhereHandler().addBind( expression, makeVar(var) );
                return this;
        }
        @Override
        public AskBuilder addOrderBy(String orderBy) {
-               solutionModifier.addOrderBy(orderBy);
+               getSolutionModifierHandler().addOrderBy(orderBy);
                return this;
        }
 
        @Override
        public AskBuilder addGroupBy(String groupBy) {
-               solutionModifier.addGroupBy(groupBy);
+               getSolutionModifierHandler().addGroupBy(groupBy);
                return this;
        }
 
        @Override
        public AskBuilder addHaving(String having) throws ParseException {
-               solutionModifier.addHaving(having);
+               getSolutionModifierHandler().addHaving(having);
                return this;
        }
 
        @Override
        public AskBuilder setLimit(int limit) {
-               solutionModifier.setLimit(limit);
+               getSolutionModifierHandler().setLimit(limit);
                return this;
        }
 
        @Override
        public AskBuilder setOffset(int offset) {
-               solutionModifier.setOffset(offset);
+               getSolutionModifierHandler().setOffset(offset);
                return this;
        }
 
        @Override
        public SolutionModifierHandler getSolutionModifierHandler() {
-               return solutionModifier;
+               return handlerBlock.getModifierHandler();
        }
 
        @Override
        public Node list(Object... objs) {
-               return whereHandler.list(objs);
+               return getWhereHandler().list(objs);
        }
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/jena/blob/e8b771b7/jena-extras/jena-querybuilder/src/main/java/org/apache/jena/arq/querybuilder/ConstructBuilder.java
----------------------------------------------------------------------
diff --git 
a/jena-extras/jena-querybuilder/src/main/java/org/apache/jena/arq/querybuilder/ConstructBuilder.java
 
b/jena-extras/jena-querybuilder/src/main/java/org/apache/jena/arq/querybuilder/ConstructBuilder.java
index 034fdef..51b861b 100644
--- 
a/jena-extras/jena-querybuilder/src/main/java/org/apache/jena/arq/querybuilder/ConstructBuilder.java
+++ 
b/jena-extras/jena-querybuilder/src/main/java/org/apache/jena/arq/querybuilder/ConstructBuilder.java
@@ -25,6 +25,8 @@ import 
org.apache.jena.arq.querybuilder.clauses.SolutionModifierClause;
 import org.apache.jena.arq.querybuilder.clauses.WhereClause;
 import org.apache.jena.arq.querybuilder.handlers.ConstructHandler;
 import org.apache.jena.arq.querybuilder.handlers.DatasetHandler;
+import org.apache.jena.arq.querybuilder.handlers.HandlerBlock;
+import org.apache.jena.arq.querybuilder.handlers.PrologHandler;
 import org.apache.jena.arq.querybuilder.handlers.SolutionModifierHandler;
 import org.apache.jena.arq.querybuilder.handlers.WhereHandler;
 import org.apache.jena.graph.FrontsTriple ;
@@ -43,118 +45,112 @@ public class ConstructBuilder extends 
AbstractQueryBuilder<ConstructBuilder>
                SolutionModifierClause<ConstructBuilder>,
                ConstructClause<ConstructBuilder> {
 
-       // the handlers used by this builder
-       private final DatasetHandler datasetHandler;
-       private final WhereHandler whereHandler;
-       private final SolutionModifierHandler solutionModifier;
-       private final ConstructHandler constructHandler;
-
+       private final HandlerBlock handlerBlock;
        /**
         * Constructor
         */
        public ConstructBuilder() {
                super();
                query.setQueryConstructType();
-               datasetHandler = new DatasetHandler(query);
-               whereHandler = new WhereHandler(query);
-               solutionModifier = new SolutionModifierHandler(query);
-               constructHandler = new ConstructHandler(query);
+               handlerBlock = new HandlerBlock(query);
        }
 
        @Override
        public DatasetHandler getDatasetHandler() {
-               return datasetHandler;
+               return handlerBlock.getDatasetHandler();
        }
 
        @Override
        public WhereHandler getWhereHandler() {
-               return whereHandler;
+               return handlerBlock.getWhereHandler();
        }
 
        @Override
        public ConstructHandler getConstructHandler() {
-               return constructHandler;
+               return handlerBlock.getConstructHandler();
        }
 
        @Override
        public SolutionModifierHandler getSolutionModifierHandler() {
-               return solutionModifier;
+               return handlerBlock.getModifierHandler();
        }
 
        @Override
+       public HandlerBlock getHandlerBlock()
+       {
+               return handlerBlock;
+       }
+       
+       @Override
        public ConstructBuilder clone() {
                ConstructBuilder qb = new ConstructBuilder();
-               qb.prologHandler.addAll(prologHandler);
-               qb.datasetHandler.addAll(datasetHandler);
-               qb.whereHandler.addAll(whereHandler);
-               qb.solutionModifier.addAll(solutionModifier);
-               qb.constructHandler.addAll(constructHandler);
+               qb.handlerBlock.addAll( handlerBlock );
                return qb;
        }
 
        @Override
        public ConstructBuilder fromNamed(String graphName) {
-               datasetHandler.fromNamed(graphName);
+               getDatasetHandler().fromNamed(graphName);
                return this;
        }
 
        @Override
        public ConstructBuilder fromNamed(Collection<String> graphNames) {
-               datasetHandler.fromNamed(graphNames);
+               getDatasetHandler().fromNamed(graphNames);
                return this;
        }
 
        @Override
        public ConstructBuilder from(String graphName) {
-               datasetHandler.from(graphName);
+               getDatasetHandler().from(graphName);
                return this;
        }
 
        @Override
        public ConstructBuilder from(Collection<String> graphName) {
-               datasetHandler.from(graphName);
+               getDatasetHandler().from(graphName);
                return this;
        }
 
        @Override
        public ConstructBuilder addOrderBy(String orderBy) {
-               solutionModifier.addOrderBy(orderBy);
+               getSolutionModifierHandler().addOrderBy(orderBy);
                return this;
        }
 
        @Override
        public ConstructBuilder addGroupBy(String groupBy) {
-               solutionModifier.addGroupBy(groupBy);
+               getSolutionModifierHandler().addGroupBy(groupBy);
                return this;
        }
 
        @Override
        public ConstructBuilder addHaving(String having) throws ParseException {
-               solutionModifier.addHaving(having);
+               getSolutionModifierHandler().addHaving(having);
                return this;
        }
 
        @Override
        public ConstructBuilder setLimit(int limit) {
-               solutionModifier.setLimit(limit);
+               getSolutionModifierHandler().setLimit(limit);
                return this;
        }
 
        @Override
        public ConstructBuilder setOffset(int offset) {
-               solutionModifier.setOffset(offset);
+               getSolutionModifierHandler().setOffset(offset);
                return this;
        }
 
        @Override
        public ConstructBuilder addWhere(Triple t) {
-               whereHandler.addWhere(t);
+               getWhereHandler().addWhere(t);
                return this;
        }
 
        @Override
        public ConstructBuilder addWhere(FrontsTriple t) {
-               whereHandler.addWhere(t.asTriple());
+               getWhereHandler().addWhere(t.asTriple());
                return this;
        }
 
@@ -166,20 +162,20 @@ public class ConstructBuilder extends 
AbstractQueryBuilder<ConstructBuilder>
 
        @Override
        public ConstructBuilder addOptional(Triple t) {
-               whereHandler.addOptional(t);
+               getWhereHandler().addOptional(t);
                return this;
        }
        
        @Override
        public ConstructBuilder addOptional(SelectBuilder t)
        {
-               whereHandler.addOptional(t.getWhereHandler());
+               getWhereHandler().addOptional(t.getWhereHandler());
                return this;
        }
 
        @Override
        public ConstructBuilder addOptional(FrontsTriple t) {
-               whereHandler.addOptional(t.asTriple());
+               getWhereHandler().addOptional(t.asTriple());
                return this;
        }
 
@@ -191,45 +187,44 @@ public class ConstructBuilder extends 
AbstractQueryBuilder<ConstructBuilder>
 
        @Override
        public ConstructBuilder addFilter(String s) throws ParseException {
-               whereHandler.addFilter(s);
+               getWhereHandler().addFilter(s);
                return this;
        }
 
        @Override
        public ConstructBuilder addSubQuery(SelectBuilder subQuery) {
-               prologHandler.addAll(subQuery.prologHandler);
-               whereHandler.addSubQuery(subQuery);
+               getWhereHandler().addSubQuery(subQuery);
                return this;
        }
 
        @Override
        public ConstructBuilder addUnion(SelectBuilder subQuery) {
-               whereHandler.addUnion(subQuery);
+               getWhereHandler().addUnion(subQuery);
                return this;
        }
 
        @Override
        public ConstructBuilder addGraph(Object graph, SelectBuilder subQuery) {
-               prologHandler.addAll(subQuery.prologHandler);
-               whereHandler.addGraph(makeNode(graph), 
subQuery.getWhereHandler());
+               getPrologHandler().addAll(subQuery.getPrologHandler());
+               getWhereHandler().addGraph(makeNode(graph), 
subQuery.getWhereHandler());
                return this;
        }
 
        @Override
        public ConstructBuilder addBind(Expr expression, Object var) {
-               whereHandler.addBind( expression, makeVar(var) );
+               getWhereHandler().addBind( expression, makeVar(var) );
                return this;
        }
 
        @Override
        public ConstructBuilder addBind(String expression, Object var) throws 
ParseException {
-               whereHandler.addBind( expression, makeVar(var) );
+               getWhereHandler().addBind( expression, makeVar(var) );
                return this;
        }
        
        @Override
        public ConstructBuilder addConstruct(Triple t) {
-               constructHandler.addConstruct(t);
+               getConstructHandler().addConstruct(t);
                return this;
        }
 
@@ -245,6 +240,6 @@ public class ConstructBuilder extends 
AbstractQueryBuilder<ConstructBuilder>
        
        @Override
        public Node list(Object... objs) {
-               return whereHandler.list(objs);
+               return getWhereHandler().list(objs);
        }
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/jena/blob/e8b771b7/jena-extras/jena-querybuilder/src/main/java/org/apache/jena/arq/querybuilder/SelectBuilder.java
----------------------------------------------------------------------
diff --git 
a/jena-extras/jena-querybuilder/src/main/java/org/apache/jena/arq/querybuilder/SelectBuilder.java
 
b/jena-extras/jena-querybuilder/src/main/java/org/apache/jena/arq/querybuilder/SelectBuilder.java
index 12a909e..1c5d3ee 100644
--- 
a/jena-extras/jena-querybuilder/src/main/java/org/apache/jena/arq/querybuilder/SelectBuilder.java
+++ 
b/jena-extras/jena-querybuilder/src/main/java/org/apache/jena/arq/querybuilder/SelectBuilder.java
@@ -25,6 +25,8 @@ import org.apache.jena.arq.querybuilder.clauses.SelectClause;
 import org.apache.jena.arq.querybuilder.clauses.SolutionModifierClause;
 import org.apache.jena.arq.querybuilder.clauses.WhereClause;
 import org.apache.jena.arq.querybuilder.handlers.DatasetHandler;
+import org.apache.jena.arq.querybuilder.handlers.HandlerBlock;
+import org.apache.jena.arq.querybuilder.handlers.PrologHandler;
 import org.apache.jena.arq.querybuilder.handlers.SelectHandler;
 import org.apache.jena.arq.querybuilder.handlers.SolutionModifierHandler;
 import org.apache.jena.arq.querybuilder.handlers.WhereHandler;
@@ -45,60 +47,54 @@ public class SelectBuilder extends 
AbstractQueryBuilder<SelectBuilder>
                SolutionModifierClause<SelectBuilder>, 
SelectClause<SelectBuilder> {
 
        // the handlers.
-       private DatasetHandler datasetHandler;
-       private WhereHandler whereHandler;
-       private SolutionModifierHandler solutionModifier;
-       private SelectHandler selectHandler;
-
+       private final HandlerBlock handlerBlock;
        /**
         * Constructor.
         */
        public SelectBuilder() {
                super();
                query.setQuerySelectType();
-               datasetHandler = new DatasetHandler(query);
-               whereHandler = new WhereHandler(query);
-               solutionModifier = new SolutionModifierHandler(query);
-               selectHandler = new SelectHandler(query);
+               handlerBlock = new HandlerBlock( query );
        }
 
        @Override
        public DatasetHandler getDatasetHandler() {
-               return datasetHandler;
+               return handlerBlock.getDatasetHandler();
        }
 
        @Override
+       public HandlerBlock getHandlerBlock()
+       {
+               return handlerBlock;
+       }
+       
+       @Override
        public WhereHandler getWhereHandler() {
-               return whereHandler;
+               return handlerBlock.getWhereHandler();
        }
 
        @Override
        public SelectBuilder clone() {
                SelectBuilder qb = new SelectBuilder();
-               qb.prologHandler.addAll(prologHandler);
-               qb.datasetHandler.addAll(datasetHandler);
-               qb.whereHandler.addAll(whereHandler);
-               qb.solutionModifier.addAll(solutionModifier);
-               qb.selectHandler.addAll(selectHandler);
-
+               qb.handlerBlock.addAll(handlerBlock);
                return qb;
        }
 
        @Override
        public SelectBuilder setDistinct(boolean state) {
-               selectHandler.setDistinct(state);
+               getSelectHandler().setDistinct(state);
                return this;
        }
 
        @Override
        public SelectBuilder setReduced(boolean state) {
-               selectHandler.setReduced(state);
+               getSelectHandler().setReduced(state);
                return this;
        }
 
        @Override
        public SelectBuilder addVar(Object var) {
-               selectHandler.addVar(makeVar(var));
+               getSelectHandler().addVar(makeVar(var));
                return this;
        }
 
@@ -109,77 +105,77 @@ public class SelectBuilder extends 
AbstractQueryBuilder<SelectBuilder>
         */
        @Override
        public SelectBuilder addVar(String expression, Object var) throws 
ParseException {
-               selectHandler.addVar( expression, makeVar(var) );
+               getSelectHandler().addVar( expression, makeVar(var) );
                return this;
        }
 
        @Override
        public SelectBuilder addVar(Expr expr, Object var) {
-               selectHandler.addVar(expr, makeVar(var));
+               getSelectHandler().addVar(expr, makeVar(var));
                return this;
        }
        
        @Override
        public List<Var> getVars() {
-               return selectHandler.getVars();
+               return getSelectHandler().getVars();
        }
 
        @Override
        public SelectBuilder fromNamed(String graphName) {
-               datasetHandler.fromNamed(graphName);
+               getDatasetHandler().fromNamed(graphName);
                return this;
        }
 
        @Override
        public SelectBuilder fromNamed(Collection<String> graphNames) {
-               datasetHandler.fromNamed(graphNames);
+               getDatasetHandler().fromNamed(graphNames);
                return this;
        }
 
        @Override
        public SelectBuilder from(String graphName) {
-               datasetHandler.from(graphName);
+               getDatasetHandler().from(graphName);
                return this;
        }
 
        @Override
        public SelectBuilder from(Collection<String> graphName) {
-               datasetHandler.from(graphName);
+               getDatasetHandler().from(graphName);
                return this;
        }
 
        @Override
        public SelectBuilder addOrderBy(String orderBy) {
-               solutionModifier.addOrderBy(orderBy);
+               getSolutionModifierHandler().addOrderBy(orderBy);
                return this;
        }
 
        @Override
        public SelectBuilder addGroupBy(String groupBy) {
-               solutionModifier.addGroupBy(groupBy);
+               getSolutionModifierHandler().addGroupBy(groupBy);
                return this;
        }
 
        @Override
        public SolutionModifierHandler getSolutionModifierHandler() {
-               return solutionModifier;
+               return handlerBlock.getModifierHandler();
        }
 
        @Override
        public SelectBuilder addHaving(String having) throws ParseException {
-               solutionModifier.addHaving(having);
+               getSolutionModifierHandler().addHaving(having);
                return this;
        }
 
        @Override
        public SelectBuilder setLimit(int limit) {
-               solutionModifier.setLimit(limit);
+               getSolutionModifierHandler().setLimit(limit);
                return this;
        }
 
        @Override
        public SelectBuilder setOffset(int offset) {
-               solutionModifier.setOffset(offset);
+               getSolutionModifierHandler().setOffset(offset);
                return this;
        }
 
@@ -231,13 +227,13 @@ public class SelectBuilder extends 
AbstractQueryBuilder<SelectBuilder>
 
        @Override
        public SelectBuilder addWhere(Triple t) {
-               whereHandler.addWhere(t);
+               getWhereHandler().addWhere(t);
                return this;
        }
 
        @Override
        public SelectBuilder addWhere(FrontsTriple t) {
-               whereHandler.addWhere(t.asTriple());
+               getWhereHandler().addWhere(t.asTriple());
                return this;
        }
 
@@ -249,13 +245,13 @@ public class SelectBuilder extends 
AbstractQueryBuilder<SelectBuilder>
 
        @Override
        public SelectBuilder addOptional(Triple t) {
-               whereHandler.addOptional(t);
+               getWhereHandler().addOptional(t);
                return this;
        }
 
        @Override
        public SelectBuilder addOptional(FrontsTriple t) {
-               whereHandler.addOptional(t.asTriple());
+               getWhereHandler().addOptional(t.asTriple());
                return this;
        }
 
@@ -268,55 +264,54 @@ public class SelectBuilder extends 
AbstractQueryBuilder<SelectBuilder>
        @Override
        public SelectBuilder addOptional(SelectBuilder t)
        {
-               whereHandler.addOptional(t.getWhereHandler());
+               getWhereHandler().addOptional(t.getWhereHandler());
                return this;
        }
        
        @Override
        public SelectBuilder addFilter(String s) throws ParseException {
-               whereHandler.addFilter(s);
+               getWhereHandler().addFilter(s);
                return this;
        }
 
        @Override
        public SelectBuilder addSubQuery(SelectBuilder subQuery) {
-               prologHandler.addAll(subQuery.prologHandler);
-               whereHandler.addSubQuery(subQuery);
+               getWhereHandler().addSubQuery(subQuery);
                return this;
        }
 
        @Override
        public SelectBuilder addUnion(SelectBuilder subQuery) {
-               whereHandler.addUnion(subQuery);
+               getWhereHandler().addUnion(subQuery);
                return this;
        }
 
        @Override
        public SelectBuilder addGraph(Object graph, SelectBuilder subQuery) {
-               prologHandler.addAll(subQuery.prologHandler);
-               whereHandler.addGraph(makeNode(graph), subQuery.whereHandler);
+               getPrologHandler().addAll(subQuery.getPrologHandler());
+               getWhereHandler().addGraph(makeNode(graph), 
subQuery.getWhereHandler());
                return this;
        }
 
        @Override
        public SelectBuilder addBind(Expr expression, Object var) {
-               whereHandler.addBind( expression, makeVar(var) );
+               getWhereHandler().addBind( expression, makeVar(var) );
                return this;
        }
 
        @Override
        public SelectBuilder addBind(String expression, Object var) throws 
ParseException {
-               whereHandler.addBind( expression, makeVar(var) );
+               getWhereHandler().addBind( expression, makeVar(var) );
                return this;
        }
 
        @Override
        public SelectHandler getSelectHandler() {
-               return selectHandler;
+               return handlerBlock.getSelectHandler();
        }
 
        @Override
        public Node list(Object... objs) {
-               return whereHandler.list(objs);
+               return getWhereHandler().list(objs);
        }
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/jena/blob/e8b771b7/jena-extras/jena-querybuilder/src/main/java/org/apache/jena/arq/querybuilder/handlers/AggregationHandler.java
----------------------------------------------------------------------
diff --git 
a/jena-extras/jena-querybuilder/src/main/java/org/apache/jena/arq/querybuilder/handlers/AggregationHandler.java
 
b/jena-extras/jena-querybuilder/src/main/java/org/apache/jena/arq/querybuilder/handlers/AggregationHandler.java
new file mode 100644
index 0000000..682dca7
--- /dev/null
+++ 
b/jena-extras/jena-querybuilder/src/main/java/org/apache/jena/arq/querybuilder/handlers/AggregationHandler.java
@@ -0,0 +1,78 @@
+package org.apache.jena.arq.querybuilder.handlers;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.apache.jena.graph.Node;
+import org.apache.jena.query.Query;
+import org.apache.jena.sparql.core.Var;
+import org.apache.jena.sparql.core.VarExprList;
+import org.apache.jena.sparql.expr.Expr;
+import org.apache.jena.sparql.expr.ExprAggregator;
+import org.apache.jena.sparql.expr.aggregate.Aggregator;
+
+public class AggregationHandler implements Handler {
+       private final Query query;
+       private final Map<Var,ExprAggregator> aggMap;
+
+       public AggregationHandler( Query query )
+       {
+               this.query = query;
+               aggMap = new HashMap<Var,ExprAggregator>();
+       }
+       
+       public AggregationHandler addAll(AggregationHandler handler)
+       {
+               for (ExprAggregator agg : handler.query.getAggregators())
+               {
+                       query.allocAggregate(agg.getAggregator());
+               }
+               for (Map.Entry<Var, ExprAggregator> entry : 
handler.aggMap.entrySet())
+               {
+                       aggMap.put( entry.getKey(), entry.getValue());
+               }
+               return this;
+       }
+               
+       public Query getQuery()
+       {
+               return query;
+       }
+       
+       public Map<Var, ExprAggregator> getVarMap() {
+               Map<Var,ExprAggregator> retval = new 
HashMap<Var,ExprAggregator>();
+               for (ExprAggregator agg : query.getAggregators())
+               {
+                       retval.put( agg.getVar(), agg);
+               }
+               return retval;
+       }
+       
+       @Override
+       public void setVars(Map<Var, Node> values) {
+               // nothing to do
+
+       }
+
+       @Override
+       public void build() {
+               for (Map.Entry<Var,Expr> entry : 
query.getProject().getExprs().entrySet())
+               {
+                       if (aggMap.containsKey(entry.getKey()))
+                       {
+                               entry.setValue( aggMap.get(entry.getKey()));
+                       }
+               }
+       }
+       
+       public void add(Expr expr, Var var) {
+               if (expr instanceof ExprAggregator)
+               {
+                       ExprAggregator eAgg = (ExprAggregator)expr;
+                       Expr expr2 = query.allocAggregate( eAgg.getAggregator() 
);      
+                       aggMap.put(var, (ExprAggregator)expr2);
+               }
+       }
+
+}

http://git-wip-us.apache.org/repos/asf/jena/blob/e8b771b7/jena-extras/jena-querybuilder/src/main/java/org/apache/jena/arq/querybuilder/handlers/HandlerBlock.java
----------------------------------------------------------------------
diff --git 
a/jena-extras/jena-querybuilder/src/main/java/org/apache/jena/arq/querybuilder/handlers/HandlerBlock.java
 
b/jena-extras/jena-querybuilder/src/main/java/org/apache/jena/arq/querybuilder/handlers/HandlerBlock.java
new file mode 100644
index 0000000..21443e5
--- /dev/null
+++ 
b/jena-extras/jena-querybuilder/src/main/java/org/apache/jena/arq/querybuilder/handlers/HandlerBlock.java
@@ -0,0 +1,158 @@
+package org.apache.jena.arq.querybuilder.handlers;
+
+import java.util.Map;
+import java.util.Stack;
+
+import org.apache.jena.arq.querybuilder.AbstractQueryBuilder;
+import org.apache.jena.arq.querybuilder.clauses.ConstructClause;
+import org.apache.jena.arq.querybuilder.clauses.DatasetClause;
+import org.apache.jena.arq.querybuilder.clauses.SelectClause;
+import org.apache.jena.arq.querybuilder.clauses.SolutionModifierClause;
+import org.apache.jena.arq.querybuilder.clauses.WhereClause;
+import org.apache.jena.graph.Node;
+import org.apache.jena.query.Query;
+import org.apache.jena.sparql.core.Var;
+
+public class HandlerBlock {
+       private final AggregationHandler aggHandler;
+       private final ConstructHandler constructHandler;
+       private final DatasetHandler datasetHandler;
+       private final PrologHandler prologHandler;
+       private final SelectHandler selectHandler;
+       private final SolutionModifierHandler modifierHandler;
+       private final WhereHandler whereHandler;
+
+       public HandlerBlock(Query query) {
+               prologHandler = new PrologHandler(query);
+               aggHandler = new AggregationHandler(query);
+               whereHandler = new WhereHandler(query);
+               datasetHandler = new DatasetHandler(query);
+               modifierHandler = new SolutionModifierHandler(query);
+               SelectHandler sTemp = null;
+               ConstructHandler cTemp = null;
+               if (query.isSelectType()) {
+                       sTemp = new SelectHandler(aggHandler);
+
+               } else if (query.isAskType()) {
+                       // nochange
+               } else if (query.isDescribeType()) {
+                       // no change
+               } else if (query.isConstructType()) {
+                       cTemp = new ConstructHandler(query);
+               }
+               selectHandler = sTemp;
+               constructHandler = cTemp;
+       }
+
+       public AggregationHandler getAggregationHandler() {
+               return aggHandler;
+       }
+
+       public ConstructHandler getConstructHandler() {
+               return constructHandler;
+       }
+
+       public DatasetHandler getDatasetHandler() {
+               return datasetHandler;
+       }
+
+       public PrologHandler getPrologHandler() {
+               return prologHandler;
+       }
+
+       public SelectHandler getSelectHandler() {
+               return selectHandler;
+       }
+
+       public SolutionModifierHandler getModifierHandler() {
+               return modifierHandler;
+       }
+
+       public WhereHandler getWhereHandler() {
+               return whereHandler;
+       }
+
+       public void addAll(PrologHandler handler) {
+               prologHandler.addAll(handler);
+       }
+
+       public void addAll(AggregationHandler handler) {
+               aggHandler.addAll(handler);
+       }
+
+       public void addAll(ConstructHandler handler) {
+               if (constructHandler != null) {
+                       constructHandler.addAll(handler);
+               }
+       }
+
+       public void addAll(DatasetHandler handler) {
+               datasetHandler.addAll(handler);
+       }
+
+       public void addAll(SolutionModifierHandler handler) {
+               modifierHandler.addAll(handler);
+       }
+
+       public void addAll(SelectHandler handler) {
+               if (selectHandler != null) {
+                       selectHandler.addAll(handler);
+               }
+       }
+
+       public void addAll(WhereHandler handler) {
+               whereHandler.addAll(handler);
+       }
+       
+       public void addAll(HandlerBlock handler)
+       {
+               addAll(handler.aggHandler);
+               if (handler.constructHandler != null)
+               {
+                       addAll(handler.constructHandler);
+               }
+               if (handler.selectHandler != null)
+               {
+                       addAll(handler.selectHandler);
+               }
+               addAll( handler.datasetHandler);
+               addAll( handler.modifierHandler);
+               addAll( handler.prologHandler);
+               addAll( handler.whereHandler);
+       }
+
+       public void setVars(Map<Var, Node> values) {
+               aggHandler.setVars(values);
+
+               if (constructHandler != null) {
+                       constructHandler.setVars(values);
+               }
+
+               datasetHandler.setVars(values);
+
+               prologHandler.setVars(values);
+
+               if (selectHandler != null) {
+                       selectHandler.setVars(values);
+               }
+
+               modifierHandler.setVars(values);
+               whereHandler.setVars(values);
+
+       }
+       
+       public void build() {
+               prologHandler.build();
+               
+               if (selectHandler != null) {
+                       selectHandler.build();
+               }
+               if (constructHandler != null) {
+                       constructHandler.build();
+               }
+               datasetHandler.build();
+               modifierHandler.build();
+               whereHandler.build();
+               aggHandler.build();
+       }
+}

http://git-wip-us.apache.org/repos/asf/jena/blob/e8b771b7/jena-extras/jena-querybuilder/src/main/java/org/apache/jena/arq/querybuilder/handlers/PrologHandler.java
----------------------------------------------------------------------
diff --git 
a/jena-extras/jena-querybuilder/src/main/java/org/apache/jena/arq/querybuilder/handlers/PrologHandler.java
 
b/jena-extras/jena-querybuilder/src/main/java/org/apache/jena/arq/querybuilder/handlers/PrologHandler.java
index 37629d7..0a5b1b9 100644
--- 
a/jena-extras/jena-querybuilder/src/main/java/org/apache/jena/arq/querybuilder/handlers/PrologHandler.java
+++ 
b/jena-extras/jena-querybuilder/src/main/java/org/apache/jena/arq/querybuilder/handlers/PrologHandler.java
@@ -24,6 +24,7 @@ import org.apache.jena.graph.Node ;
 import org.apache.jena.query.Query ;
 import org.apache.jena.riot.system.IRIResolver;
 import org.apache.jena.shared.PrefixMapping ;
+import org.apache.jena.shared.impl.PrefixMappingImpl;
 import org.apache.jena.sparql.core.Var ;
 
 /**
@@ -82,6 +83,13 @@ public class PrologHandler implements Handler {
        public void addPrefix(String pfx, String uri) {
                query.setPrefix(canonicalPfx(pfx), uri);
        }
+       
+       /**
+        * Clear the prefix mapping.
+        */
+       public void clearPrefixes() {
+               query.setPrefixMapping( new PrefixMappingImpl() );
+       }
 
        /**
         * Add the map of prefixes to the query prefixes.
@@ -92,6 +100,10 @@ public class PrologHandler implements Handler {
                        addPrefix(e.getKey(), e.getValue());
                }
        }
+       
+       public PrefixMapping getPrefixes() {
+               return query.getPrefixMapping();
+       }
 
        /**
         * Add prefixes from a prefix mapping.

http://git-wip-us.apache.org/repos/asf/jena/blob/e8b771b7/jena-extras/jena-querybuilder/src/main/java/org/apache/jena/arq/querybuilder/handlers/SelectHandler.java
----------------------------------------------------------------------
diff --git 
a/jena-extras/jena-querybuilder/src/main/java/org/apache/jena/arq/querybuilder/handlers/SelectHandler.java
 
b/jena-extras/jena-querybuilder/src/main/java/org/apache/jena/arq/querybuilder/handlers/SelectHandler.java
index a2982e6..f9f653f 100644
--- 
a/jena-extras/jena-querybuilder/src/main/java/org/apache/jena/arq/querybuilder/handlers/SelectHandler.java
+++ 
b/jena-extras/jena-querybuilder/src/main/java/org/apache/jena/arq/querybuilder/handlers/SelectHandler.java
@@ -41,8 +41,7 @@ public class SelectHandler implements Handler {
 
        // the query to handle
        private final Query query;
-
-       private final Map<Var, ExprAggregator> aggregators = new HashMap<Var, 
ExprAggregator>();
+       private final AggregationHandler aggHandler;
 
        /**
         * Constructor.
@@ -50,8 +49,9 @@ public class SelectHandler implements Handler {
         * @param query
         *            The query to manage.
         */
-       public SelectHandler(Query query) {
-               this.query = query;
+       public SelectHandler(AggregationHandler aggHandler) {
+               this.query = aggHandler.getQuery();
+               this.aggHandler = aggHandler;
                setDistinct(query.isDistinct());
                setReduced(query.isReduced());
        }
@@ -162,9 +162,7 @@ public class SelectHandler implements Handler {
                }
                query.setQueryResultStar(false);
                query.addResultVar(var, expr);
-               if (expr instanceof ExprAggregator) {
-                       aggregators.put(var, (ExprAggregator) expr);
-               }
+               aggHandler.add( expr, var );
        }
 
        /**
@@ -204,9 +202,7 @@ public class SelectHandler implements Handler {
                                qProjectVars.add(var, 
shProjectVars.getExpr(var));
                        }
                }
-               for (Var v : selectHandler.aggregators.keySet()) {
-                       aggregators.put(v, selectHandler.aggregators.get(v));
-               }
+               aggHandler.addAll( selectHandler.aggHandler );
        }
 
        @Override
@@ -219,14 +215,13 @@ public class SelectHandler implements Handler {
                if (query.getProject().getVars().isEmpty()) {
                        query.setQueryResultStar(true);
                }
-
+               
                VarExprList vel = query.getProject();
                Map<Var, Expr> exprMap = vel.getExprs();
 
-               for (Map.Entry<Var, ExprAggregator> entry : 
aggregators.entrySet()) {
-                       Expr expr = 
query.allocAggregate(entry.getValue().getAggregator());
+               for (Map.Entry<Var, ExprAggregator> entry : 
aggHandler.getVarMap().entrySet()) {
                        if (exprMap.containsKey(entry.getKey())) {
-                               exprMap.put(entry.getKey(), expr);
+                               exprMap.put(entry.getKey(), entry.getValue());
                        }
                }
                // handle the SELECT * case

http://git-wip-us.apache.org/repos/asf/jena/blob/e8b771b7/jena-extras/jena-querybuilder/src/main/java/org/apache/jena/arq/querybuilder/handlers/WhereHandler.java
----------------------------------------------------------------------
diff --git 
a/jena-extras/jena-querybuilder/src/main/java/org/apache/jena/arq/querybuilder/handlers/WhereHandler.java
 
b/jena-extras/jena-querybuilder/src/main/java/org/apache/jena/arq/querybuilder/handlers/WhereHandler.java
index 0a4d4c9..011a8a3 100644
--- 
a/jena-extras/jena-querybuilder/src/main/java/org/apache/jena/arq/querybuilder/handlers/WhereHandler.java
+++ 
b/jena-extras/jena-querybuilder/src/main/java/org/apache/jena/arq/querybuilder/handlers/WhereHandler.java
@@ -20,15 +20,22 @@ package org.apache.jena.arq.querybuilder.handlers;
 import java.util.Collections;
 import java.util.List;
 import java.util.Map;
+import java.util.Stack;
 
 import org.apache.jena.arq.querybuilder.AbstractQueryBuilder;
 import org.apache.jena.arq.querybuilder.SelectBuilder;
 import org.apache.jena.arq.querybuilder.clauses.ConstructClause;
+import org.apache.jena.arq.querybuilder.clauses.DatasetClause;
+import org.apache.jena.arq.querybuilder.clauses.SelectClause;
+import org.apache.jena.arq.querybuilder.clauses.SolutionModifierClause;
+import org.apache.jena.arq.querybuilder.clauses.WhereClause;
 import org.apache.jena.arq.querybuilder.rewriters.ElementRewriter;
 import org.apache.jena.graph.Node;
 import org.apache.jena.graph.NodeFactory;
 import org.apache.jena.graph.Triple;
 import org.apache.jena.query.Query;
+import org.apache.jena.shared.PrefixMapping;
+import org.apache.jena.shared.impl.PrefixMappingImpl;
 import org.apache.jena.sparql.core.Var;
 import org.apache.jena.sparql.core.VarExprList;
 import org.apache.jena.sparql.expr.Expr;
@@ -263,28 +270,29 @@ public class WhereHandler implements Handler {
         *            The sub query to convert
         * @return THe converted element.
         */
-       private ElementSubQuery makeSubQuery(SelectBuilder subQuery) {
+       private ElementSubQuery makeSubQuery(AbstractQueryBuilder<?> subQuery) {
                Query q = new Query();
-               PrologHandler ph = new PrologHandler(query);
-               ph.addAll(subQuery.getPrologHandler());
-
-               VarExprList vars = subQuery.getSelectHandler().getProject();
-               for (Var v : vars.getVars()) {
-                       q.addResultVar(v, vars.getExpr(v));
-                       q.setQuerySelectType();
+               SelectHandler sh = 
subQuery.getHandlerBlock().getSelectHandler();
+               if (sh != null)
+               {
+                       if (! sh.getProject().isEmpty()) {
+                               q.setQuerySelectType();
+                       }
                }
-
-               if (subQuery instanceof ConstructClause) {
-                       ConstructHandler ch = new ConstructHandler(q);
-                       ch.addAll(((ConstructClause<?>) 
subQuery).getConstructHandler());
-
+               PrologHandler ph = new PrologHandler(query);
+               ph.addPrefixes( subQuery.getPrologHandler().getPrefixes() );
+               HandlerBlock handlerBlock = new HandlerBlock(q);
+               handlerBlock.addAll( subQuery.getHandlerBlock() );
+               // remove the prefix mappings from the sub query.
+               handlerBlock.getPrologHandler().clearPrefixes();
+
+               
+               //  make sure we have a query pattern before we start building.
+               if (q.getQueryPattern() == null)
+               {
+                       q.setQueryPattern( new ElementGroup() );
                }
-               DatasetHandler dh = new DatasetHandler(q);
-               dh.addAll(subQuery.getDatasetHandler());
-               SolutionModifierHandler smh = new SolutionModifierHandler(q);
-               smh.addAll(subQuery.getSolutionModifierHandler());
-               WhereHandler wh = new WhereHandler(q);
-               wh.addAll(subQuery.getWhereHandler());
+               handlerBlock.build();
                return new ElementSubQuery(q);
        }
 
@@ -320,7 +328,7 @@ public class WhereHandler implements Handler {
                        union.addElement(makeSubQuery(subQuery));
                } else {
                        PrologHandler ph = new PrologHandler(query);
-                       ph.addAll(subQuery.getPrologHandler());
+                       
ph.addPrefixes(subQuery.getPrologHandler().getPrefixes());
                        
union.addElement(subQuery.getWhereHandler().getClause());
                }
 

http://git-wip-us.apache.org/repos/asf/jena/blob/e8b771b7/jena-extras/jena-querybuilder/src/main/java/org/apache/jena/arq/querybuilder/rewriters/ElementRewriter.java
----------------------------------------------------------------------
diff --git 
a/jena-extras/jena-querybuilder/src/main/java/org/apache/jena/arq/querybuilder/rewriters/ElementRewriter.java
 
b/jena-extras/jena-querybuilder/src/main/java/org/apache/jena/arq/querybuilder/rewriters/ElementRewriter.java
index 91acce2..4a9a56a 100644
--- 
a/jena-extras/jena-querybuilder/src/main/java/org/apache/jena/arq/querybuilder/rewriters/ElementRewriter.java
+++ 
b/jena-extras/jena-querybuilder/src/main/java/org/apache/jena/arq/querybuilder/rewriters/ElementRewriter.java
@@ -23,6 +23,7 @@ import java.util.Map;
 import org.apache.jena.arq.querybuilder.AbstractQueryBuilder;
 import org.apache.jena.graph.Node ;
 import org.apache.jena.graph.Triple ;
+import org.apache.jena.query.Query;
 import org.apache.jena.sparql.core.TriplePath ;
 import org.apache.jena.sparql.core.Var ;
 import org.apache.jena.sparql.engine.binding.Binding ;
@@ -190,8 +191,9 @@ public class ElementRewriter extends 
AbstractRewriter<Element> implements
 
        @Override
        public void visit(ElementSubQuery el) {
+               Query q = AbstractQueryBuilder.clone(el.getQuery());
                push(new ElementSubQuery(AbstractQueryBuilder.rewrite(
-                               AbstractQueryBuilder.clone(el.getQuery()), 
values)));
+                               q, values)));
        }
 
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/jena/blob/e8b771b7/jena-extras/jena-querybuilder/src/test/java/org/apache/jena/arq/querybuilder/AbstractQueryBuilderTest.java
----------------------------------------------------------------------
diff --git 
a/jena-extras/jena-querybuilder/src/test/java/org/apache/jena/arq/querybuilder/AbstractQueryBuilderTest.java
 
b/jena-extras/jena-querybuilder/src/test/java/org/apache/jena/arq/querybuilder/AbstractQueryBuilderTest.java
index 4293a6f..89108a9 100644
--- 
a/jena-extras/jena-querybuilder/src/test/java/org/apache/jena/arq/querybuilder/AbstractQueryBuilderTest.java
+++ 
b/jena-extras/jena-querybuilder/src/test/java/org/apache/jena/arq/querybuilder/AbstractQueryBuilderTest.java
@@ -19,11 +19,15 @@
 package org.apache.jena.arq.querybuilder;
 
 import static org.junit.Assert.*;
+
+import org.apache.jena.arq.querybuilder.handlers.HandlerBlock;
+import org.apache.jena.arq.querybuilder.handlers.PrologHandler;
 import org.apache.jena.graph.FrontsNode ;
 import org.apache.jena.graph.Node ;
 import org.apache.jena.graph.NodeFactory ;
 import org.apache.jena.graph.impl.LiteralLabel ;
 import org.apache.jena.graph.impl.LiteralLabelFactory ;
+import org.apache.jena.query.Query;
 import org.apache.jena.reasoner.rulesys.Node_RuleVariable ;
 import org.apache.jena.sparql.core.Var ;
 import org.apache.jena.sparql.expr.ExprVar ;
@@ -41,10 +45,23 @@ public class AbstractQueryBuilderTest {
        }
 
        private class TestBuilder extends AbstractQueryBuilder<TestBuilder> {
+               private HandlerBlock handlerBlock;
+               
+               public TestBuilder()
+               {
+                       super();
+                       handlerBlock = new HandlerBlock( query );
+                       
+               }
                @Override
                public String toString() {
                        return "TestBuilder";
                }
+
+               @Override
+               public HandlerBlock getHandlerBlock() {
+                       return handlerBlock;
+               }
        }
 
        private class NodeFront implements FrontsNode {

http://git-wip-us.apache.org/repos/asf/jena/blob/e8b771b7/jena-extras/jena-querybuilder/src/test/java/org/apache/jena/arq/querybuilder/SelectBuilderTest.java
----------------------------------------------------------------------
diff --git 
a/jena-extras/jena-querybuilder/src/test/java/org/apache/jena/arq/querybuilder/SelectBuilderTest.java
 
b/jena-extras/jena-querybuilder/src/test/java/org/apache/jena/arq/querybuilder/SelectBuilderTest.java
index 54c76cf..3eb209f 100644
--- 
a/jena-extras/jena-querybuilder/src/test/java/org/apache/jena/arq/querybuilder/SelectBuilderTest.java
+++ 
b/jena-extras/jena-querybuilder/src/test/java/org/apache/jena/arq/querybuilder/SelectBuilderTest.java
@@ -23,8 +23,10 @@ import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertTrue;
 
 import org.apache.jena.arq.AbstractRegexpBasedTest;
+import org.apache.jena.query.Query;
 import org.apache.jena.query.QueryExecution;
 import org.apache.jena.query.QueryExecutionFactory;
+import org.apache.jena.query.QueryFactory;
 import org.apache.jena.query.QuerySolution;
 import org.apache.jena.query.ResultSet;
 import org.apache.jena.rdf.model.Model;
@@ -33,6 +35,7 @@ import org.apache.jena.rdf.model.Resource;
 import org.apache.jena.sparql.core.Var;
 import org.apache.jena.sparql.lang.sparql_11.ParseException;
 import org.apache.jena.vocabulary.RDF;
+import org.apache.jena.vocabulary.XSD;
 import org.junit.Before;
 import org.junit.Test;
 
@@ -170,6 +173,7 @@ public class SelectBuilderTest extends 
AbstractRegexpBasedTest {
                QueryExecution qexec = 
QueryExecutionFactory.create(builder.build(), m);
 
                ResultSet results = qexec.execSelect();
+               assertTrue(results.hasNext());
                for (; results.hasNext();) {
                        QuerySolution soln = results.nextSolution();
                        assertTrue(soln.contains("c"));
@@ -182,6 +186,7 @@ public class SelectBuilderTest extends 
AbstractRegexpBasedTest {
                qexec = QueryExecutionFactory.create(builder.build(), m);
 
                results = qexec.execSelect();
+               assertTrue(results.hasNext());
                for (; results.hasNext();) {
                        QuerySolution soln = results.nextSolution();
                        assertTrue(soln.contains("c"));
@@ -193,4 +198,77 @@ public class SelectBuilderTest extends 
AbstractRegexpBasedTest {
                }
 
        }
+
+       @Test
+       public void testAggregatorsInSubQuery() throws ParseException {
+
+               Model m = ModelFactory.createDefaultModel();
+               Resource r = m.createResource("urn:one");
+               m.add(r, m.getProperty("urn:p:one"), m.createTypedLiteral(1));
+               m.add(r, m.getProperty("urn:p:two"), m.createTypedLiteral(3));
+               m.add(r, m.getProperty("urn:p:three"), m.createTypedLiteral(5));
+               r = m.createResource("urn:two");
+               m.add(r, m.getProperty("urn:p:one"), m.createTypedLiteral(2));
+               m.add(r, m.getProperty("urn:p:two"), m.createTypedLiteral(4));
+               m.add(r, m.getProperty("urn:p:three"), m.createTypedLiteral(6));
+
+               SelectBuilder sb = new 
SelectBuilder().addVar("?x").addVar("max(?o)", "?max").addWhere("?x", "?p", 
"?o")
+                               .addGroupBy("?x");
+
+               builder.addPrefix("xsd", 
XSD.getURI()).addVar("?x").addVar("min(?o2)", "?min").addWhere("?x", "?p2", 
"?o2")
+                               .addSubQuery(sb).addFilter("?max = 
'6'^^xsd:int").addGroupBy("?x");
+
+               QueryExecution qexec = 
QueryExecutionFactory.create(builder.build(), m);
+
+               ResultSet results = qexec.execSelect();
+               assertTrue(results.hasNext());
+               for (; results.hasNext();) {
+                       QuerySolution soln = results.nextSolution();
+                       assertTrue(soln.contains("x"));
+                       assertTrue(soln.contains("min"));
+                       assertEquals("urn:two", 
soln.get("?x").asResource().getURI());
+                       assertEquals(2, soln.get("?min").asLiteral().getInt());
+               }
+       }
+       
+       @Test
+       public void testVarReplacementInSubQuery() throws ParseException {
+
+               Model m = ModelFactory.createDefaultModel();
+               Resource r = m.createResource("urn:one");
+               m.add(r, m.getProperty("urn:p:one"), m.createTypedLiteral(1));
+               m.add(r, m.getProperty("urn:p:two"), m.createTypedLiteral(3));
+               m.add(r, m.getProperty("urn:p:three"), m.createTypedLiteral(5));
+               r = m.createResource("urn:two");
+               m.add(r, m.getProperty("urn:p:one"), m.createTypedLiteral(2));
+               m.add(r, m.getProperty("urn:p:two"), m.createTypedLiteral(4));
+               m.add(r, m.getProperty("urn:p:three"), m.createTypedLiteral(6));
+
+               SelectBuilder sb = new 
SelectBuilder().addVar("?x").addVar("?p").addWhere("?x", "?p", "?o")
+                               .addFilter( "?o < ?limit");
+
+               builder.addPrefix("xsd", 
XSD.getURI()).addVar("?x").addVar("count(?p)", "?c").addWhere("?x", "?p", "?o2")
+                               .addSubQuery(sb).addGroupBy("?x");
+
+               
+               builder.setVar( "?limit",  4 );
+               
+               QueryExecution qexec = 
QueryExecutionFactory.create(builder.build(), m);
+
+               ResultSet results = qexec.execSelect();
+               assertTrue(results.hasNext());
+               for (; results.hasNext();) {
+                       QuerySolution soln = results.nextSolution();
+                       assertTrue(soln.contains("x"));
+                       assertTrue(soln.contains("c"));
+                       if ("urn:one".equals( 
soln.get("?x").asResource().getURI()))
+                       {
+                               assertEquals( 2, 
soln.get("?c").asLiteral().getInt());
+                       }
+                       else 
+                       {
+                               assertEquals( 1, 
soln.get("?c").asLiteral().getInt());
+                       }
+               }
+       }
 }

http://git-wip-us.apache.org/repos/asf/jena/blob/e8b771b7/jena-extras/jena-querybuilder/src/test/java/org/apache/jena/arq/querybuilder/clauses/WhereClauseTest.java
----------------------------------------------------------------------
diff --git 
a/jena-extras/jena-querybuilder/src/test/java/org/apache/jena/arq/querybuilder/clauses/WhereClauseTest.java
 
b/jena-extras/jena-querybuilder/src/test/java/org/apache/jena/arq/querybuilder/clauses/WhereClauseTest.java
index 570a91e..23b522b 100644
--- 
a/jena-extras/jena-querybuilder/src/test/java/org/apache/jena/arq/querybuilder/clauses/WhereClauseTest.java
+++ 
b/jena-extras/jena-querybuilder/src/test/java/org/apache/jena/arq/querybuilder/clauses/WhereClauseTest.java
@@ -144,7 +144,7 @@ public class WhereClauseTest<T extends WhereClause<?>> 
extends
        }
 
        @ContractTest
-       public void addSubQuery() {
+       public void testAddSubQuery() {
                SelectBuilder sb = new SelectBuilder();
                sb.addPrefix("pfx", "urn:uri").addVar("?x")
                                .addWhere("pfx:one", "pfx:two", "pfx:three");

http://git-wip-us.apache.org/repos/asf/jena/blob/e8b771b7/jena-extras/jena-querybuilder/src/test/java/org/apache/jena/arq/querybuilder/handlers/SelectHandlerTest.java
----------------------------------------------------------------------
diff --git 
a/jena-extras/jena-querybuilder/src/test/java/org/apache/jena/arq/querybuilder/handlers/SelectHandlerTest.java
 
b/jena-extras/jena-querybuilder/src/test/java/org/apache/jena/arq/querybuilder/handlers/SelectHandlerTest.java
index 4e51478..6e131de 100644
--- 
a/jena-extras/jena-querybuilder/src/test/java/org/apache/jena/arq/querybuilder/handlers/SelectHandlerTest.java
+++ 
b/jena-extras/jena-querybuilder/src/test/java/org/apache/jena/arq/querybuilder/handlers/SelectHandlerTest.java
@@ -38,7 +38,8 @@ public class SelectHandlerTest extends AbstractHandlerTest {
        @Before
        public void setup() {
                query = new Query();
-               handler = new SelectHandler(query);
+               AggregationHandler aggHandler = new AggregationHandler(query);
+               handler = new SelectHandler(aggHandler);
        }
 
        @Test
@@ -166,7 +167,8 @@ public class SelectHandlerTest extends AbstractHandlerTest {
 
        @Test
        public void testAddAllResultStartReduced() {
-               SelectHandler sh = new SelectHandler(new Query());
+               AggregationHandler aggHandler = new AggregationHandler(new 
Query());
+               SelectHandler sh = new SelectHandler(aggHandler);
                sh.addVar(null);
                sh.setReduced(true);
 
@@ -177,7 +179,8 @@ public class SelectHandlerTest extends AbstractHandlerTest {
 
        @Test
        public void testAddAllVarsDistinct() {
-               SelectHandler sh = new SelectHandler(new Query());
+               AggregationHandler aggHandler = new AggregationHandler(new 
Query());
+               SelectHandler sh = new SelectHandler(aggHandler);
                sh.addVar(Var.alloc("foo"));
                sh.setDistinct(true);
 

Reply via email to