/** * Add the children JexlNodes to the parent JexlNode, correctly setting parent pointers, parenthesis, and reference nodes. * * @param parent * @param children * @return */ public static JexlNode setChildren(JexlNode parent, Iterable<? extends JexlNode> children) { int i = 0; JexlNodes.ensureCapacity(parent, Iterables.size(children)); // hopefully // we got // passed a // collection... for (JexlNode child : children) { parent.jjtAddChild(child, i); child.jjtSetParent(parent); i++; } return parent; }
JexlNodes.ensureCapacity(parentNode, pairs.size()); for (List<Object> pair : pairs) { if (2 != pair.size()) {
JexlNodes.ensureCapacity(newNode, leaves.size() + ranges.size()); int index = 0; for (; index < leaves.size(); index++) { JexlNodes.ensureCapacity(onlyRangeNodes, range.getValue().size()); for (int i = 0; i < range.getValue().size(); i++) { onlyRangeNodes.jjtAddChild(range.getValue().get(i), i);
Object data) { JexlNodes.ensureCapacity(newNode, leaves.size() + ranges.size()); int index = 0; for (; index < leaves.size(); index++) { JexlNodes.ensureCapacity(rangeNodes, range.getValue().size()); for (int i = 0; i < range.getValue().size(); i++) { rangeNodes.jjtAddChild(range.getValue().get(i), i);
protected JexlNode expandIndexBoundedRange(Map<LiteralRange<?>,List<JexlNode>> ranges, List<JexlNode> leaves, ASTAndNode currentNode, JexlNode newNode, Object data) { JexlNodes.ensureCapacity(newNode, leaves.size() + ranges.size()); int index = 0; for (; index < leaves.size(); index++) { JexlNodes.ensureCapacity(onlyRangeNodes, range.getValue().size()); for (int i = 0; i < range.getValue().size(); i++) { onlyRangeNodes.jjtAddChild(range.getValue().get(i), i);
ParserTreeConstants.JJTANDNODE)); int i = 0; JexlNodes.ensureCapacity(parentNode, fieldNames.size()); for (String fieldName : fieldNames) { JexlNode child = buildUntypedNode(node, fieldName, literal);
JexlNodes.ensureCapacity(parentNode, fieldValues.size());
JexlNodes.ensureCapacity(parentNode, fieldValues.size());
@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; }
/** * Create a new ASTGENode from the given field name and value * * @param namespace * @param function * @param field * @param args * @return */ public static JexlNode buildFunctionNode(String namespace, String function, String field, Object... args) { ASTFunctionNode newNode = new ASTFunctionNode(ParserTreeConstants.JJTFUNCTIONNODE); JexlNodes.ensureCapacity(newNode, args.length + 3); int childIndex = 0; ASTIdentifier nsNode = new ASTIdentifier(ParserTreeConstants.JJTIDENTIFIER); nsNode.image = namespace; newNode.jjtAddChild(nsNode, childIndex++); ASTIdentifier functionNode = new ASTIdentifier(ParserTreeConstants.JJTIDENTIFIER); functionNode.image = function; newNode.jjtAddChild(functionNode, childIndex++); ASTIdentifier fieldNode = new ASTIdentifier(ParserTreeConstants.JJTIDENTIFIER); fieldNode.image = field; newNode.jjtAddChild(fieldNode, childIndex++); for (int i = 0; i < args.length; i++) { ASTStringLiteral literal = new ASTStringLiteral(ParserTreeConstants.JJTSTRINGLITERAL); literal.image = args[i].toString(); newNode.jjtAddChild(JexlNodeFactory.wrap(literal), childIndex++); } return JexlNodeFactory.wrap(newNode); }
int parentNodeChildCount = 0; JexlNodes.ensureCapacity(parentNode, fields.size()); for (String field : fields) { ValueSet valuesForField = fieldsToValues.get(field); JexlNode childNode = (containerType.equals(ContainerType.OR_NODE) ? new ASTOrNode(ParserTreeConstants.JJTORNODE) : new ASTAndNode( ParserTreeConstants.JJTANDNODE)); JexlNodes.ensureCapacity(childNode, patterns.size()); for (String pattern : patterns) { JexlNode child = new ExceededValueThresholdMarkerJexlNode(buildUntypedNode(orgNode, field, pattern)); JexlNode childNode = (containerType.equals(ContainerType.OR_NODE) ? new ASTOrNode(ParserTreeConstants.JJTORNODE) : new ASTAndNode( ParserTreeConstants.JJTANDNODE)); JexlNodes.ensureCapacity(childNode, valuesForField.size()); for (String value : valuesForField) { JexlNode child = buildUntypedNode(node, field, value);