@Override public void meet(SqlOr node) throws RuntimeException { super.meet(node); SqlExpr left = node.getLeftArg(); SqlExpr right = node.getRightArg(); if (left instanceof TrueValue || right instanceof TrueValue) { replace(node, new TrueValue()); } else if (left instanceof FalseValue && right instanceof FalseValue) { replace(node, new FalseValue()); } else if (left instanceof FalseValue) { replace(node, right.clone()); } else if (right instanceof FalseValue) { replace(node, left.clone()); } else if (right instanceof SqlNull && andAllTheWay(node)) { replace(node, left.clone()); } else if (left instanceof SqlNull && andAllTheWay(node)) { replace(node, right.clone()); } else if (right instanceof SqlNull && left instanceof SqlNull) { replace(node, new SqlNull()); } else if (left instanceof SqlNull && right instanceof SqlOr) { SqlOr r = (SqlOr) right; SqlExpr rleft = r.getLeftArg(); SqlExpr rright = r.getRightArg(); if (rleft instanceof SqlNull || rright instanceof SqlNull) { replace(node, right.clone()); } } else if (right instanceof SqlNull && left instanceof SqlOr) { SqlOr l = (SqlOr) left; SqlExpr lleft = l.getLeftArg(); SqlExpr lright = l.getRightArg(); if (lleft instanceof SqlNull || lright instanceof SqlNull) { replace(node, left.clone()); } } else if (right instanceof SqlNull && left instanceof SqlAnd) { // value IS NOT NULL AND value = ? OR NULL // -> value = ? SqlAnd l = (SqlAnd) left; SqlExpr lleft = l.getLeftArg(); SqlExpr lright = l.getRightArg(); SqlExpr isNotNull = arg(arg(lleft, SqlNot.class), SqlIsNull.class); SqlExpr isNotEq = other(lright, isNotNull, SqlEq.class); if (isNotEq instanceof SqlConstant) { replace(node, lright); } } }
@Override public void meet(SqlAnd node) throws RuntimeException { super.meet(node); SqlExpr left = node.getLeftArg(); SqlExpr right = node.getRightArg(); if (left instanceof FalseValue || right instanceof FalseValue) { replace(node, new FalseValue()); } else if (left instanceof TrueValue && right instanceof TrueValue) { replace(node, new TrueValue()); } else if (left instanceof TrueValue) { replace(node, right.clone()); } else if (right instanceof TrueValue) { replace(node, left.clone()); } else if (right instanceof SqlNull || left instanceof SqlNull) { replace(node, new SqlNull()); } else if (right instanceof SqlNot && ((SqlNot) right).getArg().equals(left)) { replace(node, new FalseValue()); } else if (left instanceof SqlNot && ((SqlNot) left).getArg().equals(right)) { replace(node, new FalseValue()); } }