@Override public Void visitDataScanOperator(DataSourceScanOperator op, IOptimizationContext ctx) throws AlgebricksException { ILogicalOperator inp1 = op.getInputs().get(0).getValue(); Map<LogicalVariable, EquivalenceClass> eqClasses = getOrCreateEqClasses(op, ctx); Map<LogicalVariable, EquivalenceClass> propagatedEqClasses = getOrComputeEqClasses(inp1, ctx); eqClasses.putAll(propagatedEqClasses); ctx.putEquivalenceClassMap(op, eqClasses); List<FunctionalDependency> fds = new ArrayList<FunctionalDependency>(getOrComputeFDs(inp1, ctx)); ctx.putFDList(op, fds); op.getDataSource().computeFDs(op.getVariables(), fds); return null; }
List<LogicalVariable> usedVariables) throws AlgebricksException { ILogicalOperator op2 = op.getInputs().get(0).getValue(); Map<LogicalVariable, EquivalenceClass> eqClasses = getOrCreateEqClasses(op, ctx); List<FunctionalDependency> fds = new ArrayList<FunctionalDependency>(); ctx.putFDList(op, fds);
private void fdsEqClassesForAbstractUnnestOperator(AbstractUnnestOperator op, IOptimizationContext ctx) throws AlgebricksException { ILogicalOperator inp1 = op.getInputs().get(0).getValue(); Map<LogicalVariable, EquivalenceClass> eqClasses = getOrCreateEqClasses(op, ctx); Map<LogicalVariable, EquivalenceClass> propagatedEqClasses = getOrComputeEqClasses(inp1, ctx); /** * The original eq classes of unnest-map are only for produced * variables, therefore eqClasses and propagatedEqClasses do not have * overlaps. */ eqClasses.putAll(propagatedEqClasses); ctx.putEquivalenceClassMap(op, eqClasses); List<FunctionalDependency> fds = getOrComputeFDs(inp1, ctx); ctx.putFDList(op, fds); ILogicalExpression expr = op.getExpressionRef().getValue(); if (expr.getExpressionTag() == LogicalExpressionTag.FUNCTION_CALL) { AbstractFunctionCallExpression afe = (AbstractFunctionCallExpression) expr; if (afe.getKind() == FunctionKind.UNNEST && ((UnnestingFunctionCallExpression) afe).returnsUniqueValues()) { List<LogicalVariable> vars = new ArrayList<LogicalVariable>(); VariableUtilities.getLiveVariables(op, vars); ArrayList<LogicalVariable> h = new ArrayList<LogicalVariable>(); h.addAll(op.getVariables()); FunctionalDependency fd = new FunctionalDependency(h, vars); fds.add(fd); } } }