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/08 21:57:45 UTC

[3/5] jena git commit: Added more addHaving() methods inline with addGroupBy() and addOrderBy()

Added more addHaving() methods inline with addGroupBy() and addOrderBy()


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

Branch: refs/heads/master
Commit: cfa7c67be1e34bab6dfb9256c003aa75569c86b6
Parents: 2ec5019
Author: Claude Warren <cl...@apache.org>
Authored: Tue Mar 8 20:46:29 2016 +0000
Committer: Claude Warren <cl...@apache.org>
Committed: Tue Mar 8 20:46:29 2016 +0000

----------------------------------------------------------------------
 .../jena/arq/querybuilder/AskBuilder.java       | 54 +++++++------
 .../jena/arq/querybuilder/ConstructBuilder.java | 57 ++++++++------
 .../org/apache/jena/arq/querybuilder/Order.java | 17 ++++
 .../jena/arq/querybuilder/SelectBuilder.java    | 83 ++++++++++++--------
 .../clauses/SolutionModifierClause.java         | 65 ++++++++++-----
 .../clauses/SolutionModifierTest.java           | 40 +++++++---
 .../handlers/SolutionModifierHandlerTest.java   | 27 ++++++-
 7 files changed, 230 insertions(+), 113 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/jena/blob/cfa7c67b/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 69cb570..30d4edd 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
@@ -26,21 +26,21 @@ import org.apache.jena.arq.querybuilder.handlers.DatasetHandler;
 import org.apache.jena.arq.querybuilder.handlers.HandlerBlock;
 import org.apache.jena.arq.querybuilder.handlers.SolutionModifierHandler;
 import org.apache.jena.arq.querybuilder.handlers.WhereHandler;
-import org.apache.jena.graph.FrontsTriple ;
+import org.apache.jena.graph.FrontsTriple;
 import org.apache.jena.graph.Node;
-import org.apache.jena.graph.Triple ;
+import org.apache.jena.graph.Triple;
 import org.apache.jena.query.SortCondition;
+import org.apache.jena.sparql.core.Var;
 import org.apache.jena.sparql.expr.Expr;
-import org.apache.jena.sparql.lang.sparql_11.ParseException ;
+import org.apache.jena.sparql.lang.sparql_11.ParseException;
 
 /**
  * Build an ASK query.
  * 
  */
-public class AskBuilder extends AbstractQueryBuilder<AskBuilder> implements
-		DatasetClause<AskBuilder>, WhereClause<AskBuilder>,
-		SolutionModifierClause<AskBuilder> {
-	
+public class AskBuilder extends AbstractQueryBuilder<AskBuilder>
+		implements DatasetClause<AskBuilder>, WhereClause<AskBuilder>, SolutionModifierClause<AskBuilder> {
+
 	private final HandlerBlock handlerBlock;
 
 	/**
@@ -49,15 +49,14 @@ public class AskBuilder extends AbstractQueryBuilder<AskBuilder> implements
 	public AskBuilder() {
 		super();
 		query.setQueryAskType();
-		handlerBlock = new HandlerBlock( query );
+		handlerBlock = new HandlerBlock(query);
 	}
-	
+
 	@Override
-	public HandlerBlock getHandlerBlock()
-	{
+	public HandlerBlock getHandlerBlock() {
 		return handlerBlock;
 	}
-	
+
 	@Override
 	public DatasetHandler getDatasetHandler() {
 		return handlerBlock.getDatasetHandler();
@@ -71,7 +70,7 @@ public class AskBuilder extends AbstractQueryBuilder<AskBuilder> implements
 	@Override
 	public AskBuilder clone() {
 		AskBuilder qb = new AskBuilder();
-		qb.handlerBlock.addAll( handlerBlock );
+		qb.handlerBlock.addAll(handlerBlock);
 		return qb;
 	}
 
@@ -122,10 +121,9 @@ public class AskBuilder extends AbstractQueryBuilder<AskBuilder> implements
 		getWhereHandler().addOptional(t);
 		return this;
 	}
-	
+
 	@Override
-	public AskBuilder addOptional(SelectBuilder t)
-	{
+	public AskBuilder addOptional(SelectBuilder t) {
 		getWhereHandler().addOptional(t.getWhereHandler());
 		return this;
 	}
@@ -166,19 +164,19 @@ public class AskBuilder extends AbstractQueryBuilder<AskBuilder> implements
 		getWhereHandler().addGraph(makeNode(graph), subQuery.getWhereHandler());
 		return this;
 	}
-	
+
 	@Override
 	public AskBuilder addBind(Expr expression, Object var) {
-		getWhereHandler().addBind( expression, makeVar(var) );
+		getWhereHandler().addBind(expression, makeVar(var));
 		return this;
 	}
 
 	@Override
 	public AskBuilder addBind(String expression, Object var) throws ParseException {
-		getWhereHandler().addBind( expression, makeVar(var) );
+		getWhereHandler().addBind(expression, makeVar(var));
 		return this;
 	}
-	
+
 	@Override
 	public AskBuilder addOrderBy(Expr orderBy) {
 		getSolutionModifierHandler().addOrderBy(orderBy);
@@ -223,13 +221,13 @@ public class AskBuilder extends AbstractQueryBuilder<AskBuilder> implements
 
 	@Override
 	public AskBuilder addGroupBy(Object var, Expr expr) {
-		getSolutionModifierHandler().addGroupBy(makeVar( var ), expr);
+		getSolutionModifierHandler().addGroupBy(makeVar(var), expr);
 		return this;
 	}
 
 	@Override
 	public AskBuilder addGroupBy(Object var, String expr) {
-		getSolutionModifierHandler().addGroupBy(makeVar( var ), makeExpr(expr));
+		getSolutionModifierHandler().addGroupBy(makeVar(var), makeExpr(expr));
 		return this;
 	}
 
@@ -240,6 +238,18 @@ public class AskBuilder extends AbstractQueryBuilder<AskBuilder> implements
 	}
 
 	@Override
+	public AskBuilder addHaving(Expr expression) throws ParseException {
+		getSolutionModifierHandler().addHaving(expression);
+		return this;
+	}
+
+	@Override
+	public AskBuilder addHaving(Var var) throws ParseException {
+		getSolutionModifierHandler().addHaving(var);
+		return this;
+	}
+
+	@Override
 	public AskBuilder setLimit(int limit) {
 		getSolutionModifierHandler().setLimit(limit);
 		return this;

http://git-wip-us.apache.org/repos/asf/jena/blob/cfa7c67b/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 3809633..0e7263b 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
@@ -28,26 +28,23 @@ import org.apache.jena.arq.querybuilder.handlers.DatasetHandler;
 import org.apache.jena.arq.querybuilder.handlers.HandlerBlock;
 import org.apache.jena.arq.querybuilder.handlers.SolutionModifierHandler;
 import org.apache.jena.arq.querybuilder.handlers.WhereHandler;
-import org.apache.jena.graph.FrontsNode;
-import org.apache.jena.graph.FrontsTriple ;
+import org.apache.jena.graph.FrontsTriple;
 import org.apache.jena.graph.Node;
-import org.apache.jena.graph.Triple ;
+import org.apache.jena.graph.Triple;
 import org.apache.jena.query.SortCondition;
+import org.apache.jena.sparql.core.Var;
 import org.apache.jena.sparql.expr.Expr;
-import org.apache.jena.sparql.lang.sparql_11.ParseException ;
+import org.apache.jena.sparql.lang.sparql_11.ParseException;
 
 /**
  * Build an Construct query.
  * 
  */
-public class ConstructBuilder extends AbstractQueryBuilder<ConstructBuilder>
-		implements DatasetClause<ConstructBuilder>,
-		WhereClause<ConstructBuilder>,
-		SolutionModifierClause<ConstructBuilder>,
-		ConstructClause<ConstructBuilder> {
+public class ConstructBuilder extends AbstractQueryBuilder<ConstructBuilder> implements DatasetClause<ConstructBuilder>,
+		WhereClause<ConstructBuilder>, SolutionModifierClause<ConstructBuilder>, ConstructClause<ConstructBuilder> {
 
 	private final HandlerBlock handlerBlock;
-	
+
 	/**
 	 * Constructor
 	 */
@@ -78,15 +75,14 @@ public class ConstructBuilder extends AbstractQueryBuilder<ConstructBuilder>
 	}
 
 	@Override
-	public HandlerBlock getHandlerBlock()
-	{
+	public HandlerBlock getHandlerBlock() {
 		return handlerBlock;
 	}
-	
+
 	@Override
 	public ConstructBuilder clone() {
 		ConstructBuilder qb = new ConstructBuilder();
-		qb.handlerBlock.addAll( handlerBlock );
+		qb.handlerBlock.addAll(handlerBlock);
 		return qb;
 	}
 
@@ -113,7 +109,7 @@ public class ConstructBuilder extends AbstractQueryBuilder<ConstructBuilder>
 		getDatasetHandler().from(graphName);
 		return this;
 	}
-	
+
 	@Override
 	public ConstructBuilder addOrderBy(Expr orderBy) {
 		getSolutionModifierHandler().addOrderBy(orderBy);
@@ -165,8 +161,8 @@ public class ConstructBuilder extends AbstractQueryBuilder<ConstructBuilder>
 	@Override
 	public ConstructBuilder addGroupBy(Object var, String expr) {
 		getSolutionModifierHandler().addGroupBy(makeVar(var), makeExpr(expr));
-		return this;	}
-
+		return this;
+	}
 
 	@Override
 	public ConstructBuilder addHaving(String having) throws ParseException {
@@ -175,6 +171,18 @@ public class ConstructBuilder extends AbstractQueryBuilder<ConstructBuilder>
 	}
 
 	@Override
+	public ConstructBuilder addHaving(Expr expression) throws ParseException {
+		getSolutionModifierHandler().addHaving(expression);
+		return this;
+	}
+
+	@Override
+	public ConstructBuilder addHaving(Var var) throws ParseException {
+		getSolutionModifierHandler().addHaving(var);
+		return this;
+	}
+
+	@Override
 	public ConstructBuilder setLimit(int limit) {
 		getSolutionModifierHandler().setLimit(limit);
 		return this;
@@ -209,10 +217,9 @@ public class ConstructBuilder extends AbstractQueryBuilder<ConstructBuilder>
 		getWhereHandler().addOptional(t);
 		return this;
 	}
-	
+
 	@Override
-	public ConstructBuilder addOptional(SelectBuilder t)
-	{
+	public ConstructBuilder addOptional(SelectBuilder t) {
 		getWhereHandler().addOptional(t.getWhereHandler());
 		return this;
 	}
@@ -256,16 +263,16 @@ public class ConstructBuilder extends AbstractQueryBuilder<ConstructBuilder>
 
 	@Override
 	public ConstructBuilder addBind(Expr expression, Object var) {
-		getWhereHandler().addBind( expression, makeVar(var) );
+		getWhereHandler().addBind(expression, makeVar(var));
 		return this;
 	}
 
 	@Override
 	public ConstructBuilder addBind(String expression, Object var) throws ParseException {
-		getWhereHandler().addBind( expression, makeVar(var) );
+		getWhereHandler().addBind(expression, makeVar(var));
 		return this;
 	}
-	
+
 	@Override
 	public ConstructBuilder addConstruct(Triple t) {
 		getConstructHandler().addConstruct(t);
@@ -281,11 +288,9 @@ public class ConstructBuilder extends AbstractQueryBuilder<ConstructBuilder>
 	public ConstructBuilder addConstruct(Object s, Object p, Object o) {
 		return addConstruct(new Triple(makeNode(s), makeNode(p), makeNode(o)));
 	}
-	
+
 	@Override
 	public Node list(Object... objs) {
 		return getWhereHandler().list(objs);
 	}
-
-	
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/jena/blob/cfa7c67b/jena-extras/jena-querybuilder/src/main/java/org/apache/jena/arq/querybuilder/Order.java
----------------------------------------------------------------------
diff --git a/jena-extras/jena-querybuilder/src/main/java/org/apache/jena/arq/querybuilder/Order.java b/jena-extras/jena-querybuilder/src/main/java/org/apache/jena/arq/querybuilder/Order.java
index c72d4de..596cb4d 100644
--- a/jena-extras/jena-querybuilder/src/main/java/org/apache/jena/arq/querybuilder/Order.java
+++ b/jena-extras/jena-querybuilder/src/main/java/org/apache/jena/arq/querybuilder/Order.java
@@ -1,4 +1,21 @@
 package org.apache.jena.arq.querybuilder;
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
 
 /**
  * The order for the ORDER BY modifiers.

http://git-wip-us.apache.org/repos/asf/jena/blob/cfa7c67b/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 1f1936e..1794fe8 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
@@ -29,32 +29,31 @@ import org.apache.jena.arq.querybuilder.handlers.HandlerBlock;
 import org.apache.jena.arq.querybuilder.handlers.SelectHandler;
 import org.apache.jena.arq.querybuilder.handlers.SolutionModifierHandler;
 import org.apache.jena.arq.querybuilder.handlers.WhereHandler;
-import org.apache.jena.graph.FrontsNode ;
-import org.apache.jena.graph.FrontsTriple ;
-import org.apache.jena.graph.Node ;
-import org.apache.jena.graph.Triple ;
+import org.apache.jena.graph.FrontsNode;
+import org.apache.jena.graph.FrontsTriple;
+import org.apache.jena.graph.Node;
+import org.apache.jena.graph.Triple;
 import org.apache.jena.query.SortCondition;
-import org.apache.jena.sparql.core.Var ;
+import org.apache.jena.sparql.core.Var;
 import org.apache.jena.sparql.expr.Expr;
-import org.apache.jena.sparql.lang.sparql_11.ParseException ;
+import org.apache.jena.sparql.lang.sparql_11.ParseException;
 
 /**
  * Build a select query.
  *
  */
-public class SelectBuilder extends AbstractQueryBuilder<SelectBuilder>
-		implements DatasetClause<SelectBuilder>, WhereClause<SelectBuilder>,
-		SolutionModifierClause<SelectBuilder>, SelectClause<SelectBuilder> {
+public class SelectBuilder extends AbstractQueryBuilder<SelectBuilder> implements DatasetClause<SelectBuilder>,
+		WhereClause<SelectBuilder>, SolutionModifierClause<SelectBuilder>, SelectClause<SelectBuilder> {
 
 	private final HandlerBlock handlerBlock;
-	
+
 	/**
 	 * Constructor.
 	 */
 	public SelectBuilder() {
 		super();
 		query.setQuerySelectType();
-		handlerBlock = new HandlerBlock( query );
+		handlerBlock = new HandlerBlock(query);
 	}
 
 	@Override
@@ -63,11 +62,10 @@ public class SelectBuilder extends AbstractQueryBuilder<SelectBuilder>
 	}
 
 	@Override
-	public HandlerBlock getHandlerBlock()
-	{
+	public HandlerBlock getHandlerBlock() {
 		return handlerBlock;
 	}
-	
+
 	@Override
 	public WhereHandler getWhereHandler() {
 		return handlerBlock.getWhereHandler();
@@ -100,12 +98,15 @@ public class SelectBuilder extends AbstractQueryBuilder<SelectBuilder>
 
 	/**
 	 * Add an expression string as a filter.
-	 * @param expression The expression string to add.
-	 * @throws ParseException If the expression can not be parsed.
+	 * 
+	 * @param expression
+	 *            The expression string to add.
+	 * @throws ParseException
+	 *             If the expression can not be parsed.
 	 */
 	@Override
 	public SelectBuilder addVar(String expression, Object var) throws ParseException {
-		getSelectHandler().addVar( expression, makeVar(var) );
+		getSelectHandler().addVar(expression, makeVar(var));
 		return this;
 	}
 
@@ -114,7 +115,7 @@ public class SelectBuilder extends AbstractQueryBuilder<SelectBuilder>
 		getSelectHandler().addVar(expr, makeVar(var));
 		return this;
 	}
-	
+
 	@Override
 	public List<Var> getVars() {
 		return getSelectHandler().getVars();
@@ -152,10 +153,10 @@ public class SelectBuilder extends AbstractQueryBuilder<SelectBuilder>
 
 	@Override
 	public SelectBuilder addOrderBy(Object orderBy) {
-		getSolutionModifierHandler().addOrderBy( makeVar(orderBy));
+		getSolutionModifierHandler().addOrderBy(makeVar(orderBy));
 		return this;
 	}
-	
+
 	@Override
 	public SelectBuilder addOrderBy(SortCondition orderBy) {
 		getSolutionModifierHandler().addOrderBy(orderBy);
@@ -173,7 +174,7 @@ public class SelectBuilder extends AbstractQueryBuilder<SelectBuilder>
 		getSolutionModifierHandler().addOrderBy(makeVar(orderBy), order);
 		return this;
 	}
-	
+
 	@Override
 	public SelectBuilder addGroupBy(Object groupBy) {
 		getSolutionModifierHandler().addGroupBy(makeVar(groupBy));
@@ -210,6 +211,18 @@ public class SelectBuilder extends AbstractQueryBuilder<SelectBuilder>
 	}
 
 	@Override
+	public SelectBuilder addHaving(Expr expression) throws ParseException {
+		getSolutionModifierHandler().addHaving(expression);
+		return this;
+	}
+
+	@Override
+	public SelectBuilder addHaving(Var var) throws ParseException {
+		getSolutionModifierHandler().addHaving(var);
+		return this;
+	}
+
+	@Override
 	public SelectBuilder setLimit(int limit) {
 		getSolutionModifierHandler().setLimit(limit);
 		return this;
@@ -222,11 +235,12 @@ public class SelectBuilder extends AbstractQueryBuilder<SelectBuilder>
 	}
 
 	/**
-	 * Convert a node to a string.
-	 * If the node is a literal return the literal value.
-	 * If the node is a URI return the URI enclosed with &lt; and &gt;
-	 * If the node is a variable return the name preceeded by '?'
-	 * @param node The node to convert.
+	 * Convert a node to a string. If the node is a literal return the literal
+	 * value. If the node is a URI return the URI enclosed with &lt; and &gt; If
+	 * the node is a variable return the name preceeded by '?'
+	 * 
+	 * @param node
+	 *            The node to convert.
 	 * @return A string representation of the node.
 	 */
 	private static String toString(Node node) {
@@ -246,15 +260,17 @@ public class SelectBuilder extends AbstractQueryBuilder<SelectBuilder>
 	}
 
 	/**
-	 * Convert the object to a string.
-	 * If the object is a node or fronts a node then 
+	 * Convert the object to a string. If the object is a node or fronts a node
+	 * then
 	 * <ul>
 	 * <li>If the node is a literal return the literal value.</li>
 	 * <li>If the node is a URI return the URI enclosed with &lt; and &gt;</li>
 	 * <li>If the node is a variable return the name preceeded by '?'</li>
 	 * </ul>
 	 * otherwise return the toString() method of the object.
-	 * @param o the Object to convert.
+	 * 
+	 * @param o
+	 *            the Object to convert.
 	 * @return The string representation of the object.
 	 */
 	public static String makeString(Object o) {
@@ -304,12 +320,11 @@ public class SelectBuilder extends AbstractQueryBuilder<SelectBuilder>
 	}
 
 	@Override
-	public SelectBuilder addOptional(SelectBuilder t)
-	{
+	public SelectBuilder addOptional(SelectBuilder t) {
 		getWhereHandler().addOptional(t.getWhereHandler());
 		return this;
 	}
-	
+
 	@Override
 	public SelectBuilder addFilter(String s) throws ParseException {
 		getWhereHandler().addFilter(s);
@@ -337,13 +352,13 @@ public class SelectBuilder extends AbstractQueryBuilder<SelectBuilder>
 
 	@Override
 	public SelectBuilder addBind(Expr expression, Object var) {
-		getWhereHandler().addBind( expression, makeVar(var) );
+		getWhereHandler().addBind(expression, makeVar(var));
 		return this;
 	}
 
 	@Override
 	public SelectBuilder addBind(String expression, Object var) throws ParseException {
-		getWhereHandler().addBind( expression, makeVar(var) );
+		getWhereHandler().addBind(expression, makeVar(var));
 		return this;
 	}
 

http://git-wip-us.apache.org/repos/asf/jena/blob/cfa7c67b/jena-extras/jena-querybuilder/src/main/java/org/apache/jena/arq/querybuilder/clauses/SolutionModifierClause.java
----------------------------------------------------------------------
diff --git a/jena-extras/jena-querybuilder/src/main/java/org/apache/jena/arq/querybuilder/clauses/SolutionModifierClause.java b/jena-extras/jena-querybuilder/src/main/java/org/apache/jena/arq/querybuilder/clauses/SolutionModifierClause.java
index 820c1d6..2467422 100644
--- a/jena-extras/jena-querybuilder/src/main/java/org/apache/jena/arq/querybuilder/clauses/SolutionModifierClause.java
+++ b/jena-extras/jena-querybuilder/src/main/java/org/apache/jena/arq/querybuilder/clauses/SolutionModifierClause.java
@@ -20,11 +20,10 @@ package org.apache.jena.arq.querybuilder.clauses;
 import org.apache.jena.arq.querybuilder.AbstractQueryBuilder;
 import org.apache.jena.arq.querybuilder.Order;
 import org.apache.jena.arq.querybuilder.handlers.SolutionModifierHandler;
-import org.apache.jena.graph.FrontsNode;
 import org.apache.jena.query.SortCondition;
 import org.apache.jena.sparql.core.Var;
 import org.apache.jena.sparql.expr.Expr;
-import org.apache.jena.sparql.lang.sparql_11.ParseException ;
+import org.apache.jena.sparql.lang.sparql_11.ParseException;
 
 /**
  * Interface that defines the SolutionClause as per
@@ -34,7 +33,7 @@ import org.apache.jena.sparql.lang.sparql_11.ParseException ;
  *            The Builder type that the clause is part of.
  */
 public interface SolutionModifierClause<T extends AbstractQueryBuilder<T>> {
-	
+
 	/**
 	 * Add an ascending order by.
 	 * 
@@ -43,7 +42,7 @@ public interface SolutionModifierClause<T extends AbstractQueryBuilder<T>> {
 	 * @return The builder for chaining.
 	 */
 	public T addOrderBy(Expr orderBy);
-	
+
 	/**
 	 * Add an ascending order by.
 	 * 
@@ -52,7 +51,7 @@ public interface SolutionModifierClause<T extends AbstractQueryBuilder<T>> {
 	 * @return The builder for chaining.
 	 */
 	public T addOrderBy(Object orderBy);
-	
+
 	/**
 	 * Add an ascending order by.
 	 * 
@@ -61,23 +60,25 @@ public interface SolutionModifierClause<T extends AbstractQueryBuilder<T>> {
 	 * @return The builder for chaining.
 	 */
 	public T addOrderBy(SortCondition orderBy);
-	
+
 	/**
 	 * Add an order by with direction specified.
 	 * 
 	 * @param orderBy
 	 *            The expression to order by.
-	 * @param order The direction to order.  
+	 * @param order
+	 *            The direction to order.
 	 * @return The builder for chaining.
 	 */
 	public T addOrderBy(Expr orderBy, Order order);
-	
+
 	/**
 	 * Add an order by with direction specified.
 	 * 
 	 * @param orderBy
 	 *            The object to order by.
-	 * @param order The direction to order.  
+	 * @param order
+	 *            The direction to order.
 	 * @return The builder for chaining.
 	 */
 	public T addOrderBy(Object orderBy, Order order);
@@ -90,26 +91,33 @@ public interface SolutionModifierClause<T extends AbstractQueryBuilder<T>> {
 	 * @return The builder for chaining.
 	 */
 	public T addGroupBy(Object groupBy);
-	
+
 	/**
-	 * Add an expression to the group by clause. 
-	 * The expression may be created from a string using the makeExpr() method.
-	 * @param groupBy The expression to add.
+	 * Add an expression to the group by clause. The expression may be created
+	 * from a string using the makeExpr() method.
+	 * 
+	 * @param groupBy
+	 *            The expression to add.
 	 */
 	public T addGroupBy(Expr groupBy);
 
 	/**
 	 * Add var and expression to the group by clause.
-	 * @param var The variable to add.
-	 * @param expr The expression to add.
+	 * 
+	 * @param var
+	 *            The variable to add.
+	 * @param expr
+	 *            The expression to add.
 	 */
 	public T addGroupBy(Object var, Expr expr);
 
-
 	/**
 	 * Add var and expression to the group by clause.
-	 * @param var The variable to add.
-	 * @param expr The expression to add.
+	 * 
+	 * @param var
+	 *            The variable to add.
+	 * @param expr
+	 *            The expression to add.
 	 */
 	public T addGroupBy(Object var, String expr);
 
@@ -121,7 +129,25 @@ public interface SolutionModifierClause<T extends AbstractQueryBuilder<T>> {
 	 * @return The builder for chaining.
 	 */
 	public T addHaving(String expression) throws ParseException;
-	
+
+	/**
+	 * Add a having expression.
+	 * 
+	 * @param expression
+	 *            Expression to evaluate for the having.
+	 * @return The builder for chaining.
+	 */
+	public T addHaving(Expr expression) throws ParseException;
+
+	/**
+	 * Add a having expression.
+	 * 
+	 * @param var
+	 *            the variable to have.
+	 * @return The builder for chaining.
+	 */
+	public T addHaving(Var var) throws ParseException;
+
 	/**
 	 * Set the limit.
 	 * 
@@ -146,6 +172,7 @@ public interface SolutionModifierClause<T extends AbstractQueryBuilder<T>> {
 
 	/**
 	 * Get the Solution modifier for this clause.
+	 * 
 	 * @return The SolutionModifierHandler the clause is using.
 	 */
 	public SolutionModifierHandler getSolutionModifierHandler();

http://git-wip-us.apache.org/repos/asf/jena/blob/cfa7c67b/jena-extras/jena-querybuilder/src/test/java/org/apache/jena/arq/querybuilder/clauses/SolutionModifierTest.java
----------------------------------------------------------------------
diff --git a/jena-extras/jena-querybuilder/src/test/java/org/apache/jena/arq/querybuilder/clauses/SolutionModifierTest.java b/jena-extras/jena-querybuilder/src/test/java/org/apache/jena/arq/querybuilder/clauses/SolutionModifierTest.java
index aa28f86..c6312d7 100644
--- a/jena-extras/jena-querybuilder/src/test/java/org/apache/jena/arq/querybuilder/clauses/SolutionModifierTest.java
+++ b/jena-extras/jena-querybuilder/src/test/java/org/apache/jena/arq/querybuilder/clauses/SolutionModifierTest.java
@@ -131,16 +131,16 @@ public class SolutionModifierTest<T extends SolutionModifierClause<?>> extends A
 		builder = solutionModifier.addGroupBy("bar");
 		assertContainsRegex(GROUP_BY + var("foo") + SPACE + var("bar"), builder.buildString());
 	}
-	
+
 	@ContractTest
 	public void testAddGroupByExpr() {
 		SolutionModifierClause<?> solutionModifier = getProducer().newInstance();
-		AbstractQueryBuilder<?> builder = solutionModifier.addGroupBy( new E_Random());
-		assertContainsRegex(GROUP_BY+"rand"+OPEN_PAREN+CLOSE_PAREN, builder.buildString());
+		AbstractQueryBuilder<?> builder = solutionModifier.addGroupBy(new E_Random());
+		assertContainsRegex(GROUP_BY + "rand" + OPEN_PAREN + CLOSE_PAREN, builder.buildString());
 		builder = solutionModifier.addGroupBy("bar");
-		assertContainsRegex(GROUP_BY+"rand"+OPEN_PAREN+CLOSE_PAREN + SPACE + var("bar"), builder.buildString());
+		assertContainsRegex(GROUP_BY + "rand" + OPEN_PAREN + CLOSE_PAREN + SPACE + var("bar"), builder.buildString());
 	}
-	
+
 	@ContractTest
 	public void testAddGroupByVar() {
 		SolutionModifierClause<?> solutionModifier = getProducer().newInstance();
@@ -150,19 +150,21 @@ public class SolutionModifierTest<T extends SolutionModifierClause<?>> extends A
 		builder = solutionModifier.addGroupBy("bar");
 		assertContainsRegex(GROUP_BY + var("foo") + SPACE + var("bar"), builder.buildString());
 	}
-	
+
 	@ContractTest
 	public void testAddGroupByVarAndExpr() {
 		SolutionModifierClause<?> solutionModifier = getProducer().newInstance();
 		AbstractQueryBuilder<?> builder = solutionModifier.addGroupBy(Var.alloc("foo"), new E_Random());
-		assertContainsRegex(GROUP_BY+OPEN_PAREN+"rand"+OPEN_PAREN+CLOSE_PAREN+SPACE+"AS"+SPACE+var("foo")+CLOSE_PAREN, builder.buildString());
+		assertContainsRegex(GROUP_BY + OPEN_PAREN + "rand" + OPEN_PAREN + CLOSE_PAREN + SPACE + "AS" + SPACE
+				+ var("foo") + CLOSE_PAREN, builder.buildString());
 
 		builder = solutionModifier.addGroupBy("bar");
-		assertContainsRegex(GROUP_BY+OPEN_PAREN+"rand"+OPEN_PAREN+CLOSE_PAREN+SPACE+"AS"+SPACE+var("foo")+CLOSE_PAREN+ SPACE + var("bar"), builder.buildString());
+		assertContainsRegex(GROUP_BY + OPEN_PAREN + "rand" + OPEN_PAREN + CLOSE_PAREN + SPACE + "AS" + SPACE
+				+ var("foo") + CLOSE_PAREN + SPACE + var("bar"), builder.buildString());
 	}
 
 	@ContractTest
-	public void testAddHaving() throws ParseException {
+	public void testAddHavingString() throws ParseException {
 		SolutionModifierClause<?> solutionModifier = getProducer().newInstance();
 		AbstractQueryBuilder<?> builder = solutionModifier.addHaving("?foo<10");
 		assertContainsRegex(HAVING + OPEN_PAREN + var("foo") + OPT_SPACE + LT + OPT_SPACE + "10" + CLOSE_PAREN,
@@ -176,6 +178,26 @@ public class SolutionModifierTest<T extends SolutionModifierClause<?>> extends A
 	}
 
 	@ContractTest
+	public void testAddHavingVar() throws ParseException {
+		SolutionModifierClause<?> solutionModifier = getProducer().newInstance();
+		AbstractQueryBuilder<?> builder = solutionModifier.addHaving(Var.alloc("foo"));
+		assertContainsRegex(HAVING + var("foo"), builder.buildString());
+
+		builder = solutionModifier.addHaving("?having2");
+		assertContainsRegex(HAVING + var("foo") + SPACE + var("having2"), builder.buildString());
+	}
+
+	@ContractTest
+	public void testAddHavingExpr() throws ParseException {
+		SolutionModifierClause<?> solutionModifier = getProducer().newInstance();
+		AbstractQueryBuilder<?> builder = solutionModifier.addHaving(new E_Random());
+		assertContainsRegex(HAVING + "rand" + OPEN_PAREN + CLOSE_PAREN, builder.buildString());
+
+		solutionModifier.addHaving("?having2");
+		assertContainsRegex(HAVING + "rand" + OPEN_PAREN + CLOSE_PAREN + SPACE + var("having2"), builder.buildString());
+	}
+
+	@ContractTest
 	public void testSetLimit() {
 		SolutionModifierClause<?> solutionModifier = getProducer().newInstance();
 		AbstractQueryBuilder<?> builder = solutionModifier.setLimit(500);

http://git-wip-us.apache.org/repos/asf/jena/blob/cfa7c67b/jena-extras/jena-querybuilder/src/test/java/org/apache/jena/arq/querybuilder/handlers/SolutionModifierHandlerTest.java
----------------------------------------------------------------------
diff --git a/jena-extras/jena-querybuilder/src/test/java/org/apache/jena/arq/querybuilder/handlers/SolutionModifierHandlerTest.java b/jena-extras/jena-querybuilder/src/test/java/org/apache/jena/arq/querybuilder/handlers/SolutionModifierHandlerTest.java
index 1609d45..5d04748 100644
--- a/jena-extras/jena-querybuilder/src/test/java/org/apache/jena/arq/querybuilder/handlers/SolutionModifierHandlerTest.java
+++ b/jena-extras/jena-querybuilder/src/test/java/org/apache/jena/arq/querybuilder/handlers/SolutionModifierHandlerTest.java
@@ -131,15 +131,36 @@ public class SolutionModifierHandlerTest extends AbstractHandlerTest {
 		s = byLine(query.toString());
 		assertContainsRegex(GROUP_BY+OPEN_PAREN+"rand"+OPEN_PAREN+CLOSE_PAREN+SPACE+"AS"+SPACE+var("groupBy")+CLOSE_PAREN+SPACE+var("groupBy2"), s);
 	}
+
 	@Test
-	public void testAddHaving() throws ParseException {
+	public void testAddHavingString() throws ParseException {
 		solutionModifier.addHaving("?having<10");
 		assertContainsRegex(HAVING + OPEN_PAREN + var("having") + OPT_SPACE
-				+ LT + OPT_SPACE + 10 + CLOSE_PAREN, query.toString());
+				+ LT + 10 + CLOSE_PAREN, query.toString());
 
 		solutionModifier.addHaving("?having2");
 		assertContainsRegex(HAVING + OPEN_PAREN + var("having") + OPT_SPACE
-				+ LT + OPT_SPACE + 10 + CLOSE_PAREN + OPT_SPACE
+				+ LT + 10 + CLOSE_PAREN + OPT_SPACE
+				+ var("having2"), query.toString());
+	}
+
+	@Test
+	public void testAddHavingVar() throws ParseException {
+		solutionModifier.addHaving(Var.alloc("foo"));
+		assertContainsRegex(HAVING + var("foo") , query.toString());
+
+		solutionModifier.addHaving("?having2");
+		assertContainsRegex(HAVING + var("foo") + SPACE
+				+ var("having2"), query.toString());
+	}
+
+	@Test
+	public void testAddHavingExpr() throws ParseException {
+		solutionModifier.addHaving( new E_Random());
+		assertContainsRegex(HAVING +  "rand"+OPEN_PAREN+CLOSE_PAREN , query.toString());
+
+		solutionModifier.addHaving("?having2");
+		assertContainsRegex(HAVING + "rand"+OPEN_PAREN+CLOSE_PAREN + SPACE
 				+ var("having2"), query.toString());
 	}