Skip to content

Commit 397ff4a

Browse files
author
James Leigh
committed
Merge branch 'master' of github.com:eclipse/rdf4j into develop
2 parents 86aa4d4 + d2e45b7 commit 397ff4a

10 files changed

Lines changed: 98 additions & 4 deletions

File tree

core/queryalgebra/evaluation/src/test/java/org/eclipse/rdf4j/query/algebra/evaluation/impl/QueryJoinOptimizerTest.java

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
package org.eclipse.rdf4j.query.algebra.evaluation.impl;
99

1010
import static org.junit.Assert.assertEquals;
11+
import static org.junit.Assert.assertNotEquals;
1112

1213
import org.eclipse.rdf4j.RDF4JException;
1314
import org.eclipse.rdf4j.query.MalformedQueryException;
@@ -19,6 +20,7 @@
1920
import org.eclipse.rdf4j.query.algebra.QueryRoot;
2021
import org.eclipse.rdf4j.query.algebra.TupleExpr;
2122
import org.eclipse.rdf4j.query.algebra.UnaryTupleOperator;
23+
import org.eclipse.rdf4j.query.algebra.helpers.AbstractQueryModelVisitor;
2224
import org.eclipse.rdf4j.query.parser.ParsedQuery;
2325
import org.eclipse.rdf4j.query.parser.QueryParserUtil;
2426
import org.eclipse.rdf4j.query.parser.sparql.SPARQLParser;
@@ -65,6 +67,28 @@ public void testContextOptimization()
6567
testOptimizer(expectedQuery, query);
6668
}
6769

70+
@Test
71+
public void testSES2306AggregateOrderBy()
72+
throws Exception
73+
{
74+
String select = "PREFIX ex: <ex:>\n" + "SELECT ((MIN(?x+1) + MAX(?y-1))/2 AS ?r) {\n"
75+
+ " ?this ex:name ?n . ?this ex:id ?id . ?this ex:prop1 ?x . ?this ex:prop2 ?y .\n"
76+
+ "} GROUP BY concat(?n, ?id) HAVING (SUM(?x) + SUM(?y) < 5) ORDER BY (COUNT(?x) + COUNT(?y))";
77+
78+
SPARQLParser parser = new SPARQLParser();
79+
ParsedQuery q = parser.parseQuery(select, null);
80+
q.getTupleExpr().visit(new AbstractQueryModelVisitor<Exception>() {
81+
82+
@Override
83+
protected void meetUnaryTupleOperator(UnaryTupleOperator node)
84+
throws Exception
85+
{
86+
assertNotEquals(node, node.getArg());
87+
super.meetUnaryTupleOperator(node);
88+
}
89+
});
90+
}
91+
6892
@Test
6993
public void testSES2116JoinBind()
7094
throws Exception

core/queryalgebra/model/src/main/java/org/eclipse/rdf4j/query/algebra/BinaryTupleOperator.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,7 @@ public TupleExpr getLeftArg() {
6767
*/
6868
public void setLeftArg(TupleExpr leftArg) {
6969
assert leftArg != null : "leftArg must not be null";
70+
assert leftArg != this : "leftArg must not be itself";
7071
leftArg.setParentNode(this);
7172
this.leftArg = leftArg;
7273
}
@@ -88,6 +89,7 @@ public TupleExpr getRightArg() {
8889
*/
8990
public void setRightArg(TupleExpr rightArg) {
9091
assert rightArg != null : "rightArg must not be null";
92+
assert rightArg != this : "rightArg must not be itself";
9193
rightArg.setParentNode(this);
9294
this.rightArg = rightArg;
9395
}

core/queryalgebra/model/src/main/java/org/eclipse/rdf4j/query/algebra/UnaryTupleOperator.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,7 @@ public TupleExpr getArg() {
6161
*/
6262
public void setArg(TupleExpr arg) {
6363
assert arg != null : "arg must not be null";
64+
assert arg != this : "arg must not be itself";
6465
arg.setParentNode(this);
6566
this.arg = arg;
6667
}

core/queryparser/sparql/src/main/java/org/eclipse/rdf4j/query/parser/sparql/TupleExprBuilder.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -375,7 +375,9 @@ private TupleExpr processOrderClause(ASTOrderClause orderNode, TupleExpr tupleEx
375375
// add the aggregate operator to the group.
376376
GroupElem ge = new GroupElem(alias, operator);
377377
group.addGroupElement(ge);
378+
}
378379

380+
if (!extension.getElements().isEmpty()) {
379381
extension.setArg(tupleExpr);
380382
tupleExpr = extension;
381383
}

core/repository/sparql/src/main/java/org/eclipse/rdf4j/repository/sparql/query/QueryStringUtil.java

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,8 +35,22 @@ public class QueryStringUtil {
3535
* @param queryString
3636
* @param bindings
3737
* @return the modified queryString
38+
* @deprecated since 2.3 use {@link #getTupleQueryString(String, BindingSet)}
3839
*/
40+
@Deprecated
3941
public static String getQueryString(String queryString, BindingSet bindings) {
42+
return getTupleQueryString(queryString, bindings);
43+
}
44+
45+
/**
46+
* Retrieve a modified queryString into which all bindings of the given argument are replaced, with the
47+
* binding names included in the SELECT clause.
48+
*
49+
* @param queryString
50+
* @param bindings
51+
* @return the modified queryString
52+
*/
53+
public static String getTupleQueryString(String queryString, BindingSet bindings) {
4054
if (bindings.size() == 0) {
4155
return queryString;
4256
}
@@ -61,6 +75,56 @@ public static String getQueryString(String queryString, BindingSet bindings) {
6175
return select + where;
6276
}
6377

78+
/**
79+
* Retrieve a modified queryString into which all bindings of the given argument are replaced with their
80+
* value.
81+
*
82+
* @param queryString
83+
* @param bindings
84+
* @return the modified queryString
85+
*/
86+
public static String getUpdateString(String queryString, BindingSet bindings) {
87+
return getGraphQueryString(queryString, bindings);
88+
}
89+
90+
/**
91+
* Retrieve a modified queryString into which all bindings of the given argument are replaced with their
92+
* value.
93+
*
94+
* @param queryString
95+
* @param bindings
96+
* @return the modified queryString
97+
*/
98+
public static String getBooleanQueryString(String queryString, BindingSet bindings) {
99+
return getGraphQueryString(queryString, bindings);
100+
}
101+
102+
/**
103+
* Retrieve a modified queryString into which all bindings of the given argument are replaced with their
104+
* value.
105+
*
106+
* @param queryString
107+
* @param bindings
108+
* @return the modified queryString
109+
*/
110+
public static String getGraphQueryString(String queryString, BindingSet bindings) {
111+
if (bindings.size() == 0) {
112+
return queryString;
113+
}
114+
115+
String qry = queryString;
116+
for (String name : bindings.getBindingNames()) {
117+
String replacement = getReplacement(bindings.getValue(name));
118+
if (replacement != null) {
119+
String pattern = "[\\?\\$]" + name + "(?=\\W)";
120+
// we use Matcher.quoteReplacement to make sure things like newlines
121+
// in literal values are preserved
122+
qry = qry.replaceAll(pattern, Matcher.quoteReplacement(replacement));
123+
}
124+
}
125+
return qry;
126+
}
127+
64128
private static String getReplacement(Value value) {
65129
StringBuilder sb = new StringBuilder();
66130
if (value instanceof IRI) {

core/repository/sparql/src/main/java/org/eclipse/rdf4j/repository/sparql/query/SPARQLBooleanQuery.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,6 @@ public boolean evaluate()
5050
}
5151

5252
private String getQueryString() {
53-
return QueryStringUtil.getQueryString(queryString, getBindings());
53+
return QueryStringUtil.getBooleanQueryString(queryString, getBindings());
5454
}
5555
}

core/repository/sparql/src/main/java/org/eclipse/rdf4j/repository/sparql/query/SPARQLGraphQuery.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,6 @@ public void evaluate(RDFHandler handler)
7474
}
7575

7676
private String getQueryString() {
77-
return QueryStringUtil.getQueryString(queryString, getBindings());
77+
return QueryStringUtil.getGraphQueryString(queryString, getBindings());
7878
}
7979
}

core/repository/sparql/src/main/java/org/eclipse/rdf4j/repository/sparql/query/SPARQLTupleQuery.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,6 @@ public void evaluate(TupleQueryResultHandler handler)
7575
}
7676

7777
private String getQueryString() {
78-
return QueryStringUtil.getQueryString(queryString, getBindings());
78+
return QueryStringUtil.getTupleQueryString(queryString, getBindings());
7979
}
8080
}

core/repository/sparql/src/main/java/org/eclipse/rdf4j/repository/sparql/query/SPARQLUpdate.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,6 @@ public void execute()
6464

6565
@Override
6666
public String getQueryString() {
67-
return QueryStringUtil.getQueryString(queryString, getBindings());
67+
return QueryStringUtil.getUpdateString(queryString, getBindings());
6868
}
6969
}

core/sail/federation/src/main/java/org/eclipse/rdf4j/sail/federation/algebra/AbstractNaryOperator.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -115,6 +115,7 @@ private final void setArgs(final List<? extends Expr> args) {
115115
* Sets the <tt>idx</tt>-th argument of this n-ary tuple operator.
116116
*/
117117
protected final void setArg(final int idx, final Expr arg) {
118+
assert arg != this : "arg must not be itself";
118119
if (arg != null) {
119120
// arg can be null (i.e. Regex)
120121
arg.setParentNode(this);

0 commit comments

Comments
 (0)