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 2021/12/08 13:44:42 UTC

[jena] branch main updated: JENA-2207: Undo variable rename for scoping

This is an automated email from the ASF dual-hosted git repository.

andy pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/jena.git


The following commit(s) were added to refs/heads/main by this push:
     new 860ed2d  JENA-2207: Undo variable rename for scoping
     new bfbd611  Merge pull request #1125 from afs/jena2207-service
860ed2d is described below

commit 860ed2dab977189a5639b831425cdec619a318c5
Author: Andy Seaborne <an...@apache.org>
AuthorDate: Tue Dec 7 09:24:04 2021 +0000

    JENA-2207: Undo variable rename for scoping
---
 .../org/apache/jena/sparql/exec/http/Service.java    | 20 ++++++++++++++++++--
 .../apache/jena/sparql/exec/http/TestService.java    |  8 ++++++++
 2 files changed, 26 insertions(+), 2 deletions(-)

diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/exec/http/Service.java b/jena-arq/src/main/java/org/apache/jena/sparql/exec/http/Service.java
index 1febb92..bc2e5e2 100644
--- a/jena-arq/src/main/java/org/apache/jena/sparql/exec/http/Service.java
+++ b/jena-arq/src/main/java/org/apache/jena/sparql/exec/http/Service.java
@@ -36,6 +36,7 @@ import org.apache.jena.sparql.algebra.Op ;
 import org.apache.jena.sparql.algebra.OpAsQuery ;
 import org.apache.jena.sparql.algebra.op.OpService ;
 import org.apache.jena.sparql.engine.QueryIterator ;
+import org.apache.jena.sparql.engine.Rename;
 import org.apache.jena.sparql.engine.http.HttpParams;
 import org.apache.jena.sparql.engine.http.QueryExceptionHTTP;
 import org.apache.jena.sparql.engine.iterator.QueryIterPlainWrapper;
@@ -124,8 +125,23 @@ public class Service {
                 query.setQueryPattern(el);
                 query.setResultVars();
             }
-        } else
-            query = OpAsQuery.asQuery(opRemote);
+        } else {
+            // This relies on the observation that the query was originally correct,
+            // so reversing the scope renaming is safe (it merely restores the
+            // algebra expression).
+            //
+            // Any variables that reappear should be internal ones that were hidden
+            // by renaming in the first place.
+            //
+            // Any substitution is also safe because it replaces variables by
+            // values.
+            //
+            // It is safer to rename/unrename than skipping SERVICE during rename
+            // to avoid substituting hidden variables.
+
+            Op opRestored = Rename.reverseVarRename(opRemote, true);
+            query = OpAsQuery.asQuery(opRestored);
+        }
 
         // -- Setup
         //boolean withCompression = context.isTrueOrUndef(httpQueryCompression);
diff --git a/jena-integration-tests/src/test/java/org/apache/jena/sparql/exec/http/TestService.java b/jena-integration-tests/src/test/java/org/apache/jena/sparql/exec/http/TestService.java
index d0209b3..34e2f06 100644
--- a/jena-integration-tests/src/test/java/org/apache/jena/sparql/exec/http/TestService.java
+++ b/jena-integration-tests/src/test/java/org/apache/jena/sparql/exec/http/TestService.java
@@ -436,6 +436,14 @@ public class TestService {
         }
     }
 
+    // JENA-2207
+    // The inner query involves a rename of variables ?p ?o. This should be undone by Service.exec.
+    @Test public void service_query_nested_select_1() {
+        String innerQuery = "SELECT ?s { ?s ?p ?o }";
+        String queryString = "ASK { SERVICE <"+SERVICE+ "> { "+innerQuery+" } }";
+        QueryExec.dataset(localDataset()).query(queryString).ask();
+    }
+
     private static void runWithModifier(String key, HttpRequestModifier modifier, Runnable action) {
         RegistryRequestModifier.get().add(SERVICE, modifier);
         try {