@Override public Expression getNotIfPossible(Session session) { // (NOT (A OR B)): (NOT(A) AND NOT(B)) // (NOT (A AND B)): (NOT(A) OR NOT(B)) Expression l = left.getNotIfPossible(session); if (l == null) { l = new ConditionNot(left); } Expression r = right.getNotIfPossible(session); if (r == null) { r = new ConditionNot(right); } int reversed = andOrType == AND ? OR : AND; return new ConditionAndOr(reversed, l, r); }
@Override public Expression optimize(Session session) { Expression e2 = condition.getNotIfPossible(session); if (e2 != null) { return e2.optimize(session); } Expression expr = condition.optimize(session); if (expr.isConstant()) { Value v = expr.getValue(session); if (v == ValueNull.INSTANCE) { return ValueExpression.getNull(); } return ValueExpression.get(v.convertTo(Value.BOOLEAN).negate()); } condition = expr; return this; }