private static IntermediateQueryBuilder convertLeftJoinAtom(IntermediateQueryBuilder queryBuilder,
QueryNode parentNodeOfTheLJ,
List<Function> subAtomsOfTheLJ,
Optional<ArgumentPosition> optionalPosition,
Collection<Predicate> tablePredicates)
throws DatalogProgram2QueryConverterImpl.InvalidDatalogProgramException, IntermediateQueryBuilderException {
P2<List<Function>, List<Function>> decomposition = PullOutEqualityNormalizerImpl.splitLeftJoinSubAtoms(subAtomsOfTheLJ);
final List<Function> leftAtoms = decomposition._1();
final List<Function> rightAtoms = decomposition._2();
AtomClassification rightSubAtomClassification = new AtomClassification(rightAtoms);
Optional<ImmutableExpression> optionalFilterCondition = createFilterExpression(
rightSubAtomClassification.booleanAtoms);
LeftJoinNode ljNode = queryBuilder.getFactory().createLeftJoinNode(optionalFilterCondition);
queryBuilder.addChild(parentNodeOfTheLJ, ljNode, optionalPosition);
queryBuilder = convertJoinAtom(queryBuilder, ljNode, leftAtoms, LEFT_POSITION, tablePredicates);
return convertDataOrCompositeAtoms(rightSubAtomClassification.dataAndCompositeAtoms, queryBuilder, ljNode,
RIGHT_POSITION, tablePredicates);
}