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 2018/05/09 14:18:33 UTC

[1/2] jena git commit: JENA-1543: QueryEngineHttp support for JSON queries.

Repository: jena
Updated Branches:
  refs/heads/master c47a3da92 -> 379c4c693


JENA-1543: QueryEngineHttp support for JSON queries.


Project: http://git-wip-us.apache.org/repos/asf/jena/repo
Commit: http://git-wip-us.apache.org/repos/asf/jena/commit/90daf979
Tree: http://git-wip-us.apache.org/repos/asf/jena/tree/90daf979
Diff: http://git-wip-us.apache.org/repos/asf/jena/diff/90daf979

Branch: refs/heads/master
Commit: 90daf9793b7186ff7f1a03e7c312a371f028e5db
Parents: 3b3c469
Author: Andy Seaborne <an...@apache.org>
Authored: Mon May 7 10:08:55 2018 +0100
Committer: Andy Seaborne <an...@apache.org>
Committed: Mon May 7 12:04:51 2018 +0100

----------------------------------------------------------------------
 .../jena/sparql/engine/QueryExecutionBase.java  |  1 +
 .../sparql/engine/http/QueryEngineHTTP.java     | 23 ++++++--
 .../apache/jena/sparql/util/QueryExecUtils.java | 56 ++++++++++++++++++--
 .../org/apache/jena/sparql/junit/QueryTest.java |  3 ++
 .../java/org/apache/jena/fuseki/TestQuery.java  | 11 ++--
 5 files changed, 78 insertions(+), 16 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/jena/blob/90daf979/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 0e5d134..95c18c7 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
@@ -595,6 +595,7 @@ public class QueryExecutionBase implements QueryExecution
         if ( q.isConstructType() )  return "CONSTRUCT" ; 
         if ( q.isDescribeType() )   return "DESCRIBE" ; 
         if ( q.isAskType() )        return "ASK" ;
+        if ( q.isJsonType() )       return "JSON" ;
         return "<<unknown>>" ;
     }
 

http://git-wip-us.apache.org/repos/asf/jena/blob/90daf979/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 91c3ed5..564c997 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
@@ -31,9 +31,10 @@ import org.apache.http.client.protocol.HttpClientContext;
 import org.apache.http.protocol.HttpContext ;
 import org.apache.jena.atlas.RuntimeIOException;
 import org.apache.jena.atlas.io.IO ;
+import org.apache.jena.atlas.json.JSON;
 import org.apache.jena.atlas.json.JsonArray;
 import org.apache.jena.atlas.json.JsonObject;
-import org.apache.jena.atlas.lib.NotImplemented;
+import org.apache.jena.atlas.json.JsonValue;
 import org.apache.jena.atlas.lib.Pair ;
 import org.apache.jena.graph.Triple ;
 import org.apache.jena.query.* ;
@@ -538,13 +539,29 @@ public class QueryEngineHTTP implements QueryExecution {
     @Override
     public JsonArray execJson()
     {
-        throw new NotImplemented("JSON queries not implemented for remote calls") ;
+        checkNotClosed();
+        HttpQuery httpQuery = makeHttpQuery();
+        httpQuery.setAccept(WebContent.contentTypeJSON);
+        InputStream in = httpQuery.exec();
+        JsonValue v = JSON.parseAny(in);
+        if ( ! v.isArray() )
+            throw new QueryExecException("Return from a JSON query isn't an array");
+        return v.getAsArray();
     }
 
     @Override
     public Iterator<JsonObject> execJsonItems()
     {
-        throw new NotImplemented("JSON queries not implemented for remote calls") ;
+        // Non-streaming.
+        // TODO Integrate with the JSON parser to stream the results. 
+        JsonArray array = execJson().getAsArray();
+        List<JsonObject> x = new ArrayList<>(array.size());
+        array.forEach(elt->{
+            if ( ! elt.isObject()) 
+                throw new QueryExecException("Item in an array from a JSON query isn't an object");
+            x.add(elt.getAsObject());
+        });
+        return x.iterator();
     }
 
     private void checkNotClosed() {

http://git-wip-us.apache.org/repos/asf/jena/blob/90daf979/jena-arq/src/main/java/org/apache/jena/sparql/util/QueryExecUtils.java
----------------------------------------------------------------------
diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/util/QueryExecUtils.java b/jena-arq/src/main/java/org/apache/jena/sparql/util/QueryExecUtils.java
index e2cbcef..541bac0 100644
--- a/jena-arq/src/main/java/org/apache/jena/sparql/util/QueryExecUtils.java
+++ b/jena-arq/src/main/java/org/apache/jena/sparql/util/QueryExecUtils.java
@@ -20,6 +20,8 @@ package org.apache.jena.sparql.util ;
 
 import java.util.List ;
 
+import org.apache.jena.atlas.json.JSON;
+import org.apache.jena.atlas.json.JsonArray;
 import org.apache.jena.query.* ;
 import org.apache.jena.rdf.model.Model ;
 import org.apache.jena.rdf.model.RDFNode ;
@@ -73,16 +75,20 @@ public class QueryExecUtils {
             prologue = query.getPrologue() ;
         if ( prologue == null )
             prologue = dftPrologue ;
-
         if ( query.isSelectType() )
             doSelectQuery(prologue, queryExecution, outputFormat) ;
-        if ( query.isDescribeType() )
+        else if ( query.isDescribeType() )
             doDescribeQuery(prologue, queryExecution, outputFormat) ;
-        if ( query.isConstructType() )
+        else if ( query.isConstructType() )
             doConstructQuery(prologue, queryExecution, outputFormat) ;
-        if ( query.isAskType() )
+        else if ( query.isConstructQuad() )
+            doConstructQuadsQuery(prologue, queryExecution, outputFormat) ;
+        else if ( query.isAskType() )
             doAskQuery(prologue, queryExecution, outputFormat) ;
-        queryExecution.close() ;
+        else if ( query.isJsonType() )
+            doJsonQuery(prologue, queryExecution, outputFormat) ;
+        else
+            throw new QueryException("Unrecognized query form");
     }
 
     public static void execute(Op op, DatasetGraph dsg) {
@@ -191,6 +197,11 @@ public class QueryExecUtils {
         outputResultSet(results, prologue, outputFormat) ;
     }
 
+    private static void doJsonQuery(Prologue prologue, QueryExecution queryExecution, ResultsFormat outputFormat) {
+        JsonArray results = queryExecution.execJson();
+        JSON.write(System.out, results);
+    }
+
     private static void doDescribeQuery(Prologue prologue, QueryExecution qe, ResultsFormat outputFormat) {
         if ( outputFormat == null || outputFormat == ResultsFormat.FMT_UNKNOWN )
             outputFormat = ResultsFormat.FMT_RDF_TTL ;
@@ -254,6 +265,41 @@ public class QueryExecUtils {
         System.err.println("Unknown format: " + outputFormat) ;
     }
 
+    private static void doConstructQuadsQuery(Prologue prologue, QueryExecution qe, ResultsFormat outputFormat) {
+        if ( outputFormat == null || outputFormat == ResultsFormat.FMT_UNKNOWN )
+            outputFormat = ResultsFormat.FMT_RDF_TRIG;
+        Dataset ds = qe.execConstructDataset();
+        writeDataset(prologue, ds, outputFormat) ;
+    }
+
+    private static void writeDataset(Prologue prologue, Dataset dataset, ResultsFormat outputFormat) {
+        if ( outputFormat == null || outputFormat == ResultsFormat.FMT_UNKNOWN )
+            outputFormat = ResultsFormat.FMT_TEXT ;
+
+        if ( outputFormat.equals(ResultsFormat.FMT_NONE) )
+            return ;
+
+        if ( outputFormat.equals(ResultsFormat.FMT_TEXT) ) {
+            System.out.println("# ======== ") ;
+            RDFDataMgr.write(System.out, dataset, Lang.TURTLE) ;
+            System.out.println("# ======== ") ;
+            return ;
+        }
+
+        if ( outputFormat.equals(ResultsFormat.FMT_RDF_NQ) ) {
+            RDFDataMgr.write(System.out, dataset, Lang.NQUADS);
+            return ;
+        }
+
+        if ( outputFormat.equals(ResultsFormat.FMT_RDF_TRIG) ) {
+            RDFDataMgr.write(System.out, dataset, Lang.TRIG);
+            return ;
+        }
+
+        System.err.println("Unknown format: " + outputFormat) ;
+    }
+
+    
     private static void doAskQuery(Prologue prologue, QueryExecution qe, ResultsFormat outputFormat) {
         boolean b = qe.execAsk() ;
 

http://git-wip-us.apache.org/repos/asf/jena/blob/90daf979/jena-arq/src/test/java/org/apache/jena/sparql/junit/QueryTest.java
----------------------------------------------------------------------
diff --git a/jena-arq/src/test/java/org/apache/jena/sparql/junit/QueryTest.java b/jena-arq/src/test/java/org/apache/jena/sparql/junit/QueryTest.java
index 3c81071..1de9b23 100644
--- a/jena-arq/src/test/java/org/apache/jena/sparql/junit/QueryTest.java
+++ b/jena-arq/src/test/java/org/apache/jena/sparql/junit/QueryTest.java
@@ -204,6 +204,9 @@ public class QueryTest extends EarlTestCase
                     runTestDescribe(query, qe) ;
                 else if ( query.isAskType() )
                     runTestAsk(query, qe) ;
+                else if ( query.isJsonType() )
+                    throw new UnsupportedOperationException("JSON {} queries not supported");
+
             }
         }
         catch (IOException ioEx)

http://git-wip-us.apache.org/repos/asf/jena/blob/90daf979/jena-fuseki2/jena-fuseki-core/src/test/java/org/apache/jena/fuseki/TestQuery.java
----------------------------------------------------------------------
diff --git a/jena-fuseki2/jena-fuseki-core/src/test/java/org/apache/jena/fuseki/TestQuery.java b/jena-fuseki2/jena-fuseki-core/src/test/java/org/apache/jena/fuseki/TestQuery.java
index a06bc35..9439342 100644
--- a/jena-fuseki2/jena-fuseki-core/src/test/java/org/apache/jena/fuseki/TestQuery.java
+++ b/jena-fuseki2/jena-fuseki-core/src/test/java/org/apache/jena/fuseki/TestQuery.java
@@ -20,22 +20,18 @@ package org.apache.jena.fuseki ;
 
 import static org.apache.jena.fuseki.ServerCtl.serviceGSP ;
 import static org.apache.jena.fuseki.ServerCtl.serviceQuery ;
-import static org.apache.jena.fuseki.ServerTest.* ;
+import static org.apache.jena.fuseki.ServerTest.gn1;
+import static org.apache.jena.fuseki.ServerTest.gn2;
 import static org.apache.jena.fuseki.ServerTest.model1 ;
 import static org.apache.jena.fuseki.ServerTest.model2 ;
 
-import java.io.BufferedInputStream;
-import java.io.BufferedReader;
-import java.io.IOException ;
-import java.io.InputStream;
-import java.io.InputStreamReader;
+import java.io.*;
 import java.net.HttpURLConnection ;
 import java.net.URL ;
 import java.util.Iterator ;
 
 import org.apache.http.impl.client.CloseableHttpClient;
 import org.apache.jena.atlas.json.JsonArray;
-import org.apache.jena.atlas.lib.NotImplemented;
 import org.apache.jena.atlas.web.AcceptList ;
 import org.apache.jena.atlas.web.MediaType;
 import org.apache.jena.graph.Node ;
@@ -270,7 +266,6 @@ public class TestQuery extends AbstractFusekiTest {
         }
     }
 
-    @Test(expected = NotImplemented.class)
     public void query_json_01() throws IOException {
         Query query = QueryFactory.create("JSON { \"s\": ?s , \"p\": ?p , \"o\" : ?o } "
                 + "WHERE { ?s ?p ?o }", Syntax.syntaxARQ);


[2/2] jena git commit: JENA-1543: Merge commit 'refs/pull/415/head' of https://github.com/apache/jena

Posted by an...@apache.org.
JENA-1543: Merge commit 'refs/pull/415/head' of https://github.com/apache/jena

Follows from JENA-632.

This closes #415.


Project: http://git-wip-us.apache.org/repos/asf/jena/repo
Commit: http://git-wip-us.apache.org/repos/asf/jena/commit/379c4c69
Tree: http://git-wip-us.apache.org/repos/asf/jena/tree/379c4c69
Diff: http://git-wip-us.apache.org/repos/asf/jena/diff/379c4c69

Branch: refs/heads/master
Commit: 379c4c69317c89eea00562a761e9da13f1ddd889
Parents: c47a3da 90daf97
Author: Andy Seaborne <an...@apache.org>
Authored: Wed May 9 15:02:13 2018 +0100
Committer: Andy Seaborne <an...@apache.org>
Committed: Wed May 9 15:02:13 2018 +0100

----------------------------------------------------------------------
 .../jena/sparql/engine/QueryExecutionBase.java  |  1 +
 .../sparql/engine/http/QueryEngineHTTP.java     | 23 ++++++--
 .../apache/jena/sparql/util/QueryExecUtils.java | 56 ++++++++++++++++++--
 .../org/apache/jena/sparql/junit/QueryTest.java |  3 ++
 .../java/org/apache/jena/fuseki/TestQuery.java  | 11 ++--
 5 files changed, 78 insertions(+), 16 deletions(-)
----------------------------------------------------------------------