Skip to content

Commit 302d4ef

Browse files
committed
GH-5112 fix for sh:pattern difference between SPARQL and transactional validation
1 parent e9d9c40 commit 302d4ef

17 files changed

Lines changed: 107 additions & 30 deletions

File tree

core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/impl/evaluationsteps/values/QueryValueEvaluationStepSupplier.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ private QueryValueEvaluationStepSupplier() {
5050
}
5151

5252
public static QueryValueEvaluationStep prepareStr(QueryValueEvaluationStep arg, ValueFactory valueFactory) {
53-
return make(arg, "Unkown constant argument for STR()", bs -> str(arg, valueFactory, bs));
53+
return make(arg, "Unknown constant argument for STR()", bs -> str(arg, valueFactory, bs));
5454
}
5555

5656
private static Value str(QueryValueEvaluationStep arg, ValueFactory valueFactory, BindingSet bindings) {
@@ -67,7 +67,7 @@ private static Value str(QueryValueEvaluationStep arg, ValueFactory valueFactory
6767
return valueFactory.createLiteral(literal.getLabel());
6868
}
6969
} else {
70-
throw new ValueExprEvaluationException("Unkown constant argument for STR()");
70+
throw new ValueExprEvaluationException("Unknown constant argument for STR()");
7171
}
7272
}
7373

core/queryresultio/binary/src/main/java/org/eclipse/rdf4j/query/resultio/binary/BinaryQueryResultParser.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -227,7 +227,7 @@ private void processError() throws IOException, QueryResultParseException {
227227
} else if (errTypeFlag == QUERY_EVALUATION_ERROR) {
228228
errType = QueryErrorType.QUERY_EVALUATION_ERROR;
229229
} else {
230-
throw new QueryResultParseException("Unkown error type: " + errTypeFlag);
230+
throw new QueryResultParseException("Unknown error type: " + errTypeFlag);
231231
}
232232

233233
String msg = readString();

core/sail/shacl/src/main/java/org/eclipse/rdf4j/sail/shacl/ShaclSailBaseConfiguration.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ abstract class ShaclSailBaseConfiguration extends NotifyingSailWrapper {
2727
private static final Logger logger = LoggerFactory.getLogger(ShaclSailBaseConfiguration.class);
2828

2929
// Field used to control if the new SPARQL based validation should be enabled or disabled. Enabled by default.
30-
final boolean sparqlValidation;
30+
boolean sparqlValidation;
3131

3232
private boolean parallelValidation = ShaclSailConfig.PARALLEL_VALIDATION_DEFAULT;
3333
private boolean logValidationPlans = ShaclSailConfig.LOG_VALIDATION_PLANS_DEFAULT;
@@ -375,4 +375,5 @@ public Set<IRI> getShapesGraphs() {
375375
public void setShapesGraphs(Set<IRI> shapesGraphs) {
376376
this.shapesGraphs = shapesGraphs;
377377
}
378+
378379
}

core/sail/shacl/src/main/java/org/eclipse/rdf4j/sail/shacl/ast/constraintcomponents/SimpleAbstractConstraintComponent.java renamed to core/sail/shacl/src/main/java/org/eclipse/rdf4j/sail/shacl/ast/constraintcomponents/AbstractSimpleConstraintComponent.java

Lines changed: 41 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -47,18 +47,18 @@
4747
import org.slf4j.Logger;
4848
import org.slf4j.LoggerFactory;
4949

50-
public abstract class SimpleAbstractConstraintComponent extends AbstractConstraintComponent {
50+
public abstract class AbstractSimpleConstraintComponent extends AbstractConstraintComponent {
5151

52-
private static final Logger logger = LoggerFactory.getLogger(SimpleAbstractConstraintComponent.class);
52+
private static final Logger logger = LoggerFactory.getLogger(AbstractSimpleConstraintComponent.class);
5353

5454
private Resource id;
5555
TargetChain targetChain;
5656

57-
public SimpleAbstractConstraintComponent(Resource id) {
57+
public AbstractSimpleConstraintComponent(Resource id) {
5858
this.id = id;
5959
}
6060

61-
public SimpleAbstractConstraintComponent() {
61+
public AbstractSimpleConstraintComponent() {
6262

6363
}
6464

@@ -159,15 +159,24 @@ private PlanNode getPlanNodeForOverrideTargetNode(ConnectionsGroup connectionsGr
159159
validationSettings.getDataGraph(), scope);
160160
allTargets = getFilterAttacherWithNegation(negatePlan, allTargets);
161161

162-
return Unique.getInstance(allTargets, true);
162+
if (effectiveTarget.size() > 1) {
163+
allTargets = Unique.getInstance(allTargets, true);
164+
}
165+
return allTargets;
163166
} else {
164-
return effectiveTarget.extend(overrideTargetPlanNode, connectionsGroup,
167+
PlanNode extend = effectiveTarget.extend(overrideTargetPlanNode, connectionsGroup,
165168
validationSettings.getDataGraph(), scope,
166169
EffectiveTarget.Extend.right,
167170
false,
168171
p -> getFilterAttacherWithNegation(negatePlan, p)
169172
);
170173

174+
if (effectiveTarget.size() > 1) {
175+
extend = Unique.getInstance(extend, true);
176+
}
177+
178+
return extend;
179+
171180
}
172181

173182
} else {
@@ -184,14 +193,22 @@ private PlanNode getPlanNodeForOverrideTargetNode(ConnectionsGroup connectionsGr
184193

185194
allTargets = getFilterAttacherWithNegation(negatePlan, allTargets);
186195

187-
return Unique.getInstance(allTargets, true);
196+
if (effectiveTarget.size() > 1) {
197+
allTargets = Unique.getInstance(allTargets, true);
198+
}
199+
200+
return allTargets;
188201

189202
} else {
190203

191204
overrideTargetPlanNode = effectiveTarget.extend(overrideTargetPlanNode, connectionsGroup,
192205
validationSettings.getDataGraph(), scope,
193206
EffectiveTarget.Extend.right, false, null);
194207

208+
if (effectiveTarget.size() > 1) {
209+
overrideTargetPlanNode = Unique.getInstance(overrideTargetPlanNode, true);
210+
}
211+
195212
planNode = new BulkedExternalInnerJoin(overrideTargetPlanNode,
196213
connectionsGroup.getBaseConnection(),
197214
validationSettings.getDataGraph(), path.get()
@@ -314,13 +331,25 @@ String literalToString(Literal literal) {
314331
@Override
315332
public PlanNode getAllTargetsPlan(ConnectionsGroup connectionsGroup, Resource[] dataGraph, Scope scope,
316333
StatementMatcher.StableRandomVariableProvider stableRandomVariableProvider) {
334+
317335
if (scope == Scope.propertyShape) {
318-
PlanNode allTargetsPlan = getTargetChain()
319-
.getEffectiveTarget(Scope.nodeShape, connectionsGroup.getRdfsSubClassOfReasoner(),
320-
stableRandomVariableProvider)
321-
.getPlanNode(connectionsGroup, dataGraph, Scope.nodeShape, true, null);
322336

323-
return Unique.getInstance(new ShiftToPropertyShape(allTargetsPlan), true);
337+
EffectiveTarget effectiveTarget = getTargetChain()
338+
.getEffectiveTarget(
339+
Scope.nodeShape,
340+
connectionsGroup.getRdfsSubClassOfReasoner(),
341+
stableRandomVariableProvider
342+
);
343+
344+
PlanNode allTargetsPlan = effectiveTarget
345+
.getPlanNode(
346+
connectionsGroup,
347+
dataGraph, Scope.nodeShape,
348+
true,
349+
null
350+
);
351+
352+
return Unique.getInstance(new ShiftToPropertyShape(allTargetsPlan), effectiveTarget.size() > 1);
324353
}
325354
return EmptyNode.getInstance();
326355
}

core/sail/shacl/src/main/java/org/eclipse/rdf4j/sail/shacl/ast/constraintcomponents/DatatypeConstraintComponent.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@
2929
import org.eclipse.rdf4j.sail.shacl.ast.planNodes.FilterPlanNode;
3030
import org.eclipse.rdf4j.sail.shacl.ast.planNodes.PlanNode;
3131

32-
public class DatatypeConstraintComponent extends SimpleAbstractConstraintComponent {
32+
public class DatatypeConstraintComponent extends AbstractSimpleConstraintComponent {
3333

3434
private final CoreDatatype coreDatatype;
3535
private final IRI datatype;

core/sail/shacl/src/main/java/org/eclipse/rdf4j/sail/shacl/ast/constraintcomponents/InConstraintComponent.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@
3131
import org.eclipse.rdf4j.sail.shacl.ast.planNodes.ValueInFilter;
3232
import org.eclipse.rdf4j.sail.shacl.wrapper.shape.ShapeSource;
3333

34-
public class InConstraintComponent extends SimpleAbstractConstraintComponent {
34+
public class InConstraintComponent extends AbstractSimpleConstraintComponent {
3535

3636
private final Set<Value> in;
3737

core/sail/shacl/src/main/java/org/eclipse/rdf4j/sail/shacl/ast/constraintcomponents/LanguageInConstraintComponent.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@
3434
import org.eclipse.rdf4j.sail.shacl.ast.planNodes.PlanNode;
3535
import org.eclipse.rdf4j.sail.shacl.wrapper.shape.ShapeSource;
3636

37-
public class LanguageInConstraintComponent extends SimpleAbstractConstraintComponent {
37+
public class LanguageInConstraintComponent extends AbstractSimpleConstraintComponent {
3838

3939
private final List<String> languageIn;
4040
private final ArrayList<String> languageRanges;

core/sail/shacl/src/main/java/org/eclipse/rdf4j/sail/shacl/ast/constraintcomponents/MaxExclusiveConstraintComponent.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@
2828
import org.eclipse.rdf4j.sail.shacl.ast.planNodes.LiteralComparatorFilter;
2929
import org.eclipse.rdf4j.sail.shacl.ast.planNodes.PlanNode;
3030

31-
public class MaxExclusiveConstraintComponent extends SimpleAbstractConstraintComponent {
31+
public class MaxExclusiveConstraintComponent extends AbstractSimpleConstraintComponent {
3232

3333
Literal maxExclusive;
3434

core/sail/shacl/src/main/java/org/eclipse/rdf4j/sail/shacl/ast/constraintcomponents/MaxInclusiveConstraintComponent.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@
2828
import org.eclipse.rdf4j.sail.shacl.ast.planNodes.LiteralComparatorFilter;
2929
import org.eclipse.rdf4j.sail.shacl.ast.planNodes.PlanNode;
3030

31-
public class MaxInclusiveConstraintComponent extends SimpleAbstractConstraintComponent {
31+
public class MaxInclusiveConstraintComponent extends AbstractSimpleConstraintComponent {
3232

3333
Literal maxInclusive;
3434

core/sail/shacl/src/main/java/org/eclipse/rdf4j/sail/shacl/ast/constraintcomponents/MaxLengthConstraintComponent.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@
3030
import org.eclipse.rdf4j.sail.shacl.ast.planNodes.MaxLengthFilter;
3131
import org.eclipse.rdf4j.sail.shacl.ast.planNodes.PlanNode;
3232

33-
public class MaxLengthConstraintComponent extends SimpleAbstractConstraintComponent {
33+
public class MaxLengthConstraintComponent extends AbstractSimpleConstraintComponent {
3434

3535
long maxLength;
3636

0 commit comments

Comments
 (0)