in asterix-graphix/src/main/java/org/apache/asterix/graphix/function/GraphixFunctionResolver.java [58:160]
public FunctionSignature resolve(CallExpr callExpr, boolean allowNonStoredUDFCalls) throws CompilationException {
FunctionSignature functionSignature = callExpr.getFunctionSignature();
DataverseName workingDataverseName = functionSignature.getDataverseName();
if (workingDataverseName == null) {
workingDataverseName = metadataProvider.getDefaultDataverseName();
}
// Attempt to **find** if a user-defined function exists. We do not resolve these calls here.
if (!workingDataverseName.equals(FunctionConstants.ASTERIX_DV)
&& !workingDataverseName.equals(FunctionConstants.ALGEBRICKS_DV)
&& !workingDataverseName.equals(GraphixFunctionIdentifiers.GRAPHIX_DV)) {
FunctionDecl functionDecl;
// First, try resolve the call with the given number of arguments.
FunctionSignature signatureWithDataverse = functionSignature;
if (functionSignature.getDataverseName() == null) {
signatureWithDataverse = new FunctionSignature(workingDataverseName, functionSignature.getName(),
functionSignature.getArity());
}
functionDecl = declaredFunctionMap.get(signatureWithDataverse);
// If this has failed, retry with a variable number of arguments.
FunctionSignature signatureWithVarArgs = new FunctionSignature(workingDataverseName,
functionSignature.getName(), FunctionIdentifier.VARARGS);
if (functionDecl == null) {
functionDecl = declaredFunctionMap.get(signatureWithVarArgs);
}
// We have found a function-declaration in our map. Return this...
if (functionDecl != null) {
if (!allowNonStoredUDFCalls && !functionDecl.isStored()) {
throw new CompilationException(ErrorCode.ILLEGAL_FUNCTION_USE, callExpr.getFunctionSignature(),
functionDecl.getSignature().toString());
}
return functionDecl.getSignature();
}
// ...otherwise, we need to search our metadata.
try {
Function function = metadataProvider.lookupUserDefinedFunction(signatureWithDataverse);
if (function == null) {
function = metadataProvider.lookupUserDefinedFunction(signatureWithVarArgs);
}
if (function != null) {
return function.getSignature();
}
} catch (AlgebricksException e) {
throw new CompilationException(ErrorCode.UNKNOWN_FUNCTION, e, callExpr.getSourceLocation(),
functionSignature.toString());
}
// If the dataverse was specified, we also need to make sure that this dataverse exists.
if (functionSignature.getDataverseName() != null) {
Dataverse dataverse;
try {
dataverse = metadataProvider.findDataverse(functionSignature.getDataverseName());
if (dataverse == null) {
throw new CompilationException(ErrorCode.UNKNOWN_DATAVERSE, callExpr.getSourceLocation(),
functionSignature.getDataverseName());
}
} catch (AlgebricksException e) {
throw new CompilationException(ErrorCode.UNKNOWN_DATAVERSE, e, callExpr.getSourceLocation(),
functionSignature.getDataverseName());
}
}
}
// We could not find a user-defined function. See if this is a Graphix-function call.
String graphixName = functionSignature.getName().toLowerCase().replaceAll("_", "-");
FunctionIdentifier graphixFunctionIdentifier = GraphixFunctionIdentifiers.getFunctionIdentifier(graphixName);
if (graphixFunctionIdentifier == null) {
graphixFunctionIdentifier = GraphixFunctionAliases.getFunctionIdentifier(graphixName);
}
if (graphixFunctionIdentifier != null) {
return new FunctionSignature(graphixFunctionIdentifier);
}
// This is neither a Graphix function nor a user-defined function. Attempt to resolve to a built-in function.
String builtInName = functionSignature.getName().toLowerCase();
String mappedName = CommonFunctionMapUtil.getFunctionMapping(builtInName);
if (mappedName != null) {
builtInName = mappedName;
}
int functionArity = functionSignature.getArity();
FunctionSignature builtInSignature = builtInFunctionResolver.apply(builtInName, functionArity);
if (builtInSignature != null) {
return builtInSignature;
}
// If we could not resolve this, try see if this is an aggregate function or window function.
builtInSignature = new FunctionSignature(FunctionConstants.ASTERIX_DV, builtInName, functionArity);
if (FunctionMapUtil.isSql92AggregateFunction(builtInSignature)
|| FunctionMapUtil.isCoreAggregateFunction(builtInSignature)
|| BuiltinFunctions.getWindowFunction(builtInSignature.createFunctionIdentifier()) != null) {
return builtInSignature;
}
// ...otherwise, this is an unknown function.
throw new CompilationException(ErrorCode.UNKNOWN_FUNCTION, callExpr.getSourceLocation(),
functionSignature.toString());
}