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;
}