use of com.vaticle.typedb.core.common.exception.ErrorMessage.RuleWrite.CONTRADICTORY_RULE_CYCLE in project grakn by graknlabs.
the class LogicManager method validateCyclesThroughNegations.
private void validateCyclesThroughNegations(ConceptManager conceptMgr, LogicManager logicMgr) {
Set<Rule> negationRulesTriggeringRules = logicMgr.rulesWithNegations().filter(rule -> !rule.condition().negatedConcludablesTriggeringRules(conceptMgr, logicMgr).isEmpty()).toSet();
for (Rule negationRule : negationRulesTriggeringRules) {
Map<Rule, RuleDependency> visitedDependentRules = new HashMap<>();
visitedDependentRules.put(negationRule, RuleDependency.of(negationRule, null));
List<RuleDependency> frontier = new LinkedList<>(ruleDependencies(negationRule, conceptMgr, logicMgr));
RuleDependency dependency;
while (!frontier.isEmpty()) {
dependency = frontier.remove(0);
if (negationRule.equals(dependency.recursiveRule)) {
List<Rule> cycle = findCycle(dependency, visitedDependentRules);
String readableCycle = cycle.stream().map(Rule::getLabel).collect(Collectors.joining(" -> \n", "\n", "\n"));
throw TypeDBException.of(CONTRADICTORY_RULE_CYCLE, readableCycle);
} else {
visitedDependentRules.put(dependency.recursiveRule, dependency);
Set<RuleDependency> recursive = ruleDependencies(dependency.recursiveRule, conceptMgr, logicMgr);
recursive.removeAll(visitedDependentRules.values());
frontier.addAll(recursive);
}
}
}
}
Aggregations