カスタム関数の戻り値の型¶
カスタム関数の戻り値の型が array
または register
である場合や、入力値に依存する場合は、その関数のパラメータに基づいて関数の型を返す追加のメソッドを実装する必要があります。
関数が複数のシグネチャを持ち、シグネチャがこれらの条件のいずれかに該当する場合は、シグネチャごとにこの追加メソッドが必要です。
Java のアノテーションを使用して開発したカスタム関数の場合、この追加メソッドには CustomExecutorReturnType
のアノテーションが付いていなければなりません。名前規則を使用して開発したカスタム関数の場合は、メソッド名が executeReturnType
でなければなりません。
この追加メソッドは以下の規則に従う必要があります。
この追加メソッドは、「execute」メソッドと同じ数のパラメータを持っている必要があります。
この追加メソッドの各パラメータの型は、
execute
メソッドのそれぞれのパラメータの型と同一または同等のものでなければなりません。execute
が基本の Java の型を返す場合、この追加メソッドは同じ基本 Java クラスを返す必要があります。たとえば、execute
がString
オブジェクトを返す場合、この追加メソッドはjava.lang.String.class
を返す必要があります。execute
がCustomRecordValue
オブジェクトを返す場合、この追加メソッドはCustomRecordType
オブジェクトを返す必要があります。execute
がCustomArrayValue
オブジェクトを返す場合、この追加メソッドはCustomArrayType
オブジェクトを返す必要があります。Virtual DataPort でこれらの戻り値パラメータに必要となる型については、表「 Java と Virtual DataPort の同等のデータ型 」を参照してください。execute
のいずれかのパラメータがCustomRecordValue
の場合、この追加メソッドでのパラメータの型はCustomRecordType
でなければなりません。execute
のいずれかのパラメータがCustomArrayValue
の場合、この追加メソッドでのパラメータの型はCustomArrayType
でなければなりません。
戻り値の型が複合データ型の場合、そのデータ型がまだ存在していなければ Virtual DataPort に作成されます。戻り値の型に名前がなければ、ランダムな名前でその型が作成されます。
実行時に、この関数が呼び出されるたびに、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;
}
}