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 <[email protected]>
Authored: Tue Mar 8 20:46:29 2016 +0000
Committer: Claude Warren <[email protected]>
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());
        }
 

Reply via email to