ApplyOperation

このセクションのコードはApplyOperation.javaというファイルに保存される。

コンセプト

これは"ApplyOp"の例のバリエーションで、以下のような変更が加えられている:
  • データ処理ロジックは接続作成ロジックから分離された。 このスタンドアロン・クラスは、異なる接続ロジックを使用する複数のAEサンプル・アプリケーションで再利用される。
  • このAEは、入力行を取得するために、コールバックパラダイムではなく、ファイルIOパラダイムを使用する。 コールバック・パラダイムの例については、Java言語スカラー関数のMyHandlerを参照のこと。
  • コードは減算演算子をサポートしている。
この関数AEは、入力行1つにつき正確に1つの出力行を書き込み、出力行には正確に1つの列が含まれるため、AEはスカラー関数またはテーブル関数から呼び出すことができることに注意してください。

コード

// ApplyOperation.java
// Function AE
// Performs arithmetic operations (+, -, or *)
// across columns in a row
// Ignores non-numeric columns
// First argument column must be a string type operation
// Handles a variable number of input columns and data types
// Returns a double result
// Can be called as a table function or a scalar function
package org.netezza.education;

import java.io.*;
import java.math.BigDecimal;
import java.text.DateFormat;
import java.sql.Date;
import java.sql.Time;
import java.sql.Timestamp;
import org.netezza.ae.*;

public class ApplyOperation {
    private static final int OP_ADD = 1;
    private static final int OP_MULT = 2;
    private static final int OP_SUBTRACT = 3;

    public static void runAe(Nzae ae) {
        final NzaeMetadata meta = ae.getMetadata();

        for (;;) {
            int op = 0;
            double result = 0;
            NzaeRecord input = ae.next();
            if (input == null) {
                break;
            }
            NzaeRecord output = ae.createOutputRecord();

            for (int i = 0; i < input.size(); i++) {
                if (input.getField(i) == null) {
                    continue;
            }

                int dataType = meta.getInputNzType(i);

                if (i == 0) {
                    if (!(dataType == NzaeDataTypes.NZUDSUDX_FIXED
                            || dataType ==
                                NzaeDataTypes.NZUDSUDX_VARIABLE)) {
                        ae.userError(
                            "first column must be a string");
                    }
                    String opStr = input.getFieldAsString(0);
                    if (opStr.equals("*")) {
                        result = 1;
                        op = OP_MULT;
                    } else if (opStr.equals("+")) {
                        result = 0;
                        op = OP_ADD;
                    } else if (opStr.equals("-")) {
                       result = 0;
                       op = OP_SUBTRACT;
                    } else {
                       ae.userError("invalid operator = " + op);
                    }
                    continue;
                }

                switch (dataType) {
                case NzaeDataTypes.NZUDSUDX_INT8:
                case NzaeDataTypes.NZUDSUDX_INT16:
                case NzaeDataTypes.NZUDSUDX_INT32:
                case NzaeDataTypes.NZUDSUDX_INT64:
                case NzaeDataTypes.NZUDSUDX_FLOAT:
                case NzaeDataTypes.NZUDSUDX_DOUBLE:
               case NzaeDataTypes.NZUDSUDX_NUMERIC32:
               case NzaeDataTypes.NZUDSUDX_NUMERIC64:
               case NzaeDataTypes.NZUDSUDX_NUMERIC128:
                   switch (op) {
                   case OP_ADD:
                       result +=
                           input.getFieldAsNumber(i).doubleValue();
                       break;
                   case OP_SUBTRACT:
                       result -=
                           input.getFieldAsNumber(i).doubleValue();
                       break;
                   case OP_MULT:
                       result *=
                           input.getFieldAsNumber(i).doubleValue();
                       break;
                   default:
                       break;
                   }
                   break;

               default:
                   break;
               }
           }   // end of column for loop

           output.setField(0, result);
           ae.outputResult(output);
       }

       ae.done();
    }
}