@Override public void addJoinCondition(JoinConditionImpl joinCondition, boolean forThisSelector) { left.addJoinCondition(joinCondition, forThisSelector); right.addJoinCondition(joinCondition, forThisSelector); }
/** * <b>!Test purpose only! <b> * * this creates a filter for the given query * */ Filter createFilter(boolean preparing) { return source.createFilter(preparing); }
public void bindSelector(SourceImpl source) { selector1 = source.getExistingSelector(selector1Name); selector2 = source.getExistingSelector(selector2Name); }
List<SourceImpl> sources = source.getInnerJoinSelectors(); List<JoinConditionImpl> conditions = source.getInnerJoinConditions(); estimatedCost = source.prepare().getEstimatedCost(); isSortedByIndex = canSortByIndex(); return; ExecutionPlan testPlan = test.prepare(); double cost = testPlan.getEstimatedCost(); if (best == null || cost < bestCost) { isPotentiallySlowJoin = false; test.unprepare(); best.prepare(bestPlan); estimatedCost = result.prepare().getEstimatedCost(); source = result; isSortedByIndex = canSortByIndex();
left.execute(rootState); leftNeedExecute = false; leftNeedNext = true; if (!left.next()) { end = true; return false; right.execute(rootState); foundJoinedRow = false; rightNeedExecute = false; if (!right.next()) { leftNeedNext = true; } else { if (right.isOuterJoinRightHandSide() && leftNeedNext && !foundJoinedRow) { return true;
private void applyJoinConditions() { switch (joinType) { case INNER: left.addJoinCondition(joinCondition, false); right.addJoinCondition(joinCondition, true); break; case LEFT_OUTER: left.setOuterJoin(true, false); right.setOuterJoin(false, true); left.addJoinCondition(joinCondition, false); right.addJoinCondition(joinCondition, true); break; case RIGHT_OUTER: // swap left and right // TODO right outer join: verify whether converting // to left outer join is always correct (given the current restrictions) joinType = JoinType.LEFT_OUTER; SourceImpl temp = left; left = right; right = temp; left.setOuterJoin(true, false); right.setOuterJoin(false, true); left.addJoinCondition(joinCondition, false); right.addJoinCondition(joinCondition, true); break; } }
@Override public SelectorImpl getSelector(String selectorName) { SelectorImpl s = left.getSelector(selectorName); if (s == null) { s = right.getSelector(selectorName); } return s; }
@Override public String getIndexCostInfo(NodeState rootState) { StringBuilder buff = new StringBuilder(); buff.append(toString()); buff.append("{ "); buff.append(left.getIndexCostInfo(rootState)); buff.append(", "); buff.append(right.getIndexCostInfo(rootState)); buff.append(" }"); return buff.toString(); }
@Override public ArrayList<SourceImpl> getInnerJoinSelectors() { ArrayList<SourceImpl> list = new ArrayList<SourceImpl>(); switch (joinType) { case INNER: list.addAll(left.getInnerJoinSelectors()); list.addAll(right.getInnerJoinSelectors()); break; case LEFT_OUTER: list.addAll(left.getInnerJoinSelectors()); break; case RIGHT_OUTER: list.addAll(right.getInnerJoinSelectors()); } return list; }
@Override public List<JoinConditionImpl> getInnerJoinConditions() { ArrayList<JoinConditionImpl> set = new ArrayList<JoinConditionImpl>(); switch (joinType) { case INNER: set.add(joinCondition); set.addAll(left.getInnerJoinConditions()); set.addAll(right.getInnerJoinConditions()); break; } return set; }
List<SourceImpl> sources = source.getInnerJoinSelectors(); List<JoinConditionImpl> conditions = source.getInnerJoinConditions(); estimatedCost = source.prepare().getEstimatedCost(); isSortedByIndex = canSortByIndex(); return; ExecutionPlan testPlan = test.prepare(); double cost = testPlan.getEstimatedCost(); if (best == null || cost < bestCost) { isPotentiallySlowJoin = false; test.unprepare(); best.prepare(bestPlan); estimatedCost = result.prepare().getEstimatedCost(); source = result; isSortedByIndex = canSortByIndex();
left.execute(rootState); leftNeedExecute = false; leftNeedNext = true; if (!left.next()) { end = true; return false; right.execute(rootState); foundJoinedRow = false; rightNeedExecute = false; if (!right.next()) { leftNeedNext = true; } else { if (right.isOuterJoinRightHandSide() && leftNeedNext && !foundJoinedRow) { return true;
private void applyJoinConditions() { switch (joinType) { case INNER: left.addJoinCondition(joinCondition, false); right.addJoinCondition(joinCondition, true); break; case LEFT_OUTER: left.setOuterJoin(true, false); right.setOuterJoin(false, true); left.addJoinCondition(joinCondition, false); right.addJoinCondition(joinCondition, true); break; case RIGHT_OUTER: // swap left and right // TODO right outer join: verify whether converting // to left outer join is always correct (given the current restrictions) joinType = JoinType.LEFT_OUTER; SourceImpl temp = left; left = right; right = temp; left.setOuterJoin(true, false); right.setOuterJoin(false, true); left.addJoinCondition(joinCondition, false); right.addJoinCondition(joinCondition, true); break; } }
@Override public SelectorImpl getSelector(String selectorName) { SelectorImpl s = left.getSelector(selectorName); if (s == null) { s = right.getSelector(selectorName); } return s; }
@Override public String getIndexCostInfo(NodeState rootState) { StringBuilder buff = new StringBuilder(); buff.append(toString()); buff.append("{ "); buff.append(left.getIndexCostInfo(rootState)); buff.append(", "); buff.append(right.getIndexCostInfo(rootState)); buff.append(" }"); return buff.toString(); }