From 10eb88ee625f25fdc66f8f2c117bbc8470297fff Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ha=CC=8Avard=20Ottestad?= Date: Thu, 29 Aug 2024 14:54:46 +0200 Subject: [PATCH] wip --- .../rdf4j/sail/shacl/ShaclSailConnection.java | 5 +- .../rdf4j/sail/shacl/ShaclValidator.java | 4 +- .../sail/shacl/ShapeValidationContainer.java | 57 +++++++++++++- .../AbstractConstraintComponent.java | 2 +- .../ClassConstraintComponent.java | 2 +- .../ClosedConstraintComponent.java | 6 +- .../OrConstraintComponent.java | 2 +- .../sail/shacl/ast/planNodes/BindSelect.java | 14 ++-- .../shacl/ast/planNodes/BufferedSplitter.java | 28 +++++-- .../planNodes/BulkedExternalInnerJoin.java | 14 ++-- .../BulkedExternalLeftOuterJoin.java | 14 ++-- .../ast/planNodes/FilterByPredicate.java | 14 ++-- .../planNodes/FilterByPredicateObject.java | 74 ++++++++++++------- .../sail/shacl/ast/planNodes/Formatter.java | 34 +++++---- .../sail/shacl/ast/planNodes/NotValuesIn.java | 11 ++- .../sail/shacl/ast/planNodes/PlanNode.java | 20 +++++ .../shacl/ast/planNodes/PlanNodeHelper.java | 12 +-- .../shacl/ast/planNodes/ReduceTargets.java | 10 ++- .../sail/shacl/ast/planNodes/Select.java | 14 ++-- .../planNodes/SingleCloseablePlanNode.java | 2 +- .../rdf4j/sail/shacl/ast/planNodes/Sort.java | 17 +++-- .../shacl/ast/planNodes/TrimToTarget.java | 3 +- .../sail/shacl/ast/planNodes/Unique.java | 1 - .../shacl/ast/planNodes/UnorderedSelect.java | 14 ++-- .../ast/planNodes/ValidationReportNode.java | 3 + .../sail/shacl/ast/targets/TargetClass.java | 4 +- .../shacl/wrapper/data/ConnectionsGroup.java | 7 +- .../shacl/benchmark/ClassBenchmarkEmpty.java | 10 +++ .../benchmark/ComplexLargeBenchmark.java | 5 +- 29 files changed, 269 insertions(+), 134 deletions(-) diff --git a/core/sail/shacl/src/main/java/org/eclipse/rdf4j/sail/shacl/ShaclSailConnection.java b/core/sail/shacl/src/main/java/org/eclipse/rdf4j/sail/shacl/ShaclSailConnection.java index 1e0416e76ad..829fdd91766 100644 --- a/core/sail/shacl/src/main/java/org/eclipse/rdf4j/sail/shacl/ShaclSailConnection.java +++ b/core/sail/shacl/src/main/java/org/eclipse/rdf4j/sail/shacl/ShaclSailConnection.java @@ -524,8 +524,9 @@ private ValidationReport performValidation(List shapes, boolea sail.isPerformanceLogging())), sail.isGlobalLogValidationExecution(), sail.isLogValidationViolations(), sail.getEffectiveValidationResultsLimitPerConstraint(), sail.isPerformanceLogging(), - logger - )) + sail.isLogValidationPlans(), + logger, + connectionsGroup)) .filter(ShapeValidationContainer::hasPlanNode) .map(validationContainer -> validationContainer::performValidation); diff --git a/core/sail/shacl/src/main/java/org/eclipse/rdf4j/sail/shacl/ShaclValidator.java b/core/sail/shacl/src/main/java/org/eclipse/rdf4j/sail/shacl/ShaclValidator.java index f6222b4117b..ed9442c0ef7 100644 --- a/core/sail/shacl/src/main/java/org/eclipse/rdf4j/sail/shacl/ShaclValidator.java +++ b/core/sail/shacl/src/main/java/org/eclipse/rdf4j/sail/shacl/ShaclValidator.java @@ -115,8 +115,8 @@ private static ValidationReport performValidation(List shapes, () -> contextWithShape.getShape() .generatePlans(connectionsGroup, new ValidationSettings(contextWithShape.getDataGraph(), false, true, false)), - false, false, 1000, false, logger - ) + false, false, 1000, false, false, logger, + connectionsGroup) ) .filter(ShapeValidationContainer::hasPlanNode) .map(ShapeValidationContainer::performValidation) diff --git a/core/sail/shacl/src/main/java/org/eclipse/rdf4j/sail/shacl/ShapeValidationContainer.java b/core/sail/shacl/src/main/java/org/eclipse/rdf4j/sail/shacl/ShapeValidationContainer.java index 85b40bf1cf3..9f951a94bb1 100644 --- a/core/sail/shacl/src/main/java/org/eclipse/rdf4j/sail/shacl/ShapeValidationContainer.java +++ b/core/sail/shacl/src/main/java/org/eclipse/rdf4j/sail/shacl/ShapeValidationContainer.java @@ -11,11 +11,14 @@ package org.eclipse.rdf4j.sail.shacl; +import java.util.Arrays; import java.util.List; import java.util.function.Supplier; import java.util.stream.Collectors; +import org.apache.commons.text.StringEscapeUtils; import org.eclipse.rdf4j.common.iteration.CloseableIteration; +import org.eclipse.rdf4j.sail.SailConnection; import org.eclipse.rdf4j.sail.SailException; import org.eclipse.rdf4j.sail.shacl.ast.Shape; import org.eclipse.rdf4j.sail.shacl.ast.planNodes.PlanNode; @@ -23,6 +26,7 @@ import org.eclipse.rdf4j.sail.shacl.ast.planNodes.ValidationExecutionLogger; import org.eclipse.rdf4j.sail.shacl.ast.planNodes.ValidationTuple; import org.eclipse.rdf4j.sail.shacl.results.lazy.ValidationResultIterator; +import org.eclipse.rdf4j.sail.shacl.wrapper.data.ConnectionsGroup; import org.slf4j.Logger; class ShapeValidationContainer { @@ -36,7 +40,7 @@ class ShapeValidationContainer { public ShapeValidationContainer(Shape shape, Supplier planNodeSupplier, boolean logValidationExecution, boolean logValidationViolations, long effectiveValidationResultsLimitPerConstraint, - boolean performanceLogging, Logger logger) { + boolean performanceLogging, boolean logValidationPlans, Logger logger, ConnectionsGroup connectionsGroup) { this.shape = shape; this.logValidationViolations = logValidationViolations; this.effectiveValidationResultsLimitPerConstraint = effectiveValidationResultsLimitPerConstraint; @@ -44,6 +48,56 @@ public ShapeValidationContainer(Shape shape, Supplier planNodeSupplier this.logger = logger; try { PlanNode planNode = planNodeSupplier.get(); + + if (logValidationPlans) { + + StringBuilder planAsGraphvizDot = new StringBuilder(); + + planAsGraphvizDot.append( + "rank1 [style=invisible];\n" + + "rank2 [style=invisible];\n" + + "\n" + + "rank1 -> rank2 [color=white];\n"); + + planAsGraphvizDot.append("{\n") + .append("\trank = same;\n") + .append("\trank2 -> ") + .append(System.identityHashCode(connectionsGroup.getBaseConnection())) + .append(" -> ") + .append(System.identityHashCode(connectionsGroup.getAddedStatements())) + .append(" -> ") + .append(System.identityHashCode(connectionsGroup.getRemovedStatements())) + .append(" [ style=invis ];\n") + .append("\trankdir = LR;\n") + .append("}\n"); + + planAsGraphvizDot.append(System.identityHashCode(connectionsGroup.getBaseConnection())) + .append(" [label=\"") + .append("BaseConnection") + .append("\" fillcolor=\"#CACADB\", style=filled];") + .append("\n"); + + planAsGraphvizDot.append(System.identityHashCode(connectionsGroup.getAddedStatements())) + .append(" [label=\"") + .append("AddedStatements") + .append("\" fillcolor=\"#CEDBCA\", style=filled];") + .append("\n"); + + planAsGraphvizDot.append(System.identityHashCode(connectionsGroup.getRemovedStatements())) + .append(" [label=\"") + .append("RemovedStatements") + .append("\" fillcolor=\"#DBCFC9r\", style=filled];") + .append("\n"); + + planNode.getPlanAsGraphvizDot(planAsGraphvizDot); + + String[] split = planAsGraphvizDot.toString().split("\n"); + planAsGraphvizDot = new StringBuilder(); + Arrays.stream(split).map(s -> "\t" + s + "\n").forEach(planAsGraphvizDot::append); + + logger.info("Plan as Graphviz dot:\ndigraph G {\n{}}", planAsGraphvizDot); + } + this.validationExecutionLogger = ValidationExecutionLogger .getInstance(logValidationExecution); if (!(planNode.isGuaranteedEmpty())) { @@ -113,7 +167,6 @@ private void handlePostLogging(long before, ValidationResultIterator validationR } if (validationResults != null) { - if (performanceLogging) { long after = System.currentTimeMillis(); logger.info("Execution of plan took {} ms for:\n{}\n", diff --git a/core/sail/shacl/src/main/java/org/eclipse/rdf4j/sail/shacl/ast/constraintcomponents/AbstractConstraintComponent.java b/core/sail/shacl/src/main/java/org/eclipse/rdf4j/sail/shacl/ast/constraintcomponents/AbstractConstraintComponent.java index aab697c03fe..f3a6413a5cb 100644 --- a/core/sail/shacl/src/main/java/org/eclipse/rdf4j/sail/shacl/ast/constraintcomponents/AbstractConstraintComponent.java +++ b/core/sail/shacl/src/main/java/org/eclipse/rdf4j/sail/shacl/ast/constraintcomponents/AbstractConstraintComponent.java @@ -155,7 +155,7 @@ static PlanNode getAllTargetsIncludingThoseAddedByPath(ConnectionsGroup connecti ValidationSettings validationSettings, Scope scope, EffectiveTarget effectiveTarget, Path path, boolean includeTargetsAffectedByRemoval) { PlanNode allTargets; - BufferedSplitter addedTargets = new BufferedSplitter( + BufferedSplitter addedTargets = BufferedSplitter.getInstance( effectiveTarget.getPlanNode(connectionsGroup, validationSettings.getDataGraph(), scope, includeTargetsAffectedByRemoval, null)); diff --git a/core/sail/shacl/src/main/java/org/eclipse/rdf4j/sail/shacl/ast/constraintcomponents/ClassConstraintComponent.java b/core/sail/shacl/src/main/java/org/eclipse/rdf4j/sail/shacl/ast/constraintcomponents/ClassConstraintComponent.java index abd4a1a0fa3..8dde6295aff 100644 --- a/core/sail/shacl/src/main/java/org/eclipse/rdf4j/sail/shacl/ast/constraintcomponents/ClassConstraintComponent.java +++ b/core/sail/shacl/src/main/java/org/eclipse/rdf4j/sail/shacl/ast/constraintcomponents/ClassConstraintComponent.java @@ -112,7 +112,7 @@ public PlanNode generateTransactionalValidationPlan(ConnectionsGroup connections } } else { - BufferedSplitter addedTargetsBufferedSplitter = new BufferedSplitter( + BufferedSplitter addedTargetsBufferedSplitter = BufferedSplitter.getInstance( effectiveTarget.getPlanNode(connectionsGroup, validationSettings.getDataGraph(), scope, false, null)); addedTargets = addedTargetsBufferedSplitter.getPlanNode(); diff --git a/core/sail/shacl/src/main/java/org/eclipse/rdf4j/sail/shacl/ast/constraintcomponents/ClosedConstraintComponent.java b/core/sail/shacl/src/main/java/org/eclipse/rdf4j/sail/shacl/ast/constraintcomponents/ClosedConstraintComponent.java index 7977bd2f559..64bf3dcc2f0 100644 --- a/core/sail/shacl/src/main/java/org/eclipse/rdf4j/sail/shacl/ast/constraintcomponents/ClosedConstraintComponent.java +++ b/core/sail/shacl/src/main/java/org/eclipse/rdf4j/sail/shacl/ast/constraintcomponents/ClosedConstraintComponent.java @@ -139,7 +139,7 @@ public PlanNode generateTransactionalValidationPlan(ConnectionsGroup connections false, null); } else { - BufferedSplitter addedTargetsBufferedSplitter = new BufferedSplitter( + BufferedSplitter addedTargetsBufferedSplitter = BufferedSplitter.getInstance( effectiveTarget.getPlanNode(connectionsGroup, validationSettings.getDataGraph(), scope, false, null)); addedTargets = addedTargetsBufferedSplitter.getPlanNode(); @@ -336,7 +336,7 @@ public PlanNode getAllTargetsPlan(ConnectionsGroup connectionsGroup, Resource[] throw new IllegalStateException(); case nodeShape: - BufferedSplitter targets = new BufferedSplitter( + BufferedSplitter targets = BufferedSplitter.getInstance( effectiveTarget.getPlanNode(connectionsGroup, dataGraph, scope, false, null)); // get all subjects of all triples where the predicate is not in the allAllowedPredicates set @@ -386,7 +386,7 @@ public PlanNode getAllTargetsPlan(ConnectionsGroup connectionsGroup, Resource[] case propertyShape: Path path = getTargetChain().getPath().get(); - BufferedSplitter addedTargetsBufferedSplitter = new BufferedSplitter( + BufferedSplitter addedTargetsBufferedSplitter = BufferedSplitter.getInstance( effectiveTarget.getPlanNode(connectionsGroup, dataGraph, scope, false, null)); PlanNode addedTargets = addedTargetsBufferedSplitter.getPlanNode(); diff --git a/core/sail/shacl/src/main/java/org/eclipse/rdf4j/sail/shacl/ast/constraintcomponents/OrConstraintComponent.java b/core/sail/shacl/src/main/java/org/eclipse/rdf4j/sail/shacl/ast/constraintcomponents/OrConstraintComponent.java index 89435c86954..db9c6744675 100644 --- a/core/sail/shacl/src/main/java/org/eclipse/rdf4j/sail/shacl/ast/constraintcomponents/OrConstraintComponent.java +++ b/core/sail/shacl/src/main/java/org/eclipse/rdf4j/sail/shacl/ast/constraintcomponents/OrConstraintComponent.java @@ -119,7 +119,7 @@ public PlanNode generateTransactionalValidationPlan(ConnectionsGroup connections if (overrideTargetNode != null) { planNodeProvider = overrideTargetNode; } else { - planNodeProvider = new BufferedSplitter( + planNodeProvider = BufferedSplitter.getInstance( getAllTargetsPlan(connectionsGroup, validationSettings.getDataGraph(), scope, stableRandomVariableProvider), false); diff --git a/core/sail/shacl/src/main/java/org/eclipse/rdf4j/sail/shacl/ast/planNodes/BindSelect.java b/core/sail/shacl/src/main/java/org/eclipse/rdf4j/sail/shacl/ast/planNodes/BindSelect.java index d48eb9a0779..c0ad89dfab0 100644 --- a/core/sail/shacl/src/main/java/org/eclipse/rdf4j/sail/shacl/ast/planNodes/BindSelect.java +++ b/core/sail/shacl/src/main/java/org/eclipse/rdf4j/sail/shacl/ast/planNodes/BindSelect.java @@ -323,13 +323,13 @@ public void getPlanAsGraphvizDot(StringBuilder stringBuilder) { // added/removed connections are always newly minted per plan node, so we instead need to compare the underlying // sail - if (connection instanceof MemoryStoreConnection) { - stringBuilder - .append(System.identityHashCode(((MemoryStoreConnection) connection).getSail()) + " -> " + getId()) - .append("\n"); - } else { - stringBuilder.append(System.identityHashCode(connection) + " -> " + getId()).append("\n"); - } +// if (connection instanceof MemoryStoreConnection) { +// stringBuilder +// .append(System.identityHashCode(((MemoryStoreConnection) connection).getSail()) + " -> " + getId()) +// .append("\n"); +// } else { + stringBuilder.append(System.identityHashCode(connection) + " -> " + getId()).append("\n"); +// } } diff --git a/core/sail/shacl/src/main/java/org/eclipse/rdf4j/sail/shacl/ast/planNodes/BufferedSplitter.java b/core/sail/shacl/src/main/java/org/eclipse/rdf4j/sail/shacl/ast/planNodes/BufferedSplitter.java index df62ca822f0..ef571fc554f 100644 --- a/core/sail/shacl/src/main/java/org/eclipse/rdf4j/sail/shacl/ast/planNodes/BufferedSplitter.java +++ b/core/sail/shacl/src/main/java/org/eclipse/rdf4j/sail/shacl/ast/planNodes/BufferedSplitter.java @@ -41,18 +41,34 @@ public class BufferedSplitter implements PlanNodeProvider { private final boolean cached; private volatile List tuplesBuffer; private long id = -1; + private boolean printed; - public BufferedSplitter(PlanNode parent, boolean cached) { + private BufferedSplitter(PlanNode parent, boolean cached) { this.parent = parent; this.cached = cached; id = idCounter.incrementAndGet(); - } - public BufferedSplitter(PlanNode parent) { + private BufferedSplitter(PlanNode parent) { this(parent, true); } + public static BufferedSplitter getInstance(PlanNode parent) { + if (parent instanceof BufferedSplitterPlaneNode + && ((BufferedSplitterPlaneNode) parent).bufferedSplitter.cached == true) { + return ((BufferedSplitterPlaneNode) parent).bufferedSplitter; + } + return new BufferedSplitter(parent); + } + + public static BufferedSplitter getInstance(PlanNode parent, boolean cached) { + if (parent instanceof BufferedSplitterPlaneNode + && ((BufferedSplitterPlaneNode) parent).bufferedSplitter.cached == cached) { + return ((BufferedSplitterPlaneNode) parent).bufferedSplitter; + } + return new BufferedSplitter(parent, cached); + } + private synchronized void init() { if (tuplesBuffer == null) { tuplesBuffer = new ArrayList<>(); @@ -156,10 +172,10 @@ public int depth() { @Override public void getPlanAsGraphvizDot(StringBuilder stringBuilder) { - if (printed) { + if (bufferedSplitter.printed) { return; } - printed = true; + bufferedSplitter.printed = true; stringBuilder.append(getId() + " [label=\"" + StringEscapeUtils.escapeJava(this.toString()) + "\"];") .append("\n"); stringBuilder.append(bufferedSplitter.parent.getId() + " -> " + getId()).append("\n"); @@ -173,7 +189,7 @@ public String getId() { @Override public String toString() { - return "BufferedSplitter"; + return "BufferedSplitter" + (cached ? " (cached)" : ""); } @Override diff --git a/core/sail/shacl/src/main/java/org/eclipse/rdf4j/sail/shacl/ast/planNodes/BulkedExternalInnerJoin.java b/core/sail/shacl/src/main/java/org/eclipse/rdf4j/sail/shacl/ast/planNodes/BulkedExternalInnerJoin.java index 0863279f495..c48e3ee02c6 100644 --- a/core/sail/shacl/src/main/java/org/eclipse/rdf4j/sail/shacl/ast/planNodes/BulkedExternalInnerJoin.java +++ b/core/sail/shacl/src/main/java/org/eclipse/rdf4j/sail/shacl/ast/planNodes/BulkedExternalInnerJoin.java @@ -189,13 +189,13 @@ public void getPlanAsGraphvizDot(StringBuilder stringBuilder) { // added/removed connections are always newly minted per plan node, so we instead need to compare the underlying // sail - if (connection instanceof MemoryStoreConnection) { - stringBuilder.append(System.identityHashCode(((MemoryStoreConnection) connection).getSail()) + " -> " - + getId() + " [label=\"right\"]").append("\n"); - } else { - stringBuilder.append(System.identityHashCode(connection) + " -> " + getId() + " [label=\"right\"]") - .append("\n"); - } +// if (connection instanceof MemoryStoreConnection) { +// stringBuilder.append(System.identityHashCode(((MemoryStoreConnection) connection).getSail()) + " -> " +// + getId() + " [label=\"right\"]").append("\n"); +// } else { + stringBuilder.append(System.identityHashCode(connection) + " -> " + getId() + " [label=\"right\"]") + .append("\n"); +// } if (skipBasedOnPreviousConnection) { diff --git a/core/sail/shacl/src/main/java/org/eclipse/rdf4j/sail/shacl/ast/planNodes/BulkedExternalLeftOuterJoin.java b/core/sail/shacl/src/main/java/org/eclipse/rdf4j/sail/shacl/ast/planNodes/BulkedExternalLeftOuterJoin.java index b4c60a78a23..8ea6b629229 100644 --- a/core/sail/shacl/src/main/java/org/eclipse/rdf4j/sail/shacl/ast/planNodes/BulkedExternalLeftOuterJoin.java +++ b/core/sail/shacl/src/main/java/org/eclipse/rdf4j/sail/shacl/ast/planNodes/BulkedExternalLeftOuterJoin.java @@ -183,13 +183,13 @@ public void getPlanAsGraphvizDot(StringBuilder stringBuilder) { // added/removed connections are always newly minted per plan node, so we instead need to compare the underlying // sail - if (connection instanceof MemoryStoreConnection) { - stringBuilder.append(System.identityHashCode(((MemoryStoreConnection) connection).getSail()) + " -> " - + getId() + " [label=\"right\"]").append("\n"); - } else { - stringBuilder.append(System.identityHashCode(connection) + " -> " + getId() + " [label=\"right\"]") - .append("\n"); - } +// if (connection instanceof MemoryStoreConnection) { +// stringBuilder.append(System.identityHashCode(((MemoryStoreConnection) connection).getSail()) + " -> " +// + getId() + " [label=\"right\"]").append("\n"); +// } else { + stringBuilder.append(System.identityHashCode(connection) + " -> " + getId() + " [label=\"right\"]") + .append("\n"); +// } stringBuilder.append(leftNode.getId() + " -> " + getId() + " [label=\"left\"]").append("\n"); diff --git a/core/sail/shacl/src/main/java/org/eclipse/rdf4j/sail/shacl/ast/planNodes/FilterByPredicate.java b/core/sail/shacl/src/main/java/org/eclipse/rdf4j/sail/shacl/ast/planNodes/FilterByPredicate.java index 028bf34a787..8c5b49b0218 100644 --- a/core/sail/shacl/src/main/java/org/eclipse/rdf4j/sail/shacl/ast/planNodes/FilterByPredicate.java +++ b/core/sail/shacl/src/main/java/org/eclipse/rdf4j/sail/shacl/ast/planNodes/FilterByPredicate.java @@ -175,13 +175,13 @@ public void getPlanAsGraphvizDot(StringBuilder stringBuilder) { // added/removed connections are always newly minted per plan node, so we instead need to compare the underlying // sail - if (connection instanceof MemoryStoreConnection) { - stringBuilder.append(System.identityHashCode(((MemoryStoreConnection) connection).getSail()) + " -> " - + getId() + " [label=\"filter source\"]").append("\n"); - } else { - stringBuilder.append(System.identityHashCode(connection) + " -> " + getId() + " [label=\"filter source\"]") - .append("\n"); - } +// if (connection instanceof MemoryStoreConnection) { +// stringBuilder.append(System.identityHashCode(((MemoryStoreConnection) connection).getSail()) + " -> " +// + getId() + " [label=\"filter source\"]").append("\n"); +// } else { + stringBuilder.append(System.identityHashCode(connection) + " -> " + getId() + " [label=\"filter source\"]") + .append("\n"); +// } parent.getPlanAsGraphvizDot(stringBuilder); } diff --git a/core/sail/shacl/src/main/java/org/eclipse/rdf4j/sail/shacl/ast/planNodes/FilterByPredicateObject.java b/core/sail/shacl/src/main/java/org/eclipse/rdf4j/sail/shacl/ast/planNodes/FilterByPredicateObject.java index 5e44d8387da..9a44baba198 100644 --- a/core/sail/shacl/src/main/java/org/eclipse/rdf4j/sail/shacl/ast/planNodes/FilterByPredicateObject.java +++ b/core/sail/shacl/src/main/java/org/eclipse/rdf4j/sail/shacl/ast/planNodes/FilterByPredicateObject.java @@ -47,7 +47,7 @@ public class FilterByPredicateObject implements PlanNode { private ValidationExecutionLogger validationExecutionLogger; private final Resource[] dataGraph; - private final Cache cache = CacheBuilder.newBuilder().maximumSize(1000).build(); + private final Cache cache; public FilterByPredicateObject(SailConnection connection, Resource[] dataGraph, IRI filterOnPredicate, Set filterOnObject, PlanNode parent, boolean returnMatching, FilterOn filterOn, @@ -61,6 +61,13 @@ public FilterByPredicateObject(SailConnection connection, Resource[] dataGraph, this.filterOnObject = filterOnObject; this.filterOn = filterOn; this.returnMatching = returnMatching; + + if (connection instanceof MemoryStoreConnection) { + cache = null; + } else { + cache = CacheBuilder.newBuilder().maximumSize(10000).build(); + } + // this.stackTrace = Thread.currentThread().getStackTrace(); } @@ -203,26 +210,37 @@ private boolean matches(Value subject, IRI filterOnPredicate, Resource[] filterO } if (subject.isResource()) { - try { - return cache.get(((Resource) subject), () -> { - for (Resource object : filterOnObject) { - if (connection.hasStatement(((Resource) subject), filterOnPredicate, object, includeInferred, - dataGraph)) { - return true; - } - } - return false; - }); - } catch (ExecutionException e) { - if (e.getCause() != null) { - if (e.getCause() instanceof RuntimeException) { - throw ((RuntimeException) e.getCause()); - } - throw new SailException(e.getCause()); + + if (cache == null) { + return matchesUnCached((Resource) subject, filterOnPredicate, filterOnObject); + } else { + return matchesCached((Resource) subject, filterOnPredicate, filterOnObject); + } + + } + return false; + } + + private Boolean matchesCached(Resource subject, IRI filterOnPredicate, Resource[] filterOnObject) { + try { + return cache.get(subject, () -> matchesUnCached(subject, filterOnPredicate, filterOnObject)); + } catch (ExecutionException e) { + if (e.getCause() != null) { + if (e.getCause() instanceof RuntimeException) { + throw ((RuntimeException) e.getCause()); } - throw new SailException(e); + throw new SailException(e.getCause()); } + throw new SailException(e); + } + } + private boolean matchesUnCached(Resource subject, IRI filterOnPredicate, Resource[] filterOnObject) { + for (Resource object : filterOnObject) { + if (connection.hasStatement(subject, filterOnPredicate, object, includeInferred, + dataGraph)) { + return true; + } } return false; } @@ -244,13 +262,13 @@ public void getPlanAsGraphvizDot(StringBuilder stringBuilder) { // added/removed connections are always newly minted per plan node, so we instead need to compare the underlying // sail - if (connection instanceof MemoryStoreConnection) { - stringBuilder.append(System.identityHashCode(((MemoryStoreConnection) connection).getSail()) + " -> " - + getId() + " [label=\"filter source\"]").append("\n"); - } else { - stringBuilder.append(System.identityHashCode(connection) + " -> " + getId() + " [label=\"filter source\"]") - .append("\n"); - } +// if (connection instanceof MemoryStoreConnection) { +// stringBuilder.append(System.identityHashCode(((MemoryStoreConnection) connection).getSail()) + " -> " +// + getId() + " [label=\"filter source\"]").append("\n"); +// } else { + stringBuilder.append(System.identityHashCode(connection) + " -> " + getId() + " [label=\"filter source\"]") + .append("\n"); +// } parent.getPlanAsGraphvizDot(stringBuilder); } @@ -323,8 +341,10 @@ public int hashCode() { @Override public String toString() { - return "ExternalPredicateObjectFilter{" + "filterOnObject=" + filterOnObject + ", filterOnPredicate=" - + filterOnPredicate + ", filterOn=" + filterOn + ", parent=" + parent + ", returnMatching=" + return "ExternalPredicateObjectFilter{" + "filterOnObject=" + PlanNode.prefix(filterOnObject) + + ", filterOnPredicate=" + + PlanNode.prefix(filterOnPredicate) + ", filterOn=" + filterOn + ", returnMatching=" + returnMatching + '}'; } + } diff --git a/core/sail/shacl/src/main/java/org/eclipse/rdf4j/sail/shacl/ast/planNodes/Formatter.java b/core/sail/shacl/src/main/java/org/eclipse/rdf4j/sail/shacl/ast/planNodes/Formatter.java index 9a40c914d73..6628f3d0988 100644 --- a/core/sail/shacl/src/main/java/org/eclipse/rdf4j/sail/shacl/ast/planNodes/Formatter.java +++ b/core/sail/shacl/src/main/java/org/eclipse/rdf4j/sail/shacl/ast/planNodes/Formatter.java @@ -10,11 +10,18 @@ *******************************************************************************/ package org.eclipse.rdf4j.sail.shacl.ast.planNodes; +import java.util.List; + import org.eclipse.rdf4j.model.IRI; +import org.eclipse.rdf4j.model.Namespace; import org.eclipse.rdf4j.model.Value; +import org.eclipse.rdf4j.model.impl.SimpleNamespace; +import org.eclipse.rdf4j.model.vocabulary.DCAT; +import org.eclipse.rdf4j.model.vocabulary.FOAF; import org.eclipse.rdf4j.model.vocabulary.RDF; import org.eclipse.rdf4j.model.vocabulary.RDFS; import org.eclipse.rdf4j.model.vocabulary.SHACL; +import org.eclipse.rdf4j.model.vocabulary.XSD; public class Formatter { @@ -28,20 +35,19 @@ public static String prefix(Value in) { String namespace = ((IRI) in).getNamespace(); - if (namespace.equals(RDF.NAMESPACE)) { - return in.toString().replace(RDF.NAMESPACE, RDF.PREFIX + ":"); - } - if (namespace.equals(RDFS.NAMESPACE)) { - return in.toString().replace(RDFS.NAMESPACE, RDFS.PREFIX + ":"); - } - if (namespace.equals(SHACL.NAMESPACE)) { - return in.toString().replace(SHACL.NAMESPACE, SHACL.PREFIX + ":"); - } - if (namespace.equals("http://example.com/ns#")) { - return in.toString().replace("http://example.com/ns#", "ex:"); - } - if (namespace.equals("http://www.w3.org/2001/XMLSchema#")) { - return in.toString().replace("http://www.w3.org/2001/XMLSchema#", "xsd:"); + List namespaces = List.of( + RDF.NS, + SHACL.NS, + FOAF.NS, + DCAT.NS, + new SimpleNamespace("http://example.com/ns#", "ex"), + XSD.NS + ); + + for (Namespace ns : namespaces) { + if (namespace.equals(ns.getName())) { + return ns.getPrefix() + ":" + ((IRI) in).getLocalName(); + } } } diff --git a/core/sail/shacl/src/main/java/org/eclipse/rdf4j/sail/shacl/ast/planNodes/NotValuesIn.java b/core/sail/shacl/src/main/java/org/eclipse/rdf4j/sail/shacl/ast/planNodes/NotValuesIn.java index 873455f431e..553ec6b88eb 100644 --- a/core/sail/shacl/src/main/java/org/eclipse/rdf4j/sail/shacl/ast/planNodes/NotValuesIn.java +++ b/core/sail/shacl/src/main/java/org/eclipse/rdf4j/sail/shacl/ast/planNodes/NotValuesIn.java @@ -117,6 +117,12 @@ public void getPlanAsGraphvizDot(StringBuilder stringBuilder) { .append(StringEscapeUtils.escapeJava(this.toString())) .append("\"];") .append("\n"); + + stringBuilder.append(parent.getId() + " -> " + getId()).append("\n"); + stringBuilder.append(notIn.getId() + " -> " + getId()).append("\n"); + parent.getPlanAsGraphvizDot(stringBuilder); + notIn.getPlanAsGraphvizDot(stringBuilder); + } @Override @@ -126,10 +132,7 @@ public String getId() { @Override public String toString() { - return "NotValuesIn{" + - "parent=" + parent + - ", notIn=" + notIn + - '}'; + return "NotValuesIn"; } @Override diff --git a/core/sail/shacl/src/main/java/org/eclipse/rdf4j/sail/shacl/ast/planNodes/PlanNode.java b/core/sail/shacl/src/main/java/org/eclipse/rdf4j/sail/shacl/ast/planNodes/PlanNode.java index 9af9725b150..99cd22d3fa1 100644 --- a/core/sail/shacl/src/main/java/org/eclipse/rdf4j/sail/shacl/ast/planNodes/PlanNode.java +++ b/core/sail/shacl/src/main/java/org/eclipse/rdf4j/sail/shacl/ast/planNodes/PlanNode.java @@ -11,13 +11,33 @@ package org.eclipse.rdf4j.sail.shacl.ast.planNodes; +import java.util.Arrays; +import java.util.Set; + import org.eclipse.rdf4j.common.iteration.CloseableIteration; +import org.eclipse.rdf4j.model.IRI; +import org.eclipse.rdf4j.model.Resource; +import org.eclipse.rdf4j.model.Value; +import org.eclipse.rdf4j.model.vocabulary.FOAF; +import org.eclipse.rdf4j.model.vocabulary.RDF; /** * @author HÃ¥vard Mikkelsen Ottestad */ public interface PlanNode { + static String prefix(Set filterOnObject) { + if (filterOnObject.size() == 1) { + return prefix(filterOnObject.iterator().next()); + } + + return Arrays.toString(filterOnObject.stream().map(PlanNode::prefix).toArray()); + } + + static String prefix(Value value) { + return Formatter.prefix(value); + } + CloseableIteration iterator(); int depth(); diff --git a/core/sail/shacl/src/main/java/org/eclipse/rdf4j/sail/shacl/ast/planNodes/PlanNodeHelper.java b/core/sail/shacl/src/main/java/org/eclipse/rdf4j/sail/shacl/ast/planNodes/PlanNodeHelper.java index 716ea053d6c..7b98a31981d 100644 --- a/core/sail/shacl/src/main/java/org/eclipse/rdf4j/sail/shacl/ast/planNodes/PlanNodeHelper.java +++ b/core/sail/shacl/src/main/java/org/eclipse/rdf4j/sail/shacl/ast/planNodes/PlanNodeHelper.java @@ -35,12 +35,12 @@ public static PlanNode handleSorting(PlanNode child, PlanNode parent, Connection public static PlanNode handleSorting(boolean requiresSorted, PlanNode parent, ConnectionsGroup connectionsGroup) { if (requiresSorted) { if (!parent.producesSorted()) { - if (connectionsGroup != null && (parent instanceof BufferedSplitter.BufferedSplitterPlaneNode || - parent instanceof UnorderedSelect)) { - parent = connectionsGroup.getCachedNodeFor(new Sort(parent, connectionsGroup)); - } else { - parent = new Sort(parent, connectionsGroup); - } +// if (connectionsGroup != null && (parent instanceof BufferedSplitter.BufferedSplitterPlaneNode || +// parent instanceof UnorderedSelect)) { +// parent = connectionsGroup.getCachedNodeFor(new Sort(parent, connectionsGroup)); +// } else { + parent = new Sort(parent, connectionsGroup); +// } } } return parent; diff --git a/core/sail/shacl/src/main/java/org/eclipse/rdf4j/sail/shacl/ast/planNodes/ReduceTargets.java b/core/sail/shacl/src/main/java/org/eclipse/rdf4j/sail/shacl/ast/planNodes/ReduceTargets.java index 1c494f7f9d8..4e1a52cb7d7 100644 --- a/core/sail/shacl/src/main/java/org/eclipse/rdf4j/sail/shacl/ast/planNodes/ReduceTargets.java +++ b/core/sail/shacl/src/main/java/org/eclipse/rdf4j/sail/shacl/ast/planNodes/ReduceTargets.java @@ -116,6 +116,11 @@ public void getPlanAsGraphvizDot(StringBuilder stringBuilder) { .append(StringEscapeUtils.escapeJava(this.toString())) .append("\"];") .append("\n"); + stringBuilder.append(parentToReduce.getId() + " -> " + getId()).append("\n"); + stringBuilder.append(reductionSource.getId() + " -> " + getId()).append("\n"); + parentToReduce.getPlanAsGraphvizDot(stringBuilder); + reductionSource.getPlanAsGraphvizDot(stringBuilder); + } @Override @@ -142,10 +147,7 @@ public boolean requiresSorted() { @Override public String toString() { - return "ReduceTargets{" + - "parentToReduce=" + parentToReduce + - ", reductionSource=" + reductionSource + - '}'; + return "ReduceTargets"; } @Override diff --git a/core/sail/shacl/src/main/java/org/eclipse/rdf4j/sail/shacl/ast/planNodes/Select.java b/core/sail/shacl/src/main/java/org/eclipse/rdf4j/sail/shacl/ast/planNodes/Select.java index e51c28a7070..f8fb2a63bc5 100644 --- a/core/sail/shacl/src/main/java/org/eclipse/rdf4j/sail/shacl/ast/planNodes/Select.java +++ b/core/sail/shacl/src/main/java/org/eclipse/rdf4j/sail/shacl/ast/planNodes/Select.java @@ -160,13 +160,13 @@ public void getPlanAsGraphvizDot(StringBuilder stringBuilder) { // added/removed connections are always newly minted per plan node, so we instead need to compare the underlying // sail - if (connection instanceof MemoryStoreConnection) { - stringBuilder - .append(System.identityHashCode(((MemoryStoreConnection) connection).getSail()) + " -> " + getId()) - .append("\n"); - } else { - stringBuilder.append(System.identityHashCode(connection) + " -> " + getId()).append("\n"); - } +// if (connection instanceof MemoryStoreConnection) { +// stringBuilder +// .append(System.identityHashCode(((MemoryStoreConnection) connection).getSail()) + " -> " + getId()) +// .append("\n"); +// } else { + stringBuilder.append(System.identityHashCode(connection) + " -> " + getId()).append("\n"); +// } } diff --git a/core/sail/shacl/src/main/java/org/eclipse/rdf4j/sail/shacl/ast/planNodes/SingleCloseablePlanNode.java b/core/sail/shacl/src/main/java/org/eclipse/rdf4j/sail/shacl/ast/planNodes/SingleCloseablePlanNode.java index c05dd3cfbd0..3d146736ae0 100644 --- a/core/sail/shacl/src/main/java/org/eclipse/rdf4j/sail/shacl/ast/planNodes/SingleCloseablePlanNode.java +++ b/core/sail/shacl/src/main/java/org/eclipse/rdf4j/sail/shacl/ast/planNodes/SingleCloseablePlanNode.java @@ -53,7 +53,7 @@ public void getPlanAsGraphvizDot(StringBuilder stringBuilder) { @Override public String toString() { - return "SingleCloseablePlanNode{" + "parent=" + parent + '}'; + return "SingleCloseablePlanNode"; } @Override diff --git a/core/sail/shacl/src/main/java/org/eclipse/rdf4j/sail/shacl/ast/planNodes/Sort.java b/core/sail/shacl/src/main/java/org/eclipse/rdf4j/sail/shacl/ast/planNodes/Sort.java index 5e63ad1a7c9..202610c1e9c 100644 --- a/core/sail/shacl/src/main/java/org/eclipse/rdf4j/sail/shacl/ast/planNodes/Sort.java +++ b/core/sail/shacl/src/main/java/org/eclipse/rdf4j/sail/shacl/ast/planNodes/Sort.java @@ -12,6 +12,7 @@ package org.eclipse.rdf4j.sail.shacl.ast.planNodes; import java.util.ArrayList; +import java.util.Arrays; import java.util.Collections; import java.util.Iterator; import java.util.List; @@ -70,13 +71,13 @@ protected void init() { } if (!alreadySorted && sortedTuples.size() > 1) { -// if (sortedTuples.size() > 8192) { // MIN_ARRAY_SORT_GRAN in Arrays.parallelSort(...) -// ValidationTuple[] objects = sortedTuples.toArray(new ValidationTuple[0]); -// Arrays.parallelSort(objects, ValidationTuple::compareActiveTarget); -// sortedTuples = Arrays.asList(objects); -// } else { - sortedTuples.sort(ValidationTuple::compareActiveTarget); -// } + if (sortedTuples.size() > 8192) { // MIN_ARRAY_SORT_GRAN in Arrays.parallelSort(...) + ValidationTuple[] objects = sortedTuples.toArray(new ValidationTuple[0]); + Arrays.parallelSort(objects, ValidationTuple::compareActiveTarget); + sortedTuples = Arrays.asList(objects); + } else { + sortedTuples.sort(ValidationTuple::compareActiveTarget); + } } sortedTuplesIterator = sortedTuples.iterator(); @@ -160,6 +161,6 @@ public boolean requiresSorted() { @Override public String toString() { - return "Sort{" + "parent=" + parent + '}'; + return "Sort"; } } diff --git a/core/sail/shacl/src/main/java/org/eclipse/rdf4j/sail/shacl/ast/planNodes/TrimToTarget.java b/core/sail/shacl/src/main/java/org/eclipse/rdf4j/sail/shacl/ast/planNodes/TrimToTarget.java index 6ff501f063b..6bb77f1d193 100644 --- a/core/sail/shacl/src/main/java/org/eclipse/rdf4j/sail/shacl/ast/planNodes/TrimToTarget.java +++ b/core/sail/shacl/src/main/java/org/eclipse/rdf4j/sail/shacl/ast/planNodes/TrimToTarget.java @@ -124,8 +124,7 @@ public int hashCode() { @Override public String toString() { return "TrimToTarget{" + - "parent=" + parent + - ", keepPath=" + keepPath + + "keepPath=" + keepPath + '}'; } } diff --git a/core/sail/shacl/src/main/java/org/eclipse/rdf4j/sail/shacl/ast/planNodes/Unique.java b/core/sail/shacl/src/main/java/org/eclipse/rdf4j/sail/shacl/ast/planNodes/Unique.java index e5a0c4f17a5..1a0eb2d73b1 100644 --- a/core/sail/shacl/src/main/java/org/eclipse/rdf4j/sail/shacl/ast/planNodes/Unique.java +++ b/core/sail/shacl/src/main/java/org/eclipse/rdf4j/sail/shacl/ast/planNodes/Unique.java @@ -259,7 +259,6 @@ public int hashCode() { public String toString() { return "Unique{" + "compress=" + compress + - ", parent=" + parent + '}'; } diff --git a/core/sail/shacl/src/main/java/org/eclipse/rdf4j/sail/shacl/ast/planNodes/UnorderedSelect.java b/core/sail/shacl/src/main/java/org/eclipse/rdf4j/sail/shacl/ast/planNodes/UnorderedSelect.java index 78bc577697f..01b932c026e 100644 --- a/core/sail/shacl/src/main/java/org/eclipse/rdf4j/sail/shacl/ast/planNodes/UnorderedSelect.java +++ b/core/sail/shacl/src/main/java/org/eclipse/rdf4j/sail/shacl/ast/planNodes/UnorderedSelect.java @@ -124,13 +124,13 @@ public void getPlanAsGraphvizDot(StringBuilder stringBuilder) { // added/removed connections are always newly minted per plan node, so we instead need to compare the underlying // sail - if (connection instanceof MemoryStoreConnection) { - stringBuilder - .append(System.identityHashCode(((MemoryStoreConnection) connection).getSail()) + " -> " + getId()) - .append("\n"); - } else { - stringBuilder.append(System.identityHashCode(connection) + " -> " + getId()).append("\n"); - } +// if (connection instanceof MemoryStoreConnection) { +// stringBuilder +// .append(System.identityHashCode(((MemoryStoreConnection) connection).getSail()) + " -> " + getId()) +// .append("\n"); +// } else { + stringBuilder.append(System.identityHashCode(connection) + " -> " + getId()).append("\n"); +// } } diff --git a/core/sail/shacl/src/main/java/org/eclipse/rdf4j/sail/shacl/ast/planNodes/ValidationReportNode.java b/core/sail/shacl/src/main/java/org/eclipse/rdf4j/sail/shacl/ast/planNodes/ValidationReportNode.java index 80dd1c42d59..21d4edf2a09 100644 --- a/core/sail/shacl/src/main/java/org/eclipse/rdf4j/sail/shacl/ast/planNodes/ValidationReportNode.java +++ b/core/sail/shacl/src/main/java/org/eclipse/rdf4j/sail/shacl/ast/planNodes/ValidationReportNode.java @@ -81,6 +81,9 @@ public void getPlanAsGraphvizDot(StringBuilder stringBuilder) { .append(StringEscapeUtils.escapeJava(this.toString())) .append("\"];") .append("\n"); + stringBuilder.append(parent.getId() + " -> " + getId()).append("\n"); + + parent.getPlanAsGraphvizDot(stringBuilder); } @Override diff --git a/core/sail/shacl/src/main/java/org/eclipse/rdf4j/sail/shacl/ast/targets/TargetClass.java b/core/sail/shacl/src/main/java/org/eclipse/rdf4j/sail/shacl/ast/targets/TargetClass.java index 994bee85833..d022824d379 100644 --- a/core/sail/shacl/src/main/java/org/eclipse/rdf4j/sail/shacl/ast/targets/TargetClass.java +++ b/core/sail/shacl/src/main/java/org/eclipse/rdf4j/sail/shacl/ast/targets/TargetClass.java @@ -66,7 +66,7 @@ private PlanNode getAddedRemovedInner(SailConnection connection, Resource[] data Resource clazz = targetClass.stream().findAny().get(); planNode = new UnorderedSelect(connection, null, RDF.TYPE, clazz, dataGraph, UnorderedSelect.Mapper.SubjectScopedMapper.getFunction(scope), null); - return planNode; +// return planNode; } else { planNode = new Select(connection, SparqlFragment.bgp(Set.of(), @@ -112,7 +112,7 @@ public PlanNode getTargetFilter(ConnectionsGroup connectionsGroup, Resource[] da PlanNode parent) { if (connectionsGroup.hasAddedStatements()) { - BufferedSplitter bufferedSplitter = new BufferedSplitter(parent); + BufferedSplitter bufferedSplitter = BufferedSplitter.getInstance(parent); FilterByPredicateObject typeFoundInAdded = new FilterByPredicateObject( connectionsGroup.getAddedStatements(), dataGraph, RDF.TYPE, targetClass, diff --git a/core/sail/shacl/src/main/java/org/eclipse/rdf4j/sail/shacl/wrapper/data/ConnectionsGroup.java b/core/sail/shacl/src/main/java/org/eclipse/rdf4j/sail/shacl/wrapper/data/ConnectionsGroup.java index 55ee9b26455..5e8ecba0743 100644 --- a/core/sail/shacl/src/main/java/org/eclipse/rdf4j/sail/shacl/wrapper/data/ConnectionsGroup.java +++ b/core/sail/shacl/src/main/java/org/eclipse/rdf4j/sail/shacl/wrapper/data/ConnectionsGroup.java @@ -16,6 +16,7 @@ import org.eclipse.rdf4j.common.annotation.InternalUseOnly; import org.eclipse.rdf4j.common.transaction.IsolationLevels; +import org.eclipse.rdf4j.model.Resource; import org.eclipse.rdf4j.sail.Sail; import org.eclipse.rdf4j.sail.SailConnection; import org.eclipse.rdf4j.sail.shacl.ShaclSailConnection; @@ -27,6 +28,8 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import com.google.common.cache.Cache; + /** * @apiNote since 3.0. This feature is for internal use only: its existence, signature or behavior may change without * warning from one release to the next. @@ -130,7 +133,7 @@ public PlanNode getCachedNodeFor(PlanNode planNode) { BufferedSplitter bufferedSplitter = nodeCache.computeIfAbsent(planNode, parent -> { matchedCache[0] = false; - return new BufferedSplitter(parent, true); + return BufferedSplitter.getInstance(parent); }); logger.debug("Found in cache: {} {} - {} : {}", matchedCache[0] ? " TRUE" : "FALSE", @@ -138,7 +141,7 @@ public PlanNode getCachedNodeFor(PlanNode planNode) { return bufferedSplitter.getPlanNode(); } else { - return nodeCache.computeIfAbsent(planNode, BufferedSplitter::new).getPlanNode(); + return nodeCache.computeIfAbsent(planNode, BufferedSplitter::getInstance).getPlanNode(); } } diff --git a/core/sail/shacl/src/test/java/org/eclipse/rdf4j/sail/shacl/benchmark/ClassBenchmarkEmpty.java b/core/sail/shacl/src/test/java/org/eclipse/rdf4j/sail/shacl/benchmark/ClassBenchmarkEmpty.java index 5271639b657..e02b47859ce 100644 --- a/core/sail/shacl/src/test/java/org/eclipse/rdf4j/sail/shacl/benchmark/ClassBenchmarkEmpty.java +++ b/core/sail/shacl/src/test/java/org/eclipse/rdf4j/sail/shacl/benchmark/ClassBenchmarkEmpty.java @@ -72,13 +72,23 @@ public void setUp() throws InterruptedException { Thread.sleep(100); } + public static void main(String[] args) throws Exception { + ClassBenchmarkEmpty classBenchmarkEmpty = new ClassBenchmarkEmpty(); + classBenchmarkEmpty.setUp(); + classBenchmarkEmpty.shacl(); + + } + @Benchmark public void shacl() throws Exception { SailRepository repository = new SailRepository(Utils.getInitializedShaclSail("shaclClassBenchmark.trig")); +// ((ShaclSail) repository.getSail()).setLogValidationPlans(true); + try (SailRepositoryConnection connection = repository.getConnection()) { for (List statements : allStatements) { +// System.out.println("."); connection.begin(); connection.add(statements); connection.commit(); diff --git a/core/sail/shacl/src/test/java/org/eclipse/rdf4j/sail/shacl/benchmark/ComplexLargeBenchmark.java b/core/sail/shacl/src/test/java/org/eclipse/rdf4j/sail/shacl/benchmark/ComplexLargeBenchmark.java index 1cf6d74fe2d..a40d5bc191b 100644 --- a/core/sail/shacl/src/test/java/org/eclipse/rdf4j/sail/shacl/benchmark/ComplexLargeBenchmark.java +++ b/core/sail/shacl/src/test/java/org/eclipse/rdf4j/sail/shacl/benchmark/ComplexLargeBenchmark.java @@ -117,7 +117,7 @@ public void teardown() { public static void main(String[] args) throws InterruptedException { ComplexLargeBenchmark complexLargeBenchmark = new ComplexLargeBenchmark(); complexLargeBenchmark.setUp(); - for (int i = 0; i < 20; i++) { + for (int i = 0; i < 100; i++) { System.out.println(i); complexLargeBenchmark.noPreloadingNonEmptyParallelRemoved(); } @@ -406,7 +406,6 @@ public void noPreloadingNonEmptyParallelRemoved() { Utils.getInitializedShaclSail("complexBenchmark/shacl.trig")); ((ShaclSail) repository.getSail()).setTransactionalValidationLimit(1000000); -// ((ShaclSail) repository.getSail()).setPerformanceLogging(true); try (SailRepositoryConnection connection = repository.getConnection()) { connection.begin(IsolationLevels.NONE, ShaclSail.TransactionSettings.ValidationApproach.Disabled); @@ -417,7 +416,7 @@ public void noPreloadingNonEmptyParallelRemoved() { ((ShaclSail) repository.getSail()).setParallelValidation(true); ((ShaclSail) repository.getSail()).setCacheSelectNodes(true); - ((ShaclSail) repository.getSail()).setPerformanceLogging(false); +// ((ShaclSail) repository.getSail()).setPerformanceLogging(true); try (SailRepositoryConnection connection = repository.getConnection()) { connection.begin(IsolationLevels.NONE);