複合型の処理: 例

タイトルとさまざまな著者で書籍をモデル化するリレーションを定義するものとします。以下の属性を使用できます。

  • TITLE: 単純型 (text)。

  • AUTHOR: 複合型。より具体的には、さまざまな著者がおり、著者ごとにその名と姓、連絡先住所のリストを表すものとします。前述のように、array 型はサブリレーションをモデル化するので、register 型を使用してこのリレーションのスキーマを示す必要があります。したがって、サブリレーション AUTHOR には、単純型 NAME および SURNAME のサブ属性と、連絡先住所のリストを格納するその他の array 型複合属性 (CONTACT) が含まれる、関連付けられた register 型があることになります。 CONTACT は別のサブリレーションを表し、サブ属性 MAILADDRESS で構成されるスキーマを使用します。 MAIL は単純型で、 ADDRESS はサブ属性 STREETPLACE 、および COUNTRY で構成される register です。

Trees of compound elements 」に、型 AUTHOR のツリーを示します。型 AUTHOR のエレメントを表すデータ型は、以下のステートメントを使用して作成できます。

CREATE TYPE address AS REGISTER OF (
    STREET:text,
    CITY:text,
    COUNTRY:text
);

CREATE TYPE contactAddress AS REGISTER OF (
    MAIL:text,
    ADDRESS:address
);

CREATE TYPE contactAddressArray AS ARRAY OF contactAddress;

CREATE TYPE author AS REGISTER OF (
    NAME:text,
    SURNAME:text,
    CONTACTADDRESS:contactAddressArray
);

CREATE TYPE authorArray AS ARRAY OF author;
Trees of compound elements

複合エレメントのツリー

Tuple with compound elements 」は、このビューのタプルとその内部表現の例を示しています。

複合エレメントのタプル

TITLE

AUTHOR

Book

NAME

SURNAME

CONTACTADRESS

Name 1

Surname1

MAIL

ADRESS

Author1@authors.com

STREET

CITY

COUNTRY

Street1

City1

Country1

MAIL

ADRESS

Author2@authors.com

STREET

CITY

COUNTRY

Street2

City2

Country2

NAME

SURNAME

CONTACTADRESS

Name 3

Surname3

MAIL

ADRESS

Author3@authors.com

STREET

CITY

COUNTRY

Street3

City3

Country3

MAIL

ADRESS

Author4@authors.com

STREET

CITY

COUNTRY

Street4

City4

Country4

TITLE

AUTHOR

Book

NAME

SURNAME

CONTACTADRESS

Name 1

Surname1

MAIL

ADRESS

Author1@authors.com

STREET

CITY

COUNTRY

Street1

City1

Country1

MAIL

ADRESS

Author2@authors.com

STREET

CITY

COUNTRY

Street2

City2

Country2

NAME

SURNAME

CONTACTADRESS

Name 3

Surname3

MAIL

ADRESS

Author3@authors.com

STREET

CITY

COUNTRY

Street3

City3

Country3

MAIL

ADRESS

Author4@authors.com

STREET

CITY

COUNTRY

Street4

City4

Country4

Tree of Compound-type values 」に、値ツリーの構造を示します。

Tree of Compound-type values

複合型値のツリー

このリレーションをモデル化する基本リレーションを作成できます。

複合型を用いた基本リレーションの作成
CREATE TABLE BOOK I18N es_euro (
    TITLE:text (SEARCH),
    AUTHOR:authorArray
);

また、リレーションの ラッパー を作成する必要もあります。ここでも同じように、 ラッパー によって返されるデータのスキーマは、リレーションのスキーマと互換性がなければならない点に注意してください。つまりこの場合、 ラッパー では、データが複合値の形式で返される必要があります。

注釈

複合型、ラッパー、および基本ビューを手動で作成しなくても済むように、Administration Tool を使用してデータソースをインポートし、基本ビューを作成することを強くお勧めします。

たとえば、次の図は、ITPilot Wrapper を作成して必要なデータを取得するための VQL 文の一部を示しています。定義された出力スキーマがリレーションのスキーマとどのように互換性があるかに注意してください。

複合型を用いたラッパーの作成
CREATE WRAPPER ITP BOOK_sm1
    OUTPUTSCHEMA (
        TITLE,
        AUTHOR : ARRAY OF
            AUTHOR : REGISTER OF (
                NAME,
                SURNAME,
                CONTACTADDRESS : ARRAY OF
                    CONTACTADDRESS : REGISTER OF (
                        MAIL,
                        ADDRESS : ARRAY OF
                            ADDRESS : REGISTER OF (
                                STREET,
                                CITY,
                                COUNTRY
                            )
                       )
                   )
               )
  ... Wrapper definition ...;

ラッパー を作成したら、 BOOK リレーションに検索メソッドを定義できます (「 基本ビューの変更 」を参照)。ほとんどの場合、クエリ制限は単純データ型を示す URI に対してのみ定義します (このことは、複合型属性がサブリレーションであるかのようにみなされるという事実と一致します)。ただし、複合型を示す URI に制限を追加することもできます (この場合、条件の右側のオペランドをコンストラクター ROW{ } を使用して作成すること、および演算子 =<> のみが使用可能です)。次の文は、使用可能な検索メソッドを追加します (複合 URI AUTHOR.CONTACTADDRESS に対する制限が含まれている点に注意してください)。

複合型を用いた検索メソッドの追加
ALTER TABLE BOOK
   ADD SEARCHMETHOD BOOK_SM1 (
     CONSTRAINTS (
        ADD TITLE                                    NOS ZERO ()
        ADD AUTHOR.NAME                              NOS ZERO ()
        ADD AUTHOR.SURNAME                           NOS ZERO ()
        ADD AUTHOR.CONTACTADDRESS                    NOS ZERO ()
        ADD AUTHOR.CONTACTADDRESS.MAIL               NOS ZERO ()
        ADD AUTHOR.CONTACTADDRESS.ADDRESS.STREET     NOS ZERO ()
        ADD AUTHOR.CONTACTADDRESS.ADDRESS.CITY       NOS ZERO ()
        ADD AUTHOR.CONTACTADDRESS.ADDRESS.COUNTRY    NOS ZERO ()
    )
    OUTPUTLIST (TITLE, AUTHOR)
    WRAPPER (itp book)
);

注釈

条件クエリに複合属性の URI を指定する場合、テーブル名と属性名の区別が曖昧になるのを避けるために、属性名を括弧で囲んで指定します。

最後に、このリレーションに対して実行できるクエリの例をいくつか示します。

  1. タイトルに「java」という語を含むすべての書籍のタイトルと著者名を取得します。

    SELECT TITLE, LIST((AUTHOR).NAME) AS AUTHORLIST
    FROM BOOK
    WHERE TITLE like '%java%'
    GROUP BY TITLE;
    
  2. タイトルに「java」という語を含む書籍のタイトルと各著者の連絡先住所のリストを検索します。

    SELECT TITLE, LIST((AUTHOR).CONTACTADDRESS) AS AUTHORLIST
    FROM BOOK
    WHERE TITLE like '%java%'
    GROUP BY TITLE
    
  3. タイトルに「java」という語を含むすべての書籍のタイトルと各著者の第 1 メールアドレスを検索します。

    SELECT TITLE,LIST((AUTHOR).CONTACTADDRESS[0].MAIL) AS AUTHORLIST
    FROM BOOK
    WHERE TITLE like '%java%'
    GROUP BY TITLE
    
  4. タイトルに「java」という語を含み、 .es という語を含むメールアドレスを持つ著者が 1 人以上いるすべての書籍のタイトルと各著者の名前を検索します。

    SELECT TITLE, LIST((AUTHOR).NAME) AS AUTHORLIST
    FROM BOOK
    WHERE (TITLE like '%java%')
          AND ((AUTHOR).CONTACTADDRESS.MAIL like '%.es%' )
    GROUP BY TITLE
    
  5. タイトルに「java」という語を含み、住所に Real が含まれる著者が 1 人以上いるすべての書籍のタイトルと各著者の名前を検索します。

    SELECT TITLE, LIST((AUTHOR).NAME) AS AUTHORLIST
    FROM BOOK
    WHERE (TITLE like '%java%')
          AND ((AUTHOR).CONTACTADDRESS.ADDRESS.STREET like '%Real%')
    GROUP BY TITLE
    
  6. 連絡先住所が 1 つで、メールアドレスが john@mail.com で、市区町村 Madrid (Spain) の番地 Real に住んでいる著者によって書かれた書籍を検索します。

    SELECT TITLE, AUTHOR
    FROM BOOK
    WHERE (AUTHOR).CONTACTADDRESS =
     { ROW('john@mail.com',{ROW('Real', 'Madrid', 'Spain')}) }