public static FormulaNode idEqualTo(ResourceId id) { return equals(symbol(ColumnModel.RECORD_ID_SYMBOL), idConstant(id)); }
private static void findBinaryTree(FormulaNode node, List<FormulaNode> list, FormulaFunction operator) { // Unwrap group expressions ((A)) node = simplify(node); if(isBinaryOperation(node, operator)) { // If this expression is in the form A && B, then descend // recursively FunctionCallNode callNode = (FunctionCallNode) node; findBinaryTree(callNode.getArgument(0), list, operator); findBinaryTree(callNode.getArgument(1), list, operator); } else { // If not a conjunction, then add this node to the list list.add(node); } }
/** * Tries to decompose a tree of binary operations into a list of operands. (A && B && C) or * (A || B || C) or (A + B + C) => [A, B, C] */ public static List<FormulaNode> findBinaryTree(FormulaNode rootNode, FormulaFunction operator) { List<FormulaNode> list = new ArrayList<>(); findBinaryTree(rootNode, list, operator); return list; }
Choice selectedParent = getSelection(level.getParent()); queryModel.selectExpr("parent").as("parent"); queryModel.setFilter(Formulas.equals(new SymbolNode("parent"), Formulas.idConstant(selectedParent.getRef().getRecordId())));
private QueryModel buildQuery(List<EffectiveTableColumn> columns, RecordRef recordRef) { QueryModel queryModel = buildQuery(columns); queryModel.setFilter(Formulas.equals(new SymbolNode("@parent"), new ConstantNode(recordRef.getRecordId().asString()))); return queryModel; }
public Optional<FormulaNode> buildFormula() { List<FormulaNode> nodes = new ArrayList<>(); for (ColumnView filter : columns) { if(filter.isFilterActive()) { nodes.add(filter.getFilterFormula()); } } if(nodes.isEmpty()) { return Optional.absent(); } else { return Optional.of(Formulas.allTrue(nodes)); } }
private static FormulaNode toListFormula(FormulaNode field, FilterConfig filter) { // Shockingly, the gxt filterconfig for list is generated by concatenating // ids together with "::" String[] enumItemIds = filter.getValue().split("::"); List<FormulaNode> enumConditions = new ArrayList<>(); for (String enumItemId : enumItemIds) { enumConditions.add(new CompoundExpr(field, new SymbolNode(enumItemId))); } return Formulas.anyTrue(enumConditions); }
return false; FormulaNode isNumberArgument = Formulas.simplify(isNumberCall.getArgument(0)); if(!(isNumberArgument instanceof FunctionCallNode)) { return false;
public Multimap<Integer, FilterConfig> parseFilter(FormulaNode filter) { Multimap<Integer, FilterConfig> result = HashMultimap.create(); List<FormulaNode> nodes = Formulas.findBinaryTree(filter, AndFunction.INSTANCE); for (FormulaNode node : nodes) { if(!parseNode(node, result)) { return EMPTY; } } return result; }
queryModel.selectRecordId().as("id"); queryModel.selectField(intakeForm.getProtectionCodeFieldId()).as("serial"); queryModel.setFilter(Formulas.equals( new SymbolNode("_id"), new ConstantNode(newRecord.getId().asString())));
assertThat(lookupKeySet.getKey(2).getKeyLabel(), equalTo("Village Name")); SymbolNode villageName = Formulas.symbol(villageForm.getNameField().getId()); SymbolNode villageTerritory = new SymbolNode(villageForm.getAdminFieldId()); FormulaNode territoryName = new CompoundExpr(villageTerritory, territoryForm.getNameFieldId());
private static Optional<String> and(Optional<String> filter1, Optional<String> filter2) { if (!filter1.isPresent() && !filter2.isPresent()) { return Optional.empty(); } else if (!filter1.isPresent()) { return filter2; } else if (!filter2.isPresent()) { return filter1; } FormulaNode filterFormula1 = FormulaParser.parse(filter1.get()); FormulaNode filterFormula2 = FormulaParser.parse(filter2.get()); if (filterFormula1.equals(filterFormula2)) { return filter1; } FormulaNode and = Formulas.allTrue(Lists.newArrayList(filterFormula1, filterFormula2)); return Optional.of(and.asExpression()); }
private List<FormulaNode> parsePermission(String filter) { FormulaNode formulaNode = FormulaParser.parse(filter); return Formulas.findBinaryTree(formulaNode, AndFunction.INSTANCE); }
public static FormulaNode toFormula(FormulaNode field, List<FilterConfig> filters) { List<FormulaNode> filterExprs = new ArrayList<>(); for (FilterConfig filter : filters) { if(!isEmpty(filter)) { filterExprs.add(ColumnFilterParser.toFormula(field, filter)); } } if(filterExprs.isEmpty()) { return new ConstantNode(true); } else { return Formulas.allTrue(filterExprs); } }
@Test public void decomposition() { assertThat(Formulas.findBinaryTree(parse("A && B"), AND), contains(A, B)); assertThat(Formulas.findBinaryTree(parse("A && B && C"), AND), contains(A, B, C)); assertThat(Formulas.findBinaryTree(parse("A && (B && C)"), AND), contains(A, B, C)); assertThat(Formulas.findBinaryTree(parse("(A && ((B && (C))))"), AND), contains(A, B, C)); }
fieldFilters.put(fieldId, Formulas.allTrue(fieldCriteria.get(fieldId)));