private boolean isCriteriaValid(List<Criteria> joinCriteria, QueryMetadataInterface metadata, PlanNode join) { if (joinCriteria.isEmpty()) { return false; } Set<GroupSymbol> groups = join.getGroups(); for (Criteria crit : joinCriteria) { if (JoinUtil.isNullDependent(metadata, groups, crit)) { return false; } } return true; }
public static JoinType getJoinTypePreventingCriteriaOptimization(PlanNode joinNode, Set<GroupSymbol> groups) { JoinType joinType = (JoinType) joinNode.getProperty(NodeConstants.Info.JOIN_TYPE); if(!joinType.isOuter()) { return null; } if(joinType.equals(JoinType.JOIN_FULL_OUTER)) { return joinType; } Set<GroupSymbol> innerGroups = getInnerSideJoinNodes(joinNode)[0].getGroups(); for (GroupSymbol group : groups) { if (innerGroups.contains(group)) { return joinType; } } return null; }
static JoinType getJoinTypePreventingCriteriaOptimization(PlanNode joinNode, PlanNode critNode) { Set<GroupSymbol> groups = critNode.getGroups(); //special case for 0 group criteria if (groups.size() == 0) { critNode = FrameUtil.findOriginatingNode(critNode, groups); if (critNode == null) { return null; } groups = critNode.getGroups(); } return getJoinTypePreventingCriteriaOptimization(joinNode, groups); }
boolean isNullDepdendent = isNullDependent(metadata, innerGroups, crit); boolean isNullDepdendentOther = isNullDependent(metadata, outerGroups, crit); } else if (!isNullDepdendent && isNullDepdendentOther) { if (modifyJoin) { JoinUtil.swapJoinChildren(joinNode); result = JoinType.JOIN_LEFT_OUTER;
JoinType jt = JoinUtil.getJoinTypePreventingCriteriaOptimization(currentNode, critNode); JoinType optimized = JoinUtil.optimizeJoinType(critNode, currentNode, metadata, this.createdNodes == null);
if(jtype == JoinType.JOIN_FULL_OUTER || (jtype.isOuter() && JoinUtil.getInnerSideJoinNodes(joinNode)[0] != sourceNode)) { sourceNode.recordDebugAnnotation("node is on outer side of the join", null, "Rejecting dependent join", analysisRecord, null); //$NON-NLS-1$ //$NON-NLS-2$ return false; JoinUtil.swapJoinChildren(joinNode);
/** * Returns true if the given criteria can be anything other than false (or unknown) * given all null values for elements in the inner groups */ public static boolean isNullDependent(QueryMetadataInterface metadata, final Collection<GroupSymbol> innerGroups, Criteria crit) { Criteria simplifiedCrit = (Criteria)replaceWithNullValues(innerGroups, crit); try { simplifiedCrit = QueryRewriter.rewriteCriteria(simplifiedCrit, null, metadata); } catch (TeiidException err) { //log the exception return true; } return !(simplifiedCrit.equals(QueryRewriter.FALSE_CRITERIA) || simplifiedCrit.equals(QueryRewriter.UNKNOWN_CRITERIA)); }
JoinUtil.swapJoinChildren(joinNode);
/** * Handles multi-group criteria originating at the given joinNode * * @param joinNode * @param critNode * @return */ private boolean handleJoinCriteria(PlanNode joinNode, PlanNode critNode, QueryMetadataInterface metadata) { JoinType jt = (JoinType)joinNode.getProperty(NodeConstants.Info.JOIN_TYPE); if (jt == JoinType.JOIN_CROSS || jt == JoinType.JOIN_INNER) { return moveCriteriaIntoOnClause(critNode, joinNode); } JoinType optimized = JoinUtil.optimizeJoinType(critNode, joinNode, metadata, true); if (optimized == JoinType.JOIN_INNER) { moveCriteriaIntoOnClause(critNode, joinNode); return true; //return true since the join type has changed } return false; }
boolean isNullDepdendent = isNullDependent(metadata, innerGroups, crit); boolean isNullDepdendentOther = isNullDependent(metadata, outerGroups, crit); } else if (!isNullDepdendent && isNullDepdendentOther) { if (modifyJoin) { JoinUtil.swapJoinChildren(joinNode); result = JoinType.JOIN_LEFT_OUTER;
JoinType jt = JoinUtil.getJoinTypePreventingCriteriaOptimization(currentNode, critNode); JoinType optimized = JoinUtil.optimizeJoinType(critNode, currentNode, metadata, this.createdNodes == null);
if(jtype == JoinType.JOIN_FULL_OUTER || (jtype.isOuter() && JoinUtil.getInnerSideJoinNodes(joinNode)[0] != sourceNode)) { sourceNode.recordDebugAnnotation("node is on outer side of the join", null, "Rejecting dependent join", analysisRecord, null); //$NON-NLS-1$ //$NON-NLS-2$ return false; JoinUtil.swapJoinChildren(joinNode);
/** * Returns true if the given criteria can be anything other than false (or unknown) * given all null values for elements in the inner groups */ public static boolean isNullDependent(QueryMetadataInterface metadata, final Collection<GroupSymbol> innerGroups, Criteria crit) { Criteria simplifiedCrit = (Criteria)replaceWithNullValues(innerGroups, crit); try { simplifiedCrit = QueryRewriter.rewriteCriteria(simplifiedCrit, null, metadata); } catch (TeiidException err) { //log the exception return true; } return !(simplifiedCrit.equals(QueryRewriter.FALSE_CRITERIA) || simplifiedCrit.equals(QueryRewriter.UNKNOWN_CRITERIA)); }
JoinUtil.swapJoinChildren(joinNode);
/** * Handles multi-group criteria originating at the given joinNode * * @param joinNode * @param critNode * @return */ private boolean handleJoinCriteria(PlanNode joinNode, PlanNode critNode, QueryMetadataInterface metadata) { JoinType jt = (JoinType)joinNode.getProperty(NodeConstants.Info.JOIN_TYPE); if (jt == JoinType.JOIN_CROSS || jt == JoinType.JOIN_INNER) { return moveCriteriaIntoOnClause(critNode, joinNode); } JoinType optimized = JoinUtil.optimizeJoinType(critNode, joinNode, metadata, true); if (optimized == JoinType.JOIN_INNER) { moveCriteriaIntoOnClause(critNode, joinNode); return true; //return true since the join type has changed } return false; }
private boolean isCriteriaValid(List<Criteria> joinCriteria, QueryMetadataInterface metadata, PlanNode join) { if (joinCriteria.isEmpty()) { return false; } Set<GroupSymbol> groups = join.getGroups(); for (Criteria crit : joinCriteria) { if (JoinUtil.isNullDependent(metadata, groups, crit)) { return false; } } return true; }
boolean isNullDepdendent = isNullDependent(metadata, innerGroups, crit); boolean isNullDepdendentOther = isNullDependent(metadata, outerGroups, crit); } else if (!isNullDepdendent && isNullDepdendentOther) { if (modifyJoin) { JoinUtil.swapJoinChildren(joinNode); result = JoinType.JOIN_LEFT_OUTER;
JoinType jt = JoinUtil.getJoinTypePreventingCriteriaOptimization(currentNode, critNode); JoinType optimized = JoinUtil.optimizeJoinType(critNode, currentNode, metadata, this.createdNodes == null);
if(jtype == JoinType.JOIN_FULL_OUTER || (jtype.isOuter() && JoinUtil.getInnerSideJoinNodes(joinNode)[0] != sourceNode)) { sourceNode.recordDebugAnnotation("node is on outer side of the join", null, "Rejecting dependent join", analysisRecord, null); //$NON-NLS-1$ //$NON-NLS-2$ return false; JoinUtil.swapJoinChildren(joinNode);
public static JoinType getJoinTypePreventingCriteriaOptimization(PlanNode joinNode, Set<GroupSymbol> groups) { JoinType joinType = (JoinType) joinNode.getProperty(NodeConstants.Info.JOIN_TYPE); if(!joinType.isOuter()) { return null; } if(joinType.equals(JoinType.JOIN_FULL_OUTER)) { return joinType; } Set<GroupSymbol> innerGroups = getInnerSideJoinNodes(joinNode)[0].getGroups(); for (GroupSymbol group : groups) { if (innerGroups.contains(group)) { return joinType; } } return null; }