Skip to content

Commit 6967301

Browse files
committed
GH-5130 zeroOrMorePath and oneOrMorePath mostly implemented
1 parent f29faee commit 6967301

170 files changed

Lines changed: 2471 additions & 1939 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -314,6 +314,8 @@ public static List<IRI> getSupportedShaclPredicates() {
314314
SHACL.TARGET_PROP,
315315
SHACL.INVERSE_PATH,
316316
SHACL.ALTERNATIVE_PATH,
317+
SHACL.ONE_OR_MORE_PATH,
318+
SHACL.ZERO_OR_MORE_PATH,
317319
SHACL.NODE,
318320
SHACL.QUALIFIED_MAX_COUNT,
319321
SHACL.QUALIFIED_MIN_COUNT,

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

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,6 @@
2424

2525
import org.eclipse.rdf4j.model.Namespace;
2626
import org.eclipse.rdf4j.model.Resource;
27-
import org.eclipse.rdf4j.model.Statement;
2827
import org.eclipse.rdf4j.sail.shacl.ast.paths.Path;
2928
import org.eclipse.rdf4j.sail.shacl.ast.targets.EffectiveTarget;
3029
import org.eclipse.rdf4j.sail.shacl.wrapper.data.ConnectionsGroup;
@@ -337,8 +336,10 @@ public String getNamespacesForSparql() {
337336
return ShaclPrefixParser.toSparqlPrefixes(namespaces);
338337
}
339338

340-
public Stream<EffectiveTarget.StatementsAndMatcher> getRoot(ConnectionsGroup connectionsGroup, Resource[] dataGraph,
341-
Path path, StatementMatcher currentStatementMatcher, List<Statement> currentStatements) {
339+
public Stream<EffectiveTarget.SubjectObjectAndMatcher> getRoot(ConnectionsGroup connectionsGroup,
340+
Resource[] dataGraph,
341+
Path path, StatementMatcher currentStatementMatcher,
342+
List<EffectiveTarget.SubjectObjectAndMatcher.SubjectObject> currentStatements) {
342343
assert traceBackFunction != null;
343344
return traceBackFunction.getRoot(connectionsGroup, dataGraph, path, currentStatementMatcher, currentStatements);
344345
}
@@ -411,12 +412,12 @@ public int hashCode() {
411412

412413
public interface TraceBack {
413414

414-
Stream<EffectiveTarget.StatementsAndMatcher> getRoot(
415+
Stream<EffectiveTarget.SubjectObjectAndMatcher> getRoot(
415416
ConnectionsGroup connectionsGroup,
416417
Resource[] dataGraph,
417418
Path path,
418419
StatementMatcher currentStatementMatcher,
419-
List<Statement> currentStatements);
420+
List<EffectiveTarget.SubjectObjectAndMatcher.SubjectObject> currentStatements);
420421
}
421422

422423
}

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

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -171,6 +171,9 @@ static PlanNode getAllTargetsIncludingThoseAddedByPath(ConnectionsGroup connecti
171171
null);
172172

173173
allTargets = UnionNode.getInstance(connectionsGroup, addedTargets.getPlanNode(), addedByPath);
174+
175+
allTargets = Unique.getInstance(new TrimToTarget(allTargets, connectionsGroup), false, connectionsGroup);
176+
174177
return allTargets;
175178
}
176179

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -252,7 +252,7 @@ public PlanNode getAllTargetsPlan(ConnectionsGroup connectionsGroup, Resource[]
252252

253253
}
254254

255-
return Unique.getInstance(allTargetsPlan, false, connectionsGroup);
255+
return Unique.getInstance(new TrimToTarget(allTargetsPlan, connectionsGroup), false, connectionsGroup);
256256

257257
}
258258

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

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
import org.eclipse.rdf4j.sail.shacl.ast.ValidationApproach;
2929
import org.eclipse.rdf4j.sail.shacl.ast.ValidationQuery;
3030
import org.eclipse.rdf4j.sail.shacl.ast.paths.Path;
31+
import org.eclipse.rdf4j.sail.shacl.ast.planNodes.AbstractBulkJoinPlanNode;
3132
import org.eclipse.rdf4j.sail.shacl.ast.planNodes.AllTargetsPlanNode;
3233
import org.eclipse.rdf4j.sail.shacl.ast.planNodes.BufferedPlanNode;
3334
import org.eclipse.rdf4j.sail.shacl.ast.planNodes.BulkedExternalInnerJoin;
@@ -135,7 +136,7 @@ public PlanNode generateTransactionalValidationPlan(ConnectionsGroup connections
135136
connectionsGroup.getPreviousStateConnection(),
136137
b -> new ValidationTuple(b.getValue("a"), b.getValue("c"), scope, true,
137138
validationSettings.getDataGraph()),
138-
connectionsGroup);
139+
connectionsGroup, AbstractBulkJoinPlanNode.DEFAULT_VARS);
139140

140141
top = UnionNode.getInstance(connectionsGroup, top, bulkedExternalInnerJoin);
141142

@@ -218,7 +219,7 @@ private PlanNode getPlanNodeForOverrideTargetNode(ConnectionsGroup connectionsGr
218219
Set.of()),
219220
false, null,
220221
BulkedExternalInnerJoin.getMapper("a", "c", scope, validationSettings.getDataGraph()),
221-
connectionsGroup);
222+
connectionsGroup, AbstractBulkJoinPlanNode.DEFAULT_VARS);
222223
planNode = connectionsGroup.getCachedNodeFor(planNode);
223224
}
224225
}

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
import org.eclipse.rdf4j.sail.shacl.ast.ValidationApproach;
3030
import org.eclipse.rdf4j.sail.shacl.ast.ValidationQuery;
3131
import org.eclipse.rdf4j.sail.shacl.ast.paths.Path;
32+
import org.eclipse.rdf4j.sail.shacl.ast.planNodes.AbstractBulkJoinPlanNode;
3233
import org.eclipse.rdf4j.sail.shacl.ast.planNodes.AllTargetsPlanNode;
3334
import org.eclipse.rdf4j.sail.shacl.ast.planNodes.BufferedSplitter;
3435
import org.eclipse.rdf4j.sail.shacl.ast.planNodes.BulkedExternalInnerJoin;
@@ -171,7 +172,7 @@ public PlanNode generateTransactionalValidationPlan(ConnectionsGroup connections
171172
false,
172173
null,
173174
BulkedExternalInnerJoin.getMapper("a", "c", scope, validationSettings.getDataGraph()),
174-
connectionsGroup);
175+
connectionsGroup, AbstractBulkJoinPlanNode.DEFAULT_VARS);
175176

176177
if (connectionsGroup.getAddedStatements() != null) {
177178
// filter by type against the added statements

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

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@
3939
import org.eclipse.rdf4j.sail.shacl.ast.ValidationQuery;
4040
import org.eclipse.rdf4j.sail.shacl.ast.paths.Path;
4141
import org.eclipse.rdf4j.sail.shacl.ast.paths.SimplePath;
42+
import org.eclipse.rdf4j.sail.shacl.ast.planNodes.AbstractBulkJoinPlanNode;
4243
import org.eclipse.rdf4j.sail.shacl.ast.planNodes.BufferedSplitter;
4344
import org.eclipse.rdf4j.sail.shacl.ast.planNodes.BulkedExternalInnerJoin;
4445
import org.eclipse.rdf4j.sail.shacl.ast.planNodes.ExternalFilterByQuery;
@@ -192,7 +193,7 @@ public PlanNode generateTransactionalValidationPlan(ConnectionsGroup connections
192193
false,
193194
null,
194195
BulkedExternalInnerJoin.getMapper("a", "c", scope, validationSettings.getDataGraph()),
195-
connectionsGroup);
196+
connectionsGroup, AbstractBulkJoinPlanNode.DEFAULT_VARS);
196197

197198
StatementMatcher.Variable<Value> subjectVariable = stableRandomVariableProvider.next();
198199
StatementMatcher.Variable<Value> predicateVariable = stableRandomVariableProvider.next();
@@ -317,7 +318,10 @@ public PlanNode generateTransactionalValidationPlan(ConnectionsGroup connections
317318
}
318319
return validationTuple;
319320
},
320-
connectionsGroup);
321+
connectionsGroup,
322+
List.of(AbstractBulkJoinPlanNode.DEFAULT_VARS.get(0), AbstractBulkJoinPlanNode.DEFAULT_VARS.get(1),
323+
predicateVariable)
324+
);
321325

322326
return bulkedExternalInnerJoin;
323327
}
@@ -529,11 +533,6 @@ private String getFilter(StatementMatcher.Variable<Value> target,
529533
return sparqlFragment.getFragment();
530534
}
531535

532-
@Override
533-
public ValidationApproach getPreferredValidationApproach(ConnectionsGroup connectionsGroup) {
534-
return super.getPreferredValidationApproach(connectionsGroup);
535-
}
536-
537536
@Override
538537
public ValidationApproach getOptimalBulkValidationApproach() {
539538
return ValidationApproach.SPARQL;

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@
3131
import org.eclipse.rdf4j.sail.shacl.ast.StatementMatcher;
3232
import org.eclipse.rdf4j.sail.shacl.ast.StatementMatcher.Variable;
3333
import org.eclipse.rdf4j.sail.shacl.ast.paths.Path;
34+
import org.eclipse.rdf4j.sail.shacl.ast.planNodes.AbstractBulkJoinPlanNode;
3435
import org.eclipse.rdf4j.sail.shacl.ast.planNodes.BulkedExternalLeftOuterJoin;
3536
import org.eclipse.rdf4j.sail.shacl.ast.planNodes.EmptyNode;
3637
import org.eclipse.rdf4j.sail.shacl.ast.planNodes.GroupByFilter;
@@ -113,7 +114,7 @@ public PlanNode generateTransactionalValidationPlan(ConnectionsGroup connections
113114
connectionsGroup.getRdfsSubClassOfReasoner(), stableRandomVariableProvider, Set.of()),
114115
(b) -> new ValidationTuple(b.getValue("a"), b.getValue("c"), scope, true,
115116
validationSettings.getDataGraph()),
116-
connectionsGroup);
117+
connectionsGroup, AbstractBulkJoinPlanNode.DEFAULT_VARS);
117118

118119
PlanNode invalidTargets = new GroupByFilter(joined, group -> {
119120
return group.stream().map(ValidationTuple::getValue).noneMatch(hasValueIn::contains);

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

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@
3030
import org.eclipse.rdf4j.sail.shacl.ast.ValidationApproach;
3131
import org.eclipse.rdf4j.sail.shacl.ast.ValidationQuery;
3232
import org.eclipse.rdf4j.sail.shacl.ast.paths.Path;
33+
import org.eclipse.rdf4j.sail.shacl.ast.planNodes.AbstractBulkJoinPlanNode;
3334
import org.eclipse.rdf4j.sail.shacl.ast.planNodes.BulkedExternalLeftOuterJoin;
3435
import org.eclipse.rdf4j.sail.shacl.ast.planNodes.EmptyNode;
3536
import org.eclipse.rdf4j.sail.shacl.ast.planNodes.GroupByFilter;
@@ -98,16 +99,18 @@ public PlanNode generateTransactionalValidationPlan(ConnectionsGroup connections
9899
EffectiveTarget.Extend.left, false, null);
99100

100101
addedTargets = UnionNode.getInstance(connectionsGroup, addedByPath, addedTargets);
101-
addedTargets = Unique.getInstance(addedTargets, false, connectionsGroup);
102102
}
103103

104+
addedTargets = Unique.getInstance(new TrimToTarget(addedTargets, connectionsGroup), false,
105+
connectionsGroup);
106+
104107
PlanNode joined = new BulkedExternalLeftOuterJoin(addedTargets, connectionsGroup.getBaseConnection(),
105108
validationSettings.getDataGraph(),
106109
path.getTargetQueryFragment(new Variable<>("a"), new Variable<>("c"),
107110
connectionsGroup.getRdfsSubClassOfReasoner(), stableRandomVariableProvider, Set.of()),
108111
(b) -> new ValidationTuple(b.getValue("a"), b.getValue("c"), scope, true,
109112
validationSettings.getDataGraph()),
110-
connectionsGroup);
113+
connectionsGroup, AbstractBulkJoinPlanNode.DEFAULT_VARS);
111114

112115
PlanNode invalidTargets = new GroupByFilter(joined, group -> {
113116
return group

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

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@
3232
import org.eclipse.rdf4j.sail.shacl.ast.ValidationApproach;
3333
import org.eclipse.rdf4j.sail.shacl.ast.ValidationQuery;
3434
import org.eclipse.rdf4j.sail.shacl.ast.paths.Path;
35+
import org.eclipse.rdf4j.sail.shacl.ast.planNodes.AbstractBulkJoinPlanNode;
3536
import org.eclipse.rdf4j.sail.shacl.ast.planNodes.BulkedExternalInnerJoin;
3637
import org.eclipse.rdf4j.sail.shacl.ast.planNodes.BulkedExternalLeftOuterJoin;
3738
import org.eclipse.rdf4j.sail.shacl.ast.planNodes.EmptyNode;
@@ -113,7 +114,7 @@ public PlanNode generateTransactionalValidationPlan(ConnectionsGroup connections
113114
false,
114115
null,
115116
BulkedExternalInnerJoin.getMapper("a", "c", scope, validationSettings.getDataGraph()),
116-
connectionsGroup);
117+
connectionsGroup, AbstractBulkJoinPlanNode.DEFAULT_VARS);
117118
} else {
118119
relevantTargetsWithPath = new BulkedExternalLeftOuterJoin(
119120
mergeNode,
@@ -126,7 +127,7 @@ public PlanNode generateTransactionalValidationPlan(ConnectionsGroup connections
126127
Set.of()),
127128
(b) -> new ValidationTuple(b.getValue("a"), b.getValue("c"), scope, true,
128129
validationSettings.getDataGraph()),
129-
connectionsGroup);
130+
connectionsGroup, AbstractBulkJoinPlanNode.DEFAULT_VARS);
130131
}
131132

132133
relevantTargetsWithPath = connectionsGroup.getCachedNodeFor(relevantTargetsWithPath);

0 commit comments

Comments
 (0)