protected Condition buildEntityKey(Condition obj) { List<Condition> crits = LanguageUtil.separateCriteriaByAnd(obj); if (!crits.isEmpty()) { boolean modified = false; for(Iterator<Condition> iter = crits.iterator(); iter.hasNext();) { Condition crit = iter.next(); if (crit instanceof Comparison) { Comparison left = (Comparison) crit; boolean leftAdded = this.entities.addEnityKey(left); if (leftAdded) { iter.remove(); modified = true; } } } if (this.entities.valid() && modified) { return LanguageUtil.combineCriteria(crits); } } return obj; }
/** * Take a criteria, which may be null, a single IPredicateCriteria or a * complex criteria built using ICompoundCriteria and breaks it apart * at ANDs such that a List of ICriteria conjuncts are returned. For * example, ((a=1 OR b=2) AND (c=3 AND d=4)) would return the list * (a=1 OR b=2), c=3, d=4. If criteria is null, an empty list is * returned. * @param criteria Criteria to break, may be null * @return List of ICriteria, never null */ public static final List<Condition> separateCriteriaByAnd(Condition criteria) { if(criteria == null) { return Collections.emptyList(); } List<Condition> parts = new ArrayList<Condition>(); separateCriteria(criteria, parts); return parts; }
public String buildURL(String serviceRoot) throws TranslatorException { URIBuilderImpl uriBuilder = this.odataQuery.buildURL(serviceRoot, this.projectedColumns, LanguageUtil.combineCriteria(this.conditionFragments)); if (this.orderBy.length() > 0) { uriBuilder.orderBy(this.orderBy.toString()); } URI uri = uriBuilder.build(); return uri.toString(); }
protected String processFilter(Condition condition) throws TranslatorException { List<Condition> crits = LanguageUtil.separateCriteriaByAnd(condition); if (!crits.isEmpty()) { for(Iterator<Condition> iter = crits.iterator(); iter.hasNext();) { Condition crit = iter.next(); ODataFilterVisitor visitor = new ODataFilterVisitor(this.executionFactory, this.metadata, this); visitor.appendFilter(crit); } } StringBuilder sb = new StringBuilder(); if (this.rootDocument.getFilter() != null) { sb.append(this.rootDocument.getFilter()); } for (ODataDocumentNode use:this.complexTables) { if (use.getFilter() != null) { if (sb.length() > 0) { sb.append(" and "); } sb.append(use.getFilter()); } } return sb.length() == 0?null:sb.toString(); }
/** * only a single join predicate is supported, so move up conditions if possible */ private void moveCondition(Select select, TableReference tableReference) { if (!(tableReference instanceof Join)) { return; } Join join = (Join)tableReference; if (join.getJoinType() != JoinType.INNER_JOIN) { return; } while (join.getCondition() instanceof AndOr) { AndOr andOr = (AndOr) join.getCondition(); if (andOr.getOperator() == AndOr.Operator.OR) { break; } Condition c = andOr.getLeftCondition(); select.setWhere(LanguageUtil.combineCriteria(select.getWhere(), c, getLanguageFactory())); join.setCondition(andOr.getRightCondition()); } moveCondition(select, join.getLeftItem()); moveCondition(select, join.getRightItem()); } }
protected Condition parseKeySegmentFromCondition(Condition obj) throws TranslatorException { List<Condition> crits = LanguageUtil.separateCriteriaByAnd(obj); if (!crits.isEmpty()) { boolean modified = false; for(Iterator<Condition> iter = crits.iterator(); iter.hasNext();) { Condition crit = iter.next(); if (crit instanceof Comparison) { Comparison left = (Comparison) crit; boolean leftAdded = parseKeySegmentFromComparison(left); if (leftAdded) { iter.remove(); modified = true; } } } if (modified) { return LanguageUtil.combineCriteria(crits); } } return obj; }
/** * Helper method for {@link #separateCriteriaByAnd(Condition)} that * can be called recursively to collect parts. * @param crit Crit to break apart * @param parts List to add parts to */ private static void separateCriteria(Condition crit, List<Condition> parts) { if(crit instanceof AndOr) { AndOr compCrit = (AndOr) crit; if(compCrit.getOperator() == Operator.AND) { separateCriteria(compCrit.getLeftCondition(), parts); separateCriteria(compCrit.getRightCondition(), parts); } else { parts.add(crit); } } else { parts.add(crit); } }
tempTables = new ArrayList<NamedTable>(); Condition c = select.getWhere(); List<Condition> conditions = LanguageUtil.separateCriteriaByAnd(c); Map<String, List<Comparison>> tables = new HashMap<String, List<Comparison>>(); select.setWhere(LanguageUtil.combineCriteria(conditions)); return result;