public Object visit(ASTAndNode node, Object data) { StringBuilder sb = (StringBuilder) data; int numChildren = node.jjtGetNumChildren(); JexlNode parent = node.jjtGetParent(); boolean wrapIt = false; if (!(parent instanceof ASTReferenceExpression || parent instanceof ASTJexlScript || parent instanceof ASTAndNode || numChildren == 0)) { wrapIt = true; sb.append("("); } int lastsize = sb.length(); for (int i = 0; i < numChildren; i++) { if (sb.length() != lastsize) { sb.append(" && "); } lastsize = sb.length(); node.jjtGetChild(i).jjtAccept(this, sb); } if (wrapIt) sb.append(")"); return data; }
newAnd.jjtSetParent(node.jjtGetParent()); Iterator<Tuple2<JexlNode,Cost>> tupleIter = costEstimates.iterator();
@Override public Object visit(ASTAndNode node, Object data) { List<JexlNode> leaves = new ArrayList<>(); Map<LiteralRange<?>,List<JexlNode>> ranges = JexlASTHelper.getBoundedRangesIndexAgnostic(node, leaves, false); JexlNode andNode = JexlNodes.newInstanceOfType(node); andNode.image = node.image; andNode.jjtSetParent(node.jjtGetParent()); // We have a bounded range completely inside of an AND/OR if (!ranges.isEmpty()) { andNode = coalesceBoundedRanges(ranges, leaves, node, andNode, data); } else { // We have no bounded range to replace, just proceed as normal JexlNodes.ensureCapacity(andNode, node.jjtGetNumChildren()); for (int i = 0; i < node.jjtGetNumChildren(); i++) { JexlNode newChild = (JexlNode) node.jjtGetChild(i).jjtAccept(this, data); andNode.jjtAddChild(newChild, i); newChild.jjtSetParent(andNode); } } return andNode; }
@Override public Object visit(ASTAndNode node, Object data) { List<JexlNode> leaves = new ArrayList<>(); Map<LiteralRange<?>,List<JexlNode>> ranges = JexlASTHelper.getBoundedRanges(node, this.dataTypeFilter, this.helper, leaves, false); JexlNode andNode = JexlNodes.newInstanceOfType(node); andNode.image = node.image; andNode.jjtSetParent(node.jjtGetParent()); // We have a bounded range completely inside of an AND/OR if (!ranges.isEmpty()) { andNode = delayIndexBoundedRange(ranges, leaves, node, andNode, data); } else { // We have no bounded range to replace, just proceed as normal JexlNodes.ensureCapacity(andNode, node.jjtGetNumChildren()); for (int i = 0; i < node.jjtGetNumChildren(); i++) { JexlNode newChild = (JexlNode) node.jjtGetChild(i).jjtAccept(this, data); andNode.jjtAddChild(newChild, i); newChild.jjtSetParent(andNode); } } return andNode; }
@Override public Object visit(ASTAndNode node, Object data) { List<JexlNode> leaves = new ArrayList<>(); Map<LiteralRange<?>,List<JexlNode>> ranges = JexlASTHelper.getBoundedRanges(node, this.config.getDatatypeFilter(), this.helper, leaves, false); JexlNode andNode = JexlNodes.newInstanceOfType(node); andNode.image = node.image; andNode.jjtSetParent(node.jjtGetParent()); // We have a bounded range completely inside of an AND/OR if (!ranges.isEmpty()) { andNode = expandIndexBoundedRange(ranges, leaves, node, andNode, data); } else { // We have no bounded range to replace, just proceed as normal JexlNodes.ensureCapacity(andNode, node.jjtGetNumChildren()); for (int i = 0; i < node.jjtGetNumChildren(); i++) { JexlNode newChild = (JexlNode) node.jjtGetChild(i).jjtAccept(this, data); andNode.jjtAddChild(newChild, i); newChild.jjtSetParent(andNode); } } return andNode; }
newNode.jjtSetParent(node.jjtGetParent());
/** * Track the current andNode and continue recursively down the tree * * @param node * @param data * @return */ @Override public Object visit(ASTAndNode node, Object data) { ExpansionTracker tracker = new ExpansionTracker(node); // because the andNode may be replaced we don't want to call super.visit to handle children processing, but should do so manually and with inspection if (node.jjtGetNumChildren() > 0) { int childCount = 0; // as long as there are more children, and this node is still valid (has a parent) keep visiting children as long as we haven't already failed while (childCount < node.jjtGetNumChildren() && node.jjtGetParent() != null && !tracker.isFailedExpansion()) { JexlNode child = node.jjtGetChild(childCount); if (child instanceof ASTOrNode) { visit((ASTOrNode) child, tracker); } else { visit(child, tracker); } childCount++; } } return tracker; }
} else { JexlNodes.swap(lastAnd.jjtGetParent(), lastAnd, newOr);