Skip to content

Commit

Permalink
wip
Browse files Browse the repository at this point in the history
  • Loading branch information
hmottestad committed Aug 29, 2024
1 parent 8a0f374 commit 10eb88e
Show file tree
Hide file tree
Showing 29 changed files with 269 additions and 134 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -524,8 +524,9 @@ private ValidationReport performValidation(List<ContextWithShape> shapes, boolea
sail.isPerformanceLogging())),
sail.isGlobalLogValidationExecution(), sail.isLogValidationViolations(),
sail.getEffectiveValidationResultsLimitPerConstraint(), sail.isPerformanceLogging(),
logger
))
sail.isLogValidationPlans(),
logger,
connectionsGroup))

.filter(ShapeValidationContainer::hasPlanNode)
.map(validationContainer -> validationContainer::performValidation);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -115,8 +115,8 @@ private static ValidationReport performValidation(List<ContextWithShape> 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)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,18 +11,22 @@

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;
import org.eclipse.rdf4j.sail.shacl.ast.planNodes.SingleCloseablePlanNode;
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 {
Expand All @@ -36,14 +40,64 @@ class ShapeValidationContainer {

public ShapeValidationContainer(Shape shape, Supplier<PlanNode> 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;
this.performanceLogging = performanceLogging;
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())) {
Expand Down Expand Up @@ -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",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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));

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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();
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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");
// }

}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -41,18 +41,34 @@ public class BufferedSplitter implements PlanNodeProvider {
private final boolean cached;
private volatile List<ValidationTuple> 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<>();
Expand Down Expand Up @@ -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");
Expand All @@ -173,7 +189,7 @@ public String getId() {

@Override
public String toString() {
return "BufferedSplitter";
return "BufferedSplitter" + (cached ? " (cached)" : "");
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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) {

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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");

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}
Expand Down
Loading

0 comments on commit 10eb88e

Please sign in to comment.