この章では、Coherenceの問合せ言語(CohQL)を使用してCoherenceキャッシュと相互作用する方法について説明します。CohQLは、軽量な構文(SQLに似た)で、Coherenceクラスタ上でキャッシュ操作を実行するのに使用します。この言語は、プログラムからでも、コマンドライン・ツールからでも使用できます。
この章は次の各項で構成されています。
|
注意:
|
次の各項では、CohQLの機能について説明します。各項では、特に記述文、その構文、および例について説明します。問合せの例は、「その他のCoherenceの問合せ言語の例」を参照してください。
|
注意: CohQLでは、副問合せはサポートされません。 |
この項は、次のトピックで構成されています。
詳細は、Coherence問合せ文、句、式をアルファベット順に示している表26-1を参照してください。
表26-1 Coherenceの問合せ言語の文
| この文、句、または式 | 参照先の項 |
|---|---|
|
BACKUP CACHE |
|
|
バインド変数 |
|
|
CREATE CACHE |
|
|
CREATE INDEX |
|
|
DELETE |
|
|
DROP CACHE |
|
|
DROP INDEX |
|
|
ENSURE CACHE |
|
|
ENSURE INDEX |
|
|
GROUP BY |
|
|
INSERT |
|
|
key()擬似関数 |
|
|
パス式 |
|
|
RESTORE CACHE |
|
|
SELECT |
|
|
SOURCE |
|
|
UPDATE |
|
|
value()擬似関数 |
|
|
WHERE |
|
この項では、構文の一部の構成要素(パス式、バインド変数、擬似関数など)について説明します。
CohQLのメインの構成要素にパス式があります。パス式は、オブジェクトのインスタンスのグラフを介して移動する際に使用されます。パス式の識別子を使用して、Java Bean感覚でプロパティを表現します。これは、先頭にgetを付加し、最初の文字を大文字にして作成される、ReflectionExtractorによってバッキングされます。各要素は「ドット」(.)文字で区切られ、オブジェクトのトラバースを表現しています。たとえば、次のパス式はオブジェクト構造を移動するのに使用します。
a.b.c
これは反射的に次のメソッドを起動します。
getA().getB().getC()
プログラム的に使用する場合には、APIは文字列を単純な一連の問合せ関数に渡します。文字列連結を行わずに変数の値を渡すには、バインド変数を使用します。バインド変数には、2つの異なる形式があります。
疑問符(?): 疑問符を入力する場所は、位置を示すプレースホルダーを表す数字の直後です。このプレースホルダーにより、問合せを実行する前に提供されたオブジェクトのコレクションの索引が作成されます。この形式の構文は、?nで、この場合nに任意の数字を使用できます。位置を示すバインド変数は、フィルタの構成でQueryHelperクラスによって使用されます。例:
QueryHelper.createFilter("number = ?1" , new Object[]{new Integer(42)};
コロン(:): コロンを入力する場所は、キー値のペアとして提供されるオブジェクトの名前付きプレースホルダーとして使用される識別子の直後です。この構文は、:identifierで、この場合identifierは英数字の組合せで、アルファベット文字で開始します。名前付きのバインド変数は、フィルタの構成でQueryHelperクラスによって使用されます。例:
HashMap env = new HashMap();
env.put("iNum",new Integer(42));
QueryHelper.createFilter("number = :iNum" , env};
QueryHelperクラスとフィルタのプログラム的な構成の詳細は、「Javaプログラムにおけるフィルタの作成」を参照してください。
多くのユーザーがオブジェクトをkeyプロパティで格納するため、CohQLでは、key()擬似関数が用意されています。key()はキャッシュのキーを表しています。問合せ構文でもvalue()擬似関数が用意されています。value()は、key()で開始されない連鎖内では暗黙的です。key()擬似関数とvalue()擬似関数は、通常、WHERE句で使用され、この句ではキーやキャッシュ・エントリの値がテストされます。key()とvalue()の使用例は、「KeyおよびValue擬似関数の例」および「コマンドラインの例」を参照してください。
意味的には必要はありませんが、CohQLはコード・アーティファクトをできるだけJPQLへ移植できるようにするために別名をサポートしています。CohQLは、キャッシュ名と、SELECTコマンド、UPDATEコマンド、DELETEコマンドのドット付きパス式の先頭に続く別名をサポートします。CohQLでは、キャッシュの別名をvalue()擬似関数の代用およびkey()擬似関数に対する引数として使用することも可能です。
通常、リテラル引数(cache-nameまたはservice-nameなど)を引用符で囲む必要はありません。引数に演算子(-、+、.、<、>、=など)や空白が含まれる場合にのみ、引用符(一重または二重)が必要となります。
ファイル名も引用符で囲む必要があります。ファイル名には、通常、パス・セパレータ(/または\)およびドットが含まれ、名前が拡張子から区切られます。
コンパイラがunquotedリテラル引数、または問題のある文字が含まれるファイル名を発生する場合には、コンパイラはエラーをスローします。
次の項では、SELECT文およびWHERE句について説明します。これらのエンティティは、ほとんどのキャッシュ問合せの基本的な構成要素です。
SELECT文は、問合せの基本的な構成要素で、キャッシュからデータを取得します。句は、単純なまたは複雑なパス表現、主要な式、変形関数、複数の式、集計関数などのいくつかの形式を取ることができます。SELECT文は、別名の使用もサポートします。
SELECT文の形式は、次のとおりです。
SELECT (properties* aggregators* | * | alias) FROM "cache-name" [[AS] alias] [WHERE conditional-expression] [GROUP [BY] properties+]
アスタリスク(*)文字は、サブパスのかわりに完全なオブジェクトを表します。cache-nameを持つパスを接頭辞として指定する必要はありません。SELECT文のFROM部分は、問合せによりその結果が引き出されるドメインを形成するキャッシュをターゲットとします。cache-nameは、既存のキャッシュの名前です。
その他の例は、「フィルタを強調表示する単純なSELECT * FROM文」を参照してください。
次に例を示します。
キャッシュのdeptから項目を選択します。
select * from "dept"
WHERE句を使用して、結果セットから返されるエントリをフィルタリングします。CohQLの主要機能の1つは、パス式を使用して、式の評価の際にオブジェクト構造を移動できることです。条件式では、論理演算子、比較式、フィールドのプリミティブおよび関数演算子などを使用できます。
WHERE句のリテラル構文では、一重引用符を使用して、文字列のリテラルを囲むことができます。その引用符の前に別の一重引用符を接頭辞にして、文字列内でエスケープできます。数式は、Javaプログラミング言語の表記規則に従って定義されます。ブール値は、リテラルのTRUEとFALSEで表されます。日付リテラルはサポートされていません。
|
注意: CohQLには、型情報に対するアクセス権が付与されていません。ゲッターがリテラルのタイプとは異なる数値型を返した場合、比較の演算子のtrueを想定した部分にfalseを取得することがあります。これを回避するには、リテラルの型で、longにはlを、doubleにはdを、またshortにはsを指定します。デフォルト値は、ピリオド(.)なしのリテラルに対してはIntegerで、ピリオド(.)付きのリテラルに対してはFloatです。 |
WHERE句内の演算子の優先順位は、次のとおりです。
パス演算子(.)
単項の+および-
乗算(*)および除算(/)
足し算(+)および引き算(-)
比較演算子: =、>、>=、<、<=、<>、[ NOT ] BETWEEN、[ NOT ] LIKE、[ NOT ] IN、IS [ NOT ] NULL、CONTAINS [ ALL | ANY ]
論理演算子(AND、OR、NOT)
WHERE句は、言語レベルで算術のみをサポートします。
BETWEEN演算子を条件式で使用して、式の結果が値の包括範囲内に含まれるかどうかを判断できます。数値の式、または文字列の式は、この方法で評価できます。形式は、BETWEEN lower AND upperとなります。
LIKE演算子は、_および%のワイルドカードを使用できます。ワイルドカード_は正確に1文字と一致させるために使用され、ワイルドカード%は任意の文字のゼロ回以上の出現と一致させるために使用されます。ワイルドカードをエスケープするには、escapeキーワードを使用して定義されたエスケープ文字をワイルドカードの前に置きます。次の例では、k%1という名前のキーを選択するために、\エスケープ文字を使用してワイルドカード%をエスケープします。
SELECT key(),value() FROM mycache WHERE key() LIKE "k\%1" escape "\"
さらに、任意の文字をエスケープ文字として定義できます。例:
SELECT key(),value() FROM mycache WHERE key() LIKE "k#%1" escape "#"
IN演算子では、単一の値のパス式がコレクションのメンバーかどうかを確認できます。このコレクションは、インラインリストとして定義されているか、バインド変数として表されています。インラインリストの構文は、次のとおりです。
"("literal*")"
CONTAINS [ ALL | ANY ]は、Coherenceデータ・モデルで通常非正規化データが使用されるため、非常に便利な演算子です、CONTAINS演算子では、多値のパス式に指定した値が含まれているどうかを判断できます。例:
e.citys CONTAINS "Boston"
CONTAINSのALLおよびANY形式は、IN演算子と同じ構文を持つインラインリストまたはバインド変数となります。
|
注意: Coherenceで用意されているプログラムのAPIを使用すると、WHERE句の条件式構文に基づいたスタンドアロンのCoherenceフィルタを作成できます。「Javaプログラムにおけるフィルタの作成」を参照してください。 |
その他の例は、「フィルタを強調表示する単純なSELECT * FROM文」を参照してください。
次に例を示します。
キャッシュdept内のすべての項目を選択します。ここでは、deptnoキーの値が10になります。
select * from "dept" where deptno = 10
次の項では、キャッシュの作成と削除の方法を説明します。また、キャッシュの内容のバックアップとリストアの方法も説明します。
問合せを送信する前に、それぞれCREATE CACHEまたはENSURE CACHE文を使用して、既存のキャッシュに接続するか、新規キャッシュを作成します。この文は、まず指定されたcache-nameでキャッシュへの接続を試行します。キャッシュがクラスタ内に見つからない場合は、現在のキャッシュ構成ファイルに基づいて指定された名前でキャッシュの作成が試行されます。この文は、コマンドラインで特に有用です。この文をプログラムで使用している場合、名前の変わりにサービスとクラス・ローダーの情報を指定するオプションがあります(クラス・ローダーにはコマンドラインからはアクセスできません)。
|
注意: 文では、キャッシュ名とサービス名を引用符(二重引用符(" ")または一重引用符(' '))で囲む必要があります。 |
構文は次のとおりです。
[ CREATE | ENSURE ] CACHE "cache-name" [ SERVICE"service-name"]
次に例を示します。
deptという名前のキャッシュを作成します。
create cache "dept"
BACKUP CACHE文を使用して、指定されたキャッシュのシリアライズ表現を、指定されたfilenameで表示されたファイルに書き込みます。filenameは、オペレーティング・システム固有のパスであり、一重または二重引用符で囲む必要があります。BACKUP CACHE文は、コマンドライン・ツールでのみ使用できます。構文は次のとおりです。
BACKUP CACHE "cache-name" [ TO ] [ FILE ] "filename"
|
注意: バックアップ(および後続のリストア)機能は、開発およびテスト環境で使用されるように設計されており、データの整合性を確認するプロビジョニングがないため、本番のデータ・セットでは使用しないでください。この機能は、本番のバックアップ、スナップショット、またはチェックポイント・ユーティリティとしてサポートされていません。特に:
|
次に例を示します。
deptキャッシュのシリアライズ表現をtextfileファイルに書き込みます。
backup cache "dept" to file "textfile"
RESTORE CACHE文を使用して、指定されたキャッシュのシリアライズ表現を、指定されたfilenameで表示されたファイルから読み取ります。filenameは、オペレーティング・システム固有のパスであり、一重または二重引用符で囲む必要があります。RESTORE CACHE文は、コマンドライン・ツールでのみ使用できます。構文は次のとおりです。
RESTORE CACHE"cache-name" [ FROM ] [ FILE ] "filename"
次に例を示します。
deptキャッシュをtextfileファイルからリストアします。
restore cache "dept" from file "textfile"
DROP CACHE文を使用して、指定したキャッシュをクラスタから完全に削除します。キャッシュは、Java destroy()メソッドへのコールによって削除されます。いずれかのクラスタ・メンバーが、削除されたキャッシュへの参照を保持してそれになんらかの操作の実行を試行すると、そのメンバーはIllegalStateExceptionを受け取ります。Coherence問合せのDROP CACHE文の構文は、次のとおりです。
DROP CACHE "cache-name"
次に例を示します。
ordersキャッシュをクラスタから削除します。
drop cache "orders"
次の項では、キャッシュ・データの挿入および削除、結果セットのフィルタリングなど、キャッシュ内のデータの操作方法を説明します。
集計の問合せは、SELECT問合せの変動要素です。結果をグループ化して集計関数を適用し、結果に関する概要を取得する場合には、集計の問合せを使用します。問合せに集計関数を使用しているか、GROUP BY句が含まれる場合には、問合せは集計の問合せと見なされます。集計の問合せの最も一般的な形式では、1つ以上のグループ化の式の後にGROUP BY句内の同じリード・グループ化の式と組み合せられたSELECT句の集計関数が続く形式が使用されます。
CohQLがサポートする集計関数は、COUNT、AVG、MIN、MAX、およびSUMです。
その他の例は、「予測、集計、グループ化を扱う複雑な問合せ」を参照してください。
次に例を示します。
supplierでグループ化されたordersキャッシュからの項目に対して、合計amountおよび平均priceを選択します。
select supplier,sum(amount),avg(price) from "orders" group by supplier
UPDATE文を使用して、キャッシュ内の既存の値を変更します。構文は次のとおりです。
UPDATE "cache-name" [[AS] alias] SET update-statement {, update-statement}* [ WHERE conditional-expression ]
各update-statementは、パス式、割当て演算子(=)および式で構成されています。割当て文に対する式の選択は制限されています。割当ての右側は、リテラル、バインド変数、静的メソッド、またはリテラルかバインド変数のみでの新規Javaコンストラクタに決定する必要があります。UPDATE文は、別名の使用もサポートします。
追加の例は、「UPDATEの例」を参照してください。
次に例を示します。
employeesキャッシュでグレード7以上のランクの従業員の場合、給与を1000に、休暇時間を200に更新します。
update "employees" set salary = 1000, vacation = 200 where grade > 7
INSERT文を使用して、指定されたKEYの下に指定されたVALUEを格納します。KEY句が提供されていない場合には、新しく作成したオブジェクトに対してメッセージgetKey()が送信されます(可能な場合)。それが可能でない場合には、valueオブジェクトがキーとして使用されます。
INSERT文はObjectsのMaps上で機能する点に注意してください。構文は次のとおりです。
INSERT INTO "cache-name" [ KEY (literal | new java-constructor | static method) ] VALUE (literal | new java-constructor | static method)
次に例を示します。
キーwriterを値Davidとともにemployeeキャッシュに挿入します。
insert into "employee" key "writer" value "David"
DELETE文を使用して、キャッシュ内の指定されたエントリを削除します。構文は次のとおりです。
DELETE FROM "cache-name" [[AS] alias] [WHERE conditional-expression]
DELETE文のWHERE句は、SELECT文の場合と同様に機能します。すべてのconditional-expressionsは、削除するエンティティのセットをフィルタする際に使用できます。DELETE文は、別名の使用もサポートします。
|
注意事項: WHERE句が存在しない場合には、指定したキャッシュ内のすべてのエントリが削除されます。 |
次に例を示します。
bar.writerキーがDavidでないemployeeキャッシュからエントリを削除します。
delete from "employee" where bar.writer IS NOT "David"
次の項では、キャッシュ・データの索引の作成と削除の方法を説明します。索引により、Coherenceの組込みオプティマイザがさらに迅速かつ効率的に問合せを分析して、結果を返すことができるようになります。
CREATE INDEXまたはENSURE INDEXを使用して、特定されたキャッシュに索引を作成します。構文は次のとおりです。
[ CREATE | ENSURE ] INDEX [ON]"cache-name" (value-extractor-list)
value-extractor-listは、パス式を使用してValueExtractorsを作成する、カンマ区切りのリストです。複数の要素が存在する場合、MultiExtractorが使用されます。KeyExtractorを作成するには、key()擬似関数を使用してパス式を開始します。
索引の自然な順序が適用されます。
次に例を示します。
ordersキャッシュ内の属性lastnameで索引を作成します。
create index "orders" lastname
次の項では、複数の問合せ文を効率的にキャッシュへ発行する方法を説明します。
SOURCE文では、文の「バッチ」処理が可能です。SOURCE文は、指定されたfilenameで表示されたファイルから1つ以上の問合せ文を開いて読み取ります。filenameは、オペレーティング・システム固有のパスであり、一重または二重引用符で囲む必要があります。ファイル内の各問合せ文は、セミコロン(;)で区切る必要があります。ソーシングはコマンドライン・ツールでのみ使用でき、コマンドの順序で構成されるファイルをロードできます。ソース・ファイルは、そのソースが他のファイルの場合もあります。構文は次のとおりです。
SOURCE FROM [ FILE ] "filename"
SOURCEは、@"filename"のように"at"記号(@)を使用して短縮できます。"ピリオド"記号の'.'は、コマンドラインでのみ、'@'の省略として使用できますが、ファイル名を引用符で囲むことはできません。
次に例を示します。
command_fileファイルの文を処理します。
source from file "command_file"
または
@ "command_file"
または
. command_file
問合せのコストと効果を判断するために使用される問合せレコードを作成および出力するには、EXPLAIN PLAN FORおよびTRACEコマンドを使用します。問合せの実行レコードは、問合せ操作の一部としてフィルタの評価の見積もりコストを提供します。問合せのトレース・レコードは、問合せ操作の一部としてフィルタの評価の実コストを提供します。いずれの問合せレコードでも、フィルタで索引を使用できるかどうかが考慮されます。問合せの実行レコードおよびトレース・レコードで提供されるデータに関する詳細は、「問合せレコードの解析」を参照してください。コマンドの構文は、次のとおりです。
問合せの実行計画:
EXPLAIN PLAN FOR select statement | update statement | delete statement
トレース:
TRACE select statement | update statement | delete statement
次に例を示します。
EXPLAIN PLAN FOR select * from "mycache" where age=19 and firstName=Bob
または
TRACE SELECT * from "MyCache" WHERE age=19
CohQLコマンドライン・ツールには、文をコマンドラインから発行するキャッシュと相互作用する、非プログラム的方法が用意されています。このツールは、com.tangosol.coherence.dslquery.QueryPlusクラスを使用して操作できます。また便宜上、COHERENCE_HOME/bin/に配置された起動スクリプトを使用してこのツールを操作できます。このスクリプトは、Windows(query.cmd)でもUNIX(query.sh)でも使用できます。
スクリプトは、コンソール・モードでクラスタ・ノードを起動します。記憶域はノード上では有効化されていません。これは、本番環境での推奨設定で、ノードが記憶域有効化キャッシュ・サーバーを持つクラスタに参加することが前提となっています。ただし、記憶域有効化ノードをテスト用に作成するには、スクリプト内のstorage_enabled設定をtrueに変更します。
|
注意: 構成の際には、起動スクリプトではデフォルトのオペレーション構成ファイル(tangosol-coherence.xml)とデフォルトのキャッシュ構成ファイル(coherence-cache-config.xml)が使用されます。これらのファイルは、クラスタの作成/参加およびキャッシュの構成の際にcoherence.jarに格納されます。Coherenceの構成の詳細は、第3章「構成について」を参照してください。 |
スクリプトは、COHERENCE_HOME環境変数を設定するためのオプションを提供します。COHERENCE_HOMEがコンピュータで未設定の場合、スクリプト内のその環境変数をCoherenceのインストール場所に設定します。
CohQLは、コマンド履歴内で上矢印または下矢印を動かすなど、コマンドライン編集の拡張機能にJLineを使用します。ただし、JLineはCohQLの使用には必要ありません。スクリプトは、COHERENCE_HOME/lib/ディレクトリ内に格納されているjline.jarライブラリを自動的に使用します。スクリプトのJLINE_HOME変数およびクラスパスを変更することで、別の場所を指定できます。JLineライブラリが見つからない場合、メッセージが表示され、CohQLはJLine機能なしで開始されます。
次の手順は、起動スクリプトを使用してCohQLコマンドライン・ツールの起動方法を示しています。この手順は、スクリプトのstorage_enabledがfalseに設定されていること(デフォルト)を前提としています。
キャッシュ・サーバー・クラスタ・ノードを起動するか、既存のキャッシュ・サーバー・クラスタが起動していることを確認します。
キャッシュ・サーバー・クラスタ・ノードを起動するには、コマンド・プロンプトまたはシェルを開き、/binディレクトリにあるキャッシュ・サーバー起動スクリプトを実行します(Windowsプラットフォームではcache-server.cmd、UNIXプラットフォームではcache-server.sh)。キャッシュ・サーバーが起動し、このクラスタ・メンバーに関する情報が出力されます。
コマンド・プロンプトまたはシェルを開き、/binディレクトリにあるCohQLコマンドライン起動スクリプトを実行します(Windowsプラットフォームではquery.cmd、UNIXプラットフォームではquery.sh)。Java環境に関する情報が表示されます。コマンドライン・ツール・プロンプト(CohQL>)が返されます。
|
注意: 既存のキャッシュ・サーバー・ノードを結合する場合、起動スクリプトを変更して、同じキャッシュ構成を含む既存のキャッシュ・サーバー・ノードと同じクラスタ設定を使用します。 |
コマンドラインのヘルプを全部表示するには、プロンプトでhelpと入力します。詳細な説明のないヘルプのリストを表示するには、commandsと入力します。
コマンドライン・ツールを用いる一連の問合せ文については、「コマンドラインの例」を参照してください。
CohQLコマンドライン・ツールには、CohQL>プロンプトが返す前に読み取られ、実行される一連の引数が組み込まれています。これは、スクリプトを大型のスクリプトの一部として使用する際に(ビルド・プロセスの一部としての使用、I/Oをパイピングするための使用など)有用です。CohQL>プロンプトでhelpと入力し、コマンドライン・ツール内の引数のヘルプを表示します。
表26-2 Coherenceの問合せ言語コマンドライン・ツールの引数
| 引数 | 説明 |
|---|---|
|
|
トレース・モードを有効にして、デバッグ情報を出力します。 |
|
|
コマンドライン引数の処理の後、コマンドライン・ツールを終了します。この引数は、標準の入力からリダイレクトする際には使用しないでください。使用すると、コマンドラインの引数が処理を終了すると同時にツールが終了して、リダイレクトされた入力が読み取られません。 |
|
|
コマンドライン・ツールをサイレント・モードで操作して、無関係な用語を削除します。これにより、標準の入力( |
|
|
コマンドライン・ツールを拡張言語モードで操作します。このモードにより、更新でオブジェクト・リテラルが許可され、コマンドを挿入できるようになります。使用法の詳細は、コマンドラインのヘルプを参照してください。 |
|
|
指定した文を実行します。文は一重または二重の引用符で囲む必要があります。任意の数の |
|
|
指定したファイルの文を処理します。ファイル内の文は、セミコロン(;)で区切る必要があります。ファイルは、オペレーティング・システム固有のパスであり、一重または二重引用符で囲む必要があります。任意の数の |
例
contactキャッシュ内のすべてのエントリを返し、そのエントリを標準出力に出力してコマンドライン・ツールを終了します。
query.sh -c -l "select * from contact"
dist-exampleキャッシュ内のすべてのエントリを返し、そのエントリ(余分な用語を削除)をmyOutputという名前のファイルに出力してコマンドライン・ツールを終了します。
query.cmd -s -c -l "select * from 'dist-example'" >myOutput
myStatementsという名前のファイルのすべてのセグメントを処理して、コマンドライン・ツールを終了します。
query.sh -c -f myStatements
myInputファイルからコマンドを読み取り、出力(余分な用語を削除)をmyOutputという名前のファイルに出力します。
query.sh -s <myInput >myOutput
例26-1に、コマンドライン・ツールをWindowsで使用する簡単な例を示します。この例ではローカル・キャッシュに対する文をテストするので、起動スクリプト内のstorage_enabled設定はtrueに設定されています。この例はキャッシュの作成と削除、エントリの格納と取得、バックアップ・ファイルからのキャッシュのリストアを示します。また、key()およびvalue()という擬似関数の使用を強調します。
コマンド・プロンプトでquery.cmdを起動する際に、Java環境、Coherenceのバージョンおよびエディション、Coherenceキャッシュ・サーバーに関する情報が表示されます。次に、問合せ文を入力できるプロンプト(CohQL>)を受け取ります。
例には、コマンドを説明する注釈とそれらの出力が太字イタリックのフォントで追加されています。次に例を示します。
< This is an annotation. >
例26-1 コマンドライン問合せの演習
C:/coherence/bin/query.cmd ** Starting storage enabled console ** java version "1.6.0_14" Java(TM) SE Runtime Environment (build 1.6.0_14-b08) Java HotSpot(TM) Server VM (build 14.0-b16, mixed mode) 2010-01-27 16:54:07.501/0.265 Oracle Coherence 3.6.0.0 Internal <Info> (thread=main, member=n/a): Loaded operational configuration from "jar:file:/C:/coherence360/coherence/lib/coherence.jar!/tangosol-coherence.xml" 2010-01-27 16:54:07.501/0.265 Oracle Coherence 3.6.0.0 Internal <Info> (thread=main, member=n/a): Loaded operational overrides from "jar:file:/C:/coherence360/coherence/lib/coherence.jar!/tangosol-coherence-override-dev.xml" 2010-01-27 16:54:07.501/0.265 Oracle Coherence 3.6.0.0 Internal <D5> (thread=main, member=n/a): Optional configuration override "/tangosol-coherence-override.xml" is not specified 2010-01-27 16:54:07.517/0.281 Oracle Coherence 3.6.0.0 Internal <D5> (thread=main, member=n/a): Optional configuration override "/custom-mbeans.xml" is not specified Oracle Coherence Version 3.6.0.0 Internal Build 0 Grid Edition: Development mode Copyright (c) 2000, 2010, Oracle and/or its affiliates. All rights reserved. 2010-01-27 16:54:09.173/1.937 Oracle Coherence GE 3.6.0.0 Internal <D5> (thread=Cluster, member=n/a): Service Cluster joined the cluster with senior service member n/a 2010-01-27 16:54:12.423/5.187 Oracle Coherence GE 3.6.0.0 Internal <Info> (thread=Cluster, member=n/a): Created a new cluster "cluster:0xC4DB" with Member(Id=1, Timestamp=2010-01-27 16:54:08.032, Address=130.35.99.213:8088, MachineId=49877, Location=site:us.oracle.com,machine:tpfaeffl-lap7,process:4316, Role=TangosolCoherenceQueryPlus, Edition=Grid Edition, Mode=Development, CpuCount=2, SocketCount=1) UID=0x822363D500000126726BBBA0C2D51F98 2010-01-27 16:54:12.501/5.265 Oracle Coherence GE 3.6.0.0 Internal <D5> (thread=Invocation:Management, member=1): Service Management joined the cluster with senior service member 1< Create a cache named "employees". >CohQL> create cache "employees" 2010-01-27 16:54:26.892/19.656 Oracle Coherence GE 3.6.0.0 Internal <Info> (thread=main, member=1): Loaded cache configuration from "jar:file:/C:/coherence360/coherence/lib/coherence.jar!/coherence-cache-config.xml" 2010-01-27 16:54:27.079/19.843 Oracle Coherence GE 3.6.0.0 Internal <D5> (thread=DistributedCache, member=1): Service DistributedCache joined the cluster with senior service member 1 2010-01-27 16:54:27.095/19.859 Oracle Coherence GE 3.6.0.0 Internal <D5> (thread=DistributedCache, member=1): Service DistributedCache: sending Config Sync to all Result< Insert an entry (key-value pair) into the cache. >CohQL> insert into "employees" key "David" value "ID-5070"< Insert an object into the cache. >CohQL> insert into "employess" value new com.my.Employee("John", "Doe", "address", 34)< Change the value of the key. >CohQL> update employees set value() = "ID-5080" where key() like "David" Result David, true< Retrieve the values in the cache. >CohQL> select * from "employees" Result ID-5080< Retrieve the value of a key that does not exist. An empty result set is returned >CohQL> select key(), value() from "employees" where key() is "Richard" Result< Delete an existing key in the cache. An empty result set is returned. >CohQL> delete from employees where key() = "David" Result< Delete the contents of the employees cache. An empty result set is returned. >CohQL> delete from "employees" Result< Destroy the employees cache. >CohQL> drop cache "employees"< Re-create the employees cache. >CohQL> create cache "employees" Result< Insert more entries into the cache. >CohQL> insert into "employees" key "David" value "ID-5080" CohQL> insert into "employees" key "Julie" value "ID-5081" CohQL> insert into "employees" key "Mike" value "ID-5082" CohQL> insert into "employees" key "Mary" value "ID-5083"< Retrieve the keys and value in the enployees cache. >CohQL> select key(), value() from "employees" Result Julie, ID-5081 Mike, ID-5082 Mary, ID-5083 David, ID-5080< Save a serialized representation of the cache in a file. >CohQL> backup cache "employees" to "emp.bkup"< Delete a key from the cache. >CohQL> delete from "employees" where key() = "David" Result< Retreive the cache contents again, notice that the deleted key and value are not present. >CohQL> select key(), value() from "employees" Result Julie, ID-5081 Mike, ID-5082 Mary, ID-5083< Delete the contents of the cache. >CohQL> delete from "employees" Result< Retrieve the contents of the cache. An empty result set is returned. >CohQL> select * from "employees" Result< Restore the cache contents from the backup file. >CohQL> restore cache "employees" from file "emp.bkup"< Retrieve the cache contents. Note that all of the entries have been restored and returned. >CohQL> select key(), value() from "employees" Result Julie, ID-5081 Mike, ID-5082 Mary, ID-5083 David, ID-5080< Destroy the employees cache. >CohQL> drop cache "employees"< Exit the command-line tool. >CohQL> bye
FilterBuilder APIは、Javaプログラム内から結果セットをフィルタリングする文字列指向の方法で、使用の際にはCoherence APIの詳細を覚える必要はありません。APIには、com.tangosol.util.QueryHelperクラスに過負荷のcreateFilterファクトリ・メソッドのセットが4つ用意されています。
次のリストは、createFilterメソッドの異なる形式について説明しています。渡された文字列は、Coherence問合せのWHERE句の構文(「エントリの結果セットでのフィルタリング」を参照)を使用しますが、リテラルのWHEREは使用しません。Object配列またはMapを指定する形式は、バインド変数で参照されるオブジェクトを渡すためのものです。各形式は用意されたCoherence問合せ文字列からフィルタを構築します。
public static Filter createFilter(String s): sは、Filterを表すCoherenceの問合せ内のStringです。
public static Filter createFilter(String s, Object[] aBindings): sは、FilterおよびaBindingsがバインド変数に使用するObjectsの配列であることを表すCoherenceの問合せ内のStringです。
public static Filter createFilter(String s, Map bindings): sは、Filterおよびbindingsがバインド変数に使用するObjectsのMapであることを表すCoherenceの問合せ内のStringです。
public static Filter createFilter(String s, Object[] aBindings, Map bindings): sは、Filter, aBindingsがバインド変数に使用するObjectsの配列であり、bindingsがバインド変数に使用するObjectsのMapであることを表すCoherenceの問合せ内のStringです。
これらのファクトリ・メソッドは、不具合、構文的に不正確な文、セマンティックなエラーがあると、FilterBuildingExceptionをスローします。この例外がRuntimeExceptionのサブクラスであるため、エラーの捕捉は必要ありませんが、エラーの捕捉をしないとプロセスが終了する可能性があります。
例
次の文では、メソッドのcreateFilter(String s)の形式を使用します。これはマサチューセッツ州に住み、別の州で働く従業員のフィルタを構築します。
..
QueryHelper.createFilter("homeAddress.state = 'MA' and workAddress.state != 'MA'")
...
この文は、Coherence APIを使用する次のフィルタ/エクストラクタと同じです。
AndFilter(EqualsFilter(ChainedExtractor(#getHomeAddress[], #getState[]), MA), NotEqualsFilter(ChainedExtractor(#getWorkAddress[], #getState[]), MA)))
QueryHelperクラスもcreateExtractorメソッドを提供し、それによりフィルタ構築時に値エクストラクタを作成できます。エクストラクタは、オブジェクトからの値の抽出(並べ替えやフィルタリングなど)とその抽出の識別の両方に使用されます。次の例は、索引作成時のcreateExtractorの使用を示しています。
cache.addIndex(QueryHelper.createExtractor("key().lastName"),/*fOrdered*/ true,
/*comparator*/ null);
この項では、その他の例を使用して、インスタンス化されたオブジェクト(Filters、ValueExtractors、Aggregatorsなど)によるそれらと同等のCoherence APIコールを示します。Filtersを強調する単純なselect *の例では、Filter部分のみに注目した場合、FilterBuilder APIの変換について理解できます。例の完全なセットを使用すると、QueryBuilder APIとコマンドライン・ツールの変換について理解できます。
この例では、識別子を修飾するキャッシュ名が削除されたパス構文の短縮された形式が使用されています。
例のJava言語形式でも、EntryProcessorsのかわりにReducerAggregatorが予測に使用されています。KeyExtractorの使用についても、Coherence 3.5ではReflectionExtractorに対する特定の変更を必要としなくなったことにも注意してください。
40がpriceキーの値より大きい、キャッシュordersから項目を選択します。
select * from "orders" where 40 > price
priceキーが100にまったく等しく、insuranceキーの値が10より小さいか、shippingキーの値が20以上である、キャッシュordersから項目を選択します。
select * from "orders" where price is 100 and insurance < 10 or shipping >= 20
priceキーが100にまったく等しく、insuranceキーの値が10より小さいか、またはshippingキーの値が20以上のいずれかである、キャッシュordersから項目を選択します。
select * from "orders" where price is 100 and (insurance < 10 or shipping >= 20)
priceキーの値が100に等しいか、barキーが20に等しい、キャッシュordersから項目を選択します。
select * from "orders" where price = 100 or shipping = 20
insuranceキーの値がnullでない、キャッシュordersから項目を選択します。
select * from "orders" where insurance is not null
emp_idキーが1から1000の値を持つか、bar.empキーが"Smith"でない、キャッシュemployeesから項目を選択します。
select * from "employees" where emp_id between 1 and 1000 or bar.emp is not "Smith"
itemキーが値"coat"に類似しているキャッシュordersから項目を選択します。
select * from "orders" where item like "coat%"
emp_idの値が5、10、15、または20のセット内にある、キャッシュemployeesから項目を選択します。
select * from "employees" where emp_id in (5,10,15,20)
emp_idがリスト5、10、15、および20を含む、キャッシュemployeesから項目を選択します。
select * from "employees" where emp_id contains (5,10,15,20)
emp_idが5、10、15、および20のすべての項目を含む、キャッシュemployeesから項目を選択します。
select * from "employees" where emp_id contains all (5,10,15,20)
emp_idが5、10、15、および20のいずれかの項目を含む、キャッシュemployeesから項目を選択します。
select * from "employees" where emp_id contains any (5,10,15,20)
fooキーの値が10より小さく、セット10、20で発生する、キャッシュemployeesから項目を選択します。
select * from "employees" where emp_id < 10 in (10,20)
キャッシュContactInfoCacheで従業員の家庭のstateとageを選択し、stateおよびageでグループ化します。
select homeAddress.state, age, count() from "ContactInfoCache" group by homeAddress.state, age
ordersキャッシュから擬似frobitキーを選択します。空の結果セットが返されます。
select frobit,supplier,sum(amount),avg(price) from "orders" group by supplier
$1000より大きいordersキャッシュ内の項目の場合、その項目、その価格と色を選択します。
select item_name,price,color from "orders" where price > 1000
ordersキャッシュから、項目に対する合計amountを選択します。
select sum(amount) from "orders"
color属性がredまたはgreenである、ordersキャッシュから、項目に対する合計amountを選択します。
select sum(amount) from "orders" where color is "red" or color is "green"
ordersキャッシュからの項目に対して、合計amountおよび平均priceを選択します。
select sum(amount),avg(price) from "orders"
employeesキャッシュの可能な重複行からlastnameとcityのコピーを選択します。ここでは、stateはカリフォルニアです。
select distinct lastName,city from "employees" where state = "CA"
employeesキャッシュでランクがグレード7以上の従業員の場合、給与を10%ごと増加して、休暇を50時間追加します。
update "employees" set salary = salary*1.10, vacation = vacation + 50 where grade > 7
この項では、key()およびvalue()という擬似関数の使用方法の例を示します。その他の例は、「コマンドラインの例」を参照してください。
ContactInfoCacheから、自宅の住所がマサチューセッツで勤務先は別の州である従業員を選択します。
select key().firstName, key().lastName from "ContactInfoCache" homeAddress.state is 'MA' and workAddress.state != "MA"
ContactInfoCacheキャッシュから、年齢が42より高い従業員を選択します。
select key().firstName, key().lastName, age from "ContactInfoCache" where age > 42