/** * Merges the from clause into a single join predicate if there are more than 1 from clauses */ private static FromClause mergeClauseTrees(From from) { List<FromClause> clauses = from.getClauses(); while (clauses.size() > 1) { FromClause first = from.getClauses().remove(0); FromClause second = from.getClauses().remove(0); JoinPredicate jp = new JoinPredicate(first, second, JoinType.JOIN_CROSS); clauses.add(0, jp); } return clauses.get(0); }
/** * Compare this object to another * @param obj Other object * @return True if equal */ public boolean equals(Object obj) { if (!super.equals(obj)) { return false; } if(!(obj instanceof JoinPredicate)) { return false; } JoinPredicate other = (JoinPredicate) obj; List thisCrit = this.getJoinCriteria(); if(thisCrit != null && thisCrit.size() == 0) { thisCrit = null; } List otherCrit = other.getJoinCriteria(); if(otherCrit != null && otherCrit.size() == 0) { otherCrit = null; } return EquivalenceUtil.areEqual(other.getJoinType(), this.getJoinType()) && EquivalenceUtil.areEqual(other.getLeftClause(), this.getLeftClause()) && EquivalenceUtil.areEqual(other.getRightClause(), this.getRightClause()) && EquivalenceUtil.areEqual(otherCrit, thisCrit); }
private JoinPredicate rewriteJoinPredicate(Query parent, JoinPredicate predicate) throws TeiidComponentException, TeiidProcessingException{ List joinCrits = predicate.getJoinCriteria(); if(joinCrits != null && joinCrits.size() > 0) { //rewrite join crits by rewriting a compound criteria Criteria criteria = new CompoundCriteria(new ArrayList(joinCrits)); criteria = rewriteCriteria(criteria); joinCrits.clear(); if (criteria instanceof CompoundCriteria && ((CompoundCriteria)criteria).getOperator() == CompoundCriteria.AND) { joinCrits.addAll(((CompoundCriteria)criteria).getCriteria()); } else { joinCrits.add(criteria); } predicate.setJoinCriteria(joinCrits); } if (predicate.getJoinType() == JoinType.JOIN_UNION) { predicate.setJoinType(JoinType.JOIN_FULL_OUTER); predicate.setJoinCriteria(new ArrayList<Criteria>(Arrays.asList(FALSE_CRITERIA))); } else if (predicate.getJoinType() == JoinType.JOIN_RIGHT_OUTER) { predicate.setJoinType(JoinType.JOIN_LEFT_OUTER); FromClause leftClause = predicate.getLeftClause(); predicate.setLeftClause(predicate.getRightClause()); predicate.setRightClause(leftClause); } predicate.setLeftClause( rewriteFromClause(parent, predicate.getLeftClause())); predicate.setRightClause( rewriteFromClause(parent, predicate.getRightClause())); return predicate; }
private void checkImplicit(FromClause clause) { if (clause instanceof JoinPredicate) { JoinPredicate jp = (JoinPredicate)clause; if (jp.getJoinType() == JoinType.JOIN_FULL_OUTER || jp.getJoinType() == JoinType.JOIN_RIGHT_OUTER) { allowImplicit = false; return; } checkImplicit(jp.getLeftClause()); if (allowImplicit) { checkImplicit(jp.getRightClause()); } } }
/** * Constructs an example <code>JoinPredicate</code> object that can be used * as join predicate in a query. * * @param joinType the type of join to be constructed * @param joinOnElement the element name to be used in the left and right * side criteria of the ON expression of the join * @return a join predicate object */ public static JoinPredicate example(JoinType joinType, String joinOnElement) { JoinPredicate jp = new JoinPredicate(); GroupSymbol g1 = new GroupSymbol("m.g1"); //$NON-NLS-1$ GroupSymbol g2 = new GroupSymbol("m.g2"); //$NON-NLS-1$ FromClause lc = new UnaryFromClause(g1); FromClause rc = new UnaryFromClause(g2); Expression le = new ElementSymbol("m.g1." + joinOnElement); //$NON-NLS-1$ Expression re = new ElementSymbol("m.g2." + joinOnElement); //$NON-NLS-1$ Criteria c1 = new CompareCriteria(le, CompareCriteria.EQ, re); jp.setLeftClause(lc); jp.setRightClause(rc); jp.setJoinType(joinType != null ? joinType : JoinType.JOIN_LEFT_OUTER); jp.setJoinCriteria( Arrays.asList(new Object[]{c1})); return jp; }
node.setProperty(NodeConstants.Info.JOIN_TYPE, jp.getJoinType()); node.setProperty(NodeConstants.Info.JOIN_STRATEGY, JoinStrategyType.NESTED_LOOP); node.setProperty(NodeConstants.Info.JOIN_CRITERIA, jp.getJoinCriteria()); if (jp.isPreserve()) { node.setProperty(Info.PRESERVE, Boolean.TRUE); FromClause[] clauses = new FromClause[] {jp.getLeftClause(), jp.getRightClause()}; for(int i=0; i<2; i++) { if (jp.isPreserve() && clauses[i] instanceof JoinPredicate) { ((JoinPredicate)clauses[i]).setPreserve(true);
public void visit(JoinPredicate obj) { assert currentGroups.isEmpty(); List<GroupSymbol> tempImplicitGroups = new ArrayList<GroupSymbol>(discoveredGroups); discoveredGroups.clear(); visitNode(obj.getLeftClause()); List<GroupSymbol> leftGroups = new ArrayList<GroupSymbol>(discoveredGroups); discoveredGroups.clear(); visitNode(obj.getRightClause()); discoveredGroups.addAll(leftGroups); addDiscoveredGroups(); visitNodes(obj.getJoinCriteria()); discoveredGroups.addAll(currentGroups); currentGroups.clear(); discoveredGroups.addAll(tempImplicitGroups); }
@Test public void testDepOptions2() { GroupSymbol a = new GroupSymbol("a"); //$NON-NLS-1$ GroupSymbol b = new GroupSymbol("b"); //$NON-NLS-1$ ElementSymbol x = new ElementSymbol("a.x", true); //$NON-NLS-1$ ElementSymbol y = new ElementSymbol("b.y", true); //$NON-NLS-1$ Criteria criteria = new CompareCriteria(x, CompareCriteria.EQ, new Function("func", new Expression[] {y})); //$NON-NLS-1$ JoinPredicate predicate = new JoinPredicate(new UnaryFromClause(a), new UnaryFromClause(b), JoinType.JOIN_INNER, Arrays.asList(new Object[] {criteria})); From from = new From(Arrays.asList(predicate)); predicate.getLeftClause().setMakeNotDep(true); predicate.getRightClause().setMakeDep(true); Select select = new Select(Arrays.asList(x, y)); Query query = new Query(select, from, null, null, null, null, null); TestParser.helpTest("Select a.x, b.y From a MAKENOTDEP INNER JOIN b MAKEDEP ON a.x = func(b.y)", //$NON-NLS-1$ "SELECT a.x, b.y FROM /*+ MAKENOTDEP */ a INNER JOIN /*+ MAKEDEP */ b ON a.x = func(b.y)", //$NON-NLS-1$ query); }
final public JoinPredicate crossJoin(ParseInfo info) throws ParseException { JoinPredicate result = new JoinPredicate(); FromClause clause = null; switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case CROSS: jj_consume_token(CROSS); result.setJoinType(JoinType.JOIN_CROSS); break; case UNION: jj_consume_token(UNION); result.setJoinType(JoinType.JOIN_UNION); break; default: jj_la1[130] = jj_gen; jj_consume_token(-1); throw new ParseException(); } jj_consume_token(JOIN); clause = tablePrimary(info); result.setRightClause(clause); {if (true) return result;} throw new Error("Missing return statement in function"); }
continue; leftClause = new JoinPredicate(leftClause, fc, JoinType.JOIN_CROSS); JoinPredicate jp = new JoinPredicate(leftClause, clause, JoinType.JOIN_LEFT_OUTER); jp.setJoinCriteria(Criteria.separateCriteriaByAnd(mappedCriteria)); query.getFrom().getClauses().add(jp); } else {
@Test public void testOptionMakeDepInline1(){ GroupSymbol g1 = new GroupSymbol("db.g1"); //$NON-NLS-1$ GroupSymbol g2 = new GroupSymbol("db.g2"); //$NON-NLS-1$ ElementSymbol a = new ElementSymbol("a"); //$NON-NLS-1$ ElementSymbol b = new ElementSymbol("b"); //$NON-NLS-1$ List<Object> crits = new ArrayList<Object>(); crits.add(new CompareCriteria(a, CompareCriteria.EQ, b)); JoinPredicate jp = new JoinPredicate(new UnaryFromClause(g1), new UnaryFromClause(g2), JoinType.JOIN_INNER, crits); jp.getRightClause().setMakeDep(true); From from = new From(); from.addClause(jp); Select select = new Select(); select.addSymbol(a); Query query = new Query(); query.setSelect(select); query.setFrom(from); TestParser.helpTest("Select a From db.g1 JOIN db.g2 MAKEDEP ON a = b", //$NON-NLS-1$ "SELECT a FROM db.g1 INNER JOIN /*+ MAKEDEP */ db.g2 ON a = b", //$NON-NLS-1$ query); }
@Test public void testOptionMakeDepInline2(){ GroupSymbol g1 = new GroupSymbol("db.g1"); //$NON-NLS-1$ GroupSymbol g2 = new GroupSymbol("db.g2"); //$NON-NLS-1$ ElementSymbol a = new ElementSymbol("a"); //$NON-NLS-1$ ElementSymbol b = new ElementSymbol("b"); //$NON-NLS-1$ List<Object> crits = new ArrayList<Object>(); crits.add(new CompareCriteria(a, CompareCriteria.EQ, b)); JoinPredicate jp = new JoinPredicate(new UnaryFromClause(g1), new UnaryFromClause(g2), JoinType.JOIN_INNER, crits); jp.getLeftClause().setMakeDep(true); From from = new From(); from.addClause(jp); Select select = new Select(); select.addSymbol(a); Query query = new Query(); query.setSelect(select); query.setFrom(from); TestParser.helpTest("Select a From db.g1 MAKEDEP JOIN db.g2 ON a = b", //$NON-NLS-1$ "SELECT a FROM /*+ MAKEDEP */ db.g1 INNER JOIN db.g2 ON a = b", //$NON-NLS-1$ query); }
@Test public void testOptionalJoinPredicate1() { JoinPredicate jp = new JoinPredicate( new UnaryFromClause(new GroupSymbol("m.g2")), //$NON-NLS-1$ new UnaryFromClause(new GroupSymbol("m.g3")), //$NON-NLS-1$ JoinType.JOIN_CROSS); jp.setOptional(true); helpTest(jp, "/*+ optional */ (m.g2 CROSS JOIN m.g3)"); //$NON-NLS-1$ }
List<Criteria> joinCrits = jp.getJoinCriteria(); List<Object> newJoinCrits = new ArrayList<Object>(1); jp.setJoinCriteria(newJoinCrits);
@Test public void testOptionMakeDepInline5(){ GroupSymbol g1 = new GroupSymbol("db.g1"); //$NON-NLS-1$ GroupSymbol g2 = new GroupSymbol("db.g2"); //$NON-NLS-1$ GroupSymbol g3 = new GroupSymbol("db.g3"); //$NON-NLS-1$ ElementSymbol a = new ElementSymbol("a"); //$NON-NLS-1$ ElementSymbol b = new ElementSymbol("b"); //$NON-NLS-1$ ElementSymbol c = new ElementSymbol("c"); //$NON-NLS-1$ List<Object> crits = new ArrayList<Object>(); crits.add(new CompareCriteria(a, CompareCriteria.EQ, b)); JoinPredicate jp = new JoinPredicate(new UnaryFromClause(g1), new UnaryFromClause(g2), JoinType.JOIN_INNER, crits); jp.setMakeDep(true); List<Object> crits2 = new ArrayList<Object>(); crits2.add(new CompareCriteria(a, CompareCriteria.EQ, c)); JoinPredicate jp2 = new JoinPredicate(jp, new UnaryFromClause(g3), JoinType.JOIN_LEFT_OUTER, crits2); From from = new From(); from.addClause(jp2); Select select = new Select(); select.addSymbol(a); Query query = new Query(); query.setSelect(select); query.setFrom(from); TestParser.helpTest("Select a From (db.g1 JOIN db.g2 ON a = b) makedep LEFT OUTER JOIN db.g3 ON a = c", //$NON-NLS-1$ "SELECT a FROM /*+ MAKEDEP */ (db.g1 INNER JOIN db.g2 ON a = b) LEFT OUTER JOIN db.g3 ON a = c", //$NON-NLS-1$ query); //ensure that the new string form is parsable TestParser.helpTest(query.toString(), query.toString(), query); }
throw new ParseException(); jp.setLeftClause(result); result = jp;
@Test public void testOptionMakedep() throws Exception { String sql = "SELECT A.alert_id " + //$NON-NLS-1$ "FROM (FSK_ALERT AS A MAKEDEP INNER JOIN Core.FSC_PARTY_DIM AS C ON A.primary_entity_key = C.PARTY_KEY) " +//$NON-NLS-1$ "LEFT OUTER JOIN FSK_SCENARIO AS S ON A.scenario_id = S.scenario_id ";//$NON-NLS-1$ Query command = (Query)new QueryParser().parseCommand(sql); JoinPredicate predicate = (JoinPredicate)command.getFrom().getClauses().get(0); assertTrue(((JoinPredicate)predicate.getLeftClause()).getLeftClause().isMakeDep()); }
final public JoinPredicate qualifiedJoin(ParseInfo info) throws ParseException { JoinPredicate result = new JoinPredicate(); FromClause clause = null; Criteria onCriteria = null; case RIGHT: jj_consume_token(RIGHT); result.setJoinType(JoinType.JOIN_RIGHT_OUTER); switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case OUTER: case LEFT: jj_consume_token(LEFT); result.setJoinType(JoinType.JOIN_LEFT_OUTER); switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case OUTER: case FULL: jj_consume_token(FULL); result.setJoinType(JoinType.JOIN_FULL_OUTER); switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case OUTER: result.setRightClause(clause); jj_consume_token(ON); onCriteria = criteria(info); result.setJoinCriteria(Criteria.separateCriteriaByAnd(onCriteria)); {if (true) return result;} throw new Error("Missing return statement in function");
node.setProperty(NodeConstants.Info.JOIN_TYPE, jp.getJoinType()); node.setProperty(NodeConstants.Info.JOIN_STRATEGY, JoinStrategyType.NESTED_LOOP); node.setProperty(NodeConstants.Info.JOIN_CRITERIA, jp.getJoinCriteria()); if (jp.isPreserve()) { node.setProperty(Info.PRESERVE, Boolean.TRUE); FromClause[] clauses = new FromClause[] {jp.getLeftClause(), jp.getRightClause()}; for(int i=0; i<2; i++) { if (jp.isPreserve() && clauses[i] instanceof JoinPredicate) { ((JoinPredicate)clauses[i]).setPreserve(true);
/** * Get hash code for object * @return Hash code */ public int hashCode() { int hash = HashCodeUtil.hashCode(0, getLeftClause()); hash = HashCodeUtil.hashCode(hash, getJoinType().getTypeCode()); hash = HashCodeUtil.hashCode(hash, getRightClause()); return hash; }