public static void convertCrossJoinToInner(LanguageObject obj, LanguageFactory lf) { if (obj instanceof Join) { Join join = (Join)obj; if (join.getJoinType() == JoinType.CROSS_JOIN) { Literal one = lf.createLiteral(1, TypeFacility.RUNTIME_TYPES.INTEGER); join.setCondition(lf.createCompareCriteria(Operator.EQ, one, one)); join.setJoinType(JoinType.INNER_JOIN); } } }
try { updated = this.odataQuery.addNavigation(obj.getCondition(), obj.getJoinType(), right); obj.setCondition(updated); if (updated != null) { this.conditionFragments.add(obj.getCondition()); try { updated = this.odataQuery.addNavigation(obj.getCondition(), obj.getJoinType(), left); obj.setCondition(updated); if (updated != null) { this.conditionFragments.add(obj.getCondition()); obj.setCondition(updated); if (updated != null) { this.conditionFragments.add(obj.getCondition());
/** * 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()); } }
@Override public void visit(Join obj) { // joins are not used currently if (obj.getLeftItem() instanceof NamedTable && obj.getRightItem() instanceof NamedTable) { this.entities.addEntity(((NamedTable)obj.getLeftItem()).getMetadataObject()); this.entities.addEntity(((NamedTable)obj.getRightItem()).getMetadataObject()); obj.setCondition(buildEntityKey(obj.getCondition())); visitNode(obj.getCondition()); } else { visitNode(obj.getLeftItem()); visitNode(obj.getRightItem()); visitNode(obj.getCondition()); } }