private boolean isUnnestingFunction(ILogicalExpression expr) { if (expr.getExpressionTag() == LogicalExpressionTag.FUNCTION_CALL) { AbstractFunctionCallExpression fce = (AbstractFunctionCallExpression) expr; return fce.getKind() == FunctionKind.UNNEST; } return false; } }
private boolean isStatefulFunctionCall(ILogicalExpression expr) { return expr.getExpressionTag() == LogicalExpressionTag.FUNCTION_CALL && ((AbstractFunctionCallExpression) expr) .getKind() == AbstractFunctionCallExpression.FunctionKind.STATEFUL; } }
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); } } }
protected ILogicalExpression makeUnnestExpression(ILogicalExpression expr) { SourceLocation sourceLoc = expr.getSourceLocation(); List<Mutable<ILogicalExpression>> argRefs = new ArrayList<>(); argRefs.add(new MutableObject<>(expr)); switch (expr.getExpressionTag()) { case CONSTANT: case VARIABLE: UnnestingFunctionCallExpression scanCollExpr1 = new UnnestingFunctionCallExpression( FunctionUtil.getFunctionInfo(BuiltinFunctions.SCAN_COLLECTION), argRefs); scanCollExpr1.setSourceLocation(sourceLoc); return scanCollExpr1; case FUNCTION_CALL: AbstractFunctionCallExpression fce = (AbstractFunctionCallExpression) expr; if (fce.getKind() == FunctionKind.UNNEST) { return expr; } else { UnnestingFunctionCallExpression scanCollExpr2 = new UnnestingFunctionCallExpression( FunctionUtil.getFunctionInfo(BuiltinFunctions.SCAN_COLLECTION), argRefs); scanCollExpr2.setSourceLocation(sourceLoc); return scanCollExpr2; } default: return expr; } }
} else { AbstractFunctionCallExpression fce = (AbstractFunctionCallExpression) unnestExpr; if (fce.getKind() != FunctionKind.UNNEST) { exit = true;