1803 fix (#656)
* Added addWhere( AbstractQueryBuilder )
* simplified code
* updated javadoc
* removed unused imports
* updated javadoc
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 e4e79db..6a261b9 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
@@ -64,9 +64,13 @@
public abstract class AbstractQueryBuilder<T extends AbstractQueryBuilder<T>>
implements Cloneable, PrologClause<T>, ValuesClause<T> {
- // the query this builder is building
+ /**
+ * the query this builder is building
+ */
protected Query query;
- // a map of vars to nodes for replacement during build.
+ /**
+ * a map of vars to nodes for replacement during build.
+ */
private final Map<Var, Node> values;
/**
@@ -90,6 +94,12 @@
return makeNode( o, query.getPrefixMapping() );
}
+ /**
+ * Make a node or path from the object using the query prefix mapping.
+ * @param o the object to make the node or path from.
+ * @return A node or path.
+ * @see #makeNodeOrPath(Object, PrefixMapping)
+ */
private Object makeNodeOrPath(Object o)
{
return makeNodeOrPath(o, query.getPrefixMapping() );
@@ -346,10 +356,26 @@
return getHandlerBlock().getValueHandler();
}
+ /**
+ * Gets the where handler used by this QueryBuilder.
+ * @return the where handler used by this QueryBuilder.
+ */
public final WhereHandler getWhereHandler() {
return getHandlerBlock().getWhereHandler();
}
-
+
+ /**
+ * Adds the contents of the whereClause to the where clause of this
+ * builder.
+ * @param whereClause the where clause to add.
+ * @return this builder for chaining.
+ */
+ @SuppressWarnings("unchecked")
+ public final T addWhere( AbstractQueryBuilder<?> whereClause) {
+ getWhereHandler().addAll( whereClause.getWhereHandler());
+ return (T) this;
+ }
+
@Override
public final ExprFactory getExprFactory() {
return getHandlerBlock().getPrologHandler().getExprFactory();
@@ -435,6 +461,12 @@
// --- VALUES
+ /**
+ * Creates a collection of nodes from an iterator of Objects.
+ * @param iter the iterator of objects, may be null or empty.
+ * @param prefixMapping the PrefixMapping to use when nodes are created.
+ * @return a Collection of nodes or null if iter is null or empty.
+ */
public static Collection<Node> makeValueNodes( Iterator<?> iter, PrefixMapping prefixMapping )
{
if (iter == null || !iter.hasNext())
@@ -457,6 +489,12 @@
return values;
}
+ /**
+ * Creates a collection of nodes from an iterator of Objects.
+ * Uses the prefix mapping from the PrologHandler.
+ * @param iter the iterator of objects, may be null or empty.
+ * @return a Collection of nodes or null if iter is null or empty.
+ */
public Collection<Node> makeValueNodes( Iterator<?> iter )
{
return makeValueNodes( iter, getPrologHandler().getPrefixes() );
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 38e5b62..9a90c04 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
@@ -23,6 +23,7 @@
import org.apache.jena.arq.querybuilder.AbstractQueryBuilder;
import org.apache.jena.arq.querybuilder.ExprFactory;
+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.Node;
@@ -85,6 +86,15 @@
public T addWhere(Object s, Object p, Object o);
/**
+ * Adds the elements from the whereClause to this where Clause.
+ *
+ * @param whereClause
+ * The whereClause to add to this statement.
+ * @return This Builder for chaining.
+ */
+ public T addWhere( AbstractQueryBuilder<?> whereClause);
+
+ /**
* Add a variable or variable and values to the value statement.
*
* The first var (or first item in a collection) is converted to a variable using
diff --git a/jena-extras/jena-querybuilder/src/main/java/org/apache/jena/arq/querybuilder/updatebuilder/CollectionQuadHolder.java b/jena-extras/jena-querybuilder/src/main/java/org/apache/jena/arq/querybuilder/updatebuilder/CollectionQuadHolder.java
index e9116a5..10cc511 100644
--- a/jena-extras/jena-querybuilder/src/main/java/org/apache/jena/arq/querybuilder/updatebuilder/CollectionQuadHolder.java
+++ b/jena-extras/jena-querybuilder/src/main/java/org/apache/jena/arq/querybuilder/updatebuilder/CollectionQuadHolder.java
@@ -95,8 +95,7 @@
if (n.isVariable())
{
Var v = Var.alloc(n);
- Node n2 = values.get( n );
- return n2==null?n:n2;
+ return values.getOrDefault(v, n);
}
return n;
}
diff --git a/jena-extras/jena-querybuilder/src/test/java/org/apache/jena/arq/querybuilder/AbstractQueryBuilderTest.java b/jena-extras/jena-querybuilder/src/test/java/org/apache/jena/arq/querybuilder/AbstractQueryBuilderTest.java
index 2af2e50..74ca337 100644
--- a/jena-extras/jena-querybuilder/src/test/java/org/apache/jena/arq/querybuilder/AbstractQueryBuilderTest.java
+++ b/jena-extras/jena-querybuilder/src/test/java/org/apache/jena/arq/querybuilder/AbstractQueryBuilderTest.java
@@ -108,6 +108,9 @@
assertEquals( "foo", n.getName());
assertTrue( n instanceof Var );
+ n = builder.makeNode( "'text'@en");
+ assertEquals( "text", n.getLiteralLexicalForm());
+ assertEquals( "en", n.getLiteralLanguage());
}
@Test
@@ -168,4 +171,5 @@
assertTrue( result.contains(NodeFactory.createURI("one")));
}
+
}
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 d233ff5..fa01d61 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
@@ -24,6 +24,7 @@
import org.apache.jena.arq.querybuilder.AbstractQueryBuilder;
import org.apache.jena.arq.querybuilder.SelectBuilder;
+import org.apache.jena.arq.querybuilder.WhereBuilder;
import org.apache.jena.arq.querybuilder.WhereValidator;
import org.apache.jena.graph.FrontsTriple;
import org.apache.jena.graph.Node;
@@ -58,7 +59,6 @@
import org.apache.jena.sparql.syntax.ElementUnion;
import org.apache.jena.vocabulary.RDF;
import org.junit.After;
-
import static org.junit.Assert.*;
import org.xenei.junit.contract.Contract;
@@ -101,6 +101,24 @@
builder.build().getQueryPattern().visit( visitor );
assertTrue( visitor.matching );
}
+
+ @ContractTest
+ public void testAddWhereWhereClause() {
+ WhereBuilder whereBuilder = new WhereBuilder()
+ .addWhere(new TriplePath(new Triple(NodeFactory.createURI("one"), NodeFactory.createURI("two"),
+ NodeFactory.createURI("three"))));
+
+ WhereClause<?> whereClause = getProducer().newInstance();
+ AbstractQueryBuilder<?> builder = whereClause.addWhere( whereBuilder );
+
+ ElementPathBlock epb = new ElementPathBlock();
+ Triple t = new Triple( NodeFactory.createURI("one"), NodeFactory.createURI("two"), NodeFactory.createURI("three") );
+ epb.addTriple( t );
+
+ WhereValidator visitor = new WhereValidator( epb );
+ builder.build().getQueryPattern().visit( visitor );
+ assertTrue( visitor.matching );
+ }
@ContractTest
public void testAddOptionalString() {