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); }
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()); } } }
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; }
/** * 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; }
/** * 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; }
/** * 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; }
/** * @param rootClause * @param query */ private void shredJoinTree(FromClause clause, Query query) { if(clause instanceof UnaryFromClause || clause instanceof SubqueryFromClause) { query.getFrom().addClause(clause); } else { JoinPredicate jp = (JoinPredicate) clause; List<Criteria> crits = jp.getJoinCriteria(); if(crits != null && crits.size() > 0) { Criteria joinCrit = null; if (crits.size() > 1) { joinCrit = new CompoundCriteria(crits); } else { joinCrit = crits.get(0); } query.setCriteria(CompoundCriteria.combineCriteria(joinCrit, query.getCriteria())); } // Recurse through tree shredJoinTree(jp.getLeftClause(), query); shredJoinTree(jp.getRightClause(), query); } }
/** * @param rootClause * @param query */ private void shredJoinTree(FromClause clause, Query query) { if(clause instanceof UnaryFromClause || clause instanceof SubqueryFromClause) { query.getFrom().addClause(clause); } else { JoinPredicate jp = (JoinPredicate) clause; List<Criteria> crits = jp.getJoinCriteria(); if(crits != null && crits.size() > 0) { Criteria joinCrit = null; if (crits.size() > 1) { joinCrit = new CompoundCriteria(crits); } else { joinCrit = crits.get(0); } query.setCriteria(CompoundCriteria.combineCriteria(joinCrit, query.getCriteria())); } // Recurse through tree shredJoinTree(jp.getLeftClause(), query); shredJoinTree(jp.getRightClause(), query); } }
@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()); }
/** * @param rootClause * @param query */ private void shredJoinTree(FromClause clause, Query query) { if(clause instanceof UnaryFromClause || clause instanceof SubqueryFromClause) { query.getFrom().addClause(clause); } else { JoinPredicate jp = (JoinPredicate) clause; List<Criteria> crits = jp.getJoinCriteria(); if(crits != null && crits.size() > 0) { Criteria joinCrit = null; if (crits.size() > 1) { joinCrit = new CompoundCriteria(crits); } else { joinCrit = crits.get(0); } query.setCriteria(CompoundCriteria.combineCriteria(joinCrit, query.getCriteria())); } // Recurse through tree shredJoinTree(jp.getLeftClause(), query); shredJoinTree(jp.getRightClause(), query); } }
/** * @param clause Clause to check recursively * @return True if tree has outer joins, false otherwise */ static boolean hasOuterJoins(FromClause clause) { if (clause instanceof SubqueryFromClause) { if (((SubqueryFromClause)clause).isLateral()) { return true; } return false; } if(clause instanceof UnaryFromClause) { return false; } JoinPredicate jp = (JoinPredicate) clause; if(jp.getJoinType().isOuter()) { return true; } // Walk children boolean childHasOuter = hasOuterJoins(jp.getLeftClause()); if(childHasOuter) { return true; } return hasOuterJoins(jp.getRightClause()); }
public void visit(JoinPredicate obj) { preVisitVisitor(obj); visitNode(obj.getLeftClause()); visitNode(obj.getJoinType()); visitNode(obj.getRightClause()); visitNodes(obj.getJoinCriteria()); postVisitVisitor(obj); } public void visit(JoinType obj) {
public void visit(JoinPredicate obj) { preVisitVisitor(obj); visitNode(obj.getLeftClause()); visitNode(obj.getJoinType()); visitNode(obj.getRightClause()); visitNodes(obj.getJoinCriteria()); postVisitVisitor(obj); } public void visit(JoinType obj) {
public void visit(JoinPredicate obj) { preVisitVisitor(obj); visitNode(obj.getLeftClause()); visitNode(obj.getJoinType()); visitNode(obj.getRightClause()); visitNodes(obj.getJoinCriteria()); postVisitVisitor(obj); } public void visit(JoinType obj) {
Join translate(JoinPredicate join) { List crits = join.getJoinCriteria(); Criteria crit = null; if (crits.size() == 1) { crit = (Criteria)crits.get(0); } else if (crits.size() > 1) { crit = new CompoundCriteria(crits); } Join.JoinType joinType = Join.JoinType.INNER_JOIN; if(join.getJoinType().equals(JoinType.JOIN_INNER)) { joinType = Join.JoinType.INNER_JOIN; } else if(join.getJoinType().equals(JoinType.JOIN_LEFT_OUTER)) { joinType = Join.JoinType.LEFT_OUTER_JOIN; } else if(join.getJoinType().equals(JoinType.JOIN_RIGHT_OUTER)) { joinType = Join.JoinType.RIGHT_OUTER_JOIN; } else if(join.getJoinType().equals(JoinType.JOIN_FULL_OUTER)) { joinType = Join.JoinType.FULL_OUTER_JOIN; } else if(join.getJoinType().equals(JoinType.JOIN_CROSS)) { joinType = Join.JoinType.CROSS_JOIN; } return new Join(translate(join.getLeftClause()), translate(join.getRightClause()), joinType, translate(crit)); }
Join translate(JoinPredicate join) { List crits = join.getJoinCriteria(); Criteria crit = null; if (crits.size() == 1) { crit = (Criteria)crits.get(0); } else if (crits.size() > 1) { crit = new CompoundCriteria(crits); } Join.JoinType joinType = Join.JoinType.INNER_JOIN; if(join.getJoinType().equals(JoinType.JOIN_INNER)) { joinType = Join.JoinType.INNER_JOIN; } else if(join.getJoinType().equals(JoinType.JOIN_LEFT_OUTER)) { joinType = Join.JoinType.LEFT_OUTER_JOIN; } else if(join.getJoinType().equals(JoinType.JOIN_RIGHT_OUTER)) { joinType = Join.JoinType.RIGHT_OUTER_JOIN; } else if(join.getJoinType().equals(JoinType.JOIN_FULL_OUTER)) { joinType = Join.JoinType.FULL_OUTER_JOIN; } else if(join.getJoinType().equals(JoinType.JOIN_CROSS)) { joinType = Join.JoinType.CROSS_JOIN; } return new Join(translate(join.getLeftClause()), translate(join.getRightClause()), joinType, translate(crit)); }
@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); }
@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 testOptionMakeNotDepInline2(){ 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().setMakeNotDep(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 MAKENOTDEP JOIN db.g2 ON a = b", //$NON-NLS-1$ "SELECT a FROM /*+ MAKENOTDEP */ db.g1 INNER JOIN db.g2 ON a = b", //$NON-NLS-1$ query); }
@Test public void testOptionMakeNotDepInline3(){ 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.getLeftClause().setMakeNotDep(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); jp2.getRightClause().setMakeNotDep(true); 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 MAKENOTDEP JOIN db.g2 ON a = b) LEFT OUTER JOIN db.g3 MAKENOTDEP ON a = c", //$NON-NLS-1$ "SELECT a FROM (/*+ MAKENOTDEP */ db.g1 INNER JOIN db.g2 ON a = b) LEFT OUTER JOIN /*+ MAKENOTDEP */ db.g3 ON a = c", //$NON-NLS-1$ query); }