simplifyOuterJoinRecursively(joinTree, exprs);
}
private static void simplifyOuterJoinRecursively(BranchNode joinNode, List<AbstractExpression> exprs) {
assert (joinNode != null);
JoinNode leftNode = joinNode.getLeftNode();
JoinNode rightNode = joinNode.getRightNode();
if (joinNode.getJoinType() == JoinType.LEFT) {
for (AbstractExpression expr : exprs) {
// Get all the tables underneath this node and
// see if the expression is NULL-rejecting for any of them
Collection<String> tableAliases = rightNode.generateTableJoinOrder();
boolean rejectNull = false;
for (String tableAlias : tableAliases) {
if (ExpressionUtil.isNullRejectingExpression(expr, tableAlias)) {
// We are done at this level
joinNode.setJoinType(JoinType.INNER);
rejectNull = true;
break;
}
}
if (rejectNull) {
break;
}
}
} else {
assert(joinNode.getJoinType() == JoinType.INNER);
}
// Now add this node expression to the list and descend
// In case of outer join, the inner node adds its WHERE and JOIN expressions, while
// the outer node adds its WHERE ones only - the outer node does not introduce NULLs
List<AbstractExpression> newExprs = new ArrayList<AbstractExpression>(exprs);
if (leftNode.getJoinExpression() != null) {
newExprs.add(leftNode.getJoinExpression());
}
if (rightNode.getJoinExpression() != null) {
newExprs.add(rightNode.getJoinExpression());
}
if (leftNode.getWhereExpression() != null) {
exprs.add(leftNode.getWhereExpression());
}
if (rightNode.getWhereExpression() != null) {
exprs.add(rightNode.getWhereExpression());
}
if (joinNode.getJoinType() == JoinType.INNER) {
exprs.addAll(newExprs);
if (leftNode instanceof BranchNode) {