1. 程式人生 > >Presto 標量函式註冊和呼叫過程簡述

Presto 標量函式註冊和呼叫過程簡述

在[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