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 2015/05/19 21:14:47 UTC

[02/11] jena git commit: Changes to support JENA-947

Changes to support JENA-947


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

Branch: refs/heads/add-contract-tests
Commit: b03ce37bf932949b59f40467b6212c0d7c25afd9
Parents: 25b3652
Author: Claude Warren <cl...@apache.org>
Authored: Sat May 16 23:30:18 2015 +0100
Committer: Claude Warren <cl...@apache.org>
Committed: Sat May 16 23:30:18 2015 +0100

----------------------------------------------------------------------
 .../arq/querybuilder/AbstractQueryBuilder.java  |  28 ++++--
 .../jena/arq/querybuilder/AskBuilder.java       |  12 +++
 .../jena/arq/querybuilder/ConstructBuilder.java |  31 +++---
 .../jena/arq/querybuilder/SelectBuilder.java    |  18 +++-
 .../arq/querybuilder/clauses/WhereClause.java   |  20 ++++
 .../jena/arq/querybuilder/handlers/Handler.java |  17 ++++
 .../querybuilder/handlers/SelectHandler.java    |   9 +-
 .../arq/querybuilder/handlers/WhereHandler.java |  26 +++++
 .../jena/arq/AbstractRegexpBasedTest.java       |   1 +
 .../querybuilder/clauses/WhereClauseTest.java   | 100 ++++++++++++++-----
 .../querybuilder/handlers/WhereHandlerTest.java |  22 ++++
 11 files changed, 218 insertions(+), 66 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/jena/blob/b03ce37b/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 dfe6732..63f068a 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
@@ -17,7 +17,6 @@
  */
 package org.apache.jena.arq.querybuilder;
 
-import java.lang.reflect.Field;
 import java.util.HashMap;
 import java.util.Map;
 import java.util.Stack;
@@ -263,17 +262,24 @@ public abstract class AbstractQueryBuilder<T extends AbstractQueryBuilder<T>>
 	 */
 	public final Query build() {
 		Query q = new Query();
-		try {
-			Field f = Query.class.getDeclaredField("queryType");
-			f.setAccessible(true);
-			f.set(q, query.getQueryType());
-		} catch (NoSuchFieldException e) {
-			throw new IllegalStateException(e.getMessage(), e);
-		} catch (SecurityException e) {
-			throw new IllegalStateException(e.getMessage(), e);
-		} catch (IllegalAccessException e) {
-			throw new IllegalStateException(e.getMessage(), e);
+		switch (query.getQueryType())
+		{
+		case Query.QueryTypeAsk:
+			q.setQueryAskType();
+			break;
+		case Query.QueryTypeConstruct:
+			q.setQueryConstructType();
+			break;
+		case Query.QueryTypeDescribe:
+			q.setQueryDescribeType();
+			break;
+		case Query.QueryTypeSelect:
+			q.setQuerySelectType();
+			break;
+		default:
+			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);

http://git-wip-us.apache.org/repos/asf/jena/blob/b03ce37b/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 b828f2d..42c213c 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
@@ -27,6 +27,7 @@ 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.Triple ;
+import org.apache.jena.sparql.expr.Expr;
 import org.apache.jena.sparql.lang.sparql_11.ParseException ;
 
 /**
@@ -158,8 +159,19 @@ public class AskBuilder extends AbstractQueryBuilder<AskBuilder> implements
 		whereHandler.addGraph(makeNode(graph), subQuery.getWhereHandler());
 		return this;
 	}
+	
+	@Override
+	public AskBuilder addBind(Expr expression, Object var) {
+		whereHandler.addBind( expression, makeVar(var) );
+		return this;
+	}
 
 	@Override
+	public AskBuilder addBind(String expression, Object var) throws ParseException {
+		whereHandler.addBind( expression, makeVar(var) );
+		return this;
+	}
+	@Override
 	public AskBuilder addOrderBy(String orderBy) {
 		solutionModifier.addOrderBy(orderBy);
 		return this;

http://git-wip-us.apache.org/repos/asf/jena/blob/b03ce37b/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 1d95a4b..f935e2b 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,8 +28,8 @@ import org.apache.jena.arq.querybuilder.handlers.DatasetHandler;
 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.Node ;
 import org.apache.jena.graph.Triple ;
+import org.apache.jena.sparql.expr.Expr;
 import org.apache.jena.sparql.lang.sparql_11.ParseException ;
 
 /**
@@ -145,23 +145,6 @@ public class ConstructBuilder extends AbstractQueryBuilder<ConstructBuilder>
 		return this;
 	}
 
-	// convert a node to a string
-	private static String toString(Node node) {
-		if (node.isBlank()) {
-			return node.getBlankNodeLabel();
-		}
-		if (node.isLiteral()) {
-			return node.toString();
-		}
-		if (node.isURI()) {
-			return String.format("<%s>", node.getURI());
-		}
-		if (node.isVariable()) {
-			return String.format("?%s", node.getName());
-		}
-		return node.toString();
-	}
-
 	@Override
 	public ConstructBuilder addWhere(Triple t) {
 		whereHandler.addWhere(t);
@@ -225,6 +208,18 @@ public class ConstructBuilder extends AbstractQueryBuilder<ConstructBuilder>
 	}
 
 	@Override
+	public ConstructBuilder addBind(Expr expression, Object var) {
+		whereHandler.addBind( expression, makeVar(var) );
+		return this;
+	}
+
+	@Override
+	public ConstructBuilder addBind(String expression, Object var) throws ParseException {
+		whereHandler.addBind( expression, makeVar(var) );
+		return this;
+	}
+	
+	@Override
 	public ConstructBuilder addConstruct(Triple t) {
 		constructHandler.addConstruct(t);
 		return this;

http://git-wip-us.apache.org/repos/asf/jena/blob/b03ce37b/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 7829aca..8ca8de3 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
@@ -17,7 +17,6 @@
  */
 package org.apache.jena.arq.querybuilder;
 
-import java.io.ByteArrayInputStream;
 import java.util.Collection;
 import java.util.List;
 
@@ -33,12 +32,9 @@ 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.sparql.core.Prologue;
 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.SPARQLParser11;
-import org.apache.jena.sparql.syntax.ElementFilter;
 
 /**
  * Build a select query.
@@ -111,6 +107,7 @@ public class SelectBuilder extends AbstractQueryBuilder<SelectBuilder>
 	 * @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 {
 		selectHandler.addVar( expression, makeVar(var) );
 		return this;
@@ -295,8 +292,19 @@ public class SelectBuilder extends AbstractQueryBuilder<SelectBuilder>
 	}
 
 	@Override
+	public SelectBuilder addBind(Expr expression, Object var) {
+		whereHandler.addBind( expression, makeVar(var) );
+		return this;
+	}
+
+	@Override
+	public SelectBuilder addBind(String expression, Object var) throws ParseException {
+		whereHandler.addBind( expression, makeVar(var) );
+		return this;
+	}
+
+	@Override
 	public SelectHandler getSelectHandler() {
 		return selectHandler;
 	}
-
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/jena/blob/b03ce37b/jena-extras/jena-querybuilder/src/main/java/org/apache/jena/arq/querybuilder/clauses/WhereClause.java
----------------------------------------------------------------------
diff --git a/jena-extras/jena-querybuilder/src/main/java/org/apache/jena/arq/querybuilder/clauses/WhereClause.java b/jena-extras/jena-querybuilder/src/main/java/org/apache/jena/arq/querybuilder/clauses/WhereClause.java
index 12c9a74..2e814ad 100644
--- a/jena-extras/jena-querybuilder/src/main/java/org/apache/jena/arq/querybuilder/clauses/WhereClause.java
+++ b/jena-extras/jena-querybuilder/src/main/java/org/apache/jena/arq/querybuilder/clauses/WhereClause.java
@@ -22,6 +22,7 @@ import org.apache.jena.arq.querybuilder.SelectBuilder;
 import org.apache.jena.arq.querybuilder.handlers.WhereHandler;
 import org.apache.jena.graph.FrontsTriple ;
 import org.apache.jena.graph.Triple ;
+import org.apache.jena.sparql.expr.Expr;
 import org.apache.jena.sparql.lang.sparql_11.ParseException ;
 
 /**
@@ -142,8 +143,27 @@ public interface WhereClause<T extends AbstractQueryBuilder<T>> {
 	 * @return This builder for chaining.
 	 */
 	public T addGraph(Object graph, SelectBuilder subQuery);
+	
+	/**
+	 * Add a bind statement to the query
+	 * * http://www.w3.org/TR/2013/REC-sparql11-query-20130321/#rGraphGraphPattern.
+	 * @param expression The expression to bind to the var.
+	 * @param var The variable to bind to.
+	 * @return This builder for chaining.
+	 */
+	public T addBind( Expr expression, Object var);
 
 	/**
+	 * Add a bind statement to the query
+	 * * http://www.w3.org/TR/2013/REC-sparql11-query-20130321/#rGraphGraphPattern.
+	 * @param expression The expression to bind to the var.
+	 * @param var The variable to bind to.
+	 * @return This builder for chaining.
+	 * @throws ParseException 
+	 */
+	public T addBind( String expression, Object var) throws ParseException;
+	
+	/**
 	 * Get the Where handler for this clause.
 	 * @return The WhereHandler used by this clause.
 	 */

http://git-wip-us.apache.org/repos/asf/jena/blob/b03ce37b/jena-extras/jena-querybuilder/src/main/java/org/apache/jena/arq/querybuilder/handlers/Handler.java
----------------------------------------------------------------------
diff --git a/jena-extras/jena-querybuilder/src/main/java/org/apache/jena/arq/querybuilder/handlers/Handler.java b/jena-extras/jena-querybuilder/src/main/java/org/apache/jena/arq/querybuilder/handlers/Handler.java
index faa1c00..2070225 100644
--- a/jena-extras/jena-querybuilder/src/main/java/org/apache/jena/arq/querybuilder/handlers/Handler.java
+++ b/jena-extras/jena-querybuilder/src/main/java/org/apache/jena/arq/querybuilder/handlers/Handler.java
@@ -17,10 +17,16 @@
  */
 package org.apache.jena.arq.querybuilder.handlers;
 
+import java.io.ByteArrayInputStream;
 import java.util.Map;
 
 import org.apache.jena.graph.Node ;
+import org.apache.jena.query.Query;
+import org.apache.jena.sparql.core.Prologue;
 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.SPARQLParser11;
 
 /**
  * The base interface for handlers.
@@ -39,4 +45,15 @@ public interface Handler {
 	 * the build completes.  The adjustments are made after setVars() has been called.
 	 */
 	public void build();
+	
+	public static class Utils {
+		public static Expr parseExpression( Query query, String expression ) throws ParseException
+		{
+			SPARQLParser11 parser = new SPARQLParser11(new ByteArrayInputStream(
+					expression.getBytes()));
+			Prologue prologue = new Prologue( query.getPrefixMapping() );
+			parser.setPrologue(prologue);
+			return parser.Expression();
+		}
+	}
 }

http://git-wip-us.apache.org/repos/asf/jena/blob/b03ce37b/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 37726d8..df3261b 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
@@ -17,19 +17,16 @@
  */
 package org.apache.jena.arq.querybuilder.handlers;
 
-import java.io.ByteArrayInputStream;
 import java.lang.reflect.Field;
 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.Prologue;
 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.lang.sparql_11.ParseException;
-import org.apache.jena.sparql.lang.sparql_11.SPARQLParser11;
 
 /**
  * A Select clause handler.
@@ -97,11 +94,7 @@ public class SelectHandler implements Handler {
 	 * @throws ParseException 
 	 */
 	public void addVar(String expression, Var var) throws ParseException {
-		SPARQLParser11 parser = new SPARQLParser11(new ByteArrayInputStream(
-				expression.getBytes()));
-		Prologue prologue = new Prologue( query.getPrefixMapping() );
-		parser.setPrologue(prologue);
-		addVar( parser.Expression(), var );
+		addVar( Utils.parseExpression(query, expression), var );
 	}
 	
 	/**

http://git-wip-us.apache.org/repos/asf/jena/blob/b03ce37b/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 03c33c6..754e7a3 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
@@ -285,7 +285,32 @@ public class WhereHandler implements Handler {
 		getClause().addElement(
 				new ElementNamedGraph(graph, subQuery.getElement()));
 	}
+	
+	/**
+	 * Add a binding to the where clause.
+	 * @param expr The expression to bind.
+	 * @param var The variable to bind it to.
+	 */
+	public void addBind( Expr expr, Var var )
+	{
+		getClause().addElement(
+				new ElementBind(var,expr)
+				);
+	}
 
+	/**
+	 * Add a binding to the where clause.
+	 * @param expr The expression to bind.
+	 * @param var The variable to bind it to.
+	 * @throws ParseException 
+	 */
+	public void addBind( String expression, Var var ) throws ParseException
+	{
+		getClause().addElement(
+				new ElementBind(var, Utils.parseExpression(query, expression))
+				);
+	}
+	
 	@Override
 	public void setVars(Map<Var, Node> values) {
 		if (values.isEmpty()) {
@@ -304,4 +329,5 @@ public class WhereHandler implements Handler {
 	public void build() {
 		// no special operations required.
 	}
+	
 }

http://git-wip-us.apache.org/repos/asf/jena/blob/b03ce37b/jena-extras/jena-querybuilder/src/test/java/org/apache/jena/arq/AbstractRegexpBasedTest.java
----------------------------------------------------------------------
diff --git a/jena-extras/jena-querybuilder/src/test/java/org/apache/jena/arq/AbstractRegexpBasedTest.java b/jena-extras/jena-querybuilder/src/test/java/org/apache/jena/arq/AbstractRegexpBasedTest.java
index 2090193..c2af399 100644
--- a/jena-extras/jena-querybuilder/src/test/java/org/apache/jena/arq/AbstractRegexpBasedTest.java
+++ b/jena-extras/jena-querybuilder/src/test/java/org/apache/jena/arq/AbstractRegexpBasedTest.java
@@ -46,6 +46,7 @@ public abstract class AbstractRegexpBasedTest {
 	protected static final String LIMIT = "LIMIT" + SPACE;
 	protected static final String OFFSET = "OFFSET" + SPACE;
 	protected static final String OPTIONAL = "OPTIONAL" + SPACE;
+	protected static final String BIND = "BIND";
 
 	protected final String quote(String s) {
 		return String.format("%s%s%s", QUOTE, s, QUOTE);

http://git-wip-us.apache.org/repos/asf/jena/blob/b03ce37b/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 ecfbd85..f6587a9 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
@@ -17,17 +17,27 @@
  */
 package org.apache.jena.arq.querybuilder.clauses;
 
-import org.apache.jena.arq.querybuilder.AbstractQueryBuilder ;
-import org.apache.jena.arq.querybuilder.SelectBuilder ;
-import org.apache.jena.graph.NodeFactory ;
-import org.apache.jena.graph.Triple ;
-import org.apache.jena.graph.impl.LiteralLabelFactory ;
-import org.apache.jena.sparql.core.Var ;
-import org.apache.jena.sparql.lang.sparql_11.ParseException ;
-import org.junit.After ;
-import org.xenei.junit.contract.Contract ;
-import org.xenei.junit.contract.ContractTest ;
-import org.xenei.junit.contract.IProducer ;
+import java.util.List;
+
+import org.apache.jena.arq.querybuilder.AbstractQueryBuilder;
+import org.apache.jena.arq.querybuilder.SelectBuilder;
+import org.apache.jena.graph.NodeFactory;
+import org.apache.jena.graph.Triple;
+import org.apache.jena.graph.impl.LiteralLabelFactory;
+import org.apache.jena.query.Query;
+import org.apache.jena.sparql.core.Var;
+import org.apache.jena.sparql.expr.E_Random;
+import org.apache.jena.sparql.lang.sparql_11.ParseException;
+import org.apache.jena.sparql.syntax.Element;
+import org.apache.jena.sparql.syntax.ElementGroup;
+import org.apache.jena.sparql.syntax.ElementTriplesBlock;
+import org.junit.After;
+
+import static org.junit.Assert.*;
+
+import org.xenei.junit.contract.Contract;
+import org.xenei.junit.contract.ContractTest;
+import org.xenei.junit.contract.IProducer;
 
 @Contract(WhereClause.class)
 public class WhereClauseTest<T extends WhereClause<?>> extends
@@ -54,20 +64,22 @@ public class WhereClauseTest<T extends WhereClause<?>> extends
 	@ContractTest
 	public void testAddWhereStrings() {
 		WhereClause<?> whereClause = getProducer().newInstance();
-		AbstractQueryBuilder<?> builder = whereClause.addWhere("<one>", "<two>", "three");
+		AbstractQueryBuilder<?> builder = whereClause.addWhere("<one>",
+				"<two>", "three");
 		assertContainsRegex(WHERE + OPEN_CURLY + node("one") + SPACE
-				+ node("two") + SPACE + quote("three") + presentStringType() + OPT_SPACE
-				+ DOT + CLOSE_CURLY, builder.buildString());
+				+ node("two") + SPACE + quote("three") + presentStringType()
+				+ OPT_SPACE + DOT + CLOSE_CURLY, builder.buildString());
 	}
 
 	@ContractTest
 	public void testAddOptionalString() {
 		WhereClause<?> whereClause = getProducer().newInstance();
-		AbstractQueryBuilder<?> builder = whereClause.addOptional("<one>", "<two>", "three");
+		AbstractQueryBuilder<?> builder = whereClause.addOptional("<one>",
+				"<two>", "three");
 		assertContainsRegex(WHERE + OPEN_CURLY + "OPTIONAL" + SPACE
 				+ OPEN_CURLY + node("one") + SPACE + node("two") + SPACE
-				+ quote("three") + presentStringType() + OPT_SPACE
-				+ DOT + CLOSE_CURLY + CLOSE_CURLY, builder.buildString());
+				+ quote("three") + presentStringType() + OPT_SPACE + DOT
+				+ CLOSE_CURLY + CLOSE_CURLY, builder.buildString());
 
 	}
 
@@ -75,8 +87,7 @@ public class WhereClauseTest<T extends WhereClause<?>> extends
 	public void testAddOptionalObjects() {
 		WhereClause<?> whereClause = getProducer().newInstance();
 		AbstractQueryBuilder<?> builder = whereClause.addOptional(
-				NodeFactory.createURI("one"), 
-				NodeFactory.createURI("two"),
+				NodeFactory.createURI("one"), NodeFactory.createURI("two"),
 				NodeFactory.createURI("three"));
 		assertContainsRegex(WHERE + OPEN_CURLY + "OPTIONAL" + SPACE
 				+ OPEN_CURLY + node("one") + SPACE + node("two") + SPACE
@@ -135,8 +146,8 @@ public class WhereClauseTest<T extends WhereClause<?>> extends
 		assertContainsRegex(PREFIX + "pfx:" + SPACE + node("uri") + ".+"
 				+ UNION + OPEN_CURLY + SELECT + var("x") + SPACE + WHERE
 				+ OPEN_CURLY + node("one") + SPACE + node("two") + SPACE
-				+ quote("three") + presentStringType() + OPT_SPACE
-				+ DOT + CLOSE_CURLY + CLOSE_CURLY, builder.buildString());
+				+ quote("three") + presentStringType() + OPT_SPACE + DOT
+				+ CLOSE_CURLY + CLOSE_CURLY, builder.buildString());
 
 	}
 
@@ -172,15 +183,14 @@ public class WhereClauseTest<T extends WhereClause<?>> extends
 
 	@ContractTest
 	public void testSetVarsInFilter() throws ParseException {
-		Var v = Var.alloc("v");
 		WhereClause<?> whereClause = getProducer().newInstance();
 		AbstractQueryBuilder<?> builder = whereClause.addFilter("?one < ?v");
 		assertContainsRegex(WHERE + OPEN_CURLY + "FILTER" + OPT_SPACE
 				+ OPEN_PAREN + var("one") + OPT_SPACE + LT + OPT_SPACE
 				+ var("v") + CLOSE_PAREN + CLOSE_CURLY, builder.buildString());
 
-		builder.setVar(Var.alloc("v"),
-				NodeFactory.createLiteral(LiteralLabelFactory.createTypedLiteral(10)));
+		builder.setVar(Var.alloc("v"), NodeFactory
+				.createLiteral(LiteralLabelFactory.createTypedLiteral(10)));
 
 		assertContainsRegex(WHERE + OPEN_CURLY + "FILTER" + OPT_SPACE
 				+ OPEN_PAREN + var("one") + OPT_SPACE + LT + OPT_SPACE
@@ -242,4 +252,46 @@ public class WhereClauseTest<T extends WhereClause<?>> extends
 				+ node("one") + ".+" + node("two") + ".+" + node("three")
 				+ ".+" + CLOSE_CURLY, builder.buildString());
 	}
+
+	@ContractTest
+	public void testBindStringVar() throws ParseException {
+		Var v = Var.alloc("foo");
+		WhereClause<?> whereClause = getProducer().newInstance();
+		AbstractQueryBuilder<?> builder = whereClause.addBind("rand()", v);
+
+		assertContainsRegex(
+				OPEN_CURLY + BIND + OPEN_PAREN + "rand\\(\\)" + SPACE + "AS"
+						+ SPACE + var("foo") + CLOSE_PAREN + CLOSE_CURLY,
+				builder.buildString());
+		builder.setVar(v, NodeFactory.createURI("three"));
+		Query q = builder.build();
+		ElementGroup eg = (ElementGroup) q.getQueryPattern();
+		List<Element> lst = eg.getElements();
+		assertEquals( "Should only be one element",  1, lst.size());
+		assertTrue( "Should have an ElementTriplesBlock", lst.get(0) instanceof ElementTriplesBlock );
+		ElementTriplesBlock etb = (ElementTriplesBlock)lst.get(0);
+		assertTrue( "ElementGroup should be empty", etb.isEmpty() );
+	}
+
+	@ContractTest
+	public void testBindExprVar() throws ParseException {
+		Var v = Var.alloc("foo");
+		WhereClause<?> whereClause = getProducer().newInstance();
+		AbstractQueryBuilder<?> builder = whereClause
+				.addBind(new E_Random(), v);
+
+		assertContainsRegex(
+				OPEN_CURLY + BIND + OPEN_PAREN + "rand\\(\\)" + SPACE + "AS"
+						+ SPACE + var("foo") + CLOSE_PAREN + CLOSE_CURLY,
+				builder.buildString());
+		
+		builder.setVar(v, NodeFactory.createURI("three"));
+		Query q = builder.build();
+		ElementGroup eg = (ElementGroup) q.getQueryPattern();
+		List<Element> lst = eg.getElements();
+		assertEquals( "Should only be one element",  1, lst.size());
+		assertTrue( "Should have an ElementTriplesBlock", lst.get(0) instanceof ElementTriplesBlock );
+		ElementTriplesBlock etb = (ElementTriplesBlock)lst.get(0);
+		assertTrue( "ElementGroup should be empty", etb.isEmpty() );
+	}
 }

http://git-wip-us.apache.org/repos/asf/jena/blob/b03ce37b/jena-extras/jena-querybuilder/src/test/java/org/apache/jena/arq/querybuilder/handlers/WhereHandlerTest.java
----------------------------------------------------------------------
diff --git a/jena-extras/jena-querybuilder/src/test/java/org/apache/jena/arq/querybuilder/handlers/WhereHandlerTest.java b/jena-extras/jena-querybuilder/src/test/java/org/apache/jena/arq/querybuilder/handlers/WhereHandlerTest.java
index 08c5147..678630a 100644
--- a/jena-extras/jena-querybuilder/src/test/java/org/apache/jena/arq/querybuilder/handlers/WhereHandlerTest.java
+++ b/jena-extras/jena-querybuilder/src/test/java/org/apache/jena/arq/querybuilder/handlers/WhereHandlerTest.java
@@ -29,6 +29,7 @@ import org.apache.jena.graph.impl.LiteralLabelFactory;
 import org.apache.jena.query.Query;
 import org.apache.jena.rdf.model.ResourceFactory;
 import org.apache.jena.sparql.core.Var;
+import org.apache.jena.sparql.expr.E_Random;
 import org.apache.jena.sparql.lang.sparql_11.ParseException;
 import org.apache.jena.vocabulary.RDF;
 import org.junit.Before;
@@ -303,4 +304,25 @@ public class WhereHandlerTest extends AbstractHandlerTest {
 				+ ".+" + CLOSE_CURLY, query.toString());
 	}
 
+	@Test
+	public void testBindStringVar() throws ParseException {
+		Var v = Var.alloc("foo");
+		handler.addBind("rand()", v);
+
+		assertContainsRegex(
+				OPEN_CURLY + BIND + OPEN_PAREN + "rand\\(\\)" + SPACE + "AS"
+						+ SPACE + var("foo") + CLOSE_PAREN + CLOSE_CURLY,
+				query.toString());
+	}
+
+	@Test
+	public void testBindExprVar() throws ParseException {
+		Var v = Var.alloc("foo");
+		handler.addBind(new E_Random(), v);
+
+		assertContainsRegex(
+				OPEN_CURLY + BIND + OPEN_PAREN + "rand\\(\\)" + SPACE + "AS"
+						+ SPACE + var("foo") + CLOSE_PAREN + CLOSE_CURLY,
+				query.toString());
+	}
 }