You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jena.apache.org by an...@apache.org on 2015/08/17 17:09:49 UTC
[10/50] [abbrv] jena git commit: new QueryExecution operations:
execConstrucQuads(), execConstructDataset()
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 <co...@gmail.com>
Authored: Fri Jun 19 16:22:38 2015 +0800
Committer: confidencesun <co...@gmail.com>
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;
+ }
}