|
26 | 26 | import org.eclipse.rdf4j.sail.shacl.ast.StatementMatcher; |
27 | 27 | import org.eclipse.rdf4j.sail.shacl.ast.ValidationApproach; |
28 | 28 | import org.eclipse.rdf4j.sail.shacl.ast.paths.Path; |
| 29 | +import org.eclipse.rdf4j.sail.shacl.ast.planNodes.EmptyNode; |
29 | 30 | import org.eclipse.rdf4j.sail.shacl.ast.planNodes.PlanNode; |
30 | 31 | import org.eclipse.rdf4j.sail.shacl.ast.planNodes.PlanNodeProvider; |
31 | 32 | import org.eclipse.rdf4j.sail.shacl.ast.planNodes.ShiftToPropertyShape; |
@@ -135,73 +136,169 @@ private PlanNode getAllTargetsBasedOnPredicate(ConnectionsGroup connectionsGroup |
135 | 136 | return Unique.getInstance(UnionNode.getInstance(targetFilter1, targetFilter2), false); |
136 | 137 | } |
137 | 138 |
|
| 139 | +// @Override |
| 140 | +// public PlanNode getAllTargetsPlan(ConnectionsGroup connectionsGroup, Resource[] dataGraph, Scope scope, |
| 141 | +// StatementMatcher.StableRandomVariableProvider stableRandomVariableProvider) { |
| 142 | +// assert scope == Scope.propertyShape; |
| 143 | +// |
| 144 | +// PlanNode allTargetsPlan = getTargetChain() |
| 145 | +// .getEffectiveTarget(Scope.nodeShape, connectionsGroup.getRdfsSubClassOfReasoner(), |
| 146 | +// stableRandomVariableProvider) |
| 147 | +// .getPlanNode(connectionsGroup, dataGraph, Scope.nodeShape, true, null); |
| 148 | +// |
| 149 | +// allTargetsPlan = new ShiftToPropertyShape(allTargetsPlan); |
| 150 | +// |
| 151 | +// // removed statements that match predicate could affect sh:or |
| 152 | +// if (connectionsGroup.getStats().hasRemoved()) { |
| 153 | +// PlanNode deletedPredicates = new UnorderedSelect(connectionsGroup.getRemovedStatements(), null, predicate, |
| 154 | +// null, dataGraph, UnorderedSelect.Mapper.SubjectScopedMapper.getFunction(Scope.propertyShape)); |
| 155 | +// deletedPredicates = getTargetChain() |
| 156 | +// .getEffectiveTarget(Scope.propertyShape, connectionsGroup.getRdfsSubClassOfReasoner(), |
| 157 | +// stableRandomVariableProvider) |
| 158 | +// .getTargetFilter(connectionsGroup, dataGraph, deletedPredicates); |
| 159 | +// deletedPredicates = getTargetChain() |
| 160 | +// .getEffectiveTarget(Scope.propertyShape, connectionsGroup.getRdfsSubClassOfReasoner(), |
| 161 | +// stableRandomVariableProvider) |
| 162 | +// .extend(deletedPredicates, connectionsGroup, dataGraph, Scope.propertyShape, EffectiveTarget.Extend.left, |
| 163 | +// false, |
| 164 | +// null); |
| 165 | +// allTargetsPlan = UnionNode.getInstanceDedupe(allTargetsPlan, deletedPredicates); |
| 166 | +// } |
| 167 | +// |
| 168 | +// // added statements that match predicate could affect sh:not |
| 169 | +// if (connectionsGroup.getStats().hasAdded()) { |
| 170 | +// PlanNode addedPredicates = new UnorderedSelect(connectionsGroup.getAddedStatements(), null, predicate, |
| 171 | +// null, dataGraph, UnorderedSelect.Mapper.SubjectScopedMapper.getFunction(Scope.propertyShape)); |
| 172 | +// addedPredicates = getTargetChain() |
| 173 | +// .getEffectiveTarget(Scope.propertyShape, connectionsGroup.getRdfsSubClassOfReasoner(), |
| 174 | +// stableRandomVariableProvider) |
| 175 | +// .getTargetFilter(connectionsGroup, dataGraph, addedPredicates); |
| 176 | +// addedPredicates = getTargetChain() |
| 177 | +// .getEffectiveTarget(Scope.propertyShape, connectionsGroup.getRdfsSubClassOfReasoner(), |
| 178 | +// stableRandomVariableProvider) |
| 179 | +// .extend(addedPredicates, connectionsGroup, dataGraph, Scope.propertyShape, EffectiveTarget.Extend.left, |
| 180 | +// false, |
| 181 | +// null); |
| 182 | +// allTargetsPlan = UnionNode.getInstanceDedupe(allTargetsPlan, addedPredicates); |
| 183 | +// } |
| 184 | +// |
| 185 | +// return Unique.getInstance(new TrimToTarget(allTargetsPlan), false); |
| 186 | +// } |
| 187 | + |
138 | 188 | @Override |
139 | 189 | public PlanNode getAllTargetsPlan(ConnectionsGroup connectionsGroup, Resource[] dataGraph, Scope scope, |
140 | 190 | StatementMatcher.StableRandomVariableProvider stableRandomVariableProvider) { |
141 | | - assert scope == Scope.propertyShape; |
| 191 | + if (scope == Scope.propertyShape) { |
| 192 | + PlanNode allTargetsPlan = getTargetChain() |
| 193 | + .getEffectiveTarget(Scope.nodeShape, connectionsGroup.getRdfsSubClassOfReasoner(), |
| 194 | + stableRandomVariableProvider) |
| 195 | + .getPlanNode(connectionsGroup, dataGraph, Scope.nodeShape, true, null); |
| 196 | + |
| 197 | + allTargetsPlan = new ShiftToPropertyShape(allTargetsPlan); |
| 198 | + |
| 199 | + // removed statements that match predicate could affect sh:or |
| 200 | + if (connectionsGroup.getStats().hasRemoved()) { |
| 201 | + PlanNode deletedPredicates = new UnorderedSelect(connectionsGroup.getRemovedStatements(), null, |
| 202 | + predicate, |
| 203 | + null, dataGraph, UnorderedSelect.Mapper.SubjectScopedMapper.getFunction(Scope.propertyShape)); |
| 204 | + deletedPredicates = getTargetChain() |
| 205 | + .getEffectiveTarget(Scope.propertyShape, connectionsGroup.getRdfsSubClassOfReasoner(), |
| 206 | + stableRandomVariableProvider) |
| 207 | + .getTargetFilter(connectionsGroup, dataGraph, deletedPredicates); |
| 208 | + deletedPredicates = getTargetChain() |
| 209 | + .getEffectiveTarget(Scope.propertyShape, connectionsGroup.getRdfsSubClassOfReasoner(), |
| 210 | + stableRandomVariableProvider) |
| 211 | + .extend(deletedPredicates, connectionsGroup, dataGraph, Scope.propertyShape, |
| 212 | + EffectiveTarget.Extend.left, |
| 213 | + false, |
| 214 | + null); |
| 215 | + allTargetsPlan = UnionNode.getInstanceDedupe(allTargetsPlan, deletedPredicates); |
| 216 | + } |
142 | 217 |
|
143 | | - PlanNode allTargetsPlan = getTargetChain() |
144 | | - .getEffectiveTarget(Scope.nodeShape, connectionsGroup.getRdfsSubClassOfReasoner(), |
145 | | - stableRandomVariableProvider) |
146 | | - .getPlanNode(connectionsGroup, dataGraph, Scope.nodeShape, true, null); |
| 218 | + // added statements that match predicate could affect sh:not |
| 219 | + if (connectionsGroup.getStats().hasAdded()) { |
| 220 | + PlanNode addedPredicates = new UnorderedSelect(connectionsGroup.getAddedStatements(), null, predicate, |
| 221 | + null, dataGraph, UnorderedSelect.Mapper.SubjectScopedMapper.getFunction(Scope.propertyShape)); |
| 222 | + addedPredicates = getTargetChain() |
| 223 | + .getEffectiveTarget(Scope.propertyShape, connectionsGroup.getRdfsSubClassOfReasoner(), |
| 224 | + stableRandomVariableProvider) |
| 225 | + .getTargetFilter(connectionsGroup, dataGraph, addedPredicates); |
| 226 | + addedPredicates = getTargetChain() |
| 227 | + .getEffectiveTarget(Scope.propertyShape, connectionsGroup.getRdfsSubClassOfReasoner(), |
| 228 | + stableRandomVariableProvider) |
| 229 | + .extend(addedPredicates, connectionsGroup, dataGraph, Scope.propertyShape, |
| 230 | + EffectiveTarget.Extend.left, |
| 231 | + false, |
| 232 | + null); |
| 233 | + allTargetsPlan = UnionNode.getInstanceDedupe(allTargetsPlan, addedPredicates); |
| 234 | + } |
147 | 235 |
|
148 | | - allTargetsPlan = new ShiftToPropertyShape(allTargetsPlan); |
| 236 | + return Unique.getInstance(new TrimToTarget(allTargetsPlan), false); |
| 237 | + } else { |
| 238 | + assert scope == Scope.nodeShape; |
| 239 | + |
| 240 | + PlanNode allTargetsPlan = EmptyNode.getInstance(); |
| 241 | + |
| 242 | + // removed type statements that match clazz could affect sh:or |
| 243 | + if (connectionsGroup.getStats().hasRemoved()) { |
| 244 | + PlanNode deletedPredicates = new UnorderedSelect(connectionsGroup.getRemovedStatements(), null, |
| 245 | + predicate, null, |
| 246 | + dataGraph, UnorderedSelect.Mapper.SubjectScopedMapper.getFunction(Scope.nodeShape)); |
| 247 | + deletedPredicates = getTargetChain() |
| 248 | + .getEffectiveTarget(Scope.nodeShape, connectionsGroup.getRdfsSubClassOfReasoner(), |
| 249 | + stableRandomVariableProvider) |
| 250 | + .getTargetFilter(connectionsGroup, dataGraph, deletedPredicates); |
| 251 | + deletedPredicates = getTargetChain() |
| 252 | + .getEffectiveTarget(Scope.nodeShape, connectionsGroup.getRdfsSubClassOfReasoner(), |
| 253 | + stableRandomVariableProvider) |
| 254 | + .extend(deletedPredicates, connectionsGroup, dataGraph, Scope.nodeShape, |
| 255 | + EffectiveTarget.Extend.left, |
| 256 | + false, null); |
| 257 | + allTargetsPlan = UnionNode.getInstanceDedupe(allTargetsPlan, deletedPredicates); |
149 | 258 |
|
150 | | - // removed statements that match predicate could affect sh:or |
151 | | - if (connectionsGroup.getStats().hasRemoved()) { |
152 | | - PlanNode deletedTypes = new UnorderedSelect(connectionsGroup.getRemovedStatements(), null, predicate, |
153 | | - null, dataGraph, UnorderedSelect.Mapper.SubjectScopedMapper.getFunction(Scope.propertyShape)); |
154 | | - deletedTypes = getTargetChain() |
155 | | - .getEffectiveTarget(Scope.propertyShape, connectionsGroup.getRdfsSubClassOfReasoner(), |
156 | | - stableRandomVariableProvider) |
157 | | - .getTargetFilter(connectionsGroup, dataGraph, deletedTypes); |
158 | | - deletedTypes = getTargetChain() |
159 | | - .getEffectiveTarget(Scope.propertyShape, connectionsGroup.getRdfsSubClassOfReasoner(), |
160 | | - stableRandomVariableProvider) |
161 | | - .extend(deletedTypes, connectionsGroup, dataGraph, Scope.propertyShape, EffectiveTarget.Extend.left, |
162 | | - false, |
163 | | - null); |
164 | | - allTargetsPlan = UnionNode.getInstanceDedupe(allTargetsPlan, deletedTypes); |
165 | | - } |
| 259 | + } |
| 260 | + |
| 261 | + // added type statements that match clazz could affect sh:not |
| 262 | + if (connectionsGroup.getStats().hasAdded()) { |
| 263 | + PlanNode addedPredicates = new UnorderedSelect(connectionsGroup.getAddedStatements(), null, predicate, |
| 264 | + null, |
| 265 | + dataGraph, UnorderedSelect.Mapper.SubjectScopedMapper.getFunction(Scope.nodeShape)); |
| 266 | + addedPredicates = getTargetChain() |
| 267 | + .getEffectiveTarget(Scope.nodeShape, connectionsGroup.getRdfsSubClassOfReasoner(), |
| 268 | + stableRandomVariableProvider) |
| 269 | + .getTargetFilter(connectionsGroup, dataGraph, addedPredicates); |
| 270 | + addedPredicates = getTargetChain() |
| 271 | + .getEffectiveTarget(Scope.nodeShape, connectionsGroup.getRdfsSubClassOfReasoner(), |
| 272 | + stableRandomVariableProvider) |
| 273 | + .extend(addedPredicates, connectionsGroup, dataGraph, Scope.nodeShape, |
| 274 | + EffectiveTarget.Extend.left, |
| 275 | + false, null); |
| 276 | + allTargetsPlan = UnionNode.getInstanceDedupe(allTargetsPlan, addedPredicates); |
| 277 | + |
| 278 | + } |
| 279 | + |
| 280 | + return Unique.getInstance(allTargetsPlan, false); |
166 | 281 |
|
167 | | - // added statements that match predicate could affect sh:not |
168 | | - if (connectionsGroup.getStats().hasAdded()) { |
169 | | - PlanNode addedTypes = new UnorderedSelect(connectionsGroup.getAddedStatements(), null, predicate, |
170 | | - null, dataGraph, UnorderedSelect.Mapper.SubjectScopedMapper.getFunction(Scope.propertyShape)); |
171 | | - addedTypes = getTargetChain() |
172 | | - .getEffectiveTarget(Scope.propertyShape, connectionsGroup.getRdfsSubClassOfReasoner(), |
173 | | - stableRandomVariableProvider) |
174 | | - .getTargetFilter(connectionsGroup, dataGraph, addedTypes); |
175 | | - addedTypes = getTargetChain() |
176 | | - .getEffectiveTarget(Scope.propertyShape, connectionsGroup.getRdfsSubClassOfReasoner(), |
177 | | - stableRandomVariableProvider) |
178 | | - .extend(addedTypes, connectionsGroup, dataGraph, Scope.propertyShape, EffectiveTarget.Extend.left, |
179 | | - false, |
180 | | - null); |
181 | | - allTargetsPlan = UnionNode.getInstanceDedupe(allTargetsPlan, addedTypes); |
182 | 282 | } |
183 | 283 |
|
184 | | - return Unique.getInstance(new TrimToTarget(allTargetsPlan), false); |
185 | 284 | } |
186 | 285 |
|
187 | 286 | @Override |
188 | | - public ValidationApproach getPreferredValidationApproach(ConnectionsGroup connectionsGroup) { |
189 | | - return ValidationApproach.Transactional; |
| 287 | + public boolean requiresEvaluation(ConnectionsGroup connectionsGroup, Scope scope, Resource[] dataGraph, |
| 288 | + StatementMatcher.StableRandomVariableProvider stableRandomVariableProvider) { |
| 289 | + return super.requiresEvaluation(connectionsGroup, scope, dataGraph, stableRandomVariableProvider) |
| 290 | + || connectionsGroup.getRemovedStatements().hasStatement(null, predicate, null, true, dataGraph) |
| 291 | + || connectionsGroup.getAddedStatements().hasStatement(null, predicate, null, true, dataGraph); |
190 | 292 | } |
191 | 293 |
|
192 | 294 | @Override |
193 | | - public ValidationApproach getOptimalBulkValidationApproach() { |
| 295 | + public ValidationApproach getPreferredValidationApproach(ConnectionsGroup connectionsGroup) { |
194 | 296 | return ValidationApproach.Transactional; |
195 | 297 | } |
196 | 298 |
|
197 | 299 | @Override |
198 | | - public boolean requiresEvaluation(ConnectionsGroup connectionsGroup, Scope scope, Resource[] dataGraph, |
199 | | - StatementMatcher.StableRandomVariableProvider stableRandomVariableProvider) { |
200 | | - |
201 | | - // todo both consider the target chain with added and removed values (path), and also added and removed values |
202 | | - // for the predicate path |
203 | | - |
204 | | - return true; |
| 300 | + public ValidationApproach getOptimalBulkValidationApproach() { |
| 301 | + return ValidationApproach.Transactional; |
205 | 302 | } |
206 | 303 |
|
207 | 304 | @Override |
|
0 commit comments