switch (child.operator) { case NOT: return pushDownNot(child.children.get(0)); case CONSTANT: return new ExpressionTree(child.constant.not()); root = new ExpressionTree(ExpressionTree.Operator.OR); for(ExpressionTree kid: child.children) { root.children.add(pushDownNot(new ExpressionTree(ExpressionTree.Operator.NOT, kid))); root = new ExpressionTree(ExpressionTree.Operator.AND); for(ExpressionTree kid: child.children) { root.children.add(pushDownNot(new ExpressionTree (ExpressionTree.Operator.NOT, kid))); root.children.set(i, pushDownNot(root.children.get(i)));
/** * Builds the expression and optimized leaf list from a non-normalized * expression. Sets the leaves field with the unique leaves. * @param expr non-normalized expression * @param leaves non-unique leaves * @return the normalized expression */ ExpressionTree expression(ExpressionTree expr, List<PredicateLeaf> leaves) { expr = pushDownNot(expr); expr = foldMaybe(expr); expr = flatten(expr); expr = convertToCNF(expr); expr = flatten(expr); expr = buildLeafList(expr, leaves, new HashMap<PredicateLeaf, ExpressionTree>()); return expr; }