Python言語スカラー関数

次の例は、数値の集合を合計する単純なスカラー関数を示している。 この例では、単純なAEを作るところから始める。 ファイル名は「applyop.py

コード

  1. nzae.Ae からクラスを派生させる。 ベースクラスはほとんどの作業を処理するので、通常は'class-method "run()"を呼び出す。 run()関数はクラスをインスタンス化し、エラー処理を設定し、適切な派生関数を呼び出す。 このようなUDFベースのAEでは、'_getFunctionResult()関数をオーバーライドしなければならない。 以下のコードを「applyop.pyファイルに保存する:
    import nzae
    class ApplyOpUdfAe(nzae.Ae):
    def _getFunctionResult(self, row):
    # OUR CUSTOM CODE WILL GO HERE.
    ApplyOpUdfAe.run()
  2. カスタムPythonコードを完成させる。 このUDFでは、2つの整数だけでなく、足し算ならプラス記号(+)、掛け算ならアスタリスク(*)を文字列演算子として渡す。 このコードは整数の積か和を返す。 SQLでは、この単純なバージョンはどちらかによって呼び出される:
    SELECT applyop('+', 3, 5);
    または
    SELECT applyop('*', 3, 5);
    前述の例では入力は1つだけだが、NPSシステムは入力のストリームを扱う。 従って、NPSシステムの方が利用しやすい:
    SELECT applyop(mytable.operator, mytable.value1, mytable.value2) FROM mytable;

    最初の例では、NPSシステムは定数 "+"、3、5を受け取り、それらを3つの要素を含む長さ1のストリームに変換する。 _getFunctionResult()によって、3つの要素を含む1つの行が "見える"。 内部的には、前述のケースはすべて同じように処理され、「applyopAEには複数の入力があると仮定できる。

  3. 入力を処理するループは、一度に1行を関数に渡すために必要なので、1行の入力を処理するカスタムコードを入力する:
    import nzae
    class ApplyOpUdfAe(nzae.Ae):
    def _getFunctionResult(self, row):
    # BREAK APART OUR ROW OF INPUT.
    operator, leftInput, rightInput = row
    # HANDLE ADDITION.
    if operator == "+":
    return leftInput + rightInput
    # HANDLE MULTIPLICATION.
    if operator == "*":
    return leftInput * rightInput
    # ERROR ON ALL OTHER.
    self.userError("Unhandled operator to ApplyOp: '" + operator + "'.")
    ApplyOpUdfAe.run()

    関数'self.userError()はSQLユーザーにエラーを報告する。 _getFunctionResult()で返されるものはすべて、SQL操作の結果である。 これはUDFとして実行されるため、結果には1つの列しか存在しない。 後の例では、UDTFを使って複数の列を出力する方法を示す。 コードが完成したら、デプロイして登録しなければならない。

コンパイル

PythonAEはコンパイルを必要としない。

デプロイメント

PythonAEはコンパイルを必要としないが、デプロイが必要である。 compile_aeコマンドは、スクリプトを共有エクスポートドライブ上のデフォルトの場所にデプロイする「--templateデプロイメントオプションと一緒に引き続き使用されます。
$NZ_EXPORT_DIR/ae/utilities/bin/compile_ae --language python64 \
--template deploy ./applyop.py --version 3

登録

Pythonファイルを登録します:
$NZ_EXPORT_DIR/ae/utilities/bin/register_ae --language python64 --version 3 \
--template udf --exe applyop.py --sig "applyop(varchar(1), int4, int4)" \
--return int4

実行中

これでAEをSQLで実行できるようになった:
SELECT applyop('+', 4, 10);
APPLYOP
---------
14
(1 row)
_getFunctionResult()の型を検証するために、'self.userError()が呼び出されることに注意。 次の例ではエラーが発生する:
SELECT applyop('-', 1, 2);
ERROR: Unhandled operator TO ApplyOp: '-'.