new QueryExecution operations: execConstrucQuads(), execConstructDataset() Project: http://git-wip-us.apache.org/repos/asf/jena/repo Commit: http://git-wip-us.apache.org/repos/asf/jena/commit/5076b1ed Tree: http://git-wip-us.apache.org/repos/asf/jena/tree/5076b1ed Diff: http://git-wip-us.apache.org/repos/asf/jena/diff/5076b1ed
Branch: refs/heads/JENA-491-construct-quads Commit: 5076b1ed0844d0a1e7c57b539b64af3d831ee039 Parents: c475249 Author: confidencesun <[email protected]> Authored: Fri Jun 19 16:22:38 2015 +0800 Committer: confidencesun <[email protected]> Committed: Fri Jun 19 16:22:38 2015 +0800 ---------------------------------------------------------------------- jena-arq/Grammar/arq.jj | 4 +- jena-arq/Grammar/master.jj | 4 +- .../org/apache/jena/query/QueryExecution.java | 32 ++++- .../jena/sparql/engine/QueryExecutionBase.java | 116 ++++++++++++++----- .../sparql/engine/http/QueryEngineHTTP.java | 11 ++ .../apache/jena/sparql/lang/arq/ARQParser.java | 86 +++++++------- .../jena/sparql/lang/arq/ARQParserBase.java | 33 ++++++ 7 files changed, 202 insertions(+), 84 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/jena/blob/5076b1ed/jena-arq/Grammar/arq.jj ---------------------------------------------------------------------- diff --git a/jena-arq/Grammar/arq.jj b/jena-arq/Grammar/arq.jj index a344b94..0f1ef8e 100644 --- a/jena-arq/Grammar/arq.jj +++ b/jena-arq/Grammar/arq.jj @@ -149,9 +149,7 @@ void ConstructQuery() : { Template t ; { t = new Template(acc) ; getQuery().setConstructTemplate(t) ; - ElementPathBlock epb = new ElementPathBlock(acc.getBGP()) ; - ElementGroup elg = new ElementGroup() ; - elg.addElement(epb) ; + ElementGroup elg = createQueryPattern(t); getQuery().setQueryPattern(elg) ; } ) http://git-wip-us.apache.org/repos/asf/jena/blob/5076b1ed/jena-arq/Grammar/master.jj ---------------------------------------------------------------------- diff --git a/jena-arq/Grammar/master.jj b/jena-arq/Grammar/master.jj index aeddc84..4005ce0 100644 --- a/jena-arq/Grammar/master.jj +++ b/jena-arq/Grammar/master.jj @@ -259,9 +259,7 @@ void ConstructQuery() : { Template t ; t = new Template(acc) ; getQuery().setConstructTemplate(t) ; // Create a query in the same shape as the query created by writing out in full. - ElementPathBlock epb = new ElementPathBlock(acc.getBGP()) ; - ElementGroup elg = new ElementGroup() ; - elg.addElement(epb) ; + ElementGroup elg = createQueryPattern(t); getQuery().setQueryPattern(elg) ; } ) http://git-wip-us.apache.org/repos/asf/jena/blob/5076b1ed/jena-arq/src/main/java/org/apache/jena/query/QueryExecution.java ---------------------------------------------------------------------- diff --git a/jena-arq/src/main/java/org/apache/jena/query/QueryExecution.java b/jena-arq/src/main/java/org/apache/jena/query/QueryExecution.java index c249724..affd46c 100644 --- a/jena-arq/src/main/java/org/apache/jena/query/QueryExecution.java +++ b/jena-arq/src/main/java/org/apache/jena/query/QueryExecution.java @@ -18,16 +18,25 @@ package org.apache.jena.query; -import java.util.Iterator ; -import java.util.concurrent.TimeUnit ; +import java.util.Iterator; +import java.util.concurrent.TimeUnit; -import org.apache.jena.graph.Triple ; -import org.apache.jena.rdf.model.Model ; -import org.apache.jena.sparql.util.Context ; +import org.apache.jena.graph.Triple; +import org.apache.jena.rdf.model.Model; +import org.apache.jena.sparql.core.Quad; +import org.apache.jena.sparql.util.Context; /** A interface for a single execution of a query. */ +/** + * @author Administrator + * + */ +/** + * @author Administrator + * + */ public interface QueryExecution extends AutoCloseable { /** Set the initial association of variables and values. @@ -101,6 +110,19 @@ public interface QueryExecution extends AutoCloseable * by applying the CONSTRUCT template of the query to the bindings in the WHERE clause. */ public Iterator<Triple> execConstructTriples(); + + + /** + * Similar to execConstructTriples(), except that constructing {@link Quad}. + */ + public Iterator<Quad> execConstructQuads(); + + + /** + * Similar to execConstructTriples(), except that constructing {@link Dataset}. + */ + public Dataset execConstructDataset(); + /** Execute a DESCRIBE query */ public Model execDescribe(); http://git-wip-us.apache.org/repos/asf/jena/blob/5076b1ed/jena-arq/src/main/java/org/apache/jena/sparql/engine/QueryExecutionBase.java ---------------------------------------------------------------------- diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/engine/QueryExecutionBase.java b/jena-arq/src/main/java/org/apache/jena/sparql/engine/QueryExecutionBase.java index 444f83c..af66134 100644 --- a/jena-arq/src/main/java/org/apache/jena/sparql/engine/QueryExecutionBase.java +++ b/jena-arq/src/main/java/org/apache/jena/sparql/engine/QueryExecutionBase.java @@ -18,35 +18,50 @@ package org.apache.jena.sparql.engine; -import java.util.HashSet ; -import java.util.Iterator ; -import java.util.List ; -import java.util.Set ; -import java.util.concurrent.TimeUnit ; - -import org.apache.jena.atlas.lib.AlarmClock ; -import org.apache.jena.atlas.logging.Log ; -import org.apache.jena.graph.Node ; -import org.apache.jena.graph.Triple ; -import org.apache.jena.query.* ; -import org.apache.jena.rdf.model.* ; -import org.apache.jena.riot.system.IRIResolver ; -import org.apache.jena.shared.PrefixMapping ; -import org.apache.jena.sparql.ARQConstants ; -import org.apache.jena.sparql.core.DatasetGraph ; -import org.apache.jena.sparql.core.describe.DescribeHandler ; -import org.apache.jena.sparql.core.describe.DescribeHandlerRegistry ; -import org.apache.jena.sparql.engine.binding.Binding ; -import org.apache.jena.sparql.engine.binding.BindingRoot ; -import org.apache.jena.sparql.engine.binding.BindingUtils ; -import org.apache.jena.sparql.engine.iterator.QueryIteratorWrapper ; -import org.apache.jena.sparql.graph.GraphFactory ; -import org.apache.jena.sparql.modify.TemplateLib ; -import org.apache.jena.sparql.syntax.ElementGroup ; -import org.apache.jena.sparql.syntax.Template ; -import org.apache.jena.sparql.util.Context ; -import org.apache.jena.sparql.util.DatasetUtils ; -import org.apache.jena.sparql.util.ModelUtils ; +import java.util.HashSet; +import java.util.Iterator; +import java.util.List; +import java.util.Set; +import java.util.concurrent.TimeUnit; + +import org.apache.jena.atlas.lib.AlarmClock; +import org.apache.jena.atlas.logging.Log; +import org.apache.jena.graph.Node; +import org.apache.jena.graph.Triple; +import org.apache.jena.query.ARQ; +import org.apache.jena.query.Dataset; +import org.apache.jena.query.DatasetFactory; +import org.apache.jena.query.Query; +import org.apache.jena.query.QueryCancelledException; +import org.apache.jena.query.QueryExecException; +import org.apache.jena.query.QueryExecution; +import org.apache.jena.query.QuerySolution; +import org.apache.jena.query.ResultSet; +import org.apache.jena.query.Syntax; +import org.apache.jena.rdf.model.Model; +import org.apache.jena.rdf.model.ModelFactory; +import org.apache.jena.rdf.model.RDFNode; +import org.apache.jena.rdf.model.Resource; +import org.apache.jena.rdf.model.Statement; +import org.apache.jena.riot.system.IRIResolver; +import org.apache.jena.shared.PrefixMapping; +import org.apache.jena.sparql.ARQConstants; +import org.apache.jena.sparql.core.DatasetGraph; +import org.apache.jena.sparql.core.DatasetGraphFactory; +import org.apache.jena.sparql.core.Quad; +import org.apache.jena.sparql.core.describe.DescribeHandler; +import org.apache.jena.sparql.core.describe.DescribeHandlerRegistry; +import org.apache.jena.sparql.engine.binding.Binding; +import org.apache.jena.sparql.engine.binding.BindingRoot; +import org.apache.jena.sparql.engine.binding.BindingUtils; +import org.apache.jena.sparql.engine.iterator.QueryIteratorWrapper; +import org.apache.jena.sparql.graph.GraphFactory; +import org.apache.jena.sparql.modify.TemplateLib; +import org.apache.jena.sparql.syntax.ElementGroup; +import org.apache.jena.sparql.syntax.Template; +import org.apache.jena.sparql.util.Context; +import org.apache.jena.sparql.util.DatasetUtils; +import org.apache.jena.sparql.util.ModelUtils; /** All the SPARQL query result forms made from a graph-level execution object */ @@ -242,6 +257,49 @@ public class QueryExecutionBase implements QueryExecution Template template = query.getConstructTemplate() ; return TemplateLib.calcTriples(template.getTriples(), queryIterator); } + + @Override + public Iterator<Quad> execConstructQuads() + { + checkNotClosed() ; + if ( ! query.isConstructType() ) + throw new QueryExecException("Attempt to get a CONSTRUCT model from a "+labelForQuery(query)+" query") ; + // This causes there to be no PROJECT around the pattern. + // That in turn, exposes the initial bindings. + if ( ! Syntax.syntaxARQ.equals( query.getSyntax() ) ) + throw new QueryExecException("Attempt to CONSTRUCT quads from a "+labelForQuery(query)+" query, which is not ARQ Syntax") ; + + query.setQueryResultStar(true) ; + + startQueryIterator() ; + + Template template = query.getConstructTemplate() ; + return TemplateLib.calcQuads(template.getQuads(), queryIterator); + } + + @Override + public Dataset execConstructDataset(){ + + DatasetGraph graph = DatasetGraphFactory.createMem(); + + checkNotClosed() ; + try + { + Iterator<Quad> it = execConstructQuads(); + + while (it.hasNext()) + { + Quad q = it.next(); + graph.add(q); + } + } + finally + { + this.close(); + } + return DatasetFactory.create(graph); + + } @Override public Model execDescribe() http://git-wip-us.apache.org/repos/asf/jena/blob/5076b1ed/jena-arq/src/main/java/org/apache/jena/sparql/engine/http/QueryEngineHTTP.java ---------------------------------------------------------------------- diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/engine/http/QueryEngineHTTP.java b/jena-arq/src/main/java/org/apache/jena/sparql/engine/http/QueryEngineHTTP.java index ef9b8f1..a35fffc 100644 --- a/jena-arq/src/main/java/org/apache/jena/sparql/engine/http/QueryEngineHTTP.java +++ b/jena-arq/src/main/java/org/apache/jena/sparql/engine/http/QueryEngineHTTP.java @@ -36,6 +36,7 @@ import org.apache.jena.rdf.model.Model ; import org.apache.jena.riot.* ; import org.apache.jena.riot.web.HttpOp ; import org.apache.jena.sparql.ARQException ; +import org.apache.jena.sparql.core.Quad; import org.apache.jena.sparql.engine.ResultSetCheckCondition ; import org.apache.jena.sparql.graph.GraphFactory ; import org.apache.jena.sparql.resultset.CSVInput ; @@ -390,6 +391,16 @@ public class QueryEngineHTTP implements QueryExecution { public Iterator<Triple> execConstructTriples() { return execTriples(); } + + @Override + public Iterator<Quad> execConstructQuads(){ + return null; + } + + @Override + public Dataset execConstructDataset(){ + return null; + } @Override public Model execDescribe() { http://git-wip-us.apache.org/repos/asf/jena/blob/5076b1ed/jena-arq/src/main/java/org/apache/jena/sparql/lang/arq/ARQParser.java ---------------------------------------------------------------------- diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/lang/arq/ARQParser.java b/jena-arq/src/main/java/org/apache/jena/sparql/lang/arq/ARQParser.java index 2b1e141..9bb2611 100644 --- a/jena-arq/src/main/java/org/apache/jena/sparql/lang/arq/ARQParser.java +++ b/jena-arq/src/main/java/org/apache/jena/sparql/lang/arq/ARQParser.java @@ -550,9 +550,7 @@ public class ARQParser extends ARQParserBase implements ARQParserConstants { SolutionModifier(); t = new Template(acc) ; getQuery().setConstructTemplate(t) ; - ElementPathBlock epb = new ElementPathBlock(acc.getBGP()) ; - ElementGroup elg = new ElementGroup() ; - elg.addElement(epb) ; + ElementGroup elg = createQueryPattern(t); getQuery().setQueryPattern(elg) ; break; default: @@ -5522,6 +5520,36 @@ public class ARQParser extends ARQParserBase implements ARQParserConstants { finally { jj_save(4, xla); } } + private boolean jj_3R_172() { + if (jj_scan_token(INTEGER_POSITIVE)) return true; + return false; + } + + private boolean jj_3R_167() { + Token xsp; + xsp = jj_scanpos; + if (jj_3R_172()) { + jj_scanpos = xsp; + if (jj_3R_173()) { + jj_scanpos = xsp; + if (jj_3R_174()) return true; + } + } + return false; + } + + private boolean jj_3R_72() { + if (jj_scan_token(DAY)) return true; + if (jj_scan_token(LPAREN)) return true; + return false; + } + + private boolean jj_3R_71() { + if (jj_scan_token(MONTH)) return true; + if (jj_scan_token(LPAREN)) return true; + return false; + } + private boolean jj_3R_70() { if (jj_scan_token(YEAR)) return true; if (jj_scan_token(LPAREN)) return true; @@ -6035,14 +6063,14 @@ public class ARQParser extends ARQParserBase implements ARQParserConstants { return false; } - private boolean jj_3R_121() { - if (jj_scan_token(AVG)) return true; - if (jj_scan_token(LPAREN)) return true; + private boolean jj_3_1() { + if (jj_3R_41()) return true; return false; } - private boolean jj_3_1() { - if (jj_3R_41()) return true; + private boolean jj_3R_121() { + if (jj_scan_token(AVG)) return true; + if (jj_scan_token(LPAREN)) return true; return false; } @@ -6153,12 +6181,6 @@ public class ARQParser extends ARQParserBase implements ARQParserConstants { return false; } - private boolean jj_3R_109() { - if (jj_scan_token(REPLACE)) return true; - if (jj_scan_token(LPAREN)) return true; - return false; - } - private boolean jj_3R_113() { if (jj_3R_127()) return true; return false; @@ -6174,6 +6196,12 @@ public class ARQParser extends ARQParserBase implements ARQParserConstants { return false; } + private boolean jj_3R_109() { + if (jj_scan_token(REPLACE)) return true; + if (jj_scan_token(LPAREN)) return true; + return false; + } + private boolean jj_3R_42() { Token xsp; while (true) { @@ -6627,36 +6655,6 @@ public class ARQParser extends ARQParserBase implements ARQParserConstants { return false; } - private boolean jj_3R_172() { - if (jj_scan_token(INTEGER_POSITIVE)) return true; - return false; - } - - private boolean jj_3R_167() { - Token xsp; - xsp = jj_scanpos; - if (jj_3R_172()) { - jj_scanpos = xsp; - if (jj_3R_173()) { - jj_scanpos = xsp; - if (jj_3R_174()) return true; - } - } - return false; - } - - private boolean jj_3R_72() { - if (jj_scan_token(DAY)) return true; - if (jj_scan_token(LPAREN)) return true; - return false; - } - - private boolean jj_3R_71() { - if (jj_scan_token(MONTH)) return true; - if (jj_scan_token(LPAREN)) return true; - return false; - } - /** Generated Token Manager. */ public ARQParserTokenManager token_source; JavaCharStream jj_input_stream; http://git-wip-us.apache.org/repos/asf/jena/blob/5076b1ed/jena-arq/src/main/java/org/apache/jena/sparql/lang/arq/ARQParserBase.java ---------------------------------------------------------------------- diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/lang/arq/ARQParserBase.java b/jena-arq/src/main/java/org/apache/jena/sparql/lang/arq/ARQParserBase.java index 580aeac..3a11805 100644 --- a/jena-arq/src/main/java/org/apache/jena/sparql/lang/arq/ARQParserBase.java +++ b/jena-arq/src/main/java/org/apache/jena/sparql/lang/arq/ARQParserBase.java @@ -17,10 +17,22 @@ */ package org.apache.jena.sparql.lang.arq; +import java.util.HashMap; +import java.util.List; + import org.apache.jena.atlas.json.io.JSONHandler ; import org.apache.jena.atlas.json.io.JSONHandlerBase ; import org.apache.jena.atlas.lib.NotImplemented ; +import org.apache.jena.graph.Node; +import org.apache.jena.sparql.core.BasicPattern; +import org.apache.jena.sparql.core.Quad; import org.apache.jena.sparql.lang.SPARQLParserBase ; +import org.apache.jena.sparql.syntax.Element; +import org.apache.jena.sparql.syntax.ElementGroup; +import org.apache.jena.sparql.syntax.ElementNamedGraph; +import org.apache.jena.sparql.syntax.ElementPathBlock; +import org.apache.jena.sparql.syntax.Template; +import org.apache.jena.util.PrintUtil; class ARQParserBase extends SPARQLParserBase @@ -67,4 +79,25 @@ class ARQParserBase protected void jsonValueNull(long currLine, long currCol) { handler.valueNull(currLine, currCol) ; } protected void jsonValueVar(String image, long currLine, long currCol) { throw new NotImplemented("yet") ; } + protected ElementGroup createQueryPattern(Template t){ + ElementGroup elg = new ElementGroup(); + List<Quad> quads = t.getQuads(); + HashMap<Node, BasicPattern> graphs = new HashMap<Node, BasicPattern>(); + for (Quad q: quads){ + BasicPattern bgp = graphs.get(q.getGraph()); + if (bgp == null){ + bgp = new BasicPattern(); + graphs.put(q.getGraph(), bgp); + } + bgp.add( q.asTriple() ); + } + for(Node n: graphs.keySet()){ + Element el = new ElementPathBlock(graphs.get(n)); + if(! Quad.defaultGraphIRI.equals(n) ){ + el = new ElementNamedGraph(n, el); + } + elg.addElement(el); + } + return elg; + } }
