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/08/05 15:33:34 UTC

[09/19] jena git commit: ARQ:Query:ParameterizedSparqlString - parenthesis now always applied when there is more than one target variables. Only check the query for parenthesis in the single target variable case.

ARQ:Query:ParameterizedSparqlString - parenthesis now always applied when there is more than one target variables. Only check the query for parenthesis in the single target variable case.

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

Branch: refs/heads/master
Commit: 9662ff6e7dc57633cfbc78632a596f56f2db3268
Parents: 8b1548c
Author: Greg Albiston <gr...@hotmail.com>
Authored: Mon Jul 30 16:49:37 2018 +0100
Committer: Greg Albiston <gr...@hotmail.com>
Committed: Mon Jul 30 16:49:37 2018 +0100

----------------------------------------------------------------------
 .../jena/query/ParameterizedSparqlString.java   | 48 ++++++++++++--------
 .../query/TestParameterizedSparqlString.java    | 17 +++++++
 2 files changed, 46 insertions(+), 19 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/jena/blob/9662ff6e/jena-arq/src/main/java/org/apache/jena/query/ParameterizedSparqlString.java
----------------------------------------------------------------------
diff --git a/jena-arq/src/main/java/org/apache/jena/query/ParameterizedSparqlString.java b/jena-arq/src/main/java/org/apache/jena/query/ParameterizedSparqlString.java
index 9a3fae8..8ecc644 100644
--- a/jena-arq/src/main/java/org/apache/jena/query/ParameterizedSparqlString.java
+++ b/jena-arq/src/main/java/org/apache/jena/query/ParameterizedSparqlString.java
@@ -1745,8 +1745,8 @@ public class ParameterizedSparqlString implements PrefixMapping {
      * Can be used to assign multiple values to a single variable or single
      * value to multiple variables (if using a List) in the SPARQL query.<br>
      * See setGroupedValues to assign multiple values to multiple variables.<br>
-     * Using "var" with list(prop_A, obj_A) on query "VALUES ?p ?o {?var}" would
-     * produce "VALUES ?p ?o {prop_A obj_A}".
+     * Using "var" with list(prop_A, obj_A) on query "VALUES (?p ?o) {?var}"
+     * would produce "VALUES (?p ?o) {(prop_A obj_A)}".
      *
      *
      * @param varName
@@ -1868,7 +1868,8 @@ public class ParameterizedSparqlString implements PrefixMapping {
                 return command;
             }
 
-            validateValuesSafeToInject(command);
+            String[] targetVars = extractTargetVars(command, varName);
+            validateValuesSafeToInject(command, targetVars);
 
             String target = createTarget();
 
@@ -1877,7 +1878,7 @@ public class ParameterizedSparqlString implements PrefixMapping {
                 replacement = groupedApply();
             } else {
 
-                replacement = ungroupedApply(command);
+                replacement = ungroupedApply(command, targetVars.length);
             }
 
             return command.replace(target, replacement);
@@ -1903,24 +1904,35 @@ public class ParameterizedSparqlString implements PrefixMapping {
             return replacement;
         }
 
-        private StringBuilder ungroupedApply(String command) {
-            boolean isParenthesisNeeded = checkParenthesis(command, varName);
+        private StringBuilder ungroupedApply(String command, int targetVarCount) {
+
             StringBuilder replacement = new StringBuilder("");
 
-            for (RDFNode item : items) {
-                if (isParenthesisNeeded) {
-                    replacement.append("(");
+            if (targetVarCount == 1) {
+                boolean isParenthesisNeeded = checkParenthesis(command, varName);
+                for (RDFNode item : items) {
+                    if (isParenthesisNeeded) {
+                        replacement.append("(");
+                    }
+                    String insert = FmtUtils.stringForNode(item.asNode(), (PrefixMapping) null);
+                    replacement.append(insert);
+                    if (isParenthesisNeeded) {
+                        replacement.append(")");
+                    }
+                    replacement.append(" ");
                 }
-                String insert = FmtUtils.stringForNode(item.asNode(), (PrefixMapping) null);
-                replacement.append(insert);
-                if (isParenthesisNeeded) {
-                    replacement.append(")");
+                replacement.deleteCharAt(replacement.length() - 1);
+            } else {
+                replacement.append("(");
+                for (RDFNode item : items) {
+                    String insert = FmtUtils.stringForNode(item.asNode(), (PrefixMapping) null);
+                    replacement.append(insert);
+                    replacement.append(" ");
                 }
-                replacement.append(" ");
+                replacement.deleteCharAt(replacement.length() - 1);
+                replacement.append(")");
             }
 
-            replacement.deleteCharAt(replacement.length() - 1);
-
             return replacement;
         }
 
@@ -1941,9 +1953,7 @@ public class ParameterizedSparqlString implements PrefixMapping {
             return target;
         }
 
-        protected void validateValuesSafeToInject(String command) {
-
-            String[] targetVars = extractTargetVars(command, varName);
+        protected void validateValuesSafeToInject(String command, String[] targetVars) {
 
             for (int i = 0; i < targetVars.length; i++) {
                 String targetVar = targetVars[i];

http://git-wip-us.apache.org/repos/asf/jena/blob/9662ff6e/jena-arq/src/test/java/org/apache/jena/query/TestParameterizedSparqlString.java
----------------------------------------------------------------------
diff --git a/jena-arq/src/test/java/org/apache/jena/query/TestParameterizedSparqlString.java b/jena-arq/src/test/java/org/apache/jena/query/TestParameterizedSparqlString.java
index adf1108..1dc14ee 100644
--- a/jena-arq/src/test/java/org/apache/jena/query/TestParameterizedSparqlString.java
+++ b/jena-arq/src/test/java/org/apache/jena/query/TestParameterizedSparqlString.java
@@ -1976,6 +1976,23 @@ public class TestParameterizedSparqlString {
     }
 
     @Test
+    public void test_set_values_multiple_variables_parenthesis() {
+        // Tests two values for same variable.
+        String str = "SELECT * WHERE { VALUES (?p ?o) {?vars} ?s ?p ?o }";
+        ParameterizedSparqlString pss = new ParameterizedSparqlString(str);
+        List<RDFNode> vars = new ArrayList<>();
+        vars.add(ResourceFactory.createProperty("http://example.org/prop_A"));
+        vars.add(ResourceFactory.createPlainLiteral("obj_A"));
+        pss.setValues("vars", vars);
+
+        String exp = "SELECT * WHERE { VALUES (?p ?o) {(<http://example.org/prop_A> \"obj_A\")} ?s ?p ?o }";
+        String res = pss.toString();
+        System.out.println("Exp: " + exp);
+        System.out.println("Res: " + res);
+        Assert.assertEquals(exp, res);
+    }
+
+    @Test
     public void test_set_values_multi_var() {
         // Tests two variables.
         String str = "SELECT * WHERE { VALUES ?p {?props} VALUES ?o {?objs} ?s ?p ?o }";