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;
+    }
 }