private IQ canonizeWithJoin(IQ assertion, IntensionalQueryMerger intensionalQueryMerger, Position pos) {
Optional<Variable> replacedVar = getReplacedVar(assertion, pos);
if (replacedVar.isPresent()) {
Variable newVariable = createFreshVariable(assertion, intensionalQueryMerger, replacedVar.get());
IntensionalDataNode idn = getIDN(replacedVar.get(), newVariable);
RDFAtomPredicate pred = getRDFAtomPredicate(assertion.getProjectionAtom());
DistinctVariableOnlyDataAtom projAtom = atomFactory.getDistinctVariableOnlyDataAtom(
pred,
replaceProjVars(
pred,
assertion.getProjectionAtom().getArguments(),
pos,
newVariable));
IQ intensionalCanonizedQuery = iqFactory.createIQ(
projAtom,
getIntensionalCanonizedTree(assertion, projAtom, idn));
IQ canonizedQuery = intensionalQueryMerger.optimize(intensionalCanonizedQuery)
.liftBinding();
return canonizedQuery.getTree().isDeclaredAsEmpty()
? assertion
: canonizedQuery;
}
return assertion;
}