diff --git a/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/impl/ArrayBindingBasedQueryEvaluationContext.java b/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/impl/ArrayBindingBasedQueryEvaluationContext.java index ef1ee675ac7..ec4038add1f 100644 --- a/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/impl/ArrayBindingBasedQueryEvaluationContext.java +++ b/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/impl/ArrayBindingBasedQueryEvaluationContext.java @@ -271,7 +271,7 @@ public void meet(Var node) throws QueryEvaluationException { @Override public void meet(ProjectionElem node) throws QueryEvaluationException { super.meet(node); - node.setSourceName(varNames.computeIfAbsent(node.getSourceName(), k -> k)); + node.setName(varNames.computeIfAbsent(node.getName(), k -> k)); node.setTargetName(varNames.computeIfAbsent(node.getTargetName(), k -> k)); } diff --git a/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/impl/ConstantOptimizer.java b/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/impl/ConstantOptimizer.java index a8ed0bd1b56..a1fe623bbe8 100644 --- a/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/impl/ConstantOptimizer.java +++ b/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/impl/ConstantOptimizer.java @@ -84,7 +84,7 @@ public void optimize(TupleExpr tupleExpr, Dataset dataset, BindingSet bindings) varsBefore.removeAll(varsAfter); for (ProjectionElemList projElems : visitor.projElemLists) { for (ProjectionElem projElem : projElems.getElements()) { - String name = projElem.getSourceName(); + String name = projElem.getName(); if (varsBefore.contains(name)) { UnaryTupleOperator proj = (UnaryTupleOperator) projElems.getParentNode(); Extension ext = new Extension(proj.getArg()); diff --git a/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/impl/OrderLimitOptimizer.java b/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/impl/OrderLimitOptimizer.java index 13c4f555af9..2e6afb71672 100644 --- a/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/impl/OrderLimitOptimizer.java +++ b/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/impl/OrderLimitOptimizer.java @@ -75,7 +75,7 @@ public void meet(Var node) { if (projection != null) { boolean projected = false; for (ProjectionElem e : projection.getProjectionElemList().getElements()) { - String source = e.getSourceName(); + String source = e.getName(); String target = e.getTargetName(); if (node.getName().equals(source) && node.getName().equals(target)) { projected = true; diff --git a/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/impl/SameTermFilterOptimizer.java b/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/impl/SameTermFilterOptimizer.java index 6fb8d630397..731c43f2cb1 100644 --- a/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/impl/SameTermFilterOptimizer.java +++ b/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/impl/SameTermFilterOptimizer.java @@ -187,8 +187,8 @@ public void meet(Var var) { @Override public void meet(ProjectionElem projElem) throws RuntimeException { - if (projElem.getSourceName().equals(oldVar.getName())) { - projElem.setSourceName(newVar.getName()); + if (projElem.getName().equals(oldVar.getName())) { + projElem.setName(newVar.getName()); } } } diff --git a/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/iterator/ProjectionIterator.java b/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/iterator/ProjectionIterator.java index c40599b603f..3801765a27c 100644 --- a/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/iterator/ProjectionIterator.java +++ b/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/iterator/ProjectionIterator.java @@ -52,7 +52,7 @@ public ProjectionIterator(Projection projection, CloseableIteration consumer = null; for (ProjectionElem pe : projectionElemList.getElements()) { - String sourceName = pe.getSourceName(); + String sourceName = pe.getName(); String targetName = pe.getTargetName(); Function valueWithSourceName = context.getValue(sourceName); BiConsumer setTarget = context.setBinding(targetName); @@ -120,9 +120,9 @@ public static BindingSet project(ProjectionElemList projElemList, BindingSet sou final QueryBindingSet resultBindings = makeNewQueryBindings(parentBindings, includeAllParentBindings); for (ProjectionElem pe : projElemList.getElements()) { - Value targetValue = sourceBindings.getValue(pe.getSourceName()); + Value targetValue = sourceBindings.getValue(pe.getName()); if (!includeAllParentBindings && targetValue == null) { - targetValue = parentBindings.getValue(pe.getSourceName()); + targetValue = parentBindings.getValue(pe.getName()); } if (targetValue != null) { resultBindings.setBinding(pe.getTargetName(), targetValue); diff --git a/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/optimizer/ConstantOptimizer.java b/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/optimizer/ConstantOptimizer.java index 1f2ecb03bfd..430c87bc0fa 100644 --- a/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/optimizer/ConstantOptimizer.java +++ b/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/optimizer/ConstantOptimizer.java @@ -88,7 +88,7 @@ public void optimize(TupleExpr tupleExpr, Dataset dataset, BindingSet bindings) for (ProjectionElemList projElems : visitor.projElemLists) { for (ProjectionElem projElem : projElems.getElements()) { - String name = projElem.getSourceName(); + String name = projElem.getName(); if (varsBefore.contains(name)) { UnaryTupleOperator proj = (UnaryTupleOperator) projElems.getParentNode(); diff --git a/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/optimizer/OrderLimitOptimizer.java b/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/optimizer/OrderLimitOptimizer.java index 94d7829aa20..92e0f0596b4 100644 --- a/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/optimizer/OrderLimitOptimizer.java +++ b/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/optimizer/OrderLimitOptimizer.java @@ -79,7 +79,7 @@ public void meet(Var node) { if (projection != null) { boolean projected = false; for (ProjectionElem e : projection.getProjectionElemList().getElements()) { - String source = e.getSourceName(); + String source = e.getName(); String target = e.getTargetName(); if (node.getName().equals(source) && node.getName().equals(target)) { projected = true; diff --git a/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/optimizer/SameTermFilterOptimizer.java b/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/optimizer/SameTermFilterOptimizer.java index 1e957ca0f08..4f34ab4049b 100644 --- a/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/optimizer/SameTermFilterOptimizer.java +++ b/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/optimizer/SameTermFilterOptimizer.java @@ -191,8 +191,8 @@ public void meet(Var var) { @Override public void meet(ProjectionElem projElem) throws RuntimeException { - if (projElem.getSourceName().equals(oldVar.getName())) { - projElem.setSourceName(newVar.getName()); + if (projElem.getName().equals(oldVar.getName())) { + projElem.setName(newVar.getName()); } } } diff --git a/core/queryalgebra/model/src/main/java/org/eclipse/rdf4j/query/algebra/MultiProjection.java b/core/queryalgebra/model/src/main/java/org/eclipse/rdf4j/query/algebra/MultiProjection.java index 32f8f51adb4..d86dd59aa64 100644 --- a/core/queryalgebra/model/src/main/java/org/eclipse/rdf4j/query/algebra/MultiProjection.java +++ b/core/queryalgebra/model/src/main/java/org/eclipse/rdf4j/query/algebra/MultiProjection.java @@ -76,7 +76,7 @@ public Set getBindingNames() { Set bindingNames = new HashSet<>(); for (ProjectionElemList projElemList : projections) { - bindingNames.addAll(projElemList.getTargetNames()); + bindingNames.addAll(projElemList.getProjectedNames()); } return bindingNames; @@ -89,10 +89,10 @@ public Set getAssuredBindingNames() { if (projections.size() >= 1) { Set assuredSourceNames = getArg().getAssuredBindingNames(); - bindingNames.addAll(projections.get(0).getTargetNamesFor(assuredSourceNames)); + bindingNames.addAll(projections.get(0).getProjectedNamesFor(assuredSourceNames)); for (int i = 1; i < projections.size(); i++) { - bindingNames.retainAll(projections.get(i).getTargetNamesFor(assuredSourceNames)); + bindingNames.retainAll(projections.get(i).getProjectedNamesFor(assuredSourceNames)); } } diff --git a/core/queryalgebra/model/src/main/java/org/eclipse/rdf4j/query/algebra/Projection.java b/core/queryalgebra/model/src/main/java/org/eclipse/rdf4j/query/algebra/Projection.java index f0fc8158b57..ffc9d42ffdb 100644 --- a/core/queryalgebra/model/src/main/java/org/eclipse/rdf4j/query/algebra/Projection.java +++ b/core/queryalgebra/model/src/main/java/org/eclipse/rdf4j/query/algebra/Projection.java @@ -65,14 +65,14 @@ public void setProjectionElemList(ProjectionElemList projElemList) { @Override public Set getBindingNames() { - return projElemList.getTargetNames(); + return projElemList.getProjectedNames(); } @Override public Set getAssuredBindingNames() { // Return all target binding names for which the source binding is assured // by the argument - return projElemList.getTargetNamesFor(getArg().getAssuredBindingNames()); + return projElemList.getProjectedNamesFor(getArg().getAssuredBindingNames()); } @Override diff --git a/core/queryalgebra/model/src/main/java/org/eclipse/rdf4j/query/algebra/ProjectionElem.java b/core/queryalgebra/model/src/main/java/org/eclipse/rdf4j/query/algebra/ProjectionElem.java index a9a379702b8..abfaaebf265 100644 --- a/core/queryalgebra/model/src/main/java/org/eclipse/rdf4j/query/algebra/ProjectionElem.java +++ b/core/queryalgebra/model/src/main/java/org/eclipse/rdf4j/query/algebra/ProjectionElem.java @@ -10,13 +10,29 @@ *******************************************************************************/ package org.eclipse.rdf4j.query.algebra; +import java.util.Objects; + +/** + * Projection elements control which of the selected expressions (produced by the WHERE clause of a query) are returned + * in the solution, and the order in which they appear. + *

+ * In SPARQL SELECT queries, projection elements are the variables determined by the algorithm for finding SELECT + * expressions (see SPARQL 1.1 Query Language + * Recommendation, section 18.2.4.4). Each projection element will be a single variable name (any aliasing is + * handled by the use of {@link Extension}s). + *

+ * In SPARQL CONSTRUCT queries, the projection elements are used to map the variables obtained from the SELECT + * expressions to the required statement patterns. In this case, each projection element will have an additional + * {@link #getTargetName() target name} that maps each projection variable name to one of {@code subject}, + * {@code predicate}, {@code object} or {@code context}. + * + * @author Jeen Broekstra + */ public class ProjectionElem extends AbstractQueryModelNode { - /*-----------* - * Variables * - *-----------*/ + private static final long serialVersionUID = -8129811335486478066L; - private String sourceName; + private String name; private String targetName; @@ -24,41 +40,86 @@ public class ProjectionElem extends AbstractQueryModelNode { private ExtensionElem sourceExpression; - /*--------------* - * Constructors * - *--------------*/ - + /** + * Create a new empty {@link ProjectionElem}. + */ public ProjectionElem() { } + /** + * Create a new {@link ProjectionElem} with a variable name. + * + * @param name The name of the projection element (typically the name of the variable in the select expressions). + * May not be null. + */ public ProjectionElem(String name) { - this(name, name); + this(name, null); } - public ProjectionElem(String sourceName, String targetName) { - setSourceName(sourceName); + /** + * Create a new {@link ProjectionElem} with a variable name and an additional mapped {@link #getTargetName() target + * name} + * + * @param name The name of the projection element (typically the name of the variable in the select + * expressions). May not be null. + * @param targetName The name of the variable the projection element value should be mapped to, to produce the + * projection. Used in CONSTRUCT queries for mapping select expressions to statement patterns. May + * be null. + */ + public ProjectionElem(String name, String targetName) { + setName(name); setTargetName(targetName); } - /*---------* - * Methods * - *---------*/ + /** + * Get the name of the projection element (typically the name of the variable in the select expressions) + * + */ + public String getName() { + return name; + } + /** + * @deprecated since 4.1.1. Use {@link #getName()} instead. + */ + @Deprecated(since = "4.1.1", forRemoval = true) public String getSourceName() { - return sourceName; + return getName(); } + /** + * @deprecated since 4.1.1. Use {@link #setName(String)} instead. + */ + @Deprecated(since = "4.1.1", forRemoval = true) public void setSourceName(String sourceName) { - assert sourceName != null : "sourceName must not be null"; - this.sourceName = sourceName; + setName(sourceName); } + /** + * Set the name of the projection element (typically the name of the variable in the select expressions) + * + * @param name the projection variable name. May not be {@code null}. + */ + public void setName(String name) { + this.name = Objects.requireNonNull(name); + } + + /** + * Get the name of the variable the projection element value should be mapped to to produce the projection. Used in + * CONSTRUCT queries for mapping select expressions to statement patterns. + * + */ public String getTargetName() { return targetName; } + /** + * Set the name of the variable the projection element value should be mapped to to produce the projection. Used in + * CONSTRUCT queries for mapping select expressions to statement patterns. + * + * @param targetName the projection mapping name. + */ public void setTargetName(String targetName) { - assert targetName != null : "targetName must not be null"; this.targetName = targetName; } @@ -78,10 +139,10 @@ public String getSignature() { sb.append(super.getSignature()); sb.append(" \""); - sb.append(sourceName); + sb.append(name); sb.append("\""); - if (!sourceName.equals(targetName)) { + if (targetName != null) { sb.append(" AS \"").append(targetName).append("\""); } @@ -92,15 +153,14 @@ public String getSignature() { public boolean equals(Object other) { if (other instanceof ProjectionElem) { ProjectionElem o = (ProjectionElem) other; - return sourceName.equals(o.getSourceName()) && targetName.equals(o.getTargetName()); + return name.equals(o.getName()) && Objects.equals(targetName, o.getTargetName()); } return false; } @Override public int hashCode() { - // Note: don't xor source and target since they will often be equal - return targetName.hashCode(); + return Objects.hash(name, targetName); } @Override diff --git a/core/queryalgebra/model/src/main/java/org/eclipse/rdf4j/query/algebra/ProjectionElemList.java b/core/queryalgebra/model/src/main/java/org/eclipse/rdf4j/query/algebra/ProjectionElemList.java index ceed8185087..b9806bd08e9 100644 --- a/core/queryalgebra/model/src/main/java/org/eclipse/rdf4j/query/algebra/ProjectionElemList.java +++ b/core/queryalgebra/model/src/main/java/org/eclipse/rdf4j/query/algebra/ProjectionElemList.java @@ -23,17 +23,11 @@ */ public class ProjectionElemList extends AbstractQueryModelNode { - /*-----------* - * Variables * - *-----------*/ + private static final long serialVersionUID = 167331362220688635L; private ProjectionElem[] elements = {}; private List elementsList = Collections.emptyList(); - /*--------------* - * Constructors * - *--------------*/ - public ProjectionElemList() { } @@ -45,10 +39,6 @@ public ProjectionElemList(Iterable elements) { addElements(elements); } - /*---------* - * Methods * - *---------*/ - public List getElements() { return elementsList; } @@ -90,26 +80,44 @@ public void addElement(ProjectionElem pe) { pe.setParentNode(this); } + /** + * + * @deprecated since 4.1.1. Use {@link #getProjectedNames()} instead. + */ + @Deprecated(since = "4.1.1", forRemoval = true) public Set getTargetNames() { - Set targetNames = new LinkedHashSet<>(elementsList.size()); + return getProjectedNames(); + } + + public Set getProjectedNames() { + Set projectedNames = new LinkedHashSet<>(elementsList.size()); for (ProjectionElem pe : elementsList) { - targetNames.add(pe.getTargetName()); + projectedNames.add(pe.getTargetName() == null ? pe.getName() : pe.getTargetName()); } - return targetNames; + return projectedNames; } + /** + * + * @deprecated since 4.1.1. Use {@link #getProjectedNamesFor(Collection)} instead. + */ + @Deprecated(since = "4.1.1", forRemoval = true) public Set getTargetNamesFor(Collection sourceNames) { - Set targetNames = new LinkedHashSet<>(elementsList.size()); + return getProjectedNamesFor(sourceNames); + } + + public Set getProjectedNamesFor(Collection sourceNames) { + Set projectedNames = new LinkedHashSet<>(elementsList.size()); for (ProjectionElem pe : elementsList) { - if (sourceNames.contains(pe.getSourceName())) { - targetNames.add(pe.getTargetName()); + if (sourceNames.contains(pe.getName())) { + projectedNames.add(pe.getTargetName() == null ? pe.getName() : pe.getTargetName()); } } - return targetNames; + return projectedNames; } @Override diff --git a/core/queryalgebra/model/src/test/java/org/eclipse/rdf4j/query/algebra/ProjectionElemListTest.java b/core/queryalgebra/model/src/test/java/org/eclipse/rdf4j/query/algebra/ProjectionElemListTest.java new file mode 100644 index 00000000000..510f7fd5cfa --- /dev/null +++ b/core/queryalgebra/model/src/test/java/org/eclipse/rdf4j/query/algebra/ProjectionElemListTest.java @@ -0,0 +1,49 @@ +/******************************************************************************* + * Copyright (c) 2022 Eclipse RDF4J contributors. + * + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Distribution License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/org/documents/edl-v10.php + * + * SPDX-License-Identifier: BSD-3-Clause + *******************************************************************************/ + +package org.eclipse.rdf4j.query.algebra; + +import static org.assertj.core.api.Assertions.assertThat; + +import java.util.Arrays; +import java.util.HashSet; +import java.util.Set; + +import org.junit.jupiter.api.Test; + +/** + * @author Jeen Broekstra + * + */ +public class ProjectionElemListTest { + + private ProjectionElem elem_a = new ProjectionElem("a"); + private ProjectionElem elem_b = new ProjectionElem("b"); + private ProjectionElem elem_ac = new ProjectionElem("a", "c"); + private ProjectionElem elem_de = new ProjectionElem("d", "e"); + + private ProjectionElemList subject = new ProjectionElemList(elem_a, elem_b, elem_ac, elem_de); + + @Test + public void testGetProjectedNames() { + assertThat(subject.getProjectedNames()).containsExactly("a", "b", "c", "e"); + } + + @Test + public void testGetProjectedNamesFor() { + Set sourceNames = new HashSet<>(Arrays.asList("a", "d")); + assertThat(subject.getProjectedNamesFor(sourceNames)).containsExactly("a", "c", "e"); + + sourceNames = new HashSet<>(Arrays.asList("b")); + assertThat(subject.getProjectedNamesFor(sourceNames)).containsExactly("b"); + } + +} diff --git a/core/queryalgebra/model/src/test/java/org/eclipse/rdf4j/query/algebra/ProjectionElemTest.java b/core/queryalgebra/model/src/test/java/org/eclipse/rdf4j/query/algebra/ProjectionElemTest.java new file mode 100644 index 00000000000..67715b61d67 --- /dev/null +++ b/core/queryalgebra/model/src/test/java/org/eclipse/rdf4j/query/algebra/ProjectionElemTest.java @@ -0,0 +1,47 @@ +/******************************************************************************* + * Copyright (c) 2022 Eclipse RDF4J contributors. + * + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Distribution License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/org/documents/edl-v10.php + * + * SPDX-License-Identifier: BSD-3-Clause + *******************************************************************************/ + +package org.eclipse.rdf4j.query.algebra; + +import static org.assertj.core.api.Assertions.assertThat; + +import org.junit.jupiter.api.Test; + +/** + * @author Jeen Broekstra + * + */ +public class ProjectionElemTest { + + private ProjectionElem elem_a = new ProjectionElem("a"); + private ProjectionElem elem_b = new ProjectionElem("b"); + private ProjectionElem elem_a2 = new ProjectionElem("a"); + + private ProjectionElem elem_ab = new ProjectionElem("a", "b"); + private ProjectionElem elem_aa = new ProjectionElem("a", "a"); + private ProjectionElem elem_ba = new ProjectionElem("b", "a"); + private ProjectionElem elem_ab2 = new ProjectionElem("a", "b"); + + @Test + public void testEquals() { + assertThat(elem_a).isEqualTo(elem_a2); + assertThat(elem_a).isNotEqualTo(elem_aa).isNotEqualTo(elem_b).isNotEqualTo(elem_ab).isNotEqualTo(elem_ba); + assertThat(elem_ab).isNotEqualTo(elem_aa).isNotEqualTo(elem_ba); + assertThat(elem_ab).isEqualTo(elem_ab2); + } + + @Test + public void testSignature() { + assertThat(elem_a.getSignature()).isEqualTo("ProjectionElem \"a\""); + assertThat(elem_aa.getSignature()).isEqualTo("ProjectionElem \"a\" AS \"a\""); + assertThat(elem_ab.getSignature()).isEqualTo("ProjectionElem \"a\" AS \"b\""); + } +} diff --git a/core/queryparser/sparql/src/main/java/org/eclipse/rdf4j/query/parser/sparql/TupleExprBuilder.java b/core/queryparser/sparql/src/main/java/org/eclipse/rdf4j/query/parser/sparql/TupleExprBuilder.java index 8e4fcdc2612..1f581e1b415 100644 --- a/core/queryparser/sparql/src/main/java/org/eclipse/rdf4j/query/parser/sparql/TupleExprBuilder.java +++ b/core/queryparser/sparql/src/main/java/org/eclipse/rdf4j/query/parser/sparql/TupleExprBuilder.java @@ -551,11 +551,7 @@ public TupleExpr visit(ASTSelect node, Object data) throws VisitorException { throw new VisitorException("Either TripleRef or Expression expected in projection."); } - String sourceName = alias; - if (child instanceof ASTVar) { - sourceName = ((ASTVar) child).getName(); - } - ProjectionElem elem = new ProjectionElem(sourceName, alias); + ProjectionElem elem = new ProjectionElem(alias); projElemList.addElement(elem); AggregateCollector collector = new AggregateCollector(); @@ -637,8 +633,8 @@ public TupleExpr visit(ASTSelect node, Object data) throws VisitorException { throw new VisitorException("non-aggregate expression '" + expr + "' not allowed in projection when using GROUP BY."); } - } else if (!groupNames.contains(elem.getTargetName())) { - throw new VisitorException("variable '" + elem.getTargetName() + } else if (!groupNames.contains(elem.getName())) { + throw new VisitorException("variable '" + elem.getName() + "' in projection not present in GROUP BY."); } } @@ -690,7 +686,7 @@ private static boolean isIllegalCombinedWithGroupByExpression(String varName, Li String prev = varName; for (ProjectionElem element : elements) { - if (element.getTargetName().equals(varName)) { + if (element.getName().equals(varName)) { if (element.hasAggregateOperatorInExpression()) { return false; } else { @@ -702,7 +698,7 @@ private static boolean isIllegalCombinedWithGroupByExpression(String varName, Li } } - varName = element.getSourceName(); + varName = element.getName(); break; } } @@ -1658,9 +1654,8 @@ public void meet(Var var) { @Override public void meet(ProjectionElem node) throws VisitorException { - if (node.getSourceName().equals(toBeReplaced.getName())) { - node.setSourceName(replacement.getName()); - node.setTargetName(replacement.getName()); + if (node.getName().equals(toBeReplaced.getName())) { + node.setName(replacement.getName()); } } } diff --git a/core/queryparser/sparql/src/test/java/org/eclipse/rdf4j/query/parser/sparql/TestSparqlStarParser.java b/core/queryparser/sparql/src/test/java/org/eclipse/rdf4j/query/parser/sparql/TestSparqlStarParser.java index edae91a3ac2..66c8b4918de 100644 --- a/core/queryparser/sparql/src/test/java/org/eclipse/rdf4j/query/parser/sparql/TestSparqlStarParser.java +++ b/core/queryparser/sparql/src/test/java/org/eclipse/rdf4j/query/parser/sparql/TestSparqlStarParser.java @@ -248,7 +248,7 @@ public void testUseInBindWithVars() throws Exception { List list = proj.getProjectionElemList().getElements(); final ArrayList listNames = new ArrayList<>(); list.forEach(el -> { - listNames.add(el.getTargetName()); + listNames.add(el.getName()); }); assertEquals("expect all bindings", 4, list.size()); assertTrue("expect s", listNames.contains("s")); @@ -311,7 +311,7 @@ public void testUseInStatementPatternWithVars() throws Exception { List list = proj.getProjectionElemList().getElements(); final ArrayList listNames = new ArrayList<>(); list.forEach(el -> { - listNames.add(el.getTargetName()); + listNames.add(el.getName()); }); assertEquals("expect all bindings", 4, list.size()); assertTrue("expect s", listNames.contains("s")); @@ -381,7 +381,7 @@ public void testUseNestedInStatementPatternWithVars() throws Exception { List list = proj.getProjectionElemList().getElements(); final ArrayList listNames = new ArrayList<>(); list.forEach(el -> { - listNames.add(el.getTargetName()); + listNames.add(el.getName()); }); assertEquals("expect all bindings", 6, list.size()); assertTrue("expect s", listNames.contains("s")); @@ -470,7 +470,7 @@ public void testUseInConstructFromStatementPattern() throws Exception { final ArrayList listSourceNames = new ArrayList<>(); list.forEach(el -> { - listSourceNames.add(el.getSourceName()); + listSourceNames.add(el.getName()); }); assertTrue("expect extension", proj.getArg() instanceof Extension); @@ -665,8 +665,8 @@ public void testUseInDeleteFromStatementPattern() throws Exception { * Var (name=_anon_3ddeacea_c54c_4db0_bb6e_2f699772e5f8, anonymous) * GroupElem * Count (Distinct) - * Var (name=p) * @throws Exception - * + * Var (name=p) + * * @throws Exception */ @Test @@ -684,7 +684,7 @@ public void testUseInGroupByFromBindWithVars() throws Exception { List list = proj.getProjectionElemList().getElements(); final ArrayList listNames = new ArrayList<>(); list.forEach(el -> { - listNames.add(el.getTargetName()); + listNames.add(el.getName()); }); assertEquals("expect all bindings", 2, list.size()); assertTrue("expect ref", listNames.contains("ref")); @@ -767,7 +767,7 @@ public void testUseInExists() throws Exception { List list = proj.getProjectionElemList().getElements(); final ArrayList listNames = new ArrayList<>(); list.forEach(el -> { - listNames.add(el.getTargetName()); + listNames.add(el.getName()); }); assertEquals("expect all bindings", 3, list.size()); assertTrue("expect s", listNames.contains("s")); @@ -833,7 +833,7 @@ public void testUseInSTR() throws Exception { List list = proj.getProjectionElemList().getElements(); final ArrayList listNames = new ArrayList<>(); list.forEach(el -> { - listNames.add(el.getTargetName()); + listNames.add(el.getName()); }); assertEquals("expect one binding", 1, list.size()); assertTrue("expect str", listNames.contains("str")); diff --git a/core/queryrender/src/main/java/org/eclipse/rdf4j/queryrender/BaseTupleExprRenderer.java b/core/queryrender/src/main/java/org/eclipse/rdf4j/queryrender/BaseTupleExprRenderer.java index b07f9973ca1..d79e580045d 100644 --- a/core/queryrender/src/main/java/org/eclipse/rdf4j/queryrender/BaseTupleExprRenderer.java +++ b/core/queryrender/src/main/java/org/eclipse/rdf4j/queryrender/BaseTupleExprRenderer.java @@ -158,15 +158,15 @@ public StatementPattern toStatementPattern(ProjectionElemList theList) throws Ex ProjectionElem aObj = theList.getElements().get(2); return new StatementPattern( - mExtensions.containsKey(aSubj.getSourceName()) - ? new Var(scrubVarName(aSubj.getSourceName()), asValue(mExtensions.get(aSubj.getSourceName()))) - : new Var(scrubVarName(aSubj.getSourceName())), - mExtensions.containsKey(aPred.getSourceName()) - ? new Var(scrubVarName(aPred.getSourceName()), asValue(mExtensions.get(aPred.getSourceName()))) - : new Var(scrubVarName(aPred.getSourceName())), - mExtensions.containsKey(aObj.getSourceName()) - ? new Var(scrubVarName(aObj.getSourceName()), asValue(mExtensions.get(aObj.getSourceName()))) - : new Var(scrubVarName(aObj.getSourceName()))); + mExtensions.containsKey(aSubj.getName()) + ? new Var(scrubVarName(aSubj.getName()), asValue(mExtensions.get(aSubj.getName()))) + : new Var(scrubVarName(aSubj.getName())), + mExtensions.containsKey(aPred.getName()) + ? new Var(scrubVarName(aPred.getName()), asValue(mExtensions.get(aPred.getName()))) + : new Var(scrubVarName(aPred.getName())), + mExtensions.containsKey(aObj.getName()) + ? new Var(scrubVarName(aObj.getName()), asValue(mExtensions.get(aObj.getName()))) + : new Var(scrubVarName(aObj.getName()))); } /** diff --git a/core/queryrender/src/main/java/org/eclipse/rdf4j/queryrender/sparql/SPARQLQueryRenderer.java b/core/queryrender/src/main/java/org/eclipse/rdf4j/queryrender/sparql/SPARQLQueryRenderer.java index d59fe6873f1..a8dacd8cba4 100644 --- a/core/queryrender/src/main/java/org/eclipse/rdf4j/queryrender/sparql/SPARQLQueryRenderer.java +++ b/core/queryrender/src/main/java/org/eclipse/rdf4j/queryrender/sparql/SPARQLQueryRenderer.java @@ -103,7 +103,7 @@ public String render(final ParsedQuery theQuery) throws Exception { aFirst = false; } - aQuery.append("?" + aElem.getSourceName()); + aQuery.append("?" + aElem.getName()); } } } diff --git a/core/queryrender/src/main/java/org/eclipse/rdf4j/queryrender/sparql/experimental/PreprocessedQuerySerializer.java b/core/queryrender/src/main/java/org/eclipse/rdf4j/queryrender/sparql/experimental/PreprocessedQuerySerializer.java index aa2b8239de5..4cf3f7688a4 100644 --- a/core/queryrender/src/main/java/org/eclipse/rdf4j/queryrender/sparql/experimental/PreprocessedQuerySerializer.java +++ b/core/queryrender/src/main/java/org/eclipse/rdf4j/queryrender/sparql/experimental/PreprocessedQuerySerializer.java @@ -954,15 +954,15 @@ public void meet(MultiProjection node) throws RuntimeException { for (ProjectionElemList proj : node.getProjections()) { for (ProjectionElem elem : proj.getElements()) { - if (valueMap.containsKey(elem.getSourceName())) { - ValueExpr expr = valueMap.get(elem.getSourceName()); + if (valueMap.containsKey(elem.getName())) { + ValueExpr expr = valueMap.get(elem.getName()); if (expr instanceof BNodeGenerator) { - builder.append("_:" + elem.getSourceName()); + builder.append("_:" + elem.getName()); } else { - valueMap.get(elem.getSourceName()).visit(this); + valueMap.get(elem.getName()).visit(this); } } else { - builder.append("?" + elem.getSourceName()); + builder.append("?" + elem.getName()); } builder.append(" "); // elem.getSourceExpression().getExpr().visit(this); @@ -1034,27 +1034,26 @@ public void meet(Projection node) throws RuntimeException { @Override public void meet(ProjectionElem node) throws RuntimeException { - if (node.getSourceExpression() == null) { boolean isDescribe = false; if ((this.currentQueryProfile instanceof SerializableParsedConstructQuery)) { isDescribe = ((SerializableParsedConstructQuery) this.currentQueryProfile).describe; } - if (node.getSourceName() == null || node.getTargetName().equals(node.getSourceName())) { - if (isDescribe && this.currentQueryProfile.extensionElements.containsKey(node.getTargetName())) { - ExtensionElem elem = this.currentQueryProfile.extensionElements.get(node.getTargetName()); + if (node.getTargetName() == null || node.getTargetName().equals(node.getName())) { + if (isDescribe && this.currentQueryProfile.extensionElements.containsKey(node.getName())) { + ExtensionElem elem = this.currentQueryProfile.extensionElements.get(node.getName()); elem.getExpr().visit(this); builder.append(" "); } else { builder.append("?"); - builder.append(node.getTargetName()); + builder.append(node.getName()); builder.append(" "); } } else { builder.append("("); builder.append("?"); - builder.append(node.getSourceName()); + builder.append(node.getName()); builder.append(" "); builder.append("AS "); builder.append("?"); @@ -1069,7 +1068,7 @@ public void meet(ProjectionElem node) throws RuntimeException { builder.append(") "); } else { builder.append("?"); - builder.append(node.getTargetName()); + builder.append(node.getName()); builder.append(" "); } } diff --git a/core/spin/src/main/java/org/eclipse/rdf4j/spin/SpinRenderer.java b/core/spin/src/main/java/org/eclipse/rdf4j/spin/SpinRenderer.java index 2d897cbe703..b7404aef0d4 100644 --- a/core/spin/src/main/java/org/eclipse/rdf4j/spin/SpinRenderer.java +++ b/core/spin/src/main/java/org/eclipse/rdf4j/spin/SpinRenderer.java @@ -367,7 +367,7 @@ public void meet(ProjectionElem node) throws RDFHandlerException { if (isSubQuery) { super.meet(node); } else { - String varName = node.getSourceName(); + String varName = node.getName(); ValueExpr valueExpr = inlineBindings.getValueExpr(varName); Value value = (valueExpr instanceof ValueConstant) ? ((ValueConstant) valueExpr).getValue() : getVar(varName); @@ -611,7 +611,7 @@ public void meet(ProjectionElemList node) throws RDFHandlerException { public void meet(ProjectionElem node) throws RDFHandlerException { ValueExpr valueExpr = null; if (inlineBindings != null) { - String varName = node.getSourceName(); + String varName = node.getName(); valueExpr = inlineBindings.getValueExpr(varName); } Resource targetVar = getVar(node.getTargetName());