public static FormulaNode simplify(FormulaNode node) { while(node instanceof GroupNode) { node = ((GroupNode) node).getExpr(); } return node; }
@Override public Slot<ColumnView> visitGroup(GroupNode group) { return group.getExpr().accept(this); }
private FieldType validateExpr(FormulaNode formulaNode) { if(formulaNode instanceof ConstantNode) { return ((ConstantNode) formulaNode).getType(); } else if(formulaNode instanceof GroupNode) { return validateExpr(((GroupNode) formulaNode).getExpr()); } else if(formulaNode instanceof SymbolNode) { return validateReference(formulaNode); } else if(formulaNode instanceof CompoundExpr) { return validateReference(formulaNode); } else if(formulaNode instanceof FunctionCallNode) { return validateFunctionCall((FunctionCallNode) formulaNode); } else { throw new UnsupportedOperationException("type: " + formulaNode.getClass().getSimpleName()); } }
private static SimpleCondition parseCondition(FormulaNode node) { if(node instanceof GroupNode) { return parseCondition(((GroupNode) node).getExpr()); } else if(node instanceof FunctionCallNode) { FunctionCallNode callNode = ((FunctionCallNode) node); if(callNode.getFunction() == NotFunction.INSTANCE) { return parseCondition(callNode.getArgument(0)).negate(); } else if(callNode.getArguments().size() == 2) { return parseBinary(((FunctionCallNode) node)); } else { throw new UnsupportedOperationException("function: " + ((FunctionCallNode) node).getFunction()); } } else if(node instanceof CompoundExpr) { return parseEnumCondition((CompoundExpr) node); } else { throw new UnsupportedOperationException("cannot handle expression: " + node); } }
private static void parse(List<SimpleCondition> conditions, Set<Criteria> criteria, FormulaNode node) { if(node instanceof GroupNode) { parse(conditions, criteria, ((GroupNode) node).getExpr()); return; } if(node instanceof FunctionCallNode) { FunctionCallNode call = (FunctionCallNode) node; if (call.getFunction() == AndFunction.INSTANCE) { criteria.add(Criteria.ALL_TRUE); parse(conditions, criteria, call.getArgument(0)); parse(conditions, criteria, call.getArgument(1)); return; } else if (call.getFunction() == OrFunction.INSTANCE) { criteria.add(Criteria.ANY_TRUE); parse(conditions, criteria, call.getArgument(0)); parse(conditions, criteria, call.getArgument(1)); return; } } conditions.add(parseCondition(node)); }
FormulaNode expr = groupNode.getExpr(); xpath.append("("); appendTo(expr, xpath);
private List<ResourceId> getFieldIds(FormulaNode formulaNode) { List<ResourceId> fieldIds = new ArrayList<>(); if (formulaNode instanceof FunctionCallNode) { FunctionCallNode functionCall = (FunctionCallNode) formulaNode; for(FormulaNode arg : functionCall.getArguments()) { fieldIds.addAll(getFieldIds(arg)); } } else if (formulaNode instanceof SymbolNode) { SymbolNode symbolNode = (SymbolNode) formulaNode; fieldIds.add(ResourceId.valueOf(symbolNode.getName())); } else if (formulaNode instanceof ConstantNode) { ConstantNode constantNode = (ConstantNode) formulaNode; if (constantNode.getType() instanceof EnumType) { fieldIds.add(ResourceId.valueOf(constantNode.toString())); } } else if (formulaNode instanceof CompoundExpr) { CompoundExpr compoundExpr = (CompoundExpr) formulaNode; fieldIds.addAll(getFieldIds(compoundExpr.getValue())); fieldIds.addAll(getFieldIds(compoundExpr.getField())); } else if (formulaNode instanceof GroupNode) { GroupNode groupNode = (GroupNode) formulaNode; fieldIds.addAll(getFieldIds(groupNode.getExpr())); } return fieldIds; }