Solaris WBEM 開発ガイド

第 5 章 WBEM 照会の作成

この章では、WQL (WBEM Query Language) と照会 API を使った照会の作成方法を説明します。この章の内容は、次のとおりです。


注 –

WBEM 照会 API (javax.wbem.query) の詳細については、/usr/sadm/lib/wbem/doc/index.html を参照してください。


WQL について

WQL (WBEM Query Language) は、標準 ANSI SQL (ANSI 構造化照会言語、American National Standards Institute Structured Query Language) のサブセットです。WQL には、Solaris 環境で WBEM をサポートできるように、意味上の変更が加えられています。

次の表に SQL の概念と WQL の対応を示します。

表 5–1 SQL の概念と WQL の対応

SQL の概念 

WQL での表現 

テーブル 

CIM クラス 

行 

CIM インスタンス 

列 

CIM プロパティ 


注 –

SQL のように、WQL 文でも単一引用符 (` ') を使用します。


Solaris WBEM サービスの実装では、WQL は検索専用の言語です。WQL を使用すると、CIM データモデルを使って格納されたデータを照会できます。CIM モデルでは、オブジェクトの情報は CIM クラスや CIM インスタンスに格納されています。CIM インスタンスには、名前、データ型、値からなるプロパティを持つことができます。

照会の記述

WBEM クライアントでは、WQL を使ってデータを照会したり、フィルタを適用したりします。データが特定のプロバイダによって提供された場合、CIMOM によりクライアント照会が適切なプロバイダに渡されます。ユーザーは、特定のクラスまたは特定の名前空間内のすべてのクラスにおいて、指定された照会と一致するインスタンスを検索できます。

次の例では、Storage_Capacity プロパティに特定の値を持つ Solaris_DiskDrive クラスのインスタンスをすべて検索します。


select * from Solaris_DiskDrive where Storage_Capacity = 1000

WQL キーワード

Solaris WBEM SDK では、Level 1 WBEM SQL がサポートされます。Level 1 WBEM SQL では、join のない簡単な select 操作を行うことができます。次の表に、Sun WBEM SDK でサポートされる WQL キーワードを示します。

表 5–2 サポートされる WQL キーワード

キーワード 

説明 

AND 

2 つのブール式を結合し、両方の式が True であれば、True を返す 

FROM 

SELECT 文にリストされているプロパティを持つクラスを指定する

NOT 

NULL 文字と共に使用される比較演算子 

OR 

2 つの条件を結合する。1 つの文に複数の論理演算子が使用されていると、OR 演算子 (論理和演算子) は AND 演算子 (論理積演算子) より後に評価される 

SELECT 

照会で使用されるプロパティを指定する 

WHERE 

照会のスコープを狭める 

LIKE 

提供された最低限の情報に基づいて結果セットを生成する 

SELECT 文

SELECT 文を使用して単一のクラスとそのサブクラスのインスタンスを取得します。取得するプロパティおよび満たす必要がある条件を指定することもできます。


注 –

現時点では、join 操作はサポートされません。


SELECT 文の構文は、次のとおりです。

SELECT list FROM class WHERE condition

次の表に、SELECT 文の検索を改良する引数の使用例を示します。

表 5–3 SELECT 文の例

照会例 

説明 

SELECT * FROM class

指定されたクラスとそのすべてのサブクラスのすべてのインスタンスを選択する。返されるインスタンスには、すべてのプロパティが含まれる 

SELECT PropertyA FROM class

指定されたクラスとそのすべてのサブクラスのうち、PropertyA を持つすべてのインスタンスを選択する

SELECT PropertyA, PropertyB FROM class WHERE PropertyB=20

指定されたクラスとそのすべてのサブクラスのうち、PropertyB=20 を持つすべてのインスタンスを選択する。返された各インスタンスには、PropertyA と PropertyB だけが含まれる

FROM 句

FROM 句では、照会文字列に一致するインスタンスが含まれているクラスを指定します。WQL FROM 句では、join 以外の式だけがサポートされます。したがって、WQL FROM 句には 1 つのクラスしか指定できません。

FROM 句は、abstract クラス fromExp によって表されます。現時点では、fromExp の直接のサブクラスは NonJoinExp だけです。NonJoinExp サブクラスは、1 つのテーブル (CIM クラス) だけを指定した FROM 句を表しています。SELECT 操作はこのテーブルに対して行われます。

WHERE 句

WHERE 句は、照会のスコープを狭めるためのものです。この句には条件式が含まれています。これらの条件式には、プロパティまたはキーワード、演算子、定数が含まれます。

次に、SELECT 文のあとに追加する WHERE 句の構文の例を示します。

SELECT CIMinstance FROM CIMclass WHERE conditional_expression

WHERE 句の conditional_expression は、次の形式です。

 
property operator constant

expression には、プロパティまたはキーワード、演算子、定数を指定します。WHERE 句を SELECT 文の後に追加するには、次のどちらかの形式を使用します。

SELECT instance FROM class WHERE constant operator property

WHERE 句は次の規則に従う必要があります。

WHERE 句で使用できる標準の WQL 演算子

SELECT 文の WHERE 句の二値式では、次の標準の WQL 演算子を使用できます。

表 5–4 WHERE 句で使用できる WQL 演算子

演算子 

説明 

= 

等しい 

< 

より小さい 

> 

より大きい 

<= 

以下 

>= 

以上 

<> 

等しくない 

照会の構文解析

javax.wbem.query パッケージに含まれるユーティリティクラスを使用すると、WQL 照会を構文解析できます。メインクラスは SelectExp で、そのコンストラクタは、WQL 照会文字列を取り込みます。SelectExp は文字列を構文解析し、それを 3 つの部分に分割します。それぞれの部分は、次の表に示すように対応するアクセス用メソッドを使って取得できます。

照会部分 

アクセス用メソッド 

SELECT リスト

getSelectList

FROM 句

getFromClause

WHERE 句

getWhereClause

構文解析すると、次に示すように SELECT リストに PropertyA および PropertyB が含まれます。FROM 句には test_class が含まれ、WHERE 句には条件式の構文解析ツリーが含まれます。


select PropertyA, PropertyB from test_class where 
       PropertyA > 20 and PropertyB < 30

SELECT リスト

各 SelectExp の getSelectList メソッドが返す SELECT リスト は、SelectList クラスのインスタンスです。このリストでは、選択されるインスタンスに含める必要のあるプロパティを、AttributeExp インスタンスとして指定します。SelectList メソッドの要素を使用すると、これらの AttributeExp インスタンスを取得できます。それぞれの属性は、WQL の CIMInstance プロパティに対応する列名を表します。AttributeExp の apply メソッドを CIMInstance に渡すと、 AttributeExp が示すプロパティ値が返されます。SelectList の apply メソッドを CIMInstance に渡すと、SelectList AttributeExp インスタンスが示すプロパティだけを含む CIMInstance が返されます。

FROM 句

現時点では、FROM 句では join 以外の式だけが処理されます。SelectExp で getFromClause メソッドが呼び出されると、NonJoinExp のインスタンスが返されます。NonJoinExp は、select 操作が実行されるクラス名を表します。

WHERE 句

WHERE 句は、abstract クラス QueryExp によって表現されます。concrete サブクラスは、AndQueryExp、OrQueryExp、NotQueryExp、および BinaryRelQueryExp です。これらの式のインスタンスは、元の条件式を表す構文解析ツリーの形式で結合されます。

このツリーの内部ノードは、AndQueryExp、OrQueryExp、および NotQueryExp インスタンスで構成されます。これらのインスタンスは、AND、OR、および NOT 式を表します。これらの式は、その他の AND、OR、および NOT 式と、バイナリ関係で構成されます。

葉ノードは、BinaryRelQueryExp で、property operator constant 形式の式で表されます。この形式は、プロパティと定数値の 2 項関係を表します。getLeftValue、getRightValue、および getOperator メソッドを使用して、property operator constant を取得します。

各 QueryExp の apply メソッドを CIMInstance に渡すと、ブール値が返されます。QueryExp で表される条件式が、CIMInstance で true になると、ブール値が true になります。true でない場合は、ブール値は false になります。

QueryExp には、ほかにも 2 つの有用なメソッドである canonizeDOC と canonizeCOD があります。canonizeDOC と canonizeCOD を使用すると、処理をする際の条件式を簡略化することができます。canonizeDOC メソッドは、構文木を複数の AND および複数の OR の任意結合から標準的な論理積の論理和 (複数の AND の OR) 形式に変換します。canonizeCOD メソッドは、構文木を複数の AND および複数の OR の任意結合から標準的な論理和の論理積 (複数の OR の AND) 形式に変換します。これらのクラスおよびメソッドは、入力照会に基づいてインスタンスにフィルタを適用するプロバイダによって使用されます。


注 –

これらのクラスの詳細については、javadoc コマンドで表示される、API リファレンスページを検索してください。/usr/sadm/lib/wbem/doc/index.html を参照してください。


照会を処理するプロバイダの記述

次の例のプロバイダプログラムは、照会 API を使って、execQuery メソッドからプロバイダに渡された WQL 文字列の構文解析を行います。このプログラムは、照会文字列中の Select 式を構文解析し、クラスを詳細列挙します。次に、列挙した各インスタンスを 1 つずつ処理して、各インスタンスを照会式および select リストと比較します。最後にプログラムは、照会文字列と一致するインスタンスの列挙が含まれるベクトルを返します。


例 5–1 照会を処理するプロバイダ

/*
 * execQuery メソッドは、部分的なキー照合に基づく限られた照会
 * のみサポートする。照会によって選択されたエントリがないと、
 * 空の Vector を返す
 *
 * @param  op 返される CIM インスタンスの CIM オブジェクトパス
 * @param  query CIM 照会式
 * @param  ql CIM 照会言語のインジケータ
 * @param  cc CIM クラス参照
 *
 * @return  CIM オブジェクトインスタンスのベクトル
 *
 * @version    1.19 01/26/00
 * @author     Sun Microsystems, Inc.
 */
public CIMInstance[] execQuery(CIMObjectPath op, 
                       String query, 
                       String  ql,
                       CIMClass cc) 
           throws CIMException {

   Vector result = new Vector();
   try {
       SelectExp q = new SelectExp(query);
       SelectList attrs = q.getSelectList();
       NonJoinExp from = (NonJoinExp)q.getFromClause();
       QueryExp where = q.getWhereClause();

       CIMInstance[] v = enumerateInstances(op, false, true, 
                                            true, null, cc);

       // インスタンスをフィルタリングする
       for (int i = 0; i < v.length; i++) {
               if ((where == null) || (where.apply(v[i]) == true)) {
                   result.addElement(attrs.apply(v[i]));
                } 
       }
   } catch (Exception e) {
       throw new CIMException(CIMException.CIM_ERR_FAILED, e.toString());
   }
   return (CIMInstance[])result.toArray();
 } // execQuery
}