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 <[email protected]> Authored: Sun Mar 6 14:15:48 2016 +0000 Committer: Claude Warren <[email protected]> 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);
