この章では、WQL (WBEM Query Language) と照会 API を使った照会の作成方法を説明します。この章の内容は、次のとおりです。
WBEM 照会 API (javax.wbem.query) の詳細については、/usr/sadm/lib/wbem/doc/index.html を参照してください。
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 |
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 文を使用して単一のクラスとそのサブクラスのインスタンスを取得します。取得するプロパティおよび満たす必要がある条件を指定することもできます。
現時点では、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 句では、照会文字列に一致するインスタンスが含まれているクラスを指定します。WQL FROM 句では、join 以外の式だけがサポートされます。したがって、WQL FROM 句には 1 つのクラスしか指定できません。
FROM 句は、abstract クラス fromExp によって表されます。現時点では、fromExp の直接のサブクラスは NonJoinExp だけです。NonJoinExp サブクラスは、1 つのテーブル (CIM クラス) だけを指定した FROM 句を表しています。SELECT 操作はこのテーブルに対して行われます。
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 句は次の規則に従う必要があります。
定数の値は、プロパティに対して適切なデータ型です。
演算子は、有効な WQL 演算子です。
演算子のどちらかが、プロパティ名または定数になります。
任意の算術式を指定することはできません。たとえば、次の照会では、ready 状態のプリンタを持つ Solaris_Printer クラスのインスタンスだけが返されます。
SELECT * FROM Solaris_Printer WHERE Status = `ready' |
WHERE 句内では、論理演算子やカッコ式を使用して、プロパティ、演算子、定数からなる複数のグループを結合することができます。各グループは、演算子 AND、OR、または NOT で結合されている必要があります。
次の例では、Name プロパティに home か files が設定されている Solaris_FileSystem クラスのすべてのインスタンスを取得します。
SELECT * FROM Solaris_FileSystem WHERE Name= `home' OR Name= `files' |
次の例では、名前が home か files のディスクのうち、一定の使用可能な容量が残っており、Solaris プラットフォームのファイルシステムを持つディスクを取得します。
SELECT * FROM Solaris_FileSystem WHERE (Name = `home' OR Name = `files') AND AvailableSpace > 2000000 AND FileSystem = `Solaris' |
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 |
各 SelectExp の getSelectList メソッドが返す SELECT リスト は、SelectList クラスのインスタンスです。このリストでは、選択されるインスタンスに含める必要のあるプロパティを、AttributeExp インスタンスとして指定します。SelectList メソッドの要素を使用すると、これらの AttributeExp インスタンスを取得できます。それぞれの属性は、WQL の CIMInstance プロパティに対応する列名を表します。AttributeExp の apply メソッドを CIMInstance に渡すと、 AttributeExp が示すプロパティ値が返されます。SelectList の apply メソッドを CIMInstance に渡すと、SelectList AttributeExp インスタンスが示すプロパティだけを含む CIMInstance が返されます。
現時点では、FROM 句では join 以外の式だけが処理されます。SelectExp で getFromClause メソッドが呼び出されると、NonJoinExp のインスタンスが返されます。NonJoinExp は、select 操作が実行されるクラス名を表します。
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 リストと比較します。最後にプログラムは、照会文字列と一致するインスタンスの列挙が含まれるベクトルを返します。
/* * 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 }