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:31 UTC

[06/19] jena git commit: ARQ:Query:ParameterizedSparqlString - need for parenthesis in ungrouped values now determined based on the query rather than as a parameter.

ARQ:Query:ParameterizedSparqlString - need for parenthesis in ungrouped values now determined based on the query rather than as a parameter.

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

Branch: refs/heads/master
Commit: ecaf8d8bf08be57146c4f52b03117f4dd39f45a2
Parents: a5f18c3
Author: Greg Albiston <gr...@hotmail.com>
Authored: Mon Jul 30 16:13:12 2018 +0100
Committer: Greg Albiston <gr...@hotmail.com>
Committed: Mon Jul 30 16:13:12 2018 +0100

----------------------------------------------------------------------
 .../jena/query/ParameterizedSparqlString.java   | 114 +++++++------------
 .../query/TestParameterizedSparqlString.java    |  18 +--
 2 files changed, 41 insertions(+), 91 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/jena/blob/ecaf8d8b/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 cba1e6d..3acac63 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
@@ -1741,19 +1741,6 @@ public class ParameterizedSparqlString implements PrefixMapping {
     }
     
     /**
-     * Assign a varName with a multiple items and whether to include
-     * parenthesis.
-     *
-     * @param varName
-     * @param items
-     * @param isParenthesisNeeded
-     */
-    public void setValues(String varName, Collection<? extends RDFNode> items, boolean isParenthesisNeeded) {
-        items.forEach(item -> validateParameterValue(item.asNode()));
-        this.valuesReplacements.put(varName, new ValueReplacement(varName, items, isParenthesisNeeded));
-    }
-
-    /**
      * Assign a varName with a multiple items.<br>
      * 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>
@@ -1763,69 +1750,31 @@ public class ParameterizedSparqlString implements PrefixMapping {
      * @param items
      */
     public void setValues(String varName, Collection<? extends RDFNode> items) {
-        setValues(varName, items, false);
-    }
-
-    /**
-     * Assign a varName with a single item and whether to include parenthesis.
-     *
-     * @param varName
-     * @param item
-     * @param isParenthesisNeeded
-     */
-    public void setValues(String varName, RDFNode item, boolean isParenthesisNeeded) {
-        setValues(varName, Arrays.asList(item), isParenthesisNeeded);
+        items.forEach(item -> validateParameterValue(item.asNode()));
+        this.valuesReplacements.put(varName, new ValueReplacement(varName, items));
     }
 
     /**
-     * Assign a varName with a single item.
+     * Assign a varName with a single item.<br>
      *
      * @param varName
      * @param item
      */
     public void setValues(String varName, RDFNode item) {
-        setValues(varName, Arrays.asList(item), false);
-    }
-
-    /**
-     * Sets a map of varNames and their items.
-     *
-     * @param valuesItems
-     */
-    public void setValues(Map<String, Collection<? extends RDFNode>> valuesItems) {
-        valuesItems.forEach(this::setValues);
+        setValues(varName, Arrays.asList(item));
     }
 
     /**
-     * All varNames in the map will use the same approach to parenthesis.
-     *
-     * @param valuesItems
-     * @param isParenthesisNeeded
-     */
-    public void setValues(Map<String, Collection<? extends RDFNode>> valuesItems, Boolean isParenthesisNeeded) {
-        valuesItems.forEach((varName, items) -> setValues(varName, items, isParenthesisNeeded));
-    }
-
-    /**
-     * Combine a map of varNames and items with whether to include parenthesis.
-     * Missing varNames in the parenthesis map will default to false.
+     * **
+     * Sets a map of varNames and their items.<br>
+     * 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.
      *
-     * @param valuesItems
-     * @param valuesParenthesis
+     * @param itemsMap
      */
-    public void setValues(Map<String, Collection<? extends RDFNode>> valuesItems, Map<String, Boolean> valuesParenthesis) {
-
-        for (String varName : valuesItems.keySet()) {
-            Collection<? extends RDFNode> items = valuesItems.get(varName);
-            Boolean isParenthesisNeeded;
-            if (valuesParenthesis.containsKey(varName)) {
-                isParenthesisNeeded = valuesParenthesis.get(varName);
-            } else {
-                isParenthesisNeeded = false;
-            }
-
-            setValues(varName, items, isParenthesisNeeded);
-        }
+    public void setValues(Map<String, Collection<? extends RDFNode>> itemsMap) {
+        itemsMap.forEach(this::setValues);
     }
 
     /**
@@ -1835,11 +1784,11 @@ public class ParameterizedSparqlString implements PrefixMapping {
      * (prop_B obj_B)}".
      *
      * @param varName
-     * @param items
+     * @param groupedItems
      */
-    public void setGroupedValues(String varName, Collection<List<? extends RDFNode>> items) {
-        items.forEach(collection -> collection.forEach(item -> validateParameterValue(item.asNode())));
-        this.valuesReplacements.put(varName, new ValueReplacement(varName, items));
+    public void setGroupedValues(String varName, Collection<List<? extends RDFNode>> groupedItems) {
+        groupedItems.forEach(collection -> collection.forEach(item -> validateParameterValue(item.asNode())));
+        this.valuesReplacements.put(varName, new ValueReplacement(varName, groupedItems, true));
     }
 
     private String applyValues(String command) {
@@ -1868,6 +1817,22 @@ public class ParameterizedSparqlString implements PrefixMapping {
         return targetVars;
     }
 
+    protected static boolean checkParenthesis(String command, String varName) {
+        boolean isNeeded;
+
+        int varIndex = command.indexOf(varName);
+        if (varIndex > -1) {
+            String subCmd = command.substring(0, varIndex).toLowerCase(); //Truncate the command at the varName. Lowercase to search both types of values.
+            int valuesIndex = subCmd.lastIndexOf(VALUES_KEYWORD);
+            int bracesIndex = subCmd.lastIndexOf("{");
+            String vars = command.substring(valuesIndex + VALUES_KEYWORD.length(), bracesIndex);
+            isNeeded = vars.contains("(");
+        } else {
+            isNeeded = false;
+        }
+        return isNeeded;
+    }
+
     /**
      * Performs replacement of VALUES in query string.
      *
@@ -1877,23 +1842,20 @@ public class ParameterizedSparqlString implements PrefixMapping {
         private final String varName;
         private final Collection<? extends RDFNode> items;
         private final Collection<List<? extends RDFNode>> groupedItems;
-        private final Boolean isParenthesisNeeded;
         private final Boolean isGrouped;
 
-        public ValueReplacement(String varName, Collection<? extends RDFNode> items, Boolean isParenthesisNeeded) {
+        public ValueReplacement(String varName, Collection<? extends RDFNode> items) {
             this.varName = varName;
             this.items = items;
             this.groupedItems = new ArrayList<>();
-            this.isParenthesisNeeded = isParenthesisNeeded;
             this.isGrouped = false;
         }
 
-        public ValueReplacement(String varName, Collection<List<? extends RDFNode>> groupedItems) {
+        public ValueReplacement(String varName, Collection<List<? extends RDFNode>> groupedItems, Boolean isGrouped) {
             this.varName = varName;
             this.items = new ArrayList<>();
             this.groupedItems = groupedItems;
-            this.isParenthesisNeeded = true;
-            this.isGrouped = true;
+            this.isGrouped = isGrouped;
         }
 
         public String apply(String command) {
@@ -1910,7 +1872,8 @@ public class ParameterizedSparqlString implements PrefixMapping {
             if (isGrouped) {
                 replacement = groupedApply();
             } else {
-                replacement = ungroupedApply();
+
+                replacement = ungroupedApply(command);
             }
 
             return command.replace(target, replacement);
@@ -1936,7 +1899,8 @@ public class ParameterizedSparqlString implements PrefixMapping {
             return replacement;
         }
 
-        private StringBuilder ungroupedApply() {
+        private StringBuilder ungroupedApply(String command) {
+            boolean isParenthesisNeeded = checkParenthesis(command, varName);
             StringBuilder replacement = new StringBuilder("");
 
             for (RDFNode item : items) {

http://git-wip-us.apache.org/repos/asf/jena/blob/ecaf8d8b/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 90e5385..adf1108 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
@@ -1942,20 +1942,6 @@ public class TestParameterizedSparqlString {
     }
 
     @Test
-    public void test_set_values_item_parenthesis() {
-        // Tests a single value with parenthesis.
-        String str = "SELECT * WHERE { VALUES ?o {?objs} ?s ?p ?o }";
-        ParameterizedSparqlString pss = new ParameterizedSparqlString(str);
-        pss.setValues("objs", ResourceFactory.createPlainLiteral("test"), true);
-
-        String exp = "SELECT * WHERE { VALUES ?o {(\"test\")} ?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_items() {
         // Tests two values for same variable.
         String str = "SELECT * WHERE { VALUES ?o {?objs} ?s ?p ?o }";
@@ -1980,7 +1966,7 @@ public class TestParameterizedSparqlString {
         List<RDFNode> objs = new ArrayList<>();
         objs.add(ResourceFactory.createPlainLiteral("obj_A"));
         objs.add(ResourceFactory.createPlainLiteral("obj_B"));
-        pss.setValues("objs", objs, true);
+        pss.setValues("objs", objs);
 
         String exp = "SELECT * WHERE { VALUES (?o) {(\"obj_A\") (\"obj_B\")} ?s ?p ?o }";
         String res = pss.toString();
@@ -2024,7 +2010,7 @@ public class TestParameterizedSparqlString {
         List<RDFNode> props = new ArrayList<>();
         props.add(ResourceFactory.createProperty("http://example.org/prop_A"));
         props.add(ResourceFactory.createProperty("http://example.org/prop_B"));
-        pss.setValues("props", props, true);
+        pss.setValues("props", props);
 
         String exp = "SELECT * WHERE { VALUES (?p) {(<http://example.org/prop_A>) (<http://example.org/prop_B>)} VALUES ?o {\"obj_A\" \"obj_B\"} ?s ?p ?o }";
         String res = pss.toString();