Presto 標量函式註冊和呼叫過程簡述
阿新 • • 發佈:2020-09-28
在[Presto 函式開發](https://note.youdao.com/)一文中已經介紹過如何進行函式開發,本文主要講述標量函式(Scalar Function)實現之後,是如何在Presto內部進行註冊和被呼叫的。主要講述標量函式是因為:三類函式的註冊和呼叫過程略有不同,而實際查詢中呼叫最多的是標量函式。
## 標量函式註冊
函式在能夠呼叫之前,首先要進行註冊,上一篇文章已經介紹過函式註冊的方法,那麼函式在註冊時究竟註冊了哪些資訊呢?函式註冊實際上是維護FunctinoRegistry類中的一個 MultiMap,Key 為函式的限定名(QualifiedName,可以簡單地理解為函式名),Value 為`SqlFunction`介面的實現類,實際主要為`SqlAggregationFunction`、`SqlWindowFunction`和`SqlScalarFunction`這三個類的子類。`SqlScalarFunction`是一個抽象類,定義如下:
```
public abstract class SqlScalarFunction
implements SqlFunction
{
private final Signature signature;
protected SqlScalarFunction(Signature signature)
{
this.signature = requireNonNull(signature, "signature is null");
checkArgument(signature.getKind() == SCALAR, "function kind must be SCALAR");
}
@Override
public final Signature getSignature()
{
return signature;
}
public abstract ScalarFunctionImplementation specialize(BoundVariables boundVariables, int arity, TypeManager typeManager, FunctionRegistry functionRegistry);
public static PolymorphicScalarFunctionBuilder builder(Class clazz)
{
return new PolymorphicScalarFunctionBuilder(clazz);
}
}
```
可以看出,其子類需要獲取`Signature`和實現`specialize`方法。
首先來看`Signature`:
```
public final class Signature
{
private final String name;
private final FunctionKind kind;
private fi