public static IntermediateQuery convertDatalogRule(DBMetadata dbMetadata, CQIE datalogRule,
Collection<Predicate> tablePredicates,
Optional<ImmutableQueryModifiers> optionalModifiers,
IntermediateQueryFactory iqFactory,
ExecutorRegistry executorRegistry)
throws DatalogProgram2QueryConverterImpl.InvalidDatalogProgramException {
TargetAtom targetAtom = DatalogConversionTools.convertFromDatalogDataAtom(datalogRule.getHead());
DistinctVariableOnlyDataAtom projectionAtom = targetAtom.getProjectionAtom();
ConstructionNode rootNode = iqFactory.createConstructionNode(projectionAtom.getVariables(),
targetAtom.getSubstitution(), optionalModifiers);
List<Function> bodyAtoms = List.iterableList(datalogRule.getBody());
if (bodyAtoms.isEmpty()) {
return createFact(dbMetadata, rootNode, projectionAtom, executorRegistry, iqFactory);
}
else {
AtomClassification atomClassification = new AtomClassification(bodyAtoms);
return createDefinition(dbMetadata, rootNode, projectionAtom, tablePredicates,
atomClassification.dataAndCompositeAtoms, atomClassification.booleanAtoms,
atomClassification.optionalGroupAtom, iqFactory, executorRegistry);
}
}