複合値の管理

Virtual DataPort には、単純型と複合型の 2 つのクラスのデータ型があります。複合型 (arrayregister) は Virtual DataPort の基本リレーションとビューの階層データを表します。

注釈

Virtual DataPort では、 array 型のエレメントはサブビューとして表示する必要があります。 array には常に register 型が関連付けられます。array に含まれる各サブエレメントは、この register データ型に属します。したがって、この register のフィールドは、モデル化するサブビューのスキーマとみなすことができます。複合フィールドのサブエレメントに演算子を適用する場合は、この点に留意することが重要です。

サーバー内のビューの各属性値は、URI と呼ばれる式を使用してタプル内で一意に識別されます。単純型に属する属性値に関連付けられた URI は、単に属性名のみで構成されます。一方、複合属性の値はツリーを使用して表され、リーフはアトミック値となります (つまり、単純データ型に属します)。これらのツリーの非リーフノードには次の 2 種類があります。

  • 配列 (array 型): ここから、配列を構成するサブエレメントを表す各ノードにアーチが伸びます (すべてが同じ register データ型に属します)。各アーチには、示されている配列サブエレメントの位置インデックスがタグ付けされます。位置インデックスは記号「[」と「]」で囲まれて記述されます。

  • レジスター (register 型): ここから、レジスターを構成するサブエレメントを表す各ノードにアーチが伸びます (各サブエレメントはレコードの 1 つのフィールドに関連付けられ、レコードは異なるデータ型に属していてもかまいません)。各アーチにはフィールド名がタグ付けされます。

さらに、属性名が付いたアーチはツリーのルートを示します。

このツリーでは、同じノードを識別する URI は、ルートから始まってツリーを下に移動し、必要なノードに到達するまで、さまざまなアーチ名を連結して取得されます (連結時に文字「.」で区切られます。ただし、配列インデックスの場合は異なり、角括弧で囲まれてインデックス値が示されます)。最後に、文字列の先頭に属性値が連結されます。さらに、array 型ノードの URI でインデックスが指定されていない場合、その URI は配列の値のリストを示します。

そのため、次の 2 種類の URI を区別することができます。

  1. 単純型または register 型の値を示す URI。

    このタイプの URI は、クエリの SELECT 句で使用するか、 GROUP BY 句で group-by 属性として使用できます。さらに、単純型の値をポイントしている場合、この URI は、クエリステートメントの SELECTWHEREGROUP BY などの句で、他のすべての単純型属性と同じように使用できます。また、 ROW および { } コンストラクター (「 複合値を使用した条件 」を参照) を使用して複合値を作成し、条件の右側で使用することもできます。この場合、演算子 =<> のみを使用でき、条件の右側と左側の URI のデータ型には互換性がなければなりません (つまり、アーチ名を除き、ツリーが等しくなければなりません)。

  2. 値のリストを示す URI。これらの URI は array の値に対応しているため、サブリレーションとみなすことができます。つまり、array の各エレメントはタプルで、このタプルのスキーマは、 array に関連付けられた register エレメントフィールドによって定義されます。

    このタイプの URI は次のようなシナリオで使用できます。

    1. WHERE 句の条件では、これらの URI を条件の左側に記述できます。この場合、それらの条件は、URI によってモデル化されたサブリレーションに対する条件である場合と同様に評価されます。

    2. FROM 句で使用されるフラット化ビュー。「 FLATTEN ビュー (データ構造のフラット化) 」を参照。

    3. 集約関数 (「 集計関数の使用 」を参照) は、このタイプの URI をサポートします。