Solaris WBEM 開発ガイド

照会の構文解析

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
}