クライアント アプリケーション開発者ガイド

     前へ  次へ    新しいウィンドウでTOCを開く     
コンテンツに進む

高度なトピック

この章では、BEA AquaLogic Data Services Platform を使用したクライアント プログラムに関するさまざまな機能について説明します。 トピックは以下のとおりです。

 


カタログ サービスを使用したメタデータへのアクセス

BEA AquaLogic Data Services Platform はシステム カタログ タイプ データ サービスである Catalog Services を通じて、データ サービス、アプリケーション、関数、スキーマに関するメタデータを保持します。 カタログ サービスは、任意の AquaLogic Data Services Platform アプリケーション、データ サービス、スキーマ、関数と関係に関する情報をプログラム的に取得するために、クライアント アプリケーション開発者に便利な方法を提供します。 カタログ サービスはデータ サービスでもあるので、AquaLogic データ サービス コンソール、AquaLogic Data Services Platform Palette およびデータ サービス コントロールを使用して表示することができます。

カタログ サービスを使用する利点は以下のとおりです。

この節では、あらゆる AquaLogic Data Services Platform アプリケーションでメタデータにアクセスできるよう、カタログ サービスのインストールと使用の詳細を説明します。 この章の内容は以下のとおりです。

カタログ サービスのインストール

カタログ サービスは、AquaLogic Data Services Platform アプリケーションのプロジェクトとして、または WebLogic Workshop のライブラリ フォルダへ追加する JAR ファイルとしてインストールすることができます。 カタログ サービス プロジェクト (_catalogservices) には、アプリケーション、フォルダ、データ サービス、関数、スキーマおよびアプリケーションで使用可能な関係の情報を提供するデータサービスが含まれています。

DataServiceRef と SchemaRef は追加データサービスで、AquaLogic Data Services Platform アプリケーションで使用可能なデータ サービスとスキーマのパスを取得する関数から構成されます。 カタログ サービスで使用可能なデータサービスと関数の詳細については、カタログ サービスの使用を参照してください。

プロジェクトとしてカタログ サービスをインストールするには、以下の手順に従います。

  1. WebLogic Workshop で AquaLogic Data Services Platform アプリケーションを右クリックします。
  2. 開発にカタログ サービスを使う場合は、図11-1 に示すように、[カタログ サービスのインストール (拡張)] オプションを選択します。 実行中のみにカタログ サービスが必要な場合は、[カタログ サービスのインストール (Jar)] オプションを選択する。
  3. 図 11-1 カタログ サービスのインストール

    カタログ サービスのインストール

カタログ サービスの使用

カタログ サービスのインストール後、AquaLogic Data Services Platform アプリケーション用にカタログ サービスプロジェクトの _catalogservices が作成されます。 このプロジェクトでは、カタログ サービスに関連するすべてのデータサービスが使用可能です。 データサービス関数を呼び出して、メタデータにアクセスできます。 カタログ サービス メソッドを呼び出すには、クライアントの Mediator API を使用します。

_catalogservices にあるデータ サービスには以下のトピックが含まれています。

注意 : カタログ サービスで使用可能なデータ サービス関数を使用するには、以下のサイトで利用できるコード サンプルを参照してください。
注意 : http://dev2dev.bea.com/wiki/pub/CodeShare/Sample1/catalogsrv_output.zip

アプリケーション (application.ds)

以下の表には、Application.ds にある getApplication() 関数の宣言と説明が示されています。

表 11-2 Application.ds に含まれる関数
関数の宣言
説明
getApplication() as schema-element(t1:Application) external;
この関数は、AquaLogic Data Services Platform アプリケーション名を返す。 パラメータは不要。

DataService (DataService.ds)

表 11-3 は DataService.ds で使用可能な関数の宣言と説明を示します。

表 11-3 DataService.ds に含まれる関数
関数の宣言
説明
サンプル入力
getDataServiceRef($arg as element(md:DataService)) as element(md:DataServiceRef) {$arg/md:DataServiceRef}
この関数は、関数と関連するデータサービスのパスを返す。
この関数については、以下の項目を指定する必要がある。
  • データ サービスのパス
  • データ サービス用のスキーマのパス
  • データサービスの参照が必要な関数の関数 ID
<urn:DataService kind="javaFunction" xmlns:acc="ld:RTLAppDataServices/CustomerDB/Customer" xmlns:urn="urn:metadata.ld.bea.com">
<urn:DataServiceRef>
<id>
ld:RTLAppDataServices/CustomerDB/Customer.ds</id>
</urn:DataServiceRef>
<returnType name="CUSTOMER" kind="read" quantifier="*" schemaId="ld:RTLAppDataServices/CustomerDB/schemas/CUSTOMER.xsd"/>
<!--Zero or more repetitions:-->
<key>
<!--1 or more repetitions:--> <path>ld:RTLAppDataServices/CustomerDB/Customer.ds</path>
</key>
<!--Zero or more repetitions:-->
<urn:FunctionId name="CUSTOMER" arity="0"/>
</urn:DataService>
getDataService($x1 as element(t1:DataServiceRef)) as schema-element(t1:DataService)? external
この関数はスキーマ パス、関数およびリレーショナル データ ソースのような指定データサービスの属性を返す。
必要な結果を取得するデータ サービスのパスを指定する。
<DataServiceRef xmlns="urn:metadata.ld.bea.com">
<id xmlns="">ld:DataServices/CustomerDB/CUSTOMER.ds</id>
</DataServiceRef>

DataServiceRef (DataServiceRef.ds)

以下の表は DataServiceRef.ds で使用可能な関数の宣言と説明を示します。

表 11-4 DataService に含まれる関数
関数の宣言
説明
サンプル入力
getDataServiceRefsByFolder($x1 as xsd:string, $x2 as xsd:boolean) as schema-element(t1:DataServiceRef)* external
この関数はプロジェクト内のフォルダにあるデータ サービスを返す。 プロジェクト フォルダのパスを指定し、この関数のブール値を true に設定する必要がある。
文字列パラメータは ld:RTLAppDataServices/CustomerDB/
ブールは値は true
getDataServiceRefs() as schema-element(t1:DataServiceRef)* external
この関数は、プロジェクトに含まれるデータサービスすべてにパスを返す。 パラメータは不要。
入力は不要。
getDependents($x1 as element(t1:DataServiceRef), $x2 as xsd:boolean) as schema-element(t1:DataServicRef)* external
この関数は、データ サービスが依存するデータサービスのパスを返す。
この関数では、依存関係を決定したいデータサービスのパスを指定しなければならない。 たとえば、CUSTOMER.ds の依存関係を知りたい場合は、データ サービスのパスを以下のように指定する。
ld:DataServices/CustomerDB/CUSTOMER.ds
<urn:DataServiceRefdat xmlns:urn="urn:metadata.ld.bea.com"> <id>ld:DataServices/CustomerDB/CUSTOMER.ds</id>
</urn:DataServiceRef>
getDependencies($x1 as element(t1:DataServiceRef), $x2 as xsd:boolean) as schema-element(t1:DataServiceRef)* external
この関数は、指定されたデータサービスの依存関係を返す。
この関数では、依存関係を決定したいデータサービスのパスを指定しなければならない。
<urn:DataServiceRef xmlns:urn="urn:metadata.ld.bea.com"> <id>ld:DataServices/Demo/CustomerProfile.ds</id>
</urn:DataServiceRef>
getFunctions($x1 as element(t1:DataServiceRef)) as schema-element(t1:Function)* external
この関数は、関数の種類、アリティ、およびスキーマ パスのような属性とデータ サービスのリストを返す。
この関数では、データ サービスのパスを入力として指定する。
<DataServiceRef xmlns="urn:metadata.ld.bea.com">
<id xmlns="">ld:RTLAppDataServices/CustomerDB/CUSTOMER.ds</id>
</DataServiceRef>
getRelationships($x1 as element(t1:DataServiceRef)) as schema-element(t1:Relationship)* external
この関数は、指定されたデータ サービスと関係があるデータ サービスのパスを取得する。 ld:RTLAppDataServices/CustomerDB/CUSTOMER.ds のように、データ サービスのパスを指定する必要がある。
DataServiceRef xmlns="urn:metadata.ld.bea.com">
<id xmlns="">ld:RTLAppDataServices/CustomerDB/CUSTOMER.ds</id>
</DataServiceRef>
getSchemaRefs($arg as element(t1:DataServiceRef), $transitive as xs:boolean) as element(t1:SchemaRef)* external
この関数では、データ サービスのパスを入力し、関連スキーマのリストを取得するブール値を true に設定する。 この関数は、指定されたデータ サービスと関係があるデータ サービス用スキーマのパスを表示する。
<urn:DataServiceRef xmlns:urn="urn:metadata.ld.bea.com"> <id>ld:RTLAppDataServices/CustomerDB/CUSTOMER.ds</id>
</urn:DataServiceRef>
Enter true as the boolean parameter.
getDataService($x1 as element(t1:DataServiceRef)) as schema-element(t1:DataService)? external
この関数はスキーマパス、関数およびリレーショナル データ ソースのような指定データサービスの属性を返す。
必要な結果を取得するデータ サービスのパスを指定する。
<urn:DataServiceRef xmlns:urn="urn:metadata.ld.bea.com">
<id xmlns="">ld:RTLAppDataServices/CustomerDB/CUSTOMER.ds</id>
</urn:DataServiceRef>

フォルダ (folder.ds)

以下の表は Folder.ds. で使用可能な関数の宣言と説明を示します。

表 11-5 Folder.ds に含まれる関数
関数の宣言
説明
サンプル入力
getFolder() as schema-element(t1:Folder)* external
この関数は、AquaLogic Data Services Platform プロジェクトに存在するフォルダとデータ サービスへのパスのリストを提供する。 パラメータは不要。
入力は不要。
getFolder($x1 as xsd:string, $x2 as xsd:boolean) as schema-element(t1:Folder)* external
このフォルダは、指定されたフォルダに存在するすべてのデータ サービスのパスを返す。 この関数については、以下の要素を含む 2 つのパラメータを指定する必要がある。
  • ld:RTLAppDataServices/CustomerDB のようなフォルダのパス。
  • ブール値 (通常 true に設定)
  • パラメータ 1 (文字列) = ld:RTLAppDataServices/CustomerDB
  • パラメータ 2 (ブール) = true
getDataServiceRefs($x1 as element(t1:Folder)) as schema-element(t1:DataServiceRef)* external
この関数は、フォルダに存在するデータ サービスのパスを提供する。 この取得するには、フォルダのパスを入力として指定する。
<Folder xmlns="urn:metadata.ld.bea.com">
<id xmlns="">ld:RTLAppDataServices/CustomerDB</id>
</Folder>

関数 (Function.ds)

以下の表に Function.ds の関数の宣言と説明を示す。

表 11-6 Function.ds の関数
関数の宣言
説明
サンプル入力
getFunctionById($x1 as element(t1:FunctionId)) as schema-element(t1:Function) external
この関数は、指定された関数について関数アリティ、関数の種類、戻り値型情報とともにデータ サービスとスキーマのパスを返す。
この関数では、関数 ID とアリティを入力として指定する。
<FunctionId name=" cus:CUSTOMER " arity="0" xmlns:cus="ld:RTLAppDataServices/CustomerDB/CUSTOMER" xmlns="urn:metadata.ld.bea.com"/>
getDataService($arg as element(md:Function)) as element(md:DataService)
この関数は、指定された関数について関数アリティと物理データソース情報を返す。
この関数では、関数 ID、データサービスとスキーマのパスを指定する必要がある。
<?xml version="1.0" encoding="UTF-8" ?>
<urn:Function kind="read" xmlns:acc="ld:RTLAppDataServices/CustomerDB/CUSTOMER"
xmlns:urn="urn:metadata.ld.bea.com">
<urn:FunctionId arity="0" name="acc:getAll"></urn:FunctionId>
<returnType kind="element" name="urn:Account" quantifier="1" schemaId="ld:RTLAppDataServices/CustomerDB/schemas/CUSTOMER.xsd">
</returnType>
<urn:DataServiceRef> <id>ld:RTLAppDataServices/CustomerDB/CUSTOMER.ds</id>
</urn:DataServiceRef>
</urn:Function>
getRelationship($arg as element(md:Function)) as element(md:Relationship) external
この関数は、関係の対象とナビゲーション関数と関係があるデータ サービスのパスを返す。
関数 ID、データ サービスのパス、およびスキーマを入力として指定する。

注意 : この関数は、ナビゲーション関数にしか適用できない。

<?xml version="1.0" encoding="UTF-8" ?>
<urn:Function kind="navigate" xmlns:acc="ld:RTLAppDataServices/CustomerDB/Customer" xmlns:urn="urn:metadata.ld.bea.com">
<urn:FunctionId arity="1" name="acc:getDISCOUNT">
</urn:FunctionId>
<returnType kind="element" name="urn:getDISCOUNT" quantifier="1" schemaId="ld:RTLAppDataServices/CustomerDB/schemas/CUSTOMER.xsd">
</returnType>
<parameter name="arg">
<type kind="navigate" name="urn:DISCOUNT" quantifier="*" schemaId="ld:RTLAppDataServices/CustomerDB/CUSTOMER.xsd">
</type>
</parameter>
<urn:DataServiceRef>
<id>ld:RTLAppDataServices/CustomerDB/CUSTOMER.ds</id>
</urn:DataServiceRef>
<roleName>DISCOUNT</roleName>
</urn:Function>
getSchemaRefs($x1 as element(t1:Function), $x2 as xsd:boolean) as schema-element(t1:SchemaRef)* external
この関数では、関数 ID とデータサービスのパスを指定して、データサービスに関連付けられたスキーマのパスを取得する。
<urn:Function kind="navigate" xmlns:acc="ld:RTLAppDataServices/CustomerDB/CUSTOMER" xmlns:urn="urn:metadata.ld.bea.com">
<urn:FunctionId name="acc:getDISCOUNT" arity="1"/>
<returnType name="DISCOUNT" kind="element" quantifier="*" schemaId="ld:RTLAppDataServices/CustomerDB/schemas/CUSTOMER.xsd"/>
<!--Zero or more repetitions:-->
<parameter name="arg">
<type name="DISCOUNT" kind="element" quantifier="*" schemaId="ld:RTLAppDataServices/CustomerDB/schemas/CUSTOMER.xsd"/>
</parameter>
<urn:DataServiceRef>
<id>ld:RTLAppDataServices/CustomerDB/Customer.ds</id>
</urn:DataServiceRef>
<!--Optional:-->
<roleName>DISCOUNT</roleName>
</urn:Function>

関係 (Relationship.ds)

以下の表は Relationship.ds. で使用可能な関数の宣言と説明を示す。

注意 : Relationship.ds の関数は、ナビゲーション関数のみに使われるメタデータへのアクセスに使用できる。

表 11-7 Relationship.ds の関数
関数の宣言
説明
サンプル入力
getFunctions($arg as element(md:Relationship)) as element(md:Function)
この関数は、入力として指定した関数の属性を返す。 この関数については、以下のパラメータを指定する必要がある。
  • 文字列パラメータ = データ サービスのパス
  • 関数 ID
  • minOccurs および maxOccurs の値
<urn:Relationship xmlns:acc="ld:RTLAppDataServices/CustomerDB/CUSTOMER" xmlns:urn="urn:metadata.ld.bea.com">
<!--1 to 2 repetitions:-->
<relationshipTarget roleName="DISCOUNT" minOccurs="1" maxOccurs="1" description="">
<urn:DataServiceRef>
<id>ld:RTLAppDataServices/CustomerDB/CUSTOMER.ds</id>
</urn:DataServiceRef>
<!--Zero or more repetitions:-->
<urn:FunctionId name="acc:getDISCOUNT" arity="1"/>
</relationshipTarget>
</urn:Relationship>
getDataServiceRefs($x1 as element(t1:Relationship)) as schema-element(t1:DataServiceRef)
この関数では、以下のパラメータをに指定する必要があります。
  • 文字列パラメータ = データ サービスのパス
  • 関数 ID
  • minOccurs および maxOccurs の値
<urn:Relationship xmlns:acc="ld:RTLAppDataServices/CustomerDB/CUSTOMER" xmlns:urn="urn:metadata.ld.bea.com">
<!--1 to 2 repetitions:-->
<relationshipTarget roleName="DISCOUNT" minOccurs="1" maxOccurs="1" description="">
<urn:DataServiceRef>
<id>ld:RTLAppDataServices/CustomerDB/CUSTOMER.ds</id>
</urn:DataServiceRef>
<!--Zero or more repetitions:-->
<urn:FunctionId name="acc:getDISCOUNT" arity="1"/>
</relationshipTarget>
</urn:Relationship>
getDataServices($arg as element(md:Relationship)) as element(md:DataService)
この関数は、データ サービスのナビゲーション関数のリレーショナル データソースや関数アリティなどの属性を返す。 この関数については、以下のパラメータを指定する必要がある。
  • 文字列パラメータ = データ サービスのパス
  • 文字列パラメータ = スキーマのパス
  • maxOccurs および minOccurs の値
  • 関数 ID
<?xml version="1.0" encoding="UTF-8" ?>
<urn:Relationship xmlns:acc="ld:RTLAppDataServices/CustomerDB/CUSTOMER" xmlns:urn="urn:metadata.ld.bea.com">
<relationshipTarget description="" maxOccurs="1" minOccurs="1" roleName="DISCOUNT">
<urn:DataServiceRef>
<id>
ld:RTLAppDataServices/CustomerDB/CUSTOMER.ds</id>
</urn:DataServiceRef>
<urn:FunctionId arity="1" name="acc:getDISCOUNT">
</urn:FunctionId>
</relationshipTarget>
<relationshipTarget description="" maxOccurs="1" minOccurs="1" roleName="DISCOUNT" xmlns:acc="ld:RTLAppDataServices/CustomerDB/CUSTOMER">
<urn:DataServiceRef>
<id>ld:RTLAppDataServices/CustomerDB/CUSTOMER.ds</id>
</urn:DataServiceRef>
<urn:FunctionId arity="1" name="acc:getDISCOUNT">
</urn:FunctionId>
</relationshipTarget>
</urn:Relationship>

スキーマ (Schema.ds)

以下の表は Schema.ds. で使用可能な関数の宣言と説明を示す。

表 11-8 Schema.ds の関数
関数の宣言
説明
サンプル入力
getSchema($x1 as element(t1:SchemaRef)) as schema-element(t1:Schema)* external
この関数は、データ サービスに関連付けられたスキーマのスキーマ属性を返す。 アクセスするスキーマのパスを文字列パラメータとして指定する必要がある。 例:
ld:RTLAppDataServices/CustomerDB/schemas/CUSTOMER.xsd
<urn:SchemaRef xmlns:urn="urn:metadata.ld.bea.com">
<id>ld:RTLAppDataServices/CustomerDB/schemas/CUSTOMER.xsd</id>
</urn:SchemaRef>
getSchemaRef($x1 as element(t1:Schema)) as schema-element(t1:SchemaRef)
この関数は、データサービスのスキーマのパスを返す。
スキーマの参照を取得するためスキーマのパスを指定する。 例:
ld:RTLAppDataServices/CustomerDB/schemas/CUSTOMER_TABLE.xsd
<urn:Schema xmlns:urn="urn:metadata.ld.bea.com">
<urn:SchemaRef>
<id>ld:RTLAppDataServices/CustomerDB/schemas/CUSTOMER_TABLE.xsd</id>
</urn:SchemaRef>
</urn:Schema>

SchemaRef (SchemaRef.ds)

以下の表は SchemaRef.ds. で使用可能な関数の宣言と説明を示す。

表 11-9 SchemaRef.ds の関数
関数の宣言
説明
サンプル入力
getDependencies($x1 as element(t1:SchemaRef), $x2 as xs:boolean) as schema-element(t1:SchemaRef)* external
この関数は、指定されたデータサービスの依存関係を返す。
データサービス用のスキーマのパスを文字列パラメータとして指定する必要がある。 例:
ld:DataServices/Demo/schemas/CustomerProfile.xsd
<urn:SchemaRef xmlns:urn="urn:metadata.ld.bea.com">
<id xmlns="">ld:DataServices/Demo/schemas/CustomerProfile.xsd</id>
</urn:SchemaRef>
2 番目のパラメータはブール値で、truefalse になる。
getSchema($x1 as element(md:SchemaRef)) as schema-element(md:Schema)* external
この関数はデータサービスに関連付けられたスキーマを返す。
データサービス用のスキーマのパスを文字列パラメータとして指定する必要がある。 例:
ld:RTLAppDataServices/CustomerDB/schemas/CUSTOMER.xsd
<urn:SchemaRef xmlns:urn="urn:metadata.ld.bea.com">
<id>ld:RTLAppDataServices/CustomerDB/schemas/CUSTOMER.xsd</id>
</urn:SchemaRef>

 


クエリ結果のフィルタ、ソート、微調整

フィルタ API により、クライアント アプリケーションはデータ サービス関数によって戻される情報にフィルタ条件を適用できます。 ある意味では、フィルタは、関数によりデータ オブジェクトをどのように実体化するか、また、関数をどのように戻すかをより詳細に指定することで、クライアント アプリケーションがデータ サービス インタフェースを拡張することを可能にします。

フィルタ API により、データ サービスの設計者は、クライアントが要求する可能性があるすべてのデータ ビューを予測しなくてもすむようになり、また、各ビューにデータ サービス関数を実装する必要がなくなります。 代わりに、設計者は、ビジネス エントリにアクセスするために、インタフェースをより幅のある一般的なものとして指定し、フィルタを通じてクライアント アプリケーションから思いとおりにビューをコントロールすることができます。

関数が返すオブジェクトのうち、条件と一致するオブジェクトだけが、クライアントに戻されます。 (サーバで評価されますので、フィルタされたオブジェクトはネットワークにより渡されることはありません。 フィルタにより除かれたオブジェクトは、基底のソースから取得さえできません。) フィルタは、XQuery や SQL 文の WHERE 句に似て、可能性のある結果セットに条件を適用します。 ANDOR 演算子を使って、複数のフィルタ条件を適用できます。 フィルタ条件に適用できる他の演算子は、表 11-10 のリストに表示されています。

表 11-10 フィルタ演算子
演算子
使用上の注意または使用例
LESS_THAN
「<」を使うこともできる。 例 : myFilter.addFilter("CUST/CUST_ORDER/ORDER", "CUST/CUST_ORDER/ORDER/ORDER_AMOUNT", ">", "1000");
myFilter.addFilter("CUST/CUST_ORDER/ORDER", "CUST/CUST_ORDER/ORDER/ORDER_AMOUNT", FilterXQuery.GREATER_THAN, "1000");
GREATER_THAN
「>」を使うこともできる。
LESS_THAN_EQUAL
「<=」を使うこともできる。
GREATER_THAN_EQUAL
「>=」を使うこともできる。
EQUAL
「=」を使うこともできる。
NOT_EQUAL
「!=」を使うこともできる。
MATCHE
文字列の一致の検査
sql-like
文字列が特定のパターンを含むかどうかの検査
OR
1 つ以上のフィルタに適用可能な複数の機能を持つ演算子
NOT
1 つ以上のフィルタに適用可能な複数の機能を持つ演算子
AND
1 つ以上のフィルタに適用可能な複数の機能を持つ演算子

注意 : フィルタ API Javadoc は他の AquaLogic Data Services Platform API とともに、「AquaLogic Data Services Platform Mediator API Javadoc」に記述されています。

 


フィルタの使用

フィルタ機能は、Mediator および Data Service コントロール クライアント アプリケーションが使用できます。 フィルタ条件を使用して、戻すデータを特定したり、データをソートしたり、戻されるレコードの数に制限をかけることができます。 Mediator クライアント アプリケーションでフィルタを使用するには、適切なパッケージをインポートし、与えられたインタフェースを使用してフィルタ条件を生成、適用します。 Data Service コントロール クライアントにより、自動的にインタフェースが取得されます。 関数がコントロールに追加されると、対応する「 WithFilter 」関数も同じように追加されます。

フィルタ パッケージの名前は以下のようになります。

	com.bea.ld.filter.FilterXQuery; 

フィルタを使用するには、以下のような手順を実行します。

  1. FilterXQuery オブジェクトを生成します。たとえば
  2. FilterXQuery myFilter = new FilterXQuery();
  3. addFilter() メソッドを使って、フィルタ オブジェクトに条件を追加します。 このメソッドで、フィルタ条件を適用するノードや、制限に基づいて戻るレコード数を指定することができます。たとえば、指定した値以上の量の注文のみを戻すフィルタを顧客の注文に適用することができます。
  4. addFilter() メソッドには、以下のような異なるパラメータを持つ複数の署名があります。

    public void addFilter(java.lang.String appliesTo, 
    java.lang.String field,
    java.lang.String operator,
    java.lang.String value,
    java.lang.Boolean everyChild)

    このバージョンのメソッドでは、以下のような引数を取ります。

    • appliesTo はフィルタによる影響を受けるノードを示す。 つまり、フィールド引数によって指定されたノードが条件に一致しない場合、appliesTo ノードがフィルタにより除かれます。
    • field はフィルタ条件をテストするノードである。
    • operatorvalue はともに条件文を構成する。 operator パラメータは、特定の value に対して作成された比較の型を指定します。 利用可能な演算子に関する情報は、表 11-10 フィルタ演算子 を参照してください。
    • everyChild は省略可能なパラメータである。 デフォルトでは false に設定されています。 このパラメータを ture に設定すると、フィルタ基準に一致する子要素のみが返されることになります。 たとえば、演算子 GREATER_THAN (または「>」) と値 1000 を設定することで、すべての注文が 1000 を超える顧客のレコードだけが戻されます。 1000 未満の量の注文がある顧客は、たとえ他の注文の量が 1000 を超えていても戻されません。
    • 以下は 1000 以上の量の注文を含む注文を戻す add filter メソッドの例です (everyChild が指定されていないので、1000 以下の量の注文も戻ることに注意してください)。

           myFilter.addFilter("CUSTOMERS/CUSTOMER/ORDER",
      "CUSTOMERS/CUSTOMER/ORDER/ORDER_AMOUNT",
      ">",
      "1000");
  5. 引数としての FilterXQuery インスタンスを通して、データ サービスにフィルタを加えるため、Mediator API の setFilterCondition() を使用します。 たとえば
  6. CUSTOMER custDS = CUSTOMER.getInstance(ctx, "RTLApp");
    custDS.setFilterCondition(myFilter);
  7. データ サービス関数を呼び出します。 データ サービス関数の呼び出しについての詳細は、「Java クライアントからのデータ サービスへのアクセス」を参照してください。

フィルタ効果の指定

特定の要素値を false にしたフィルタ条件を適用した場合、要素は結果セットに含まれません。 フィルタによって除かれた要素は、addFilter() 関数の最初の引数として指定されます。

求める結果次第で、フィルタの効果は異なります。 たとえば、図 11-1 にある CUSTOMERS データ オブジェクトと想定します。 複数の複雑な要素 (CUSTOMER と ORDERS) や、ORDER_AMOUNT を含むいくつかの単純な要素が含まれています。 この階層の任意の要素にも、フィルタを適用できます。

図 11-11 ネストされた値のフィルタ

一般的には、ネストされた XML データにおいて、「CUSTOMER/ORDER/ORDER_AMOUNT> 1000」のような条件は、どのようなオブジェクトが返されるかについて、複数の方法で影響を及ぼすことができます。 たとえば、1000 未満の ORDERS を取り除き、すべての CUSTOMER オブジェクトを戻すことが可能です。

また、最低、1つの大きな注文を持つ CUSTOMER オブジェクトのみを戻したり、すべての ORDER オブジェクトを各 CUSTOMER に戻すこともできます。 さらに、ORDER が 1000 を超える CUSTOMER オブジェクトのみを戻すこともできます。たとえば、

	FilterXQuery myFilter = new FilterXQuery();
myFilter.addFilter( "CUSTOMERS/CUSTOMER",
"CUSTOMERS/CUSTOMER/ORDER/ORDER_AMOUNT",
FilterXQuery.GREATER_THAN,"1000",true);

省略可能な 4 番目のパラメータ everychild = true は、デフォルトで属性が false であることに注意してください。 このパラメータを true に設定することで、それぞれ ORDER が 1000 超える CUSTOMER オブジェクトのみ戻ります。

以下の例では、複数のフィルタ適用方法について説明します。

最後の例は、複数の機能を持つフィルタです。つまり、2 つの条件を持つフィルタです。リスト 11-1 では、AND 演算子を使用してフィルタの組み合わせを、結果セットおよび与えられたデータ サービス インスタンス customerDS に適用します。

リスト 11-1 論理演算子を使用した複数の機能を持つフィルタの例
FilterXQuery myFilter = new FilterXQuery();
Filter f1 = myFilter.createFilter("CUSTOMER_PROFILE/ADDRESS/ISDEFAULT",
FilterXQuery.NOT_EQUAL,"0");
Filter f2 = myFilter.createFilter("CUSTOMER/ADDRESS/STATUS",
FilterXQuery.EQUAL,
"\"ACTIVE\"");
Filter f3 = myFilter.createFilter(f1,f2, FilterXQuery.AND);
Customer customerDS = Customer.getInstance(ctx, "RTLApp");
CustomerDS.setFilterCondition(myFilter);

データ サービス結果の順序付けと切り詰め

クライアント アプリケーション コードで使用できるフィルタの型に、順序付け条件もあります。データ サービスから戻される結果の順序 (昇順、降順) を指定します。 メソッド (FilterXQuery クラスの addOrderBy()) は、プロパティ名を昇順や降順の判断基準とします。リスト 11-2 では、顧客プロファイルを、その人が顧客となった日に基づいて昇順で戻すフィルタを生成する例を説明します。

リスト 11-2 順序付けを行うフィルタを適用する例
FilterXQuery myFilter = new FilterXQuery();
myFilter.addOrderBy("CUSTOMER_PROFILE",
"CustomerSince" ,FilterXQuery.ASCENDING);
ds.setFilterCondition(myFilter);
DataObject objArrayOfCust = (DataObject) ds.invoke("getCustomer", null);

同様に、関数から戻される結果の最大数を設定できます。 setLimit() 関数は、配列要素の中の要素数を指定した数に制限します。 そして、繰り返しのノードで、戻される結果の制限をかける場合に、その意味があります。 (繰り返しのないノードで制限を設定しても、結果が短縮されるわけではありません。)

リスト 11-3 では、SetLimit() 関数の使用方法について説明します。 結果セット (アクティブ アドレスをフィルタ) 中のアクティブなアドレス数を、10 個のデータ サービス インスタンス ds に制限します。

リスト 11-3 結果の切り詰め (制限) を行うフィルタを適用する例
FilterXQuery myFilter = new FilterXQuery();
Filter f2 = myFilter.createFilter("CUSTOMER_PROFILE/ADDRESS",
FilterXQuery.EQUAL,"\"INACTIVE\"");
myFilter.addFilter("CUSTOMER_PROFILE", f2);
myFilter.setLimit("CUSTOMER_PROFILE", "10");
ds.setFilterCondition(myFilter);

アドホック クエリを使用したクライアントからの結果の微調整

アドホック クエリは、データ サービスの一部として定義されていない XQuery 関数です。クライアント アプリケーションのコンテキストで定義されます。 アドホック クエリは、一般的には、クライアント アプリケーションの中で、データ サービス関数を呼び出し、何らかの方法で結果を最適化するために使用します。 アドホック クエリを使って、データ サービスに対して XQuery の正しい式を実行することができます。 式は、データ サービスの基礎にある、実際のデータ ソースをターゲットにすることができます。また、データ サービスによって提供される関数やプロシージャを使用することができます。

XQuery の式を実行するには、Mediator API で使用できる PreparedExpression インタフェースを使用します。 PreparedExpression インタフェースは、JDBC の PreparedStatement と同様に、JNDI サーバ コンテキストやアプリケーション名とともに、XQuery 式をコンストラクタの文字列とします。 用意された式オブジェクトをこの方法で作成した後、executeQuery( ) メソッドを呼び出すことができます。 アドホック クエリがデータ サービス関数やプロシージャを呼び出した場合、データ サービスのネームスペースは、アドホック クエリでメソッドを参照する前にクエリ 文字列にインポートする必要があります。

リスト 11-4 では、詳細な例について説明しています。ネームスペースにある getCustomers( ) という名前のデータ サービス関数の結果がコードにより戻されます。

ld:DataServices/RTLServices/Customer
リスト 11-4 アドホック クエリを使用したデータ サービス関数の呼び出し
import com.bea.ld.dsmediator.client.PreparedExpression;
String queryStr = 
"declare namespace ns0=\"ld:DataServices/RTLServices/Customer\";" +
"<Results>" +
" { for $customer_profile in ns0:getCustomer()" +
" return $customer_profile }" +
"</Results>";
PreparedExpression adHocQuery =
DataServiceFactory.prepareExpression(context,"RTLApp",queryStr );
XmlObject objResult = (XmlObject) adHocQuery.executeQuery();

AquaLogic Data Services Platform は、XMLObject データ型として、アドホック クエリに情報を戻します。 XMLObject であれば、デプロイされた XML スキーマのデータ型にダウンキャストできます。 XMLObject は、ルート型を 1 つのみ保持しているため、データ サービス関数が配列を戻す場合、アドホック クエリに配列のコンテナとしてルート要素を含めなければなりません。

たとえば、リスト 11-4 のアドホック クエリは、<Results> コンテナ オブジェクトを特定し、その中には、getCustomer() データ サービス関数により戻される CUSTOMER_PROFILE 要素の配列があります。

データ サービスで定義されているセキュリティ ポリシーは、アドホック クエリの中のデータ サービスの呼び出しにも同様に適用されます。 アドホック クエリが保護されたリソースを使用している場合は、JNDI 初期コンテキストの作成時に適切な資格を送る必要があります (詳細については、「AquaLogic Data Services Platform 用のWebLogic JNDI コンテキストの取得」を参照してください)。

JDBC の PreparedStatement インタフェースのように、PreparedExpression インタフェースは、アドホック クエリの式における動的なバインディング変数をサポートします。 さまざまなデータ型の値をバインディングするため、PreparedExpression は複数のメソッド (bindType( ) メソッドは表 11-12 を参照) を提供します。

表 11-12 バインディング変数用の PreparedExpression メソッド
以下のデータ型をバインドするには...
バインド メソッドを使用する...
Binary
bindBinary(javax.xml.namespace.QName qname, byte[] abyte0)
BinaryXML
bindBinaryXML(javax.xml.namespace.QName qname, byte[] abyte0)
Boolean
bindBoolean(javax.xml.namespace.QName qname, boolean flag)
Byte
bindByte(javax.xml.namespace.QName qname, byte byte0)
Date
bindDate(javax.xml.namespace.QName qname, java.sql.Date date)
Calendar
bindDateTime(javax.xml.namespace.QName qname, java.util.Calendar calendar)
DateTime
bindDateTime(javax.xml.namespace.QName qname, java.util.Date date)
DateTime
bindDateTime(javax.xml.namespace.QName qname, java.sql.Timestamp timestamp)
BigDecimal
bindDecimal(javax.xml.namespace.QName qname, java.math.BigDecimal bigdecimal)
double
bindDouble(javax.xml.namespace.QName qname, double d)
Element
bindElement(javax.xml.namespace.QName qname, org.w3c.dom.Element element)
Object
bindElement(javax.xml.namespace.QName qname, java.lang.String s)
float
bindFloat(javax.xml.namespace.QName qname, float f)
int
bindInt(javax.xml.namespace.QName qname, int i)
long
bindLong(javax.xml.namespace.QName qname, long l)
Object
bindObject(javax.xml.namespace.QName qname, java.lang.Object obj)
short
bindShort(javax.xml.namespace.QName qname, short word0)
String
bindString(javax.xml.namespace.QName qname, java.lang.String s)
Time
bindTime(javax.xml.namespace.QName qname, java.sql.Time time)
URI
bindURI(javax.xml.namespace.QName qname, java.net.URI uri)

bindType メソッドを使用するには、たとえば、以下のように、この値に対応する XML 修飾名 (QName) を変数名として送ります。

adHocQuery.bindInt(new QName("i"),94133);

リスト 11-5 では、bindInt() メソッドをアドホック クエリのコンテキスト内で使用する例について説明しています。

リスト 11-5 アドホック クエリ内で使用するための QName (修飾名) への変数のバインディング
PreparedExpression adHocQuery = DataServiceFactory.preparedExpression(
context, "RTLApp",
"declare variable $i as xs:int external;
<result><zip>{fn:data($i)}</zip></result>");
adHocQuery.bindInt(new QName("i"),94133);
XmlObject adHocResult = adHocQuery.executeQuery();
注意 : QName に関する詳細については、以下を参照してください。

http://www.w3.org/TR/xmlschema-2/#QName

リスト 11-6 では、アドホック クエリの詳細な例について説明しています。PreparedExpression インタフェースと QName を使用し、バインド メソッドの中で値を送っています。

リスト 11-6 アドホック クエリのサンプル
import com.bea.ld.dsmediator.client.DataServiceFactory;
import com.bea.ld.dsmediator.client.PreparedExpression;
import com.bea.xml.XmlObject;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.xml.namespace.QName;
import weblogic.jndi.Environment;

public class AdHocQuery
{
public static InitialContext getInitialContext() throws NamingException {
Environment env = new Environment();
env.setProviderUrl("t3://localhost:7001");
env.setInitialContextFactory("weblogic.jndi.WLInitialContextFactory");
env.setSecurityPrincipal("weblogic");
env.setSecurityCredentials("weblogic");
return new InitialContext(env.getInitialContext().getEnvironment());
}

public static void main (String args[]) {
System.out.println("========== Ad Hoc Client ==========");
try {
StringBuffer xquery = new StringBuffer();
xquery.append("declare variable $p_firstname as xs:string external; \n");
xquery.append("declare variable $p_lastname as xs:string external; \n");

xquery.append(
"declare namespace ns1=\"ld:DataServices/MyQueries/XQueries\"; \n");
xquery.append(
"declare namespace ns0=\"ld:DataServices/CustomerDB/CUSTOMER\"; \n\n");

xquery.append("<ns1:RESULTS> \n");
xquery.append("{ \n");
xquery.append(" for $customer in ns0:CUSTOMER() \n");
xquery.append(" where ($customer/FIRST_NAME eq $p_firstname \n");
xquery.append(" and $customer/LAST_NAME eq $p_lastname) \n");
xquery.append(" return \n");
xquery.append(" $customer \n");
xquery.append(" } \n");
xquery.append("</ns1:RESULTS> \n");

PreparedExpression pe = DataServiceFactory.prepareExpression(
getInitialContext(), "RTLApp", xquery.toString());
pe.bindString(new QName("p_firstname"), "Jack");
pe.bindString(new QName("p_lastname"), "Black");
XmlObject results = pe.executeQuery();
System.out.println(results);

} catch (Exception e) {
e.printStackTrace();
}
}

 


Streaming API による大きな結果セットの処理

この節では、Data Service Mediator API を使用したクライアント プログラムに関するプログラムのさまざまなトピックについて説明します。 内容は以下のとおりです。

ストリーミング インタフェースの使用

標準データ サービス インタフェースにて関数が呼び出されると、要求されたデータは、まずサーバ マシンのシステム メモリ内で実体化されます。 関数が大量のデータを戻すことを目的とする場合、メモリ内のデータの実体化は実用的でない場合があります。 たとえば、管理を行う関数が、AquaLogic Data Services Platform で公開されるデータの「inventory reports」を生成する場合が考えられます。 このような場合、AquaLogic Data Services Platform では、情報を出力ストリームとして提供します。

AquaLogic Data Services Platform では、WebLogic XML Streaming API をストリーミング インタフェースとして呼び出します。 WebLogic XML Streaming API は標準 SAX (XML の Streaming API) インタフェースと似ています。 しかし、SAX で使われるイベント ハンドラが複雑であるのに対し、WebLogic Streaming API によって、データ オブジェクト要素を段階的に進む中で、XML ドキュメントのストリームベース (またはプルベースの) のハンドリングを使用することができます。 WebLogic Streaming API は SAX インタフェースよりも多くのコントロールを利用可能であり、そのなかで、利用するアプリケーションがイベントを初期化します。たとえば、応答する代わりに、属性を反復したり、次の要素まで移動します。

注意 : Streaming API は大量の結果セットが必要で、メモリに簡単に実体化できない場合に使用することを目的としています。 リアルタイム クエリや大きなバッチ指向クエリの両方を同時にサポートするため、異なるサーバのデータ サービス クエリを起動することが望ましい場合があります。

ただし、2 台のサーバが利用できない場合、オフピーク時には、Streaming API を起動することを検討してください。

AquaLogic Data Services Platform では、サーバ側のストリーミングのみをサポートしています。 したがって、JSP はサーバでホストされるため、Streaming API を呼び出すことができます。 ただし、外部の Java アプリケーションではこれを実行できません。

アドホックや型なしのデータ サービス インタフェースを使用して、AquaLogic Data Services Platform をストリームとして取得することができます。

注意 : ストリーミングは、静的なインタフェースではサポートされていません。 WebLogic Streaming API の詳細については、

http://edocs.beasys.co.jp/e-docs/wls/docs81/xml/xml_stream.html の「WebLogic XML Streaming API の使い方」を参照してください。

このストリーミング インタフェースは、com.bea.ld.dsmediator.client パッケージ内の以下のクラスにあります。

これらのインタフェースを使用するのは、SDO Mediator クライアント API 等価式を使用するのに似ています。 しかし、戻されるデータは、ドキュメント オブジェクトではなく、XMInputStream です。 複雑な要素 (大量のデータである可能性がある) を入力パラメータとする関数では、XMLInputStream が入力引数としてサポートされています。 以下はその例です:

StreamingDataService ds = DataServiceFactory.newStreamingDataService(
context,
"ld:DataServices/RTLServices/Customer");
XMLInputStream stream = ds.invoke("getCustomerByCustID", "CUSTOMER0");

前述の例では、動的ストリーミング インタフェースについて説明しています。 以下の例では、アドホック クエリを使用しています。

String adhocQuery = 
"declare namespace ns0=\"ld:DataServices/RTLServices/Customer\";\n" +
"declare variable $cust_id as xs:string external;\n" +
"for $customer in ns0:getCustomerByCustID($cust_id)\n" +
"return\n" +
" $customer\n";
StreamingPreparedExression expr =
DataServiceFactory.prepareExpression(context, adhocQuery);

クエリの string (上記の例のアドホック クエリ) に外部変数がある場合、以下のことを行う必要があります。

	expr.bindString("$cust_id","CUSOMER0");
XMLInputStream xml = expr.executeQuery();
注意 : 動的インタフェースとアドホック インタフェースの使用に関する詳細については、「Java クライアントからの Data Services へのアクセス」の「動的 Mediator API の使用」を参照してください。
注意 : StreamingDataService インタフェース用の Javadoc と、他の AquaLogic Data Services Platform API は、「AquaLogic Data Services Platform Mediator API Javadoc」に記述されています。

リスト 11-7 では、XML 入力ストリームを読み取るメソッドの例について説明しています。 このメソッドは、属性反復子を使用して XML イベントの属性とネームスペースを表示し、エラーが発生すると SMLStream 例外を送出します。

リスト 11-7 ストリーミング アプリケーションのサンプル
import weblogic.xml.stream.Attribute;
import weblogic.xml.stream.AttributeIterator;
import weblogic.xml.stream.ChangePrefixMapping;
import weblogic.xml.stream.CharacterData;
import weblogic.xml.stream.XMLEvent;
import weblogic.xml.stream.EndDocument;
import weblogic.xml.stream.EndElement;
import weblogic.xml.stream.EntityReference;
import weblogic.xml.stream.Space;
import weblogic.xml.stream.StartDocument;
import weblogic.xml.stream.XMLInputStream;
import weblogic.xml.stream.XMLInputStreamFactory;
import weblogic.xml.stream.XMLName;
import weblogic.xml.stream.XMLStreamException;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
public class ComplexParse {

public void parse(XMLEvent event)throws XMLStreamException
{
switch(event.getType()) {
case XMLEvent.START_ELEMENT:
StartElement startElement = (StartElement) event;
System.out.print("<" + startElement.getName().getQualifiedName() );
AttributeIterator attributes = startElement.getAttributesAndNamespaces();
while(attributes.hasNext()){
Attribute attribute = attributes.next();
System.out.print(" " + attribute.getName().getQualifiedName() +
"='" + attribute.getValue() + "'");
}
System.out.print(">");
break;
case XMLEvent.END_ELEMENT:
System.out.print("</" + event.getName().getQualifiedName() +">");
break;
case XMLEvent.SPACE:
case XMLEvent.CHARACTER_DATA:
CharacterData characterData = (CharacterData) event;
System.out.print(characterData.getContent());
break;
case XMLEvent.COMMENT:
// Print comment
break;
case XMLEvent.PROCESSING_INSTRUCTION:
// Print ProcessingInstruction
break;
case XMLEvent.START_DOCUMENT:
// Print StartDocument
break;
case XMLEvent.END_DOCUMENT:
// Print EndDocument
break;
case XMLEvent.START_PREFIX_MAPPING:
// Print StartPrefixMapping
break;
case XMLEvent.END_PREFIX_MAPPING:
// Print EndPrefixMapping
break;
case XMLEvent.CHANGE_PREFIX_MAPPING:
// Print ChangePrefixMapping
break;
case XMLEvent.ENTITY_REFERENCE:
// Print EntityReference
break;
case XMLEvent.NULL_ELEMENT:
throw new XMLStreamException("Attempt to write a null event.");
default:
throw new XMLStreamException("Attempt to write unknown event["
+event.getType()+"]");
}
}

データ サービス関数結果からファイルへの書き出し

WriteOutputToFile メソッドを使用して、データ サービス関数の一連の結果をファイルに書き出すことができます。 この関数は、データ サービスの中で定義される各関数用に、自動的に生成されます。 セキュリティの理由で、サーバのファイル システムにのみファイルを書き出します。

この関数が提供するサービスは、Streaming API に似ています。 データ サービス情報のレポートや在庫の作成を目的としています。 ただし、writeOutputToFile メソッドは、リモート Mediator API から呼び出すことができます。(「ストリーミング インタフェースの使用」で記述されている、Streaming API と比較してください。)

以下の例では、型なしインタフェースからファイルに書き込む方法を説明しています。

 StreamingDataService sds =
DataServiceFactory.newStreamingDataService(
context,"RTLApp","ld:DataServices/RTLServices/Customer"");
sds.writeOutputToFile("getCustomer", null, "streamContent.txt");
sds.closeStream();
注意 : フォルダを作成するわけではありません。 上記では、myData という名のフォルダの中にデータを書き込む場合、そのフォルダは、書き込む操作より前に、サーバ ドメイン ルートに存在する必要があります。

  ページの先頭       前へ  次へ