カスタム関数の戻り値の型

カスタム関数の戻り値の型が array または register である場合や、入力値に依存する場合は、その関数のパラメーターに基づいて関数の型を返す追加のメソッドを実装する必要があります。

関数が複数のシグネチャを持ち、シグネチャがこれらの条件のいずれかに該当する場合は、シグネチャごとにこの追加メソッドが必要です。

Java のアノテーションを使用して開発したカスタム関数の場合、この追加メソッドには CustomExecutorReturnType のアノテーションが付いていなければなりません。名前規則を使用して開発したカスタム関数の場合は、メソッド名が executeReturnType でなければなりません。

この追加メソッドは以下の規則に従う必要があります。

  1. この追加メソッドは、「execute」メソッドと同じ数のパラメーターを持っている必要があります。

  2. この追加メソッドの各パラメーターの型は、 execute メソッドのそれぞれのパラメーターの型と同一または同等のものでなければなりません。

    1. execute が基本の Java の型を返す場合、この追加メソッドは同じ基本 Java クラスを返す必要があります。たとえば、 executeString オブジェクトを返す場合、この追加メソッドは java.lang.String.class を返す必要があります。

    2. executeCustomRecordValue オブジェクトを返す場合、この追加メソッドは CustomRecordType オブジェクトを返す必要があります。

    3. executeCustomArrayValue オブジェクトを返す場合、この追加メソッドは CustomArrayType オブジェクトを返す必要があります。Virtual DataPort でこれらの戻り値パラメーターに必要となる型については、表「 Java と Virtual DataPort の同等のデータ型 」を参照してください。

    4. execute のいずれかのパラメーターが CustomRecordValue の場合、この追加メソッドでのパラメーターの型は CustomRecordType でなければなりません。

    5. execute のいずれかのパラメーターが CustomArrayValue の場合、この追加メソッドでのパラメーターの型は CustomArrayType でなければなりません。

#. If the returned type is a compound data type, the type will be created in Virtual DataPort, unless it already exists. If the returned type does not have name, the type will be created with a random name.

実行時に、この関数が呼び出されるたびに、Virtual DataPort はこの追加メソッドを実行して、関数の戻り値の型を判断します。

以下の 2 つのセクションでは、アノテーションを使用した関数と、名前規則を使用した関数でのこの追加メソッドの実装方法の例を示しています。

戻り値の型が入力に依存する、アノテーションを使用していない関数

指定した正規表現との一致部分の言語で文字列を分割し、それらの部分文字列の配列を返す関数 SPLIT の実装:

戻り値の型が入力に依存する、アノテーションを使用していない関数の例
 public class SplitVdpFunction {
     private static final String STRING_FIELD = "string";
     public CustomArrayValue execute(String regex, String value) {
         if (value == null || regex == null) {
             return null;
         }
         String[] result = value.split(regex);
         LinkedHashMap<String, Object> results =
                 new LinkedHashMap<String, Object>(1);
         List<CustomRecordValue> arrayValues =
                 new ArrayList<CustomRecordValue>(result.length);
         for (String string : result) {
             results.put(STRING_FIELD, string);
             CustomRecordValue recordValue =
                     CustomElementsUtil.createCustomRecordValue(results);
             arrayValues.add(recordValue);
         }
         return CustomElementsUtil.createCustomArrayValue(arrayValues);
     }

     public CustomArrayType executeReturnType(String regex, String value){
         LinkedHashMap<String, Object> props =
                 new LinkedHashMap<String, Object>();
         props.put(STRING_FIELD, String.class);
         CustomRecordType record =
                 CustomElementsUtil.createCustomRecordType(props);
         CustomArrayType array =
                 CustomElementsUtil.createCustomArrayType(record);
         return array;
     }
 }

アノテーションを使用した集計関数

次の関数は、各グループについて、非 group-by フィールドの最初の値を返します。

アノテーションを使用した集計関数の例
 @CustomElement(
       type=CustomElementType.VDPAGGREGATEFUNCTION, name="FIRST_RECORD")
 public class FirstRecordFunction {

     @CustomExecutor
     public CustomRecordValue execute(
             @CustomGroup(groupType=CustomRecordValue.class, name="records")
                 CustomGroupValue<CustomRecordValue> records) {

         if(records == null) {
             return null;
         }
         if(records.size() == 0) {
             return null;
         }

         return records.getValue(0);
     }

     @CustomExecutorReturnType
     public CustomRecordType executeReturnType(
             CustomRecordType recordType) {

         return recordType;
     }
 }
アノテーションを使用した集計関数の例
 @CustomElement(type=CustomElementType.VDPAGGREGATEFUNCTION, name="FUNCTION_F1")
 public class FirstRecordFunction {

     @CustomExecutor
     public Long execute(
             @CustomGroup(groupType=Long.class, name="values")
                 CustomGroupValue<Long> records) {

         ...
         ...
         return ...
     }

     @CustomExecutorReturnType
     public Class executeReturnType(Long values) {

         return Long.class;
     }
 }