@Override public Void visitLeftOuterJoinOperator(LeftOuterJoinOperator op, IOptimizationContext ctx) throws AlgebricksException { Map<LogicalVariable, EquivalenceClass> equivalenceClasses = new HashMap<LogicalVariable, EquivalenceClass>(); List<FunctionalDependency> functionalDependencies = new ArrayList<FunctionalDependency>(); ctx.putEquivalenceClassMap(op, equivalenceClasses); ctx.putFDList(op, functionalDependencies); ILogicalOperator opLeft = op.getInputs().get(0).getValue(); ILogicalOperator opRight = op.getInputs().get(1).getValue(); functionalDependencies.addAll(getOrComputeFDs(opLeft, ctx)); functionalDependencies.addAll(getOrComputeFDs(opRight, ctx)); equivalenceClasses.putAll(getOrComputeEqClasses(opLeft, ctx)); equivalenceClasses.putAll(getOrComputeEqClasses(opRight, ctx)); Collection<LogicalVariable> leftSideVars; if (opLeft.getSchema() == null) { leftSideVars = new LinkedList<LogicalVariable>(); VariableUtilities.getLiveVariables(opLeft, leftSideVars); // actually, not all produced vars. are visible (due to projection) // so using cached schema is better and faster } else { leftSideVars = opLeft.getSchema(); } ILogicalExpression expr = op.getCondition().getValue(); expr.getConstraintsForOuterJoin(functionalDependencies, leftSideVars); return null; }
@Override public void getConstraintsForOuterJoin(Collection<FunctionalDependency> fds, Collection<LogicalVariable> outerVars) { FunctionIdentifier funId = getFunctionIdentifier(); if (funId.equals(AlgebricksBuiltinFunctions.AND)) { for (Mutable<ILogicalExpression> a : arguments) { a.getValue().getConstraintsForOuterJoin(fds, outerVars); } } else if (funId.equals(AlgebricksBuiltinFunctions.EQ)) { ILogicalExpression opLeft = arguments.get(0).getValue(); ILogicalExpression opRight = arguments.get(1).getValue(); if (opLeft.getExpressionTag() == LogicalExpressionTag.VARIABLE && opRight.getExpressionTag() == LogicalExpressionTag.VARIABLE) { LogicalVariable var1 = ((VariableReferenceExpression) opLeft).getVariableReference(); LogicalVariable var2 = ((VariableReferenceExpression) opRight).getVariableReference(); if (outerVars.contains(var1)) { addFD(fds, var1, var2); } if (outerVars.contains(var2)) { addFD(fds, var2, var1); } } } }