use of org.drools.impact.analysis.model.Rule in project drools by kiegroup.
the class ModelToGraphConverter method processInsert.
private void processInsert(GraphAnalysis graphAnalysis, String pkgName, String ruleName, InsertAction action) {
Node source = graphAnalysis.getNode(fqdn(pkgName, ruleName));
Class<?> insertedClass = action.getActionClass();
if (!graphAnalysis.isRegisteredClass(insertedClass)) {
// Not likely happen but not invalid
logger.warn("Not found {} in reactiveMap", insertedClass);
return;
}
// property based link
List<InsertedProperty> insertedProperties = action.getInsertedProperties();
for (InsertedProperty insertedProperty : insertedProperties) {
String property = insertedProperty.getProperty();
for (AnalyzedRule reactedRule : graphAnalysis.getRulesReactiveTo(insertedClass, property)) {
List<Pattern> patterns = reactedRule.getRule().getLhs().getPatterns().stream().filter(pattern -> pattern.getPatternClass() == insertedClass).collect(Collectors.toList());
for (Pattern pattern : patterns) {
List<Constraint> constraints = pattern.getConstraints().stream().filter(constraint -> constraint.getProperty() != null && constraint.getProperty().equals(property)).collect(Collectors.toList());
ReactivityType combinedLinkType = ReactivityType.UNKNOWN;
if (constraints.isEmpty()) {
// This rule is reactive to the property but cannot find its constraint (e.g. [age > $a] non-literal constraint). It means UNKNOWN impact
combinedLinkType = ReactivityType.UNKNOWN;
} else {
// If constraints contain at least one POSITIVE, we consider it's POSITIVE.
for (Constraint constraint : constraints) {
ReactivityType linkType = linkType(constraint, insertedProperty);
if (linkType == ReactivityType.POSITIVE) {
combinedLinkType = ReactivityType.POSITIVE;
break;
} else if (linkType == ReactivityType.NEGATIVE) {
// NEGATIVE is stronger than UNKNOWN (but may be configurable)
combinedLinkType = ReactivityType.NEGATIVE;
} else if (combinedLinkType == ReactivityType.NEGATIVE && linkType == ReactivityType.UNKNOWN) {
// Don't overwrite with UNKNOWN
} else {
// UNKNOWN
combinedLinkType = linkType;
}
}
}
if (combinedLinkType == ReactivityType.NEGATIVE) {
// TODO: handle "exists" case
continue;
}
if (combinedLinkType == ReactivityType.POSITIVE && !pattern.isPositive()) {
// POSITIVE insert in not() means NEGATIVE
combinedLinkType = combinedLinkType.negate();
}
Node target = graphAnalysis.getNode(fqdn(pkgName, reactedRule.getRule().getName()));
linkNodesIfExpected(source, target, combinedLinkType);
}
}
}
// class based link
for (AnalyzedRule reactedRule : graphAnalysis.getRulesReactiveToWithoutProperty(insertedClass)) {
Node target = graphAnalysis.getNode(fqdn(pkgName, reactedRule.getRule().getName()));
linkNodesIfExpected(source, target, reactedRule.getReactivityType());
}
}
use of org.drools.impact.analysis.model.Rule in project drools by kiegroup.
the class GraphvizOutputTest method testSimpleGraph.
@Test
public void testSimpleGraph() {
Node node1 = new Node(new Rule("org.example", "rule1", "dummy"));
Node node2 = new Node(new Rule("org.example", "rule2", "dummy"));
Node node3 = new Node(new Rule("org.example", "rule3", "dummy"));
Node node4 = new Node(new Rule("org.example", "rule4", "dummy"));
Node node5 = new Node(new Rule("org.example", "rule5", "dummy"));
Node.linkNodes(node1, node2, ReactivityType.POSITIVE);
Node.linkNodes(node1, node3, ReactivityType.NEGATIVE);
Node.linkNodes(node2, node4, ReactivityType.UNKNOWN);
Node.linkNodes(node3, node5, ReactivityType.POSITIVE);
Map<String, Node> nodeMap = new HashMap<>();
nodeMap.put(node1.getFqdn(), node1);
nodeMap.put(node2.getFqdn(), node2);
nodeMap.put(node3.getFqdn(), node3);
nodeMap.put(node4.getFqdn(), node4);
nodeMap.put(node5.getFqdn(), node5);
Graph graph = new Graph(nodeMap);
GraphImageGenerator generator = new GraphImageGenerator("simple");
generator.generateDot(graph);
generator.generateSvg(graph);
generator.generatePng(graph);
}
Aggregations