protected CreateResult doCreateFunction()

in asterix-graphix/src/main/java/org/apache/asterix/graphix/app/translator/GraphixQueryTranslator.java [173:222]


    protected CreateResult doCreateFunction(MetadataProvider metadataProvider, CreateFunctionStatement cfs,
            FunctionSignature functionSignature, IStatementRewriter stmtRewriter, IRequestParameters requestParameters)
            throws Exception {
        // Before executing our parent, analyze our function body for graph dependencies.
        Set<DependencyIdentifier> graphDependencies = new HashSet<>();
        GraphStatementHandlingUtil.collectDependenciesOnGraph(cfs.getFunctionBodyExpression(),
                cfs.getFunctionSignature().getDataverseName(), graphDependencies);

        // Execute the parent CREATE-FUNCTION function. Ensure that our FUNCTION is valid.
        CreateResult createResult =
                super.doCreateFunction(metadataProvider, cfs, functionSignature, stmtRewriter, requestParameters);
        if (createResult == CreateResult.NOOP) {
            return createResult;
        }

        // Our function is valid. Proceed by inserting / upserting a new dependence record.
        DataverseName dataverseName = functionSignature.getDataverseName();
        GraphStatementHandlingUtil.acquireGraphExtensionWriteLocks(metadataProvider, dataverseName,
                cfs.getFunctionSignature().toString());
        MetadataTransactionContext mdTxnCtx = MetadataManager.INSTANCE.beginTransaction();
        metadataProvider.setMetadataTxnContext(mdTxnCtx);

        // If we have an existing requirement record, fetch it first.
        DataverseName activeDataverseName = functionSignature.getDataverseName();
        Optional<FunctionRequirements> existingRequirements = GraphixMetadataExtension
                .getAllEntityRequirements(mdTxnCtx).stream()
                .filter(r -> r.getDataverseName().equals(activeDataverseName))
                .filter(r -> r.getDependentKind() == IEntityRequirements.DependentKind.FUNCTION)
                .map(r -> (FunctionRequirements) r).filter(f -> f.getEntityName().equals(functionSignature.getName()))
                .filter(f -> Integer.parseInt(f.getArityAsString()) == functionSignature.getArity()).findFirst();
        if (existingRequirements.isPresent() && !cfs.getReplaceIfExists()) {
            throw new CompilationException(ErrorCode.COMPILATION_ERROR, cfs.getSourceLocation(),
                    "Graph dependency record for " + functionSignature.getName() + " already exists.");
        }

        // Insert / upsert into our GraphDependency dataset.
        if (!graphDependencies.isEmpty()) {
            FunctionRequirements requirements = new FunctionRequirements(cfs.getFunctionSignature(), graphDependencies);
            if (!existingRequirements.isPresent()) {
                MetadataManager.INSTANCE.addEntity(mdTxnCtx, requirements);

            } else {
                MetadataManager.INSTANCE.upsertEntity(mdTxnCtx, requirements);
            }
        }
        MetadataManager.INSTANCE.commitTransaction(mdTxnCtx);

        // Exit here. Our parent will release all locks.
        return createResult;
    }