日時型および時間間隔型の処理

ここでは、日時値を返すカスタムラッパーを開発する方法について説明します。

カスタムラッパーを開発する際には、ラッパーのメインクラスで、カスタムラッパーの出力スキーマを定義する getSchemaParameters(Map<String, String> inputValues) メソッドをオーバーライドする必要があります。このメソッドは、 CustomWrapperSchemaParameter オブジェクトの配列を返す必要があります。 CustomWrapperSchemaParameter クラスのコンストラクターの 2 番目のパラメーターは type パラメーターです。このパラメーターの値は、 java.sql.Types クラスの定数です。

次の表は、以下の間のマッピングを示しています。

  • Denodo のデータ型と、 CustomWrapperSchemaParameter のコンストラクターに渡す必要がある java.sql.Types クラスの定数

  • Denodo のデータ型と、カスタムラッパーが返す必要がある Java オブジェクトのクラス

Denodo のデータ型

java.sql.Types クラスの定数

Java クラス

localdate

Types.DATE

java.time.LocalDate

time

Types.TIME

java.time.LocalTime

timestamp

Types.TIMESTAMP

java.time.LocalDateTime

timestamptz

Types.TIMESTAMP_WITH_TIMEZONE

java.time.OffsetDateTime

intervaldaysecond

JDBCTypeUtil.INTERVAL_DAY_SECOND

java.time.Duration

intervalyearmonth

JDBCTypeUtil.INTERVAL_YEAR_MONTH

java.time.Period

JDBCTypeUtil = com.denodo.vdb.vdbinterface.common.clientResult.vo.descriptions.type.util.JDBCTypeUtil

日時型フィールドを持つカスタムラッパーのパラメーターの定義
public CustomWrapperSchemaParameter[] getSchemaParameters(
        Map<String, String> inputValues) {

    return new CustomWrapperSchemaParameter[] {

          new CustomWrapperSchemaParameter("date_field", Types.DATE)
        , new CustomWrapperSchemaParameter("timestamp_field", Types.TIMESTAMP)
        , new CustomWrapperSchemaParameter("timestamptz_field", Types.TIMESTAMP_WITH_TIMEZONE)
        , new CustomWrapperSchemaParameter("time_field", Types.TIME)
        , new CustomWrapperSchemaParameter("intervalyear_month",
              JDBCTypeUtil.INTERVAL_YEAR_MONTH)
        , new CustomWrapperSchemaParameter("intervalday_second",
              JDBCTypeUtil.INTERVAL_DAY_SECOND) };
}

下のコードで、カスタムラッパーが返す Java オブジェクトは、上の表に従った適切なオブジェクトになっていることに注意してください。たとえば、 getSchemaParameters() メソッドの「date_field」フィールドは Types.DATE 定数を指定して作成されています。上の表では、この型のパラメーターは「localdate」型に対応し、結果のオブジェクトは java.time.LocalDate でなければなりません。

日時値を返すカスタムラッパーの run() メソッド
void run(CustomWrapperConditionHolder condition,
      List<CustomWrapperFieldExpression> projectedFields,
      CustomWrapperResult result,
      Map<String,String> inputValues)
      throws CustomWrapperException {

    // ...
    // ...

    result.addRow(new Object[]{
            LocalDate.parse("2017-10-11"),
            LocalDateTime.parse("2015-03-08T01:59:59"),
            OffsetDateTime.parse("2015-03-08T01:59:59+01:00"),
            LocalTime.parse("21:15:45"),
            Duration.ofHours(65).plusMinutes(23),
            Period.ofMonths(25)},
            projectedFields);

    result.addRow(new Object[]{
            sdf.parse("2017-10-11"),
            sdf.parse("2015-03-08 01:59:59"),
            sdf.parse("2015-03-08 01:59:59 +01:00"),
            sdf.parse("21:15:45"),
            Duration.ofHours(65).plusMinutes(23),
            Period.ofMonths(25)},
            projectedFields);
}

下位互換性を維持するために、現在ではまだ、カスタムラッパーで「localdate」型、「timestamp」型、「timestamptz」型、および「time」型に対して java.util.Date オブジェクトを返すことができます。ただし、この型のオブジェクトを返す処理は、Denodo の将来のメジャーバージョンではサポートされなくなる可能性があります。