You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jena.apache.org by cl...@apache.org on 2016/03/06 15:17:20 UTC
jena git commit: Changes for JENA-1144
Repository: jena
Updated Branches:
refs/heads/master bb30cae54 -> e8b771b7f
Changes for JENA-1144
refactored handlers
Added AggregationHandler
Added HandlerBlock to consistently handle dependencies between handlers.
Project: http://git-wip-us.apache.org/repos/asf/jena/repo
Commit: http://git-wip-us.apache.org/repos/asf/jena/commit/e8b771b7
Tree: http://git-wip-us.apache.org/repos/asf/jena/tree/e8b771b7
Diff: http://git-wip-us.apache.org/repos/asf/jena/diff/e8b771b7
Branch: refs/heads/master
Commit: e8b771b7fcd040e29d055cc0864ebdce290bf09e
Parents: bb30cae
Author: Claude Warren <cl...@apache.org>
Authored: Sun Mar 6 14:15:48 2016 +0000
Committer: Claude Warren <cl...@apache.org>
Committed: Sun Mar 6 14:15:48 2016 +0000
----------------------------------------------------------------------
.../arq/querybuilder/AbstractQueryBuilder.java | 89 +++--------
.../jena/arq/querybuilder/AskBuilder.java | 77 +++++----
.../jena/arq/querybuilder/ConstructBuilder.java | 81 +++++-----
.../jena/arq/querybuilder/SelectBuilder.java | 91 +++++------
.../handlers/AggregationHandler.java | 78 +++++++++
.../arq/querybuilder/handlers/HandlerBlock.java | 158 +++++++++++++++++++
.../querybuilder/handlers/PrologHandler.java | 12 ++
.../querybuilder/handlers/SelectHandler.java | 23 ++-
.../arq/querybuilder/handlers/WhereHandler.java | 48 +++---
.../querybuilder/rewriters/ElementRewriter.java | 4 +-
.../querybuilder/AbstractQueryBuilderTest.java | 17 ++
.../arq/querybuilder/SelectBuilderTest.java | 78 +++++++++
.../querybuilder/clauses/WhereClauseTest.java | 2 +-
.../handlers/SelectHandlerTest.java | 9 +-
14 files changed, 534 insertions(+), 233 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/jena/blob/e8b771b7/jena-extras/jena-querybuilder/src/main/java/org/apache/jena/arq/querybuilder/AbstractQueryBuilder.java
----------------------------------------------------------------------
diff --git a/jena-extras/jena-querybuilder/src/main/java/org/apache/jena/arq/querybuilder/AbstractQueryBuilder.java b/jena-extras/jena-querybuilder/src/main/java/org/apache/jena/arq/querybuilder/AbstractQueryBuilder.java
index b05fc4e..f366d85 100644
--- a/jena-extras/jena-querybuilder/src/main/java/org/apache/jena/arq/querybuilder/AbstractQueryBuilder.java
+++ b/jena-extras/jena-querybuilder/src/main/java/org/apache/jena/arq/querybuilder/AbstractQueryBuilder.java
@@ -27,9 +27,11 @@ import org.apache.jena.arq.querybuilder.clauses.PrologClause;
import org.apache.jena.arq.querybuilder.clauses.SelectClause;
import org.apache.jena.arq.querybuilder.clauses.SolutionModifierClause;
import org.apache.jena.arq.querybuilder.clauses.WhereClause;
+import org.apache.jena.arq.querybuilder.handlers.AggregationHandler;
import org.apache.jena.arq.querybuilder.handlers.ConstructHandler;
import org.apache.jena.arq.querybuilder.handlers.DatasetHandler;
import org.apache.jena.arq.querybuilder.handlers.Handler;
+import org.apache.jena.arq.querybuilder.handlers.HandlerBlock;
import org.apache.jena.arq.querybuilder.handlers.PrologHandler;
import org.apache.jena.arq.querybuilder.handlers.SelectHandler;
import org.apache.jena.arq.querybuilder.handlers.SolutionModifierHandler;
@@ -58,8 +60,6 @@ import org.apache.jena.sparql.util.NodeFactoryExtra ;
public abstract class AbstractQueryBuilder<T extends AbstractQueryBuilder<T>>
implements Cloneable, PrologClause<T> {
- // all queries have prologs
- protected PrologHandler prologHandler;
// the query this builder is building
protected Query query;
// a map of vars to nodes for replacement during build.
@@ -175,9 +175,16 @@ public abstract class AbstractQueryBuilder<T extends AbstractQueryBuilder<T>>
*/
protected AbstractQueryBuilder() {
query = new Query();
- prologHandler = new PrologHandler(query);
values = new HashMap<Var, Node>();
}
+
+ public abstract HandlerBlock getHandlerBlock();
+
+
+ public final PrologHandler getPrologHandler() {
+ return getHandlerBlock().getPrologHandler();
+ }
+
/**
* Set a variable replacement. During build all instances of var in the
@@ -221,11 +228,6 @@ public abstract class AbstractQueryBuilder<T extends AbstractQueryBuilder<T>>
}
@Override
- public PrologHandler getPrologHandler() {
- return prologHandler;
- }
-
- @Override
public T addPrefix(String pfx, Resource uri) {
return addPrefix(pfx, uri.getURI());
}
@@ -238,21 +240,21 @@ public abstract class AbstractQueryBuilder<T extends AbstractQueryBuilder<T>>
@SuppressWarnings("unchecked")
@Override
public T addPrefix(String pfx, String uri) {
- prologHandler.addPrefix(pfx, uri);
+ getPrologHandler().addPrefix(pfx, uri);
return (T) this;
}
@SuppressWarnings("unchecked")
@Override
public T addPrefixes(Map<String, String> prefixes) {
- prologHandler.addPrefixes(prefixes);
+ getPrologHandler().addPrefixes(prefixes);
return (T) this;
}
@SuppressWarnings("unchecked")
@Override
public T setBase(String base) {
- prologHandler.setBase(base);
+ getPrologHandler().setBase(base);
return (T) this;
}
@@ -303,51 +305,17 @@ public abstract class AbstractQueryBuilder<T extends AbstractQueryBuilder<T>>
throw new IllegalStateException( "Internal query is not a known type: "+q.getQueryType());
}
- Stack<Handler> handlerStack = new Stack<Handler>();
- PrologHandler ph = new PrologHandler(q);
- handlerStack.push(ph);
- ph.addAll(prologHandler);
- ph.setVars(values);
- if (this instanceof SelectClause) {
- SelectHandler sh = new SelectHandler(q);
- sh.addAll(((SelectClause<?>) this).getSelectHandler());
- sh.setVars(values);
- handlerStack.push(sh);
- }
- if (this instanceof ConstructClause) {
- ConstructHandler ch = new ConstructHandler(q);
- ch.addAll(((ConstructClause<?>) this).getConstructHandler());
- ch.setVars(values);
- handlerStack.push(ch);
- }
- if (this instanceof DatasetClause) {
- DatasetHandler dh = new DatasetHandler(q);
- dh.addAll(((DatasetClause<?>) this).getDatasetHandler());
- dh.setVars(values);
- handlerStack.push(dh);
- }
- if (this instanceof SolutionModifierClause) {
- SolutionModifierHandler smh = new SolutionModifierHandler(q);
- smh.addAll(((SolutionModifierClause<?>) this)
- .getSolutionModifierHandler());
- smh.setVars(values);
- handlerStack.push(smh);
- }
- if (this instanceof WhereClause) {
- WhereHandler wh = new WhereHandler(q);
- wh.addAll(((WhereClause<?>) this).getWhereHandler());
- wh.setVars(values);
- handlerStack.push(wh);
- }
-
+ HandlerBlock handlerBlock = new HandlerBlock(q);
+ handlerBlock.addAll( getHandlerBlock() );
+ handlerBlock.setVars(values);
+
// make sure we have a query pattern before we start building.
if (q.getQueryPattern() == null)
{
q.setQueryPattern( new ElementGroup() );
}
- while (!handlerStack.isEmpty()) {
- handlerStack.pop().build();
- }
+
+ handlerBlock.build();
return q;
}
@@ -378,13 +346,10 @@ public abstract class AbstractQueryBuilder<T extends AbstractQueryBuilder<T>>
retval.setQueryConstructType();
}
- new PrologHandler(retval).addAll(new PrologHandler(q2));
- new ConstructHandler(retval).addAll(new ConstructHandler(q2));
- new DatasetHandler(retval).addAll(new DatasetHandler(q2));
- new SolutionModifierHandler(retval).addAll(new SolutionModifierHandler(
- q2));
- new WhereHandler(retval).addAll(new WhereHandler(q2));
- new SelectHandler(retval).addAll(new SelectHandler(q2));
+ HandlerBlock hb = new HandlerBlock( retval );
+ HandlerBlock hb2 = new HandlerBlock( q2 );
+ hb.addAll(hb2);
+
return retval;
}
@@ -398,12 +363,8 @@ public abstract class AbstractQueryBuilder<T extends AbstractQueryBuilder<T>>
* @return The new query with the specified vars replaced.
*/
public static Query rewrite(Query q2, Map<Var, Node> values) {
- new PrologHandler(q2).setVars(values);
- new ConstructHandler(q2).setVars(values);
- new DatasetHandler(q2).setVars(values);
- new SolutionModifierHandler(q2).setVars(values);
- new WhereHandler(q2).setVars(values);
- new SelectHandler(q2).setVars(values);
+ HandlerBlock hb = new HandlerBlock(q2);
+ hb.setVars(values);
return q2;
}
}
http://git-wip-us.apache.org/repos/asf/jena/blob/e8b771b7/jena-extras/jena-querybuilder/src/main/java/org/apache/jena/arq/querybuilder/AskBuilder.java
----------------------------------------------------------------------
diff --git a/jena-extras/jena-querybuilder/src/main/java/org/apache/jena/arq/querybuilder/AskBuilder.java b/jena-extras/jena-querybuilder/src/main/java/org/apache/jena/arq/querybuilder/AskBuilder.java
index 1e2c437..064a995 100644
--- a/jena-extras/jena-querybuilder/src/main/java/org/apache/jena/arq/querybuilder/AskBuilder.java
+++ b/jena-extras/jena-querybuilder/src/main/java/org/apache/jena/arq/querybuilder/AskBuilder.java
@@ -23,6 +23,8 @@ import org.apache.jena.arq.querybuilder.clauses.DatasetClause;
import org.apache.jena.arq.querybuilder.clauses.SolutionModifierClause;
import org.apache.jena.arq.querybuilder.clauses.WhereClause;
import org.apache.jena.arq.querybuilder.handlers.DatasetHandler;
+import org.apache.jena.arq.querybuilder.handlers.HandlerBlock;
+import org.apache.jena.arq.querybuilder.handlers.PrologHandler;
import org.apache.jena.arq.querybuilder.handlers.SolutionModifierHandler;
import org.apache.jena.arq.querybuilder.handlers.WhereHandler;
import org.apache.jena.graph.FrontsTriple ;
@@ -38,12 +40,8 @@ import org.apache.jena.sparql.lang.sparql_11.ParseException ;
public class AskBuilder extends AbstractQueryBuilder<AskBuilder> implements
DatasetClause<AskBuilder>, WhereClause<AskBuilder>,
SolutionModifierClause<AskBuilder> {
- // the dataset handler
- private final DatasetHandler datasetHandler;
- // the where handler.
- private final WhereHandler whereHandler;
- // the solution modifier handler.
- private final SolutionModifierHandler solutionModifier;
+
+ private final HandlerBlock handlerBlock;
/**
* The constructor
@@ -51,63 +49,65 @@ public class AskBuilder extends AbstractQueryBuilder<AskBuilder> implements
public AskBuilder() {
super();
query.setQueryAskType();
- datasetHandler = new DatasetHandler(query);
- whereHandler = new WhereHandler(query);
- solutionModifier = new SolutionModifierHandler(query);
+ handlerBlock = new HandlerBlock( query );
}
-
+
+ @Override
+ public HandlerBlock getHandlerBlock()
+ {
+ return handlerBlock;
+ }
+
@Override
public DatasetHandler getDatasetHandler() {
- return datasetHandler;
+ return handlerBlock.getDatasetHandler();
}
@Override
public WhereHandler getWhereHandler() {
- return whereHandler;
+ return handlerBlock.getWhereHandler();
}
@Override
public AskBuilder clone() {
AskBuilder qb = new AskBuilder();
- qb.prologHandler.addAll(prologHandler);
- qb.datasetHandler.addAll(datasetHandler);
- qb.solutionModifier.addAll(solutionModifier);
+ qb.handlerBlock.addAll( handlerBlock );
return qb;
}
@Override
public AskBuilder fromNamed(String graphName) {
- datasetHandler.fromNamed(graphName);
+ getDatasetHandler().fromNamed(graphName);
return this;
}
@Override
public AskBuilder fromNamed(Collection<String> graphNames) {
- datasetHandler.fromNamed(graphNames);
+ getDatasetHandler().fromNamed(graphNames);
return this;
}
@Override
public AskBuilder from(String graphName) {
- datasetHandler.from(graphName);
+ getDatasetHandler().from(graphName);
return this;
}
@Override
public AskBuilder from(Collection<String> graphName) {
- datasetHandler.from(graphName);
+ getDatasetHandler().from(graphName);
return this;
}
@Override
public AskBuilder addWhere(Triple t) {
- whereHandler.addWhere(t);
+ getWhereHandler().addWhere(t);
return this;
}
@Override
public AskBuilder addWhere(FrontsTriple t) {
- whereHandler.addWhere(t.asTriple());
+ getWhereHandler().addWhere(t.asTriple());
return this;
}
@@ -119,20 +119,20 @@ public class AskBuilder extends AbstractQueryBuilder<AskBuilder> implements
@Override
public AskBuilder addOptional(Triple t) {
- whereHandler.addOptional(t);
+ getWhereHandler().addOptional(t);
return this;
}
@Override
public AskBuilder addOptional(SelectBuilder t)
{
- whereHandler.addOptional(t.getWhereHandler());
+ getWhereHandler().addOptional(t.getWhereHandler());
return this;
}
@Override
public AskBuilder addOptional(FrontsTriple t) {
- whereHandler.addOptional(t.asTriple());
+ getWhereHandler().addOptional(t.asTriple());
return this;
}
@@ -144,78 +144,77 @@ public class AskBuilder extends AbstractQueryBuilder<AskBuilder> implements
@Override
public AskBuilder addFilter(String s) throws ParseException {
- whereHandler.addFilter(s);
+ getWhereHandler().addFilter(s);
return this;
}
@Override
public AskBuilder addSubQuery(SelectBuilder subQuery) {
- prologHandler.addAll(subQuery.getPrologHandler());
- whereHandler.addSubQuery(subQuery);
+ getWhereHandler().addSubQuery(subQuery);
return this;
}
@Override
public AskBuilder addUnion(SelectBuilder subQuery) {
- whereHandler.addUnion(subQuery);
+ getWhereHandler().addUnion(subQuery);
return this;
}
@Override
public AskBuilder addGraph(Object graph, SelectBuilder subQuery) {
- prologHandler.addAll(subQuery.getPrologHandler());
- whereHandler.addGraph(makeNode(graph), subQuery.getWhereHandler());
+ getPrologHandler().addAll(subQuery.getPrologHandler());
+ getWhereHandler().addGraph(makeNode(graph), subQuery.getWhereHandler());
return this;
}
@Override
public AskBuilder addBind(Expr expression, Object var) {
- whereHandler.addBind( expression, makeVar(var) );
+ getWhereHandler().addBind( expression, makeVar(var) );
return this;
}
@Override
public AskBuilder addBind(String expression, Object var) throws ParseException {
- whereHandler.addBind( expression, makeVar(var) );
+ getWhereHandler().addBind( expression, makeVar(var) );
return this;
}
@Override
public AskBuilder addOrderBy(String orderBy) {
- solutionModifier.addOrderBy(orderBy);
+ getSolutionModifierHandler().addOrderBy(orderBy);
return this;
}
@Override
public AskBuilder addGroupBy(String groupBy) {
- solutionModifier.addGroupBy(groupBy);
+ getSolutionModifierHandler().addGroupBy(groupBy);
return this;
}
@Override
public AskBuilder addHaving(String having) throws ParseException {
- solutionModifier.addHaving(having);
+ getSolutionModifierHandler().addHaving(having);
return this;
}
@Override
public AskBuilder setLimit(int limit) {
- solutionModifier.setLimit(limit);
+ getSolutionModifierHandler().setLimit(limit);
return this;
}
@Override
public AskBuilder setOffset(int offset) {
- solutionModifier.setOffset(offset);
+ getSolutionModifierHandler().setOffset(offset);
return this;
}
@Override
public SolutionModifierHandler getSolutionModifierHandler() {
- return solutionModifier;
+ return handlerBlock.getModifierHandler();
}
@Override
public Node list(Object... objs) {
- return whereHandler.list(objs);
+ return getWhereHandler().list(objs);
}
}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/jena/blob/e8b771b7/jena-extras/jena-querybuilder/src/main/java/org/apache/jena/arq/querybuilder/ConstructBuilder.java
----------------------------------------------------------------------
diff --git a/jena-extras/jena-querybuilder/src/main/java/org/apache/jena/arq/querybuilder/ConstructBuilder.java b/jena-extras/jena-querybuilder/src/main/java/org/apache/jena/arq/querybuilder/ConstructBuilder.java
index 034fdef..51b861b 100644
--- a/jena-extras/jena-querybuilder/src/main/java/org/apache/jena/arq/querybuilder/ConstructBuilder.java
+++ b/jena-extras/jena-querybuilder/src/main/java/org/apache/jena/arq/querybuilder/ConstructBuilder.java
@@ -25,6 +25,8 @@ import org.apache.jena.arq.querybuilder.clauses.SolutionModifierClause;
import org.apache.jena.arq.querybuilder.clauses.WhereClause;
import org.apache.jena.arq.querybuilder.handlers.ConstructHandler;
import org.apache.jena.arq.querybuilder.handlers.DatasetHandler;
+import org.apache.jena.arq.querybuilder.handlers.HandlerBlock;
+import org.apache.jena.arq.querybuilder.handlers.PrologHandler;
import org.apache.jena.arq.querybuilder.handlers.SolutionModifierHandler;
import org.apache.jena.arq.querybuilder.handlers.WhereHandler;
import org.apache.jena.graph.FrontsTriple ;
@@ -43,118 +45,112 @@ public class ConstructBuilder extends AbstractQueryBuilder<ConstructBuilder>
SolutionModifierClause<ConstructBuilder>,
ConstructClause<ConstructBuilder> {
- // the handlers used by this builder
- private final DatasetHandler datasetHandler;
- private final WhereHandler whereHandler;
- private final SolutionModifierHandler solutionModifier;
- private final ConstructHandler constructHandler;
-
+ private final HandlerBlock handlerBlock;
/**
* Constructor
*/
public ConstructBuilder() {
super();
query.setQueryConstructType();
- datasetHandler = new DatasetHandler(query);
- whereHandler = new WhereHandler(query);
- solutionModifier = new SolutionModifierHandler(query);
- constructHandler = new ConstructHandler(query);
+ handlerBlock = new HandlerBlock(query);
}
@Override
public DatasetHandler getDatasetHandler() {
- return datasetHandler;
+ return handlerBlock.getDatasetHandler();
}
@Override
public WhereHandler getWhereHandler() {
- return whereHandler;
+ return handlerBlock.getWhereHandler();
}
@Override
public ConstructHandler getConstructHandler() {
- return constructHandler;
+ return handlerBlock.getConstructHandler();
}
@Override
public SolutionModifierHandler getSolutionModifierHandler() {
- return solutionModifier;
+ return handlerBlock.getModifierHandler();
}
@Override
+ public HandlerBlock getHandlerBlock()
+ {
+ return handlerBlock;
+ }
+
+ @Override
public ConstructBuilder clone() {
ConstructBuilder qb = new ConstructBuilder();
- qb.prologHandler.addAll(prologHandler);
- qb.datasetHandler.addAll(datasetHandler);
- qb.whereHandler.addAll(whereHandler);
- qb.solutionModifier.addAll(solutionModifier);
- qb.constructHandler.addAll(constructHandler);
+ qb.handlerBlock.addAll( handlerBlock );
return qb;
}
@Override
public ConstructBuilder fromNamed(String graphName) {
- datasetHandler.fromNamed(graphName);
+ getDatasetHandler().fromNamed(graphName);
return this;
}
@Override
public ConstructBuilder fromNamed(Collection<String> graphNames) {
- datasetHandler.fromNamed(graphNames);
+ getDatasetHandler().fromNamed(graphNames);
return this;
}
@Override
public ConstructBuilder from(String graphName) {
- datasetHandler.from(graphName);
+ getDatasetHandler().from(graphName);
return this;
}
@Override
public ConstructBuilder from(Collection<String> graphName) {
- datasetHandler.from(graphName);
+ getDatasetHandler().from(graphName);
return this;
}
@Override
public ConstructBuilder addOrderBy(String orderBy) {
- solutionModifier.addOrderBy(orderBy);
+ getSolutionModifierHandler().addOrderBy(orderBy);
return this;
}
@Override
public ConstructBuilder addGroupBy(String groupBy) {
- solutionModifier.addGroupBy(groupBy);
+ getSolutionModifierHandler().addGroupBy(groupBy);
return this;
}
@Override
public ConstructBuilder addHaving(String having) throws ParseException {
- solutionModifier.addHaving(having);
+ getSolutionModifierHandler().addHaving(having);
return this;
}
@Override
public ConstructBuilder setLimit(int limit) {
- solutionModifier.setLimit(limit);
+ getSolutionModifierHandler().setLimit(limit);
return this;
}
@Override
public ConstructBuilder setOffset(int offset) {
- solutionModifier.setOffset(offset);
+ getSolutionModifierHandler().setOffset(offset);
return this;
}
@Override
public ConstructBuilder addWhere(Triple t) {
- whereHandler.addWhere(t);
+ getWhereHandler().addWhere(t);
return this;
}
@Override
public ConstructBuilder addWhere(FrontsTriple t) {
- whereHandler.addWhere(t.asTriple());
+ getWhereHandler().addWhere(t.asTriple());
return this;
}
@@ -166,20 +162,20 @@ public class ConstructBuilder extends AbstractQueryBuilder<ConstructBuilder>
@Override
public ConstructBuilder addOptional(Triple t) {
- whereHandler.addOptional(t);
+ getWhereHandler().addOptional(t);
return this;
}
@Override
public ConstructBuilder addOptional(SelectBuilder t)
{
- whereHandler.addOptional(t.getWhereHandler());
+ getWhereHandler().addOptional(t.getWhereHandler());
return this;
}
@Override
public ConstructBuilder addOptional(FrontsTriple t) {
- whereHandler.addOptional(t.asTriple());
+ getWhereHandler().addOptional(t.asTriple());
return this;
}
@@ -191,45 +187,44 @@ public class ConstructBuilder extends AbstractQueryBuilder<ConstructBuilder>
@Override
public ConstructBuilder addFilter(String s) throws ParseException {
- whereHandler.addFilter(s);
+ getWhereHandler().addFilter(s);
return this;
}
@Override
public ConstructBuilder addSubQuery(SelectBuilder subQuery) {
- prologHandler.addAll(subQuery.prologHandler);
- whereHandler.addSubQuery(subQuery);
+ getWhereHandler().addSubQuery(subQuery);
return this;
}
@Override
public ConstructBuilder addUnion(SelectBuilder subQuery) {
- whereHandler.addUnion(subQuery);
+ getWhereHandler().addUnion(subQuery);
return this;
}
@Override
public ConstructBuilder addGraph(Object graph, SelectBuilder subQuery) {
- prologHandler.addAll(subQuery.prologHandler);
- whereHandler.addGraph(makeNode(graph), subQuery.getWhereHandler());
+ getPrologHandler().addAll(subQuery.getPrologHandler());
+ getWhereHandler().addGraph(makeNode(graph), subQuery.getWhereHandler());
return this;
}
@Override
public ConstructBuilder addBind(Expr expression, Object var) {
- whereHandler.addBind( expression, makeVar(var) );
+ getWhereHandler().addBind( expression, makeVar(var) );
return this;
}
@Override
public ConstructBuilder addBind(String expression, Object var) throws ParseException {
- whereHandler.addBind( expression, makeVar(var) );
+ getWhereHandler().addBind( expression, makeVar(var) );
return this;
}
@Override
public ConstructBuilder addConstruct(Triple t) {
- constructHandler.addConstruct(t);
+ getConstructHandler().addConstruct(t);
return this;
}
@@ -245,6 +240,6 @@ public class ConstructBuilder extends AbstractQueryBuilder<ConstructBuilder>
@Override
public Node list(Object... objs) {
- return whereHandler.list(objs);
+ return getWhereHandler().list(objs);
}
}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/jena/blob/e8b771b7/jena-extras/jena-querybuilder/src/main/java/org/apache/jena/arq/querybuilder/SelectBuilder.java
----------------------------------------------------------------------
diff --git a/jena-extras/jena-querybuilder/src/main/java/org/apache/jena/arq/querybuilder/SelectBuilder.java b/jena-extras/jena-querybuilder/src/main/java/org/apache/jena/arq/querybuilder/SelectBuilder.java
index 12a909e..1c5d3ee 100644
--- a/jena-extras/jena-querybuilder/src/main/java/org/apache/jena/arq/querybuilder/SelectBuilder.java
+++ b/jena-extras/jena-querybuilder/src/main/java/org/apache/jena/arq/querybuilder/SelectBuilder.java
@@ -25,6 +25,8 @@ import org.apache.jena.arq.querybuilder.clauses.SelectClause;
import org.apache.jena.arq.querybuilder.clauses.SolutionModifierClause;
import org.apache.jena.arq.querybuilder.clauses.WhereClause;
import org.apache.jena.arq.querybuilder.handlers.DatasetHandler;
+import org.apache.jena.arq.querybuilder.handlers.HandlerBlock;
+import org.apache.jena.arq.querybuilder.handlers.PrologHandler;
import org.apache.jena.arq.querybuilder.handlers.SelectHandler;
import org.apache.jena.arq.querybuilder.handlers.SolutionModifierHandler;
import org.apache.jena.arq.querybuilder.handlers.WhereHandler;
@@ -45,60 +47,54 @@ public class SelectBuilder extends AbstractQueryBuilder<SelectBuilder>
SolutionModifierClause<SelectBuilder>, SelectClause<SelectBuilder> {
// the handlers.
- private DatasetHandler datasetHandler;
- private WhereHandler whereHandler;
- private SolutionModifierHandler solutionModifier;
- private SelectHandler selectHandler;
-
+ private final HandlerBlock handlerBlock;
/**
* Constructor.
*/
public SelectBuilder() {
super();
query.setQuerySelectType();
- datasetHandler = new DatasetHandler(query);
- whereHandler = new WhereHandler(query);
- solutionModifier = new SolutionModifierHandler(query);
- selectHandler = new SelectHandler(query);
+ handlerBlock = new HandlerBlock( query );
}
@Override
public DatasetHandler getDatasetHandler() {
- return datasetHandler;
+ return handlerBlock.getDatasetHandler();
}
@Override
+ public HandlerBlock getHandlerBlock()
+ {
+ return handlerBlock;
+ }
+
+ @Override
public WhereHandler getWhereHandler() {
- return whereHandler;
+ return handlerBlock.getWhereHandler();
}
@Override
public SelectBuilder clone() {
SelectBuilder qb = new SelectBuilder();
- qb.prologHandler.addAll(prologHandler);
- qb.datasetHandler.addAll(datasetHandler);
- qb.whereHandler.addAll(whereHandler);
- qb.solutionModifier.addAll(solutionModifier);
- qb.selectHandler.addAll(selectHandler);
-
+ qb.handlerBlock.addAll(handlerBlock);
return qb;
}
@Override
public SelectBuilder setDistinct(boolean state) {
- selectHandler.setDistinct(state);
+ getSelectHandler().setDistinct(state);
return this;
}
@Override
public SelectBuilder setReduced(boolean state) {
- selectHandler.setReduced(state);
+ getSelectHandler().setReduced(state);
return this;
}
@Override
public SelectBuilder addVar(Object var) {
- selectHandler.addVar(makeVar(var));
+ getSelectHandler().addVar(makeVar(var));
return this;
}
@@ -109,77 +105,77 @@ public class SelectBuilder extends AbstractQueryBuilder<SelectBuilder>
*/
@Override
public SelectBuilder addVar(String expression, Object var) throws ParseException {
- selectHandler.addVar( expression, makeVar(var) );
+ getSelectHandler().addVar( expression, makeVar(var) );
return this;
}
@Override
public SelectBuilder addVar(Expr expr, Object var) {
- selectHandler.addVar(expr, makeVar(var));
+ getSelectHandler().addVar(expr, makeVar(var));
return this;
}
@Override
public List<Var> getVars() {
- return selectHandler.getVars();
+ return getSelectHandler().getVars();
}
@Override
public SelectBuilder fromNamed(String graphName) {
- datasetHandler.fromNamed(graphName);
+ getDatasetHandler().fromNamed(graphName);
return this;
}
@Override
public SelectBuilder fromNamed(Collection<String> graphNames) {
- datasetHandler.fromNamed(graphNames);
+ getDatasetHandler().fromNamed(graphNames);
return this;
}
@Override
public SelectBuilder from(String graphName) {
- datasetHandler.from(graphName);
+ getDatasetHandler().from(graphName);
return this;
}
@Override
public SelectBuilder from(Collection<String> graphName) {
- datasetHandler.from(graphName);
+ getDatasetHandler().from(graphName);
return this;
}
@Override
public SelectBuilder addOrderBy(String orderBy) {
- solutionModifier.addOrderBy(orderBy);
+ getSolutionModifierHandler().addOrderBy(orderBy);
return this;
}
@Override
public SelectBuilder addGroupBy(String groupBy) {
- solutionModifier.addGroupBy(groupBy);
+ getSolutionModifierHandler().addGroupBy(groupBy);
return this;
}
@Override
public SolutionModifierHandler getSolutionModifierHandler() {
- return solutionModifier;
+ return handlerBlock.getModifierHandler();
}
@Override
public SelectBuilder addHaving(String having) throws ParseException {
- solutionModifier.addHaving(having);
+ getSolutionModifierHandler().addHaving(having);
return this;
}
@Override
public SelectBuilder setLimit(int limit) {
- solutionModifier.setLimit(limit);
+ getSolutionModifierHandler().setLimit(limit);
return this;
}
@Override
public SelectBuilder setOffset(int offset) {
- solutionModifier.setOffset(offset);
+ getSolutionModifierHandler().setOffset(offset);
return this;
}
@@ -231,13 +227,13 @@ public class SelectBuilder extends AbstractQueryBuilder<SelectBuilder>
@Override
public SelectBuilder addWhere(Triple t) {
- whereHandler.addWhere(t);
+ getWhereHandler().addWhere(t);
return this;
}
@Override
public SelectBuilder addWhere(FrontsTriple t) {
- whereHandler.addWhere(t.asTriple());
+ getWhereHandler().addWhere(t.asTriple());
return this;
}
@@ -249,13 +245,13 @@ public class SelectBuilder extends AbstractQueryBuilder<SelectBuilder>
@Override
public SelectBuilder addOptional(Triple t) {
- whereHandler.addOptional(t);
+ getWhereHandler().addOptional(t);
return this;
}
@Override
public SelectBuilder addOptional(FrontsTriple t) {
- whereHandler.addOptional(t.asTriple());
+ getWhereHandler().addOptional(t.asTriple());
return this;
}
@@ -268,55 +264,54 @@ public class SelectBuilder extends AbstractQueryBuilder<SelectBuilder>
@Override
public SelectBuilder addOptional(SelectBuilder t)
{
- whereHandler.addOptional(t.getWhereHandler());
+ getWhereHandler().addOptional(t.getWhereHandler());
return this;
}
@Override
public SelectBuilder addFilter(String s) throws ParseException {
- whereHandler.addFilter(s);
+ getWhereHandler().addFilter(s);
return this;
}
@Override
public SelectBuilder addSubQuery(SelectBuilder subQuery) {
- prologHandler.addAll(subQuery.prologHandler);
- whereHandler.addSubQuery(subQuery);
+ getWhereHandler().addSubQuery(subQuery);
return this;
}
@Override
public SelectBuilder addUnion(SelectBuilder subQuery) {
- whereHandler.addUnion(subQuery);
+ getWhereHandler().addUnion(subQuery);
return this;
}
@Override
public SelectBuilder addGraph(Object graph, SelectBuilder subQuery) {
- prologHandler.addAll(subQuery.prologHandler);
- whereHandler.addGraph(makeNode(graph), subQuery.whereHandler);
+ getPrologHandler().addAll(subQuery.getPrologHandler());
+ getWhereHandler().addGraph(makeNode(graph), subQuery.getWhereHandler());
return this;
}
@Override
public SelectBuilder addBind(Expr expression, Object var) {
- whereHandler.addBind( expression, makeVar(var) );
+ getWhereHandler().addBind( expression, makeVar(var) );
return this;
}
@Override
public SelectBuilder addBind(String expression, Object var) throws ParseException {
- whereHandler.addBind( expression, makeVar(var) );
+ getWhereHandler().addBind( expression, makeVar(var) );
return this;
}
@Override
public SelectHandler getSelectHandler() {
- return selectHandler;
+ return handlerBlock.getSelectHandler();
}
@Override
public Node list(Object... objs) {
- return whereHandler.list(objs);
+ return getWhereHandler().list(objs);
}
}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/jena/blob/e8b771b7/jena-extras/jena-querybuilder/src/main/java/org/apache/jena/arq/querybuilder/handlers/AggregationHandler.java
----------------------------------------------------------------------
diff --git a/jena-extras/jena-querybuilder/src/main/java/org/apache/jena/arq/querybuilder/handlers/AggregationHandler.java b/jena-extras/jena-querybuilder/src/main/java/org/apache/jena/arq/querybuilder/handlers/AggregationHandler.java
new file mode 100644
index 0000000..682dca7
--- /dev/null
+++ b/jena-extras/jena-querybuilder/src/main/java/org/apache/jena/arq/querybuilder/handlers/AggregationHandler.java
@@ -0,0 +1,78 @@
+package org.apache.jena.arq.querybuilder.handlers;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.apache.jena.graph.Node;
+import org.apache.jena.query.Query;
+import org.apache.jena.sparql.core.Var;
+import org.apache.jena.sparql.core.VarExprList;
+import org.apache.jena.sparql.expr.Expr;
+import org.apache.jena.sparql.expr.ExprAggregator;
+import org.apache.jena.sparql.expr.aggregate.Aggregator;
+
+public class AggregationHandler implements Handler {
+ private final Query query;
+ private final Map<Var,ExprAggregator> aggMap;
+
+ public AggregationHandler( Query query )
+ {
+ this.query = query;
+ aggMap = new HashMap<Var,ExprAggregator>();
+ }
+
+ public AggregationHandler addAll(AggregationHandler handler)
+ {
+ for (ExprAggregator agg : handler.query.getAggregators())
+ {
+ query.allocAggregate(agg.getAggregator());
+ }
+ for (Map.Entry<Var, ExprAggregator> entry : handler.aggMap.entrySet())
+ {
+ aggMap.put( entry.getKey(), entry.getValue());
+ }
+ return this;
+ }
+
+ public Query getQuery()
+ {
+ return query;
+ }
+
+ public Map<Var, ExprAggregator> getVarMap() {
+ Map<Var,ExprAggregator> retval = new HashMap<Var,ExprAggregator>();
+ for (ExprAggregator agg : query.getAggregators())
+ {
+ retval.put( agg.getVar(), agg);
+ }
+ return retval;
+ }
+
+ @Override
+ public void setVars(Map<Var, Node> values) {
+ // nothing to do
+
+ }
+
+ @Override
+ public void build() {
+ for (Map.Entry<Var,Expr> entry : query.getProject().getExprs().entrySet())
+ {
+ if (aggMap.containsKey(entry.getKey()))
+ {
+ entry.setValue( aggMap.get(entry.getKey()));
+ }
+ }
+ }
+
+ public void add(Expr expr, Var var) {
+ if (expr instanceof ExprAggregator)
+ {
+ ExprAggregator eAgg = (ExprAggregator)expr;
+ Expr expr2 = query.allocAggregate( eAgg.getAggregator() );
+ aggMap.put(var, (ExprAggregator)expr2);
+ }
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/jena/blob/e8b771b7/jena-extras/jena-querybuilder/src/main/java/org/apache/jena/arq/querybuilder/handlers/HandlerBlock.java
----------------------------------------------------------------------
diff --git a/jena-extras/jena-querybuilder/src/main/java/org/apache/jena/arq/querybuilder/handlers/HandlerBlock.java b/jena-extras/jena-querybuilder/src/main/java/org/apache/jena/arq/querybuilder/handlers/HandlerBlock.java
new file mode 100644
index 0000000..21443e5
--- /dev/null
+++ b/jena-extras/jena-querybuilder/src/main/java/org/apache/jena/arq/querybuilder/handlers/HandlerBlock.java
@@ -0,0 +1,158 @@
+package org.apache.jena.arq.querybuilder.handlers;
+
+import java.util.Map;
+import java.util.Stack;
+
+import org.apache.jena.arq.querybuilder.AbstractQueryBuilder;
+import org.apache.jena.arq.querybuilder.clauses.ConstructClause;
+import org.apache.jena.arq.querybuilder.clauses.DatasetClause;
+import org.apache.jena.arq.querybuilder.clauses.SelectClause;
+import org.apache.jena.arq.querybuilder.clauses.SolutionModifierClause;
+import org.apache.jena.arq.querybuilder.clauses.WhereClause;
+import org.apache.jena.graph.Node;
+import org.apache.jena.query.Query;
+import org.apache.jena.sparql.core.Var;
+
+public class HandlerBlock {
+ private final AggregationHandler aggHandler;
+ private final ConstructHandler constructHandler;
+ private final DatasetHandler datasetHandler;
+ private final PrologHandler prologHandler;
+ private final SelectHandler selectHandler;
+ private final SolutionModifierHandler modifierHandler;
+ private final WhereHandler whereHandler;
+
+ public HandlerBlock(Query query) {
+ prologHandler = new PrologHandler(query);
+ aggHandler = new AggregationHandler(query);
+ whereHandler = new WhereHandler(query);
+ datasetHandler = new DatasetHandler(query);
+ modifierHandler = new SolutionModifierHandler(query);
+ SelectHandler sTemp = null;
+ ConstructHandler cTemp = null;
+ if (query.isSelectType()) {
+ sTemp = new SelectHandler(aggHandler);
+
+ } else if (query.isAskType()) {
+ // nochange
+ } else if (query.isDescribeType()) {
+ // no change
+ } else if (query.isConstructType()) {
+ cTemp = new ConstructHandler(query);
+ }
+ selectHandler = sTemp;
+ constructHandler = cTemp;
+ }
+
+ public AggregationHandler getAggregationHandler() {
+ return aggHandler;
+ }
+
+ public ConstructHandler getConstructHandler() {
+ return constructHandler;
+ }
+
+ public DatasetHandler getDatasetHandler() {
+ return datasetHandler;
+ }
+
+ public PrologHandler getPrologHandler() {
+ return prologHandler;
+ }
+
+ public SelectHandler getSelectHandler() {
+ return selectHandler;
+ }
+
+ public SolutionModifierHandler getModifierHandler() {
+ return modifierHandler;
+ }
+
+ public WhereHandler getWhereHandler() {
+ return whereHandler;
+ }
+
+ public void addAll(PrologHandler handler) {
+ prologHandler.addAll(handler);
+ }
+
+ public void addAll(AggregationHandler handler) {
+ aggHandler.addAll(handler);
+ }
+
+ public void addAll(ConstructHandler handler) {
+ if (constructHandler != null) {
+ constructHandler.addAll(handler);
+ }
+ }
+
+ public void addAll(DatasetHandler handler) {
+ datasetHandler.addAll(handler);
+ }
+
+ public void addAll(SolutionModifierHandler handler) {
+ modifierHandler.addAll(handler);
+ }
+
+ public void addAll(SelectHandler handler) {
+ if (selectHandler != null) {
+ selectHandler.addAll(handler);
+ }
+ }
+
+ public void addAll(WhereHandler handler) {
+ whereHandler.addAll(handler);
+ }
+
+ public void addAll(HandlerBlock handler)
+ {
+ addAll(handler.aggHandler);
+ if (handler.constructHandler != null)
+ {
+ addAll(handler.constructHandler);
+ }
+ if (handler.selectHandler != null)
+ {
+ addAll(handler.selectHandler);
+ }
+ addAll( handler.datasetHandler);
+ addAll( handler.modifierHandler);
+ addAll( handler.prologHandler);
+ addAll( handler.whereHandler);
+ }
+
+ public void setVars(Map<Var, Node> values) {
+ aggHandler.setVars(values);
+
+ if (constructHandler != null) {
+ constructHandler.setVars(values);
+ }
+
+ datasetHandler.setVars(values);
+
+ prologHandler.setVars(values);
+
+ if (selectHandler != null) {
+ selectHandler.setVars(values);
+ }
+
+ modifierHandler.setVars(values);
+ whereHandler.setVars(values);
+
+ }
+
+ public void build() {
+ prologHandler.build();
+
+ if (selectHandler != null) {
+ selectHandler.build();
+ }
+ if (constructHandler != null) {
+ constructHandler.build();
+ }
+ datasetHandler.build();
+ modifierHandler.build();
+ whereHandler.build();
+ aggHandler.build();
+ }
+}
http://git-wip-us.apache.org/repos/asf/jena/blob/e8b771b7/jena-extras/jena-querybuilder/src/main/java/org/apache/jena/arq/querybuilder/handlers/PrologHandler.java
----------------------------------------------------------------------
diff --git a/jena-extras/jena-querybuilder/src/main/java/org/apache/jena/arq/querybuilder/handlers/PrologHandler.java b/jena-extras/jena-querybuilder/src/main/java/org/apache/jena/arq/querybuilder/handlers/PrologHandler.java
index 37629d7..0a5b1b9 100644
--- a/jena-extras/jena-querybuilder/src/main/java/org/apache/jena/arq/querybuilder/handlers/PrologHandler.java
+++ b/jena-extras/jena-querybuilder/src/main/java/org/apache/jena/arq/querybuilder/handlers/PrologHandler.java
@@ -24,6 +24,7 @@ import org.apache.jena.graph.Node ;
import org.apache.jena.query.Query ;
import org.apache.jena.riot.system.IRIResolver;
import org.apache.jena.shared.PrefixMapping ;
+import org.apache.jena.shared.impl.PrefixMappingImpl;
import org.apache.jena.sparql.core.Var ;
/**
@@ -82,6 +83,13 @@ public class PrologHandler implements Handler {
public void addPrefix(String pfx, String uri) {
query.setPrefix(canonicalPfx(pfx), uri);
}
+
+ /**
+ * Clear the prefix mapping.
+ */
+ public void clearPrefixes() {
+ query.setPrefixMapping( new PrefixMappingImpl() );
+ }
/**
* Add the map of prefixes to the query prefixes.
@@ -92,6 +100,10 @@ public class PrologHandler implements Handler {
addPrefix(e.getKey(), e.getValue());
}
}
+
+ public PrefixMapping getPrefixes() {
+ return query.getPrefixMapping();
+ }
/**
* Add prefixes from a prefix mapping.
http://git-wip-us.apache.org/repos/asf/jena/blob/e8b771b7/jena-extras/jena-querybuilder/src/main/java/org/apache/jena/arq/querybuilder/handlers/SelectHandler.java
----------------------------------------------------------------------
diff --git a/jena-extras/jena-querybuilder/src/main/java/org/apache/jena/arq/querybuilder/handlers/SelectHandler.java b/jena-extras/jena-querybuilder/src/main/java/org/apache/jena/arq/querybuilder/handlers/SelectHandler.java
index a2982e6..f9f653f 100644
--- a/jena-extras/jena-querybuilder/src/main/java/org/apache/jena/arq/querybuilder/handlers/SelectHandler.java
+++ b/jena-extras/jena-querybuilder/src/main/java/org/apache/jena/arq/querybuilder/handlers/SelectHandler.java
@@ -41,8 +41,7 @@ public class SelectHandler implements Handler {
// the query to handle
private final Query query;
-
- private final Map<Var, ExprAggregator> aggregators = new HashMap<Var, ExprAggregator>();
+ private final AggregationHandler aggHandler;
/**
* Constructor.
@@ -50,8 +49,9 @@ public class SelectHandler implements Handler {
* @param query
* The query to manage.
*/
- public SelectHandler(Query query) {
- this.query = query;
+ public SelectHandler(AggregationHandler aggHandler) {
+ this.query = aggHandler.getQuery();
+ this.aggHandler = aggHandler;
setDistinct(query.isDistinct());
setReduced(query.isReduced());
}
@@ -162,9 +162,7 @@ public class SelectHandler implements Handler {
}
query.setQueryResultStar(false);
query.addResultVar(var, expr);
- if (expr instanceof ExprAggregator) {
- aggregators.put(var, (ExprAggregator) expr);
- }
+ aggHandler.add( expr, var );
}
/**
@@ -204,9 +202,7 @@ public class SelectHandler implements Handler {
qProjectVars.add(var, shProjectVars.getExpr(var));
}
}
- for (Var v : selectHandler.aggregators.keySet()) {
- aggregators.put(v, selectHandler.aggregators.get(v));
- }
+ aggHandler.addAll( selectHandler.aggHandler );
}
@Override
@@ -219,14 +215,13 @@ public class SelectHandler implements Handler {
if (query.getProject().getVars().isEmpty()) {
query.setQueryResultStar(true);
}
-
+
VarExprList vel = query.getProject();
Map<Var, Expr> exprMap = vel.getExprs();
- for (Map.Entry<Var, ExprAggregator> entry : aggregators.entrySet()) {
- Expr expr = query.allocAggregate(entry.getValue().getAggregator());
+ for (Map.Entry<Var, ExprAggregator> entry : aggHandler.getVarMap().entrySet()) {
if (exprMap.containsKey(entry.getKey())) {
- exprMap.put(entry.getKey(), expr);
+ exprMap.put(entry.getKey(), entry.getValue());
}
}
// handle the SELECT * case
http://git-wip-us.apache.org/repos/asf/jena/blob/e8b771b7/jena-extras/jena-querybuilder/src/main/java/org/apache/jena/arq/querybuilder/handlers/WhereHandler.java
----------------------------------------------------------------------
diff --git a/jena-extras/jena-querybuilder/src/main/java/org/apache/jena/arq/querybuilder/handlers/WhereHandler.java b/jena-extras/jena-querybuilder/src/main/java/org/apache/jena/arq/querybuilder/handlers/WhereHandler.java
index 0a4d4c9..011a8a3 100644
--- a/jena-extras/jena-querybuilder/src/main/java/org/apache/jena/arq/querybuilder/handlers/WhereHandler.java
+++ b/jena-extras/jena-querybuilder/src/main/java/org/apache/jena/arq/querybuilder/handlers/WhereHandler.java
@@ -20,15 +20,22 @@ package org.apache.jena.arq.querybuilder.handlers;
import java.util.Collections;
import java.util.List;
import java.util.Map;
+import java.util.Stack;
import org.apache.jena.arq.querybuilder.AbstractQueryBuilder;
import org.apache.jena.arq.querybuilder.SelectBuilder;
import org.apache.jena.arq.querybuilder.clauses.ConstructClause;
+import org.apache.jena.arq.querybuilder.clauses.DatasetClause;
+import org.apache.jena.arq.querybuilder.clauses.SelectClause;
+import org.apache.jena.arq.querybuilder.clauses.SolutionModifierClause;
+import org.apache.jena.arq.querybuilder.clauses.WhereClause;
import org.apache.jena.arq.querybuilder.rewriters.ElementRewriter;
import org.apache.jena.graph.Node;
import org.apache.jena.graph.NodeFactory;
import org.apache.jena.graph.Triple;
import org.apache.jena.query.Query;
+import org.apache.jena.shared.PrefixMapping;
+import org.apache.jena.shared.impl.PrefixMappingImpl;
import org.apache.jena.sparql.core.Var;
import org.apache.jena.sparql.core.VarExprList;
import org.apache.jena.sparql.expr.Expr;
@@ -263,28 +270,29 @@ public class WhereHandler implements Handler {
* The sub query to convert
* @return THe converted element.
*/
- private ElementSubQuery makeSubQuery(SelectBuilder subQuery) {
+ private ElementSubQuery makeSubQuery(AbstractQueryBuilder<?> subQuery) {
Query q = new Query();
- PrologHandler ph = new PrologHandler(query);
- ph.addAll(subQuery.getPrologHandler());
-
- VarExprList vars = subQuery.getSelectHandler().getProject();
- for (Var v : vars.getVars()) {
- q.addResultVar(v, vars.getExpr(v));
- q.setQuerySelectType();
+ SelectHandler sh = subQuery.getHandlerBlock().getSelectHandler();
+ if (sh != null)
+ {
+ if (! sh.getProject().isEmpty()) {
+ q.setQuerySelectType();
+ }
}
-
- if (subQuery instanceof ConstructClause) {
- ConstructHandler ch = new ConstructHandler(q);
- ch.addAll(((ConstructClause<?>) subQuery).getConstructHandler());
-
+ PrologHandler ph = new PrologHandler(query);
+ ph.addPrefixes( subQuery.getPrologHandler().getPrefixes() );
+ HandlerBlock handlerBlock = new HandlerBlock(q);
+ handlerBlock.addAll( subQuery.getHandlerBlock() );
+ // remove the prefix mappings from the sub query.
+ handlerBlock.getPrologHandler().clearPrefixes();
+
+
+ // make sure we have a query pattern before we start building.
+ if (q.getQueryPattern() == null)
+ {
+ q.setQueryPattern( new ElementGroup() );
}
- DatasetHandler dh = new DatasetHandler(q);
- dh.addAll(subQuery.getDatasetHandler());
- SolutionModifierHandler smh = new SolutionModifierHandler(q);
- smh.addAll(subQuery.getSolutionModifierHandler());
- WhereHandler wh = new WhereHandler(q);
- wh.addAll(subQuery.getWhereHandler());
+ handlerBlock.build();
return new ElementSubQuery(q);
}
@@ -320,7 +328,7 @@ public class WhereHandler implements Handler {
union.addElement(makeSubQuery(subQuery));
} else {
PrologHandler ph = new PrologHandler(query);
- ph.addAll(subQuery.getPrologHandler());
+ ph.addPrefixes(subQuery.getPrologHandler().getPrefixes());
union.addElement(subQuery.getWhereHandler().getClause());
}
http://git-wip-us.apache.org/repos/asf/jena/blob/e8b771b7/jena-extras/jena-querybuilder/src/main/java/org/apache/jena/arq/querybuilder/rewriters/ElementRewriter.java
----------------------------------------------------------------------
diff --git a/jena-extras/jena-querybuilder/src/main/java/org/apache/jena/arq/querybuilder/rewriters/ElementRewriter.java b/jena-extras/jena-querybuilder/src/main/java/org/apache/jena/arq/querybuilder/rewriters/ElementRewriter.java
index 91acce2..4a9a56a 100644
--- a/jena-extras/jena-querybuilder/src/main/java/org/apache/jena/arq/querybuilder/rewriters/ElementRewriter.java
+++ b/jena-extras/jena-querybuilder/src/main/java/org/apache/jena/arq/querybuilder/rewriters/ElementRewriter.java
@@ -23,6 +23,7 @@ import java.util.Map;
import org.apache.jena.arq.querybuilder.AbstractQueryBuilder;
import org.apache.jena.graph.Node ;
import org.apache.jena.graph.Triple ;
+import org.apache.jena.query.Query;
import org.apache.jena.sparql.core.TriplePath ;
import org.apache.jena.sparql.core.Var ;
import org.apache.jena.sparql.engine.binding.Binding ;
@@ -190,8 +191,9 @@ public class ElementRewriter extends AbstractRewriter<Element> implements
@Override
public void visit(ElementSubQuery el) {
+ Query q = AbstractQueryBuilder.clone(el.getQuery());
push(new ElementSubQuery(AbstractQueryBuilder.rewrite(
- AbstractQueryBuilder.clone(el.getQuery()), values)));
+ q, values)));
}
}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/jena/blob/e8b771b7/jena-extras/jena-querybuilder/src/test/java/org/apache/jena/arq/querybuilder/AbstractQueryBuilderTest.java
----------------------------------------------------------------------
diff --git a/jena-extras/jena-querybuilder/src/test/java/org/apache/jena/arq/querybuilder/AbstractQueryBuilderTest.java b/jena-extras/jena-querybuilder/src/test/java/org/apache/jena/arq/querybuilder/AbstractQueryBuilderTest.java
index 4293a6f..89108a9 100644
--- a/jena-extras/jena-querybuilder/src/test/java/org/apache/jena/arq/querybuilder/AbstractQueryBuilderTest.java
+++ b/jena-extras/jena-querybuilder/src/test/java/org/apache/jena/arq/querybuilder/AbstractQueryBuilderTest.java
@@ -19,11 +19,15 @@
package org.apache.jena.arq.querybuilder;
import static org.junit.Assert.*;
+
+import org.apache.jena.arq.querybuilder.handlers.HandlerBlock;
+import org.apache.jena.arq.querybuilder.handlers.PrologHandler;
import org.apache.jena.graph.FrontsNode ;
import org.apache.jena.graph.Node ;
import org.apache.jena.graph.NodeFactory ;
import org.apache.jena.graph.impl.LiteralLabel ;
import org.apache.jena.graph.impl.LiteralLabelFactory ;
+import org.apache.jena.query.Query;
import org.apache.jena.reasoner.rulesys.Node_RuleVariable ;
import org.apache.jena.sparql.core.Var ;
import org.apache.jena.sparql.expr.ExprVar ;
@@ -41,10 +45,23 @@ public class AbstractQueryBuilderTest {
}
private class TestBuilder extends AbstractQueryBuilder<TestBuilder> {
+ private HandlerBlock handlerBlock;
+
+ public TestBuilder()
+ {
+ super();
+ handlerBlock = new HandlerBlock( query );
+
+ }
@Override
public String toString() {
return "TestBuilder";
}
+
+ @Override
+ public HandlerBlock getHandlerBlock() {
+ return handlerBlock;
+ }
}
private class NodeFront implements FrontsNode {
http://git-wip-us.apache.org/repos/asf/jena/blob/e8b771b7/jena-extras/jena-querybuilder/src/test/java/org/apache/jena/arq/querybuilder/SelectBuilderTest.java
----------------------------------------------------------------------
diff --git a/jena-extras/jena-querybuilder/src/test/java/org/apache/jena/arq/querybuilder/SelectBuilderTest.java b/jena-extras/jena-querybuilder/src/test/java/org/apache/jena/arq/querybuilder/SelectBuilderTest.java
index 54c76cf..3eb209f 100644
--- a/jena-extras/jena-querybuilder/src/test/java/org/apache/jena/arq/querybuilder/SelectBuilderTest.java
+++ b/jena-extras/jena-querybuilder/src/test/java/org/apache/jena/arq/querybuilder/SelectBuilderTest.java
@@ -23,8 +23,10 @@ import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import org.apache.jena.arq.AbstractRegexpBasedTest;
+import org.apache.jena.query.Query;
import org.apache.jena.query.QueryExecution;
import org.apache.jena.query.QueryExecutionFactory;
+import org.apache.jena.query.QueryFactory;
import org.apache.jena.query.QuerySolution;
import org.apache.jena.query.ResultSet;
import org.apache.jena.rdf.model.Model;
@@ -33,6 +35,7 @@ import org.apache.jena.rdf.model.Resource;
import org.apache.jena.sparql.core.Var;
import org.apache.jena.sparql.lang.sparql_11.ParseException;
import org.apache.jena.vocabulary.RDF;
+import org.apache.jena.vocabulary.XSD;
import org.junit.Before;
import org.junit.Test;
@@ -170,6 +173,7 @@ public class SelectBuilderTest extends AbstractRegexpBasedTest {
QueryExecution qexec = QueryExecutionFactory.create(builder.build(), m);
ResultSet results = qexec.execSelect();
+ assertTrue(results.hasNext());
for (; results.hasNext();) {
QuerySolution soln = results.nextSolution();
assertTrue(soln.contains("c"));
@@ -182,6 +186,7 @@ public class SelectBuilderTest extends AbstractRegexpBasedTest {
qexec = QueryExecutionFactory.create(builder.build(), m);
results = qexec.execSelect();
+ assertTrue(results.hasNext());
for (; results.hasNext();) {
QuerySolution soln = results.nextSolution();
assertTrue(soln.contains("c"));
@@ -193,4 +198,77 @@ public class SelectBuilderTest extends AbstractRegexpBasedTest {
}
}
+
+ @Test
+ public void testAggregatorsInSubQuery() throws ParseException {
+
+ Model m = ModelFactory.createDefaultModel();
+ Resource r = m.createResource("urn:one");
+ m.add(r, m.getProperty("urn:p:one"), m.createTypedLiteral(1));
+ m.add(r, m.getProperty("urn:p:two"), m.createTypedLiteral(3));
+ m.add(r, m.getProperty("urn:p:three"), m.createTypedLiteral(5));
+ r = m.createResource("urn:two");
+ m.add(r, m.getProperty("urn:p:one"), m.createTypedLiteral(2));
+ m.add(r, m.getProperty("urn:p:two"), m.createTypedLiteral(4));
+ m.add(r, m.getProperty("urn:p:three"), m.createTypedLiteral(6));
+
+ SelectBuilder sb = new SelectBuilder().addVar("?x").addVar("max(?o)", "?max").addWhere("?x", "?p", "?o")
+ .addGroupBy("?x");
+
+ builder.addPrefix("xsd", XSD.getURI()).addVar("?x").addVar("min(?o2)", "?min").addWhere("?x", "?p2", "?o2")
+ .addSubQuery(sb).addFilter("?max = '6'^^xsd:int").addGroupBy("?x");
+
+ QueryExecution qexec = QueryExecutionFactory.create(builder.build(), m);
+
+ ResultSet results = qexec.execSelect();
+ assertTrue(results.hasNext());
+ for (; results.hasNext();) {
+ QuerySolution soln = results.nextSolution();
+ assertTrue(soln.contains("x"));
+ assertTrue(soln.contains("min"));
+ assertEquals("urn:two", soln.get("?x").asResource().getURI());
+ assertEquals(2, soln.get("?min").asLiteral().getInt());
+ }
+ }
+
+ @Test
+ public void testVarReplacementInSubQuery() throws ParseException {
+
+ Model m = ModelFactory.createDefaultModel();
+ Resource r = m.createResource("urn:one");
+ m.add(r, m.getProperty("urn:p:one"), m.createTypedLiteral(1));
+ m.add(r, m.getProperty("urn:p:two"), m.createTypedLiteral(3));
+ m.add(r, m.getProperty("urn:p:three"), m.createTypedLiteral(5));
+ r = m.createResource("urn:two");
+ m.add(r, m.getProperty("urn:p:one"), m.createTypedLiteral(2));
+ m.add(r, m.getProperty("urn:p:two"), m.createTypedLiteral(4));
+ m.add(r, m.getProperty("urn:p:three"), m.createTypedLiteral(6));
+
+ SelectBuilder sb = new SelectBuilder().addVar("?x").addVar("?p").addWhere("?x", "?p", "?o")
+ .addFilter( "?o < ?limit");
+
+ builder.addPrefix("xsd", XSD.getURI()).addVar("?x").addVar("count(?p)", "?c").addWhere("?x", "?p", "?o2")
+ .addSubQuery(sb).addGroupBy("?x");
+
+
+ builder.setVar( "?limit", 4 );
+
+ QueryExecution qexec = QueryExecutionFactory.create(builder.build(), m);
+
+ ResultSet results = qexec.execSelect();
+ assertTrue(results.hasNext());
+ for (; results.hasNext();) {
+ QuerySolution soln = results.nextSolution();
+ assertTrue(soln.contains("x"));
+ assertTrue(soln.contains("c"));
+ if ("urn:one".equals( soln.get("?x").asResource().getURI()))
+ {
+ assertEquals( 2, soln.get("?c").asLiteral().getInt());
+ }
+ else
+ {
+ assertEquals( 1, soln.get("?c").asLiteral().getInt());
+ }
+ }
+ }
}
http://git-wip-us.apache.org/repos/asf/jena/blob/e8b771b7/jena-extras/jena-querybuilder/src/test/java/org/apache/jena/arq/querybuilder/clauses/WhereClauseTest.java
----------------------------------------------------------------------
diff --git a/jena-extras/jena-querybuilder/src/test/java/org/apache/jena/arq/querybuilder/clauses/WhereClauseTest.java b/jena-extras/jena-querybuilder/src/test/java/org/apache/jena/arq/querybuilder/clauses/WhereClauseTest.java
index 570a91e..23b522b 100644
--- a/jena-extras/jena-querybuilder/src/test/java/org/apache/jena/arq/querybuilder/clauses/WhereClauseTest.java
+++ b/jena-extras/jena-querybuilder/src/test/java/org/apache/jena/arq/querybuilder/clauses/WhereClauseTest.java
@@ -144,7 +144,7 @@ public class WhereClauseTest<T extends WhereClause<?>> extends
}
@ContractTest
- public void addSubQuery() {
+ public void testAddSubQuery() {
SelectBuilder sb = new SelectBuilder();
sb.addPrefix("pfx", "urn:uri").addVar("?x")
.addWhere("pfx:one", "pfx:two", "pfx:three");
http://git-wip-us.apache.org/repos/asf/jena/blob/e8b771b7/jena-extras/jena-querybuilder/src/test/java/org/apache/jena/arq/querybuilder/handlers/SelectHandlerTest.java
----------------------------------------------------------------------
diff --git a/jena-extras/jena-querybuilder/src/test/java/org/apache/jena/arq/querybuilder/handlers/SelectHandlerTest.java b/jena-extras/jena-querybuilder/src/test/java/org/apache/jena/arq/querybuilder/handlers/SelectHandlerTest.java
index 4e51478..6e131de 100644
--- a/jena-extras/jena-querybuilder/src/test/java/org/apache/jena/arq/querybuilder/handlers/SelectHandlerTest.java
+++ b/jena-extras/jena-querybuilder/src/test/java/org/apache/jena/arq/querybuilder/handlers/SelectHandlerTest.java
@@ -38,7 +38,8 @@ public class SelectHandlerTest extends AbstractHandlerTest {
@Before
public void setup() {
query = new Query();
- handler = new SelectHandler(query);
+ AggregationHandler aggHandler = new AggregationHandler(query);
+ handler = new SelectHandler(aggHandler);
}
@Test
@@ -166,7 +167,8 @@ public class SelectHandlerTest extends AbstractHandlerTest {
@Test
public void testAddAllResultStartReduced() {
- SelectHandler sh = new SelectHandler(new Query());
+ AggregationHandler aggHandler = new AggregationHandler(new Query());
+ SelectHandler sh = new SelectHandler(aggHandler);
sh.addVar(null);
sh.setReduced(true);
@@ -177,7 +179,8 @@ public class SelectHandlerTest extends AbstractHandlerTest {
@Test
public void testAddAllVarsDistinct() {
- SelectHandler sh = new SelectHandler(new Query());
+ AggregationHandler aggHandler = new AggregationHandler(new Query());
+ SelectHandler sh = new SelectHandler(aggHandler);
sh.addVar(Var.alloc("foo"));
sh.setDistinct(true);