private Pair createProcedureJob()

in asterix-bad/src/main/java/org/apache/asterix/bad/lang/statement/CreateProcedureStatement.java [179:216]


    private Pair<JobSpecification, PrecompiledType> createProcedureJob(IStatementExecutor statementExecutor,
            MetadataProvider metadataProvider, IHyracksClientConnection hcc, Stats stats) throws Exception {
        if (getProcedureBodyStatement().getKind() == Statement.Kind.INSERT) {
            if (!varList.isEmpty()) {
                throw new CompilationException("Insert procedures cannot have parameters");
            }
            InsertStatement insertStatement = (InsertStatement) getProcedureBodyStatement();
            dependencies.get(0)
                    .add(new Triple<>(statementExecutor.getActiveDataverseName(insertStatement.getDataverseName()),
                            insertStatement.getDatasetName(), null));
            return new Pair<>(((QueryTranslator) statementExecutor).handleInsertUpsertStatement(metadataProvider,
                    getProcedureBodyStatement(), hcc, null, ResultDelivery.ASYNC, null, stats, true, null, null, null),
                    PrecompiledType.INSERT);
        } else if (getProcedureBodyStatement().getKind() == Statement.Kind.QUERY) {
            //TODO: Fix type dependency computation
            SqlppRewriterFactory fact = new SqlppRewriterFactory(new SqlppParserFactory());
            dependencies.get(1).addAll(FunctionUtil.getFunctionDependencies(fact.createQueryRewriter(),
                    ((Query) getProcedureBodyStatement()).getBody(), metadataProvider).get(1));
            Pair<JobSpecification, PrecompiledType> pair = new Pair<>(BADJobService.compileQueryJob(statementExecutor,
                    metadataProvider, hcc, (Query) getProcedureBodyStatement()), PrecompiledType.QUERY);
            dependencies.get(0).addAll(FunctionUtil.getFunctionDependencies(fact.createQueryRewriter(),
                    ((Query) getProcedureBodyStatement()).getBody(), metadataProvider).get(0));
            return pair;
        } else if (getProcedureBodyStatement().getKind() == Statement.Kind.DELETE) {
            getProcedureBodyStatement().accept(SqlppDeleteRewriteVisitor.INSTANCE, metadataProvider);
            DeleteStatement delete = (DeleteStatement) getProcedureBodyStatement();

            SqlppRewriterFactory fact = new SqlppRewriterFactory(new SqlppParserFactory());
            dependencies = FunctionUtil.getFunctionDependencies(fact.createQueryRewriter(), delete.getQuery().getBody(),
                    metadataProvider);
            Pair<JobSpecification, PrecompiledType> pair =
                    new Pair<>(((QueryTranslator) statementExecutor).handleDeleteStatement(metadataProvider,
                            getProcedureBodyStatement(), hcc, true, null, null), PrecompiledType.DELETE);
            return pair;
        } else {
            throw new CompilationException("Procedure can only execute a single delete, insert, or query");
        }
    }