カスタム関数の開発

カスタム関数を使用すると、Virtual DataPort で利用可能な一連の関数を拡張することができます。カスタム関数は、複数の Java クラスを 1 つの Jar ファイルに含め、この Jar ファイルを Virtual DataPort に追加することで実装します (管理ガイドの「 拡張機能のインポート 」を参照)。このようなカスタム関数は、 MAXMINSUM などの他のすべての関数と同じように使用できます。

Virtual DataPort では、条件や集計のカスタム関数を作成できます。各関数は異なる Java クラスでなければなりませんが、複数の Java クラスを 1 つの Jar ファイルにまとめることができます。

Virtual DataPort のインストール環境 (ディレクトリ <DENODO_HOME>/samples/vdp/customFunctions) に、カスタム関数のサンプルがいくつかあります。このディレクトリの README ファイルでは、これらのサンプルをコンパイルして使用する方法について説明しています。

カスタム関数を開発して Virtual DataPort にインポートした後は、Denodo ナレッジベースの記事「 How to debug Denodo custom extensions with Eclipse 」を読んでデバッグ方法について確認してください。


カスタム関数は、Java のアノテーションを使用して開発することを強くお勧めします (「 アノテーションを使用したカスタム関数の作成 」を参照)。一定の名前規則に従ってカスタム関数を開発することも可能ですが (「 名前規則を使用したカスタム関数の作成 」を参照)、この方法で開発したカスタム関数は Denodo Platform が提供するすべての機能にアクセスできるわけではありません。

以下に、すべてのカスタム関数に適用される規則を示します。カスタム関数を正常に動作させるためには、これらの規則に従う必要があります。

  • 同じ名前の複数のカスタム関数を使用することはできません。Jar に同じ名前のカスタム関数が複数含まれている場合、サーバーはその Jar から何も読み込みません。

  • 同じ Jar に格納されているすべてのカスタム関数は、その Jar をサーバーにアップロードまたは削除することによって、まとめて追加または削除されます。

  • 各関数は複数のシグネチャを持つことができます。各シグネチャは、そのカスタム関数を定義している Java クラスの異なるメソッドを表します。

  • 関数はアリティ n を持つことができますが、n 回繰り返すことができるのは、そのシグネチャの最後のパラメーターのみです。

  • 関数はステートレスでなければなりません。つまり、実行をまたがってデータを関数に保存すべきではありません。たとえば、グローバル変数は使用しないでください。カスタム関数がステートフルとして実装されている場合、一部のシナリオでは正常に動作しない可能性があります。

複合型の値 (レジスターまたは配列) を返すカスタム関数のシグネチャには、戻り値の型の構造を計算するための追加のメソッドが必要です。このメソッドにより、Virtual DataPort はクエリの出力スキーマを事前に認識できます。このメソッドは、出力型がカスタム関数の入力値に依存する場合にも必要です。

カスタム関数を定義する際に、単純型は Java オブジェクトから Virtual DataPort データオブジェクトに直接マップされます。次の表に、このマッピングの仕組みと、使用可能な Java の型を示します。

Java と Virtual DataPort の同等のデータ型

Virtual DataPort の型

Java クラス

blob

byte[]

boolean

java.lang.Boolean

date (非推奨)

java.util.Calendar

decimal

java.math.BigDecimal

double

java.lang.Double

float

java.lang.Float

int

java.lang.Integer

intervaldaysecond

java.time.Duration

intervalyearmonth

java.time.Period

localdate

java.time.LocalDate

long

java.lang.Long

text

java.lang.String

time

java.time.LocalTime

timestamp

java.time.LocalDateTime

timestamptz

java.time.ZonedDateTime および java.util.Calendar

intlongdouble などのプリミティブ型はカスタム関数のパラメーターに使用できません。代わりに、 java.lang.Integerjava.lang.Longjava.long.Double などを使用してください。

関数の最後のパラメーターは「varargs」引数にすることができます。次に例を示します。

function1(Integer parameter1, String... parameterN)

Virtual DataPort で、この関数は可変数の引数を持ちます。


カスタム関数がサードパーティのライブラリに依存する場合は、以下を行ってください。

  • 必要な jar ファイルの内容をカスタム関数が含まれている jar にコピーします。必要な jar ファイル自体ではなく、その jar の内容をコピーする必要があります。

  • または、必要な jar ファイルを <DENODO_HOME>/extensions/thirdparty/lib ディレクトリにコピーします。一般的には、使用するライブラリが Denodo Platform の他のライブラリとやり取りしないことが確実な場合を除き、このディレクトリに jar ファイルをコピーすることは推奨しません。たとえば、Apache Commons のライブラリをこのディレクトリにコピーした場合、Virtual DataPort サーバーで何らかの誤動作が発生する可能性があります。