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:36 UTC
[11/19] jena git commit: ARQ:Query:ParameterizedSparqlString -
Distinction removed between "items" and "rowItems". Alternative checks
(replacing values and validating injection) are made when only a single
variable found. Otherwise treat multiple variabl
ARQ:Query:ParameterizedSparqlString
- Distinction removed between "items" and "rowItems". Alternative checks (replacing values and validating injection) are made when only a single variable found. Otherwise treat multiple variables with single row or many rows the same.
- Now ensure all "row" Collections are Lists when values are being set for later handling.
Project: http://git-wip-us.apache.org/repos/asf/jena/repo
Commit: http://git-wip-us.apache.org/repos/asf/jena/commit/856e06c2
Tree: http://git-wip-us.apache.org/repos/asf/jena/tree/856e06c2
Diff: http://git-wip-us.apache.org/repos/asf/jena/diff/856e06c2
Branch: refs/heads/master
Commit: 856e06c2d12cdf194db4661d9e91bddb7c522e49
Parents: b708cff
Author: Greg Albiston <gr...@hotmail.com>
Authored: Thu Aug 2 13:49:21 2018 +0100
Committer: Greg Albiston <gr...@hotmail.com>
Committed: Thu Aug 2 13:49:21 2018 +0100
----------------------------------------------------------------------
.../jena/query/ParameterizedSparqlString.java | 113 +++++++------------
1 file changed, 43 insertions(+), 70 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/jena/blob/856e06c2/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 e45f3d6..c3b3857 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
@@ -32,6 +32,7 @@ import java.util.Map.Entry;
import java.util.regex.MatchResult;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
+import java.util.stream.Collectors;
import org.apache.jena.atlas.lib.Pair;
import org.apache.jena.datatypes.RDFDatatype ;
import org.apache.jena.graph.Node ;
@@ -1754,7 +1755,15 @@ public class ParameterizedSparqlString implements PrefixMapping {
*/
public void setValues(String varName, Collection<? extends RDFNode> items) {
items.forEach(item -> validateParameterValue(item.asNode()));
- this.valuesReplacements.put(varName, new ValueReplacement(varName, items));
+
+ //Ensure that a list is used for the items.
+ Collection<List<? extends RDFNode>> rowItems = new ArrayList<>();
+ if (items instanceof List) {
+ rowItems.add((List) items);
+ } else {
+ rowItems.add(new ArrayList<>(items));
+ }
+ this.valuesReplacements.put(varName, new ValueReplacement(varName, rowItems));
}
/**
@@ -1793,7 +1802,7 @@ public class ParameterizedSparqlString implements PrefixMapping {
*/
public void setRowValues(String varName, Collection<List<? extends RDFNode>> rowItems) {
rowItems.forEach(collection -> collection.forEach(item -> validateParameterValue(item.asNode())));
- this.valuesReplacements.put(varName, new ValueReplacement(varName, rowItems, true));
+ this.valuesReplacements.put(varName, new ValueReplacement(varName, rowItems));
}
private String applyValues(String command) {
@@ -1829,27 +1838,16 @@ public class ParameterizedSparqlString implements PrefixMapping {
private class ValueReplacement {
private final String varName;
- private final Collection<? extends RDFNode> items;
private final Collection<List<? extends RDFNode>> rowItems;
- private final Boolean isRows;
- public ValueReplacement(String varName, Collection<? extends RDFNode> items) {
+ public ValueReplacement(String varName, Collection<List<? extends RDFNode>> rowItems) {
this.varName = varName;
- this.items = items;
- this.rowItems = new ArrayList<>();
- this.isRows = false;
- }
-
- public ValueReplacement(String varName, Collection<List<? extends RDFNode>> rowItems, Boolean isRows) {
- this.varName = varName;
- this.items = new ArrayList<>();
this.rowItems = rowItems;
- this.isRows = isRows;
}
public String apply(String command) {
- if (items.isEmpty() && rowItems.isEmpty()) {
+ if (rowItems.isEmpty()) {
return command;
}
@@ -1857,59 +1855,38 @@ public class ParameterizedSparqlString implements PrefixMapping {
validateValuesSafeToInject(command, targetVars);
String target = createTarget();
-
- StringBuilder replacement;
- if (isRows) {
- replacement = rowsApply();
- } else {
- replacement = singleApply(targetVars.length);
- }
+ StringBuilder replacement = buildReplacement(targetVars.length);
return command.replace(target, replacement);
}
- private StringBuilder rowsApply() {
- StringBuilder replacement = new StringBuilder("");
-
- for (List<? extends RDFNode> row : rowItems) {
- replacement.append("(");
- for (RDFNode item : row) {
- String insert = FmtUtils.stringForNode(item.asNode(), (PrefixMapping) null);
- replacement.append(insert);
- replacement.append(" ");
- }
-
- replacement.deleteCharAt(replacement.length() - 1);
- replacement.append(") ");
- }
-
- replacement.deleteCharAt(replacement.length() - 1);
- return replacement;
- }
-
- private StringBuilder singleApply(int targetVarCount) {
+ private StringBuilder buildReplacement(int targetVarCount) {
StringBuilder replacement = new StringBuilder("");
if (targetVarCount == 1) {
- for (RDFNode item : items) {
+ for (List<? extends RDFNode> row : rowItems) {
+ for (RDFNode item : row) {
replacement.append("(");
String insert = FmtUtils.stringForNode(item.asNode(), (PrefixMapping) null);
replacement.append(insert);
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(" ");
+ for (List<? extends RDFNode> row : rowItems) {
+ replacement.append("(");
+ for (RDFNode item : row) {
+ String insert = FmtUtils.stringForNode(item.asNode(), (PrefixMapping) null);
+ replacement.append(insert);
+ replacement.append(" ");
+ }
+ replacement.deleteCharAt(replacement.length() - 1);
+ replacement.append(") ");
}
- replacement.deleteCharAt(replacement.length() - 1);
- replacement.append(")");
}
+ replacement.deleteCharAt(replacement.length() - 1);
return replacement;
}
@@ -1933,29 +1910,25 @@ public class ParameterizedSparqlString implements PrefixMapping {
protected void validateValuesSafeToInject(String command, String[] targetVars) {
- for (int i = 0; i < targetVars.length; i++) {
- String targetVar = targetVars[i];
- if (isRows) {
- //Iterate through each row according to the position of var and item.
- for (List<? extends RDFNode> row : rowItems) {
- RDFNode item = row.get(i);
+ if (targetVars.length == 1) {
+ //Single var with one or more items so all checked against the same var.
+ String targetVar = targetVars[0];
+ for (List<? extends RDFNode> row : rowItems) {
+ for (RDFNode item : row) {
validateSafeToInject(command, targetVar, item.asNode());
}
- } else {
- if (targetVars.length > 1) {
- if (items instanceof List) {
- //Multiple vars with items in an ordered list. Each var is checked against the item.
- List<? extends RDFNode> listItems = (List<? extends RDFNode>) items;
- RDFNode item = listItems.get(i);
+ }
+ } else {
+ //Multiple var with one or more rows.
+ for (int i = 0; i < targetVars.length; i++) {
+ String targetVar = targetVars[i];
+ for (List<? extends RDFNode> row : rowItems) {
+ if (targetVars.length == row.size()) {
+ RDFNode item = row.get(i);
validateSafeToInject(command, targetVar, item.asNode());
} else {
- //Multiple vars with items not in an ordered list. This is parsing error.
- throw new ARQException("Multiple VALUES variables (" + String.join(", ", targetVars) + ") being used without an ordered list of items: " + items.toString());
- }
- } else {
- //Single var with one or more items so all are checked.
- for (RDFNode item : items) {
- validateSafeToInject(command, targetVar, item.asNode());
+ String rowString = row.stream().map(RDFNode::toString).collect(Collectors.joining(","));
+ throw new ARQException("Number of VALUES variables (" + String.join(", ", targetVars) + ") does not equal replacement row (" + rowString + ").");
}
}
}