4.3.7. OData Metadata(Data Virtualization がリレーショナルデータベースを OData の $metadata に変換する方法)

OData は Conceptual Schema Definition Language(CSDL)を使用してスキーマを定義します。Data Virtualization の ACTIVE 状態の VDB は、CSDL 形式で表示されるメタデータを公開します。たとえば、vdb のメタデータを取得する場合は、以下のような要求を発行する必要があります。

http://localhost:8080/odata/$metadata

OData スキーマモデルはリレーショナルデータベースモデルではないため、Data Virtualization は以下のセマンティクスを使用して、リレーショナルデータベースモデルを OData スキーマモデルにマッピングします。

リレーショナルデータベースマッピングされた OData エンティティー

モデル名

スキーマ名前空間、EntityContainer Name

テーブル/ビュー

EntityType、EntitySet

テーブルカラム

EntityType のプロパティー

プライマリーキー

EntityType のキープロパティー

外部キー

EntityType のナビゲーションプロパティー

手順

FunctionImport、actionImport

テーブルのテーブルを返す手順

ComplexType

設計による Data Virtualization は、EntityType の "embedded" ComplexType を定義しません。

OData のアクセスはキーベースであるため、すべてのテーブル Data Virtualization が OData 経由で公開する MANDATORY であるため、PK または少なくとも 1 つの UNIQUE キーが必要です。上記のいずれかではない表は、$metadata からドロップされます。

すべてのデータロールは OData メタデータの構築で参照されないため、テーブルや手順を明示的に非表示にする必要がある場合があります。これは、オブジェクトの拡張メタデータプロパティー「teiid_odata:visible」で行うことができます。

create foreign table HIDDEN (id long primary key, ...) OPTIONS ("teiid_odata:visible" false);

teiid_odata:visible を false に設定すると、OData レイヤーは指定されたオブジェクトを公開しません。

データタイプマッピング

Data Virtualization タイプ

OData Type

STRING

Edm.String

BOOLEAN

Edm.Boolean

BYTE

Edm.SByte

SHORT

Edm.Int16

INTEGER

Edm.Int32

LONG

Edm.Int64

FLOAT

Edm.Single

DOUBLE

Edm.Double

BIG_INTEGER

Edm.Decimal

BIG_DECIMAL

Edm.Decimal

DATE

Edm.Date

TIME

Edm.TimeOfDay

TIMESTAMP

Edm.DateTimeOffset

BLOB

Edm.Stream

CLOB

Edm.Stream

XML

Edm.Stream

VARBINARY

Edm.Binary

geography および Geometry は、関連する {http://www.teiid.org/translator/spatial/2015}type プロパティーに基づいて、対応する Edm.GeometryXXX および Edm.GeographyXXX タイプにマッピングされます。Edm.Geometry または EdmGeography への一般的なマッピングは、値を正しくシリアライズできません。

可能な場合、配列タイプはコレクションタイプにマップされます。ただし、多次元のアレイを含めることはできません。また、配列/コレクションの値はパラメーターまたは比較として使用できません。

4.3.7.1. 関数およびアクション

エンティティーとそのプロパティーのマッピングは比較的簡単です。Data Virtualization の手順の OData Functions および Actions へのマッピングがより関与します。DDL(Java クラスではない)で定義された仮想手順、ソース手順、および仮想機能はすべてマッピングの対象となります。Java クラスによって定義されるソース機能または Virtual Function は、現在対応する OData コンストラクトにマッピングされません。その機能が必要な場合は、問題をログに記録してください。OData には out パラメーターの概念がないため、OUT パラメーターは無視され、INOUT パラメーターは IN としてのみ処理されます。結果セットは、コンプレックスタイプのコレクション結果にマッピングされます。配列の結果は単純な型のコレクションにマップされます。

以下の場合、OData Function が使用されます。

  • 手順/機能には戻り値(スカラーまたは結果セットのいずれか)があります。
  • 手順/関数には LOB 入力パラメーターがありません。現在、Clob、Blob、Meometry、Geography、および JSON は LOB タイプとみなされます。
  • 手順/機能は無料です。これは、更新数に対して 0 の明示的な値で決定されます。例: CREATE VIRTUAL PROCEDURE …​ OPTIONS(UPDATECOUNT 0)AS BEGIN …​

これらの条件のいずれかが満たされない場合は、代わりに OData Action によって手順/機能が表示されます。ただし、LOB 値を持つ結果セットがある場合は、複数のストリーミング値を返すことができないため、この手順はマッピングされません。

OData Functions と Actions は異なる方法で呼び出されることに注意してください。Function は、パラメーター値が URI に含まれる GET リクエストによって呼び出されます。Action は、コンテンツがパラメーター値を提供する POST によって呼び出されます。

現在、バインドされていない機能およびアクションのみが互換性があります。

手順/機能のマッピング方法を検証するには、機能およびアクションについて $metadata を常に確認してください。