You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jena.apache.org by cl...@apache.org on 2016/03/06 15:17:20 UTC

jena git commit: Changes for JENA-1144

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 <cl...@apache.org>
Authored: Sun Mar 6 14:15:48 2016 +0000
Committer: Claude Warren <cl...@apache.org>
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);