ヘッダーをスキップ
Oracle® Fusion Middleware Oracle Coherenceでのアプリケーションの開発
12c (12.1.2)
B70741-02
  ドキュメント・ライブラリへ移動
ライブラリ
製品リストへ移動
製品
目次へ移動
目次

前
 
次
 

28 Coherenceの問合せ言語の使用

この章では、Coherenceの問合せ言語(CohQL)を使用してCoherenceキャッシュと相互作用する方法について説明します。CohQLは、軽量な構文(SQLに似た)で、Coherenceクラスタ上でキャッシュ操作を実行するのに使用します。この言語は、プログラムからでも、コマンドライン・ツールからでも使用できます。

この章には次の項が含まれます:


注意:

  • CohQL構文はSQLによく似ているように見えますが、この構文はSQLではなく、実際には文脈的にJava Persistence問合せ言語(JPQL)の標準の方に関連している点に注意してください。

  • 連続問合せ言語(CQL: Continuous Query Language)は、複合イベント処理(CEP: Complex Event Processing)に関連した問合せ言語です。CohQLと混同しないようにしてください。


28.1 Coherenceの問合せ言語構文の理解

次の各項では、CohQLの機能について説明します。各項では、特に記述文、その構文、および例について説明します。問合せの例は、「その他のCoherenceの問合せ言語の例」を参照してください。


注意:

CohQLでは、副問合せはサポートされません。


この項には次のトピックが含まれます:

詳細は、Coherence問合せ文、句、式をアルファベット順に示している表28-1を参照してください。

28.1.1 問合せ構文の基本

この項では、構文の一部の構成要素(パス式、バインド変数、擬似関数など)について説明します。

28.1.1.1 パス式の使用

CohQLのメインの構成要素にパス式があります。パス式は、オブジェクトのインスタンスのグラフを介して移動する際に使用されます。パス式の識別子を使用して、Java Bean感覚でプロパティを表現します。これは、先頭にgetを付加し、最初の文字を大文字にして作成される、ReflectionExtractorによってバッキングされます。各要素は「ドット」(.)文字で区切られ、オブジェクトのトラバースを表現しています。たとえば、次のパス式はオブジェクト構造を移動するのに使用します。

a.b.c

これは反射的に次のメソッドを起動します。

getA().getB().getC()

28.1.1.2 バインド変数の使用

プログラム的に使用する場合には、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プログラムにおけるフィルタの作成」を参照してください。

28.1.1.3 KeyおよびValue擬似関数の使用

多くのユーザーがオブジェクトをkeyプロパティで格納するため、CohQLでは、key()擬似関数が用意されています。key()はキャッシュのキーを表しています。問合せ構文でもvalue()擬似関数が用意されています。value()は、key()で開始されない連鎖内では暗黙的です。key()擬似関数とvalue()擬似関数は、通常、WHERE句で使用され、この句ではキーやキャッシュ・エントリの値がテストされます。key()value()の使用例は、「KeyおよびValue擬似関数の例」および「コマンドラインの例」を参照してください。

28.1.1.4 別名の使用

意味的には必要はありませんが、CohQLはコード・アーティファクトをできるだけJPQLへ移植できるようにするために別名をサポートしています。CohQLは、キャッシュ名と、SELECTコマンド、UPDATEコマンド、DELETEコマンドのドット付きパス式の先頭に続く別名をサポートします。CohQLでは、キャッシュの別名をvalue()擬似関数の代用およびkey()擬似関数に対する引数として使用することも可能です。

28.1.1.5 リテラル引数での引用符の使用

通常、リテラル引数(cache-nameまたはservice-nameなど)を引用符で囲む必要はありません。引数に演算子(-+.<>=など)や空白が含まれる場合にのみ、引用符(一重または二重)が必要となります。

ファイル名も引用符で囲む必要があります。ファイル名には、通常、パス・セパレータ(/または\)およびドットが含まれ、名前が拡張子から区切られます。

コンパイラがunquotedリテラル引数、または問題のある文字が含まれるファイル名を発生する場合には、コンパイラはエラーをスローします。

28.1.2 データの取得

次の項では、SELECT文およびWHERE句について説明します。これらのエンティティは、ほとんどのキャッシュ問合せの基本的な構成要素です。

28.1.2.1 キャッシュからのデータの取得

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"
    

28.1.2.2 エントリの結果セットでのフィルタリング

WHERE句を使用して、結果セットから返されるエントリをフィルタリングします。CohQLの主要機能の1つは、パス式を使用して、式の評価の際にオブジェクト構造を移動できることです。条件式では、論理演算子、比較式、フィールドのプリミティブおよび関数演算子などを使用できます。

WHERE句のリテラル構文では、一重引用符を使用して、文字列のリテラルを囲むことができます。その引用符の前に別の一重引用符を接頭辞にして、文字列内でエスケープできます。数式は、Javaプログラミング言語の表記規則に従って定義されます。ブール値は、リテラルのTRUEFALSEで表されます。日付リテラルはサポートされていません。


注意:

CohQLには、型情報に対するアクセス権が付与されていません。ゲッターがリテラルのタイプとは異なる数値型を返した場合、比較の演算子のtrueを想定した部分にfalseを取得することがあります。これを回避するには、リテラルの型で、longにはlを、doubleにはdを、またshortにはsを指定します。デフォルト値は、ピリオド(.)なしのリテラルに対してはIntegerで、ピリオド(.)付きのリテラルに対してはFloatです。


WHERE句内の演算子の優先度は、次のとおりです。

  1. パス演算子(.)

  2. 単項の+および-

  3. 乗算(*)および除算(/)

  4. 足し算(+)および引き算(-)

  5. 比較演算子: =>>=<<=<>、[NOT] BETWEEN、[NOT] LIKE、[NOT] INIS [NOT] NULLCONTAINS [ALL|ANY]

  6. 論理演算子(ANDORNOT)

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"

CONTAINSALLおよびANY形式は、IN演算子と同じ構文を持つインラインリストまたはバインド変数となります。


注意:

Coherenceで用意されているプログラムのAPIを使用すると、WHERE句の条件式構文に基づいたスタンドアロンのCoherenceフィルタを作成できます。「Javaプログラムにおけるフィルタの作成」を参照してください。


その他の例は、「フィルタを強調表示する単純なSELECT * FROM文」を参照してください。

次に例を示します。

  • キャッシュdept内のすべての項目を選択します。ここでは、deptnoキーの値が10になります。

    select * from "dept" where deptno = 10
    

28.1.3 キャッシュのライフサイクルの管理

次の項では、キャッシュの作成と削除の方法を説明します。また、キャッシュの内容のバックアップとリストアの方法も説明します。

28.1.3.1 キャッシュの作成

問合せを送信する前に、それぞれCREATE CACHEまたはENSURE CACHE文を使用して、既存のキャッシュに接続するか、新規キャッシュを作成します。この文は、まず指定されたcache-nameでキャッシュへの接続を試行します。キャッシュがクラスタ内に見つからない場合は、現在のキャッシュ構成ファイルに基づいて指定された名前でキャッシュの作成が試行されます。この文は、コマンドラインで特に有用です。この文をプログラムで使用している場合、名前の変わりにサービスとクラスローダーの情報を指定するオプションがあります(クラスローダーにはコマンドラインからはアクセスできません)。


注意:

文では、キャッシュ名とサービス名を引用符(二重引用符(" ")または一重引用符(' '))で囲む必要があります。


構文は次のとおりです。

[ CREATE | ENSURE ] CACHE "cache-name" 
[ SERVICE "service-name" ]

次に例を示します。

  • deptという名前のキャッシュを作成します。

    create cache "dept"
    

28.1.3.2 キャッシュのシリアライズ表現のファイルへの書込み

BACKUP CACHE文を使用して、指定されたキャッシュのシリアライズ表現を、指定されたfilenameで表示されたファイルに書き込みます。filenameは、オペレーティング・システム固有のパスであり、一重または二重引用符で囲む必要があります。BACKUP CACHE文は、コマンドライン・ツールでのみ使用できます。構文は次のとおりです。

BACKUP CACHE "cache-name" [ TO ] [ FILE ] "filename"

注意:

バックアップ(および後続のリストア)機能は、開発およびテスト環境で使用されるように設計されており、データの整合性を確認するプロビジョニングがないため、本番のデータ・セットでは使用しないでください。この機能は、本番のバックアップ、スナップショット、またはチェックポイント・ユーティリティとしてサポートされていません。

特に:

  • バックアップは、クラスタ内のシングル・ノードでのみ動作するため、低速です。

  • バックアップはアトミックではありません。つまり、バックアップ中に発生した要素への変更が反映されず、データの読取りで内容が保証されない結果になります。

  • エラーが発生して不完全なバックアップとなった場合、バックアップは停止します。そのような場合には、エラーを説明するIOExceptionがスローされます。

  • バックアップは、3.xから12.1.xまでの上位互換性および下位互換性はありません。


次に例を示します。

  • deptキャッシュのシリアライズ表現をtextfileファイルに書き込みます。

    backup cache "dept" to file "textfile"
    

28.1.3.3 キャッシュの内容のファイルからのロード

RESTORE CACHE文を使用して、指定されたキャッシュのシリアライズ表現を、指定されたfilenameで表示されたファイルから読み取ります。filenameは、オペレーティング・システム固有のパスであり、一重または二重引用符で囲む必要があります。RESTORE CACHE文は、コマンドライン・ツールでのみ使用できます。構文は次のとおりです。

RESTORE CACHE "cache-name" [ FROM ] [ FILE ] "filename"

注意:

Coherenceのバージョン3.xから12.1.xまでは、バックアップをリストアできません。


次に例を示します。

  • deptキャッシュをtextfileファイルからリストアします。

    restore cache "dept" from file "textfile"
    

28.1.3.4 クラスタからのキャッシュの削除

DROP CACHE文を使用して、指定したキャッシュをクラスタから完全に削除します。キャッシュは、Java destroy()メソッドへのコールによって削除されます。いずれかのクラスタ・メンバーが、削除されたキャッシュへの参照を保持してそれになんらかの操作の実行を試行すると、そのメンバーはIllegalStateExceptionを受け取ります。Coherence問合せのDROP CACHE文の構文は、次のとおりです。

DROP CACHE  "cache-name"

次に例を示します。

  • ordersキャッシュをクラスタから削除します。

    drop cache "orders"
    

28.1.4 キャッシュ・データの処理

次の項では、キャッシュ・データの挿入および削除、結果セットのフィルタリングなど、キャッシュ内のデータの操作方法を説明します。

28.1.4.1 問合せ結果の集計

集計の問合せは、SELECT問合せの変動要素です。結果をグループ化して集計関数を適用し、結果に関するサマリー情報を取得する場合には、集計の問合せを使用します。問合せに集計関数を使用しているか、GROUP BY句が含まれる場合には、問合せは集計の問合せと見なされます。集計の問合せの最も一般的な形式では、1つ以上のグループ化の式の後にGROUP BY句内の同じリード・グループ化の式と組み合せられたSELECT句の集計関数が続く形式が使用されます。

CohQLがサポートする集計関数は、COUNTAVGMINMAX、およびSUMです。これらの関数は、DoubleLongおよびBigDecimal型に対して使用できます。型を指定するには、型の後にアンダースコア(_)を付けた接頭辞を関数に含めます。例:

long_sum, bd_sum

明示的に型が指定されていない場合は、Double型であると見なされます。

その他の例は、「予測、集計、グループ化を扱う複雑な問合せ」を参照してください。

次に例を示します。

  • supplierでグループ化されたordersキャッシュからの項目に対して、合計amountおよび平均priceを選択します。

    select supplier,sum(amount),avg(price) from "orders" group by supplier
    
  • supplierでグループ化されたordersキャッシュからの項目に対して、(BigDecimal型を使用して)合計amountおよび平均priceを選択します。

    select supplier,bd_sum(amount),bd_avg(price) from "orders" group by supplier
    

28.1.4.2 既存の値の変更

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
    

28.1.4.3 キャッシュ内へのエントリの挿入

INSERT文を使用して、指定されたKEYの下に指定されたVALUEを格納します。KEY句が提供されていない場合には、新しく作成したオブジェクトに対してメッセージgetKey()が送信されます(可能な場合)。そうでない場合、valueオブジェクトがキーとして使用されます。

INSERT文はObjectsMaps上で機能する点に注意してください。構文は次のとおりです。

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"
    

28.1.4.4 キャッシュ内のエントリの削除

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"
    

28.1.5 索引の処理

次の項では、キャッシュ・データの索引の作成と削除の方法を説明します。索引により、Coherenceの組込みオプティマイザがさらに迅速かつ効率的に問合せを分析して、結果を返すことができるようになります。

28.1.5.1 キャッシュ上での索引の作成

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
    

28.1.5.2 キャッシュからの索引の削除

DROP INDEX文は、指定されたValueExtractorに基づいて索引を削除します。この文は、コマンドライン・ツールでのみ使用できます。構文は次のとおりです。

DROP INDEX [ON] "cache-name" (value-extractor-list)

次に例を示します。

  • ordersキャッシュ内の属性lastnameの索引を削除します。

    drop index "orders" lastname
    

28.1.6 複数の問合せ文の発行

次の項では、複数の問合せ文を効率的にキャッシュへ発行する方法を説明します。

28.1.6.1 問合せ文のバッチ・モードでの処理

SOURCE文では、文の「バッチ」処理が可能です。SOURCE文は、指定されたfilenameで表示されたファイルから1つ以上の問合せ文を開いて読み取ります。filenameは、オペレーティング・システム固有のパスであり、一重または二重引用符で囲む必要があります。ファイル内の各問合せ文は、セミコロン(;)で区切る必要があります。ソーシングはコマンドライン・ツールでのみ使用でき、コマンドの順序で構成されるファイルをロードできます。ソース・ファイルは、そのソースが他のファイルの場合もあります。構文は次のとおりです。

SOURCE FROM [ FILE ] "filename"

SOURCEは、@"filename"のように"at"記号(@)を使用して短縮できます。"ピリオド"記号の'.'は、コマンドラインでのみ、'@'の省略として使用できますが、ファイル名を引用符で囲むことはできません。

次に例を示します。

  • command_fileファイルの文を処理します。

    source from file "command_file"
    

    または

    @ "command_file"
    

    または

    . command_file
    

28.1.7 問合せのコストと効果の表示

問合せのコストと効果を判断するために使用される問合せレコードを作成および出力するには、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

28.2 CohQLコマンドライン・ツールの使用

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機能なしで開始されます。

28.2.1 コマンドライン・ツールの起動

次の手順は、起動スクリプトを使用してCohQLコマンドライン・ツールの起動方法を示しています。この手順は、スクリプトのstorage_enabledfalseに設定されていること(デフォルト)を前提としています。

  1. キャッシュ・サーバー・クラスタ・ノードを起動するか、既存のキャッシュ・サーバー・クラスタが起動していることを確認します。

    キャッシュ・サーバー・クラスタ・ノードを起動するには、コマンド・プロンプトまたはシェルを開き、/binディレクトリにあるキャッシュ・サーバー起動スクリプトを実行します(Windowsプラットフォームではcache-server.cmd、UNIXプラットフォームではcache-server.sh)。キャッシュ・サーバーが起動し、このクラスタ・メンバーに関する情報が出力されます。

  2. コマンド・プロンプトまたはシェルを開き、/binディレクトリにあるCohQLコマンドライン起動スクリプトを実行します(Windowsプラットフォームではquery.cmd、UNIXプラットフォームではquery.sh)。Java環境に関する情報が表示されます。コマンドライン・ツール・プロンプト(CohQL>)が返されます。


    注意:

    既存のキャッシュ・サーバー・ノードを結合する場合、起動スクリプトを変更して、同じキャッシュ構成を含む既存のキャッシュ・サーバー・ノードと同じクラスタ設定を使用します。


  3. コマンドラインのヘルプを全部表示するには、プロンプトでhelpと入力します。詳細な説明のないヘルプのリストを表示するには、commandsと入力します。

    コマンドライン・ツールを用いる一連の問合せ文については、「コマンドラインの例」を参照してください。

28.2.2 コマンドライン・ツールの引数の使用

CohQLコマンドライン・ツールには、CohQL>プロンプトが返す前に読み取られ、実行される一連の引数が組み込まれています。これは、スクリプトを大型のスクリプトの一部として使用する際に(ビルド・プロセスの一部としての使用、I/Oをパイピングするための使用など)有用です。CohQL>プロンプトでhelpと入力し、コマンドライン・ツール内の引数のヘルプを表示します。

表28-2 Coherenceの問合せ言語コマンドライン・ツールの引数

引数 説明

-t

トレース・モードを有効にして、デバッグ情報を出力します。

-c

コマンドライン引数の処理の後、コマンドライン・ツールを終了します。この引数は、標準の入力からリダイレクトする際には使用しないでください。使用すると、コマンドラインの引数が処理を終了すると同時にツールが終了して、リダイレクトされた入力が読み取られません。

-s

コマンドライン・ツールをサイレント・モードで操作して、無関係な用語を削除します。これにより、標準の入力(<myInput)と標準の出力(>myOuput)をリダイレクトすると、コマンドライン・ツールをパイプまたはフィルタで使用できます。

-e

コマンドライン・ツールを拡張言語モードで操作します。このモードにより、更新でオブジェクト・リテラルが許可され、コマンドを挿入できるようになります。使用法の詳細は、コマンドラインのヘルプを参照してください。

-l statement

指定した文を実行します。文は一重または二重の引用符で囲む必要があります。任意の数の-l引数を使用できます。

-f filename

指定したファイルの文を処理します。ファイル内の文は、セミコロン(;)で区切る必要があります。ファイルは、オペレーティング・システム固有のパスであり、一重または二重引用符で囲む必要があります。任意の数の-f引数を使用できます。


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

28.2.3 コマンドラインの例

次に、Windowsでのコマンドライン・ツールの使用方法の例を示します。この例では、単一クラスタ・メンバーを想定しているため、起動スクリプト内のstorage_enabled設定はtrueに設定されています。この例はキャッシュの作成と削除、エントリの格納と取得、バックアップ・ファイルからのキャッシュのリストアを示します。また、key()およびvalue()という擬似関数の使用を強調します。

コマンド・プロンプトでquery.cmdスクリプトを起動する際に、Java環境、Coherenceのバージョンおよびエディション、Coherenceキャッシュ・サーバーに関する情報が表示されます。プロンプト(CohQL>)に問合せ文を入力します。

次のようにしてCohQLコマンドライン・ツールを起動します。

C:/coherence/bin/query.cmd

employeesという名前のキャッシュを作成します。

CohQL> create cache "employees"

エントリ(キーと値のペア)をキャッシュに挿入します。

CohQL> insert into "employees" key "David" value "ID-5070"

キャッシュにオブジェクトを挿入します。

CohQL> insert into "employees" value new com.my.Employee("John", "Doe", 
"address", 34)

キーの値を変更します。

CohQL> update employees set value() = "ID-5080" where key() like "David"

キャッシュ内の値を取得します。

CohQL> select * from "employees"

存在しないキーの値を取得します。空の結果セットが返されます。

CohQL> select key(), value() from "employees" where key() is "Richard"

キャッシュ内の既存のキーを削除します。空の結果セットが返されます。

CohQL> delete from employees where key() = "David"

employeesキャッシュの内容を削除します。空の結果セットが返されます。

CohQL> delete from "employees"

employeesキャッシュを破棄します。

CohQL> drop cache "employees"

employeesキャッシュを再作成します。

CohQL> create cache "employees"

さらに多くのエントリをキャッシュに挿入します。

CohQL> insert into "employees" key "David" value "ID-5080"

CohQL> insert into "employees" key "Julie" value "ID-5081"

CohQL> insert into "employees" key "Julie" value "ID-5082"

CohQL> insert into "employees" key "Mike" value "ID-5083"

employeesキャッシュ内のキーと値を取得します。

CohQL> select key(), value() from "employees"

キャッシュのシリアライズされた形式をファイルに保存します。

CohQL> backup cache "employees" to "emp.bkup"

キャッシュからキーを削除します。

CohQL> delete from "employees" where key() = "David"

キャッシュの内容を取得します。削除されたキーと値が存在していないことがわかります。

CohQL> select key(), value() from "employees"

キャッシュの内容を削除します。

CohQL> delete from "employees"

キャッシュの内容を取得します。空の結果セットが返されます。

CohQL> select * from "employees"

バックアップ・ファイルからキャッシュの内容をリストアします。

CohQL> restore cache "employees" from file "emp.bkup"

キャッシュの内容を取得します。すべてのエントリがリストアされ、返されたことを確認します。

CohQL> select key(), value() from "employees"

employeesキャッシュを破棄します。

CohQL> drop cache "employees"

コマンドライン・ツールを終了します。

CohQL> bye

28.3 Javaプログラムにおけるフィルタの作成

FilterBuilder APIは、Javaプログラム内から結果セットをフィルタリングする文字列指向の方法で、使用の際にはCoherence APIの詳細を覚える必要はありません。APIには、com.tangosol.util.QueryHelperクラスに過負荷のcreateFilterファクトリ・メソッドのセットが4つ用意されています。

次のリストは、createFilterメソッドの異なる形式について説明しています。渡された文字列は、Coherence問合せのWHERE句の構文(「エントリの結果セットでのフィルタリング」を参照)を使用しますが、リテラルのWHEREは使用しません。Object配列またはMapを指定する形式は、バインド変数で参照されるオブジェクトを渡すためのものです。各形式は用意されたCoherence問合せ文字列からフィルタを構築します。

これらのファクトリ・メソッドは、不具合、構文的に不正確な文、セマンティックなエラーがあると、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);

28.4 その他のCoherenceの問合せ言語の例

この項では、その他の例を使用して、インスタンス化されたオブジェクト(FiltersValueExtractorsAggregatorsなど)によるそれらと同等のCoherence APIコールを示します。Filtersを強調する単純なselect *の例では、Filter部分のみに注目した場合、FilterBuilder APIの変換について理解できます。例の完全なセットを使用すると、QueryBuilder APIとコマンドライン・ツールの変換について理解できます。

この例では、識別子を修飾するキャッシュ名が削除されたパス構文の短縮された形式が使用されています。

例のJava言語形式でも、EntryProcessorsのかわりにReducerAggregatorが予測に使用されています。KeyExtractorの使用についても、Coherence 3.5ではReflectionExtractorに対する特定の変更を必要としなくなったことにも注意してください。

28.4.1 フィルタを強調表示する単純なSELECT * FROM文

  • 40priceキーの値より大きい、キャッシュ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がリスト51015、および20を含む、キャッシュemployeesから項目を選択します。

    select * from "employees" where emp_id contains (5,10,15,20)
    
  • emp_id51015、および20のすべての項目を含む、キャッシュemployeesから項目を選択します。

    select * from "employees" where emp_id contains all (5,10,15,20)
    
  • emp_id51015、および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)
    

28.4.2 予測、集計、グループ化を扱う複雑な問合せ

  • キャッシュContactInfoCacheで従業員の家庭のstateageを選択し、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を選択します。Double型であると見なされます。

    select sum(amount) from "orders"
    
  • ordersキャッシュから、項目に対する合計amountLong型として選択します。

    select long_sum(amount) from "orders"
    
  • ordersキャッシュから、項目に対する合計amountBigDecimal型として選択します。

    select bd_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キャッシュの可能な重複行からlastnamecityのコピーを選択します。ここでは、stateはカリフォルニアです。

    select distinct lastName,city from "employees" where state = "CA"
    

28.4.3 UPDATEの例

  • employeesキャッシュでランクがグレード7以上の従業員の場合、給与を10%ごと増加して、休暇を50時間追加します。

    update "employees" set salary = salary*1.10, vacation = vacation + 50 where grade > 7
    

28.4.4 KeyおよびValue擬似関数の例

この項では、key()およびvalue()という擬似関数の使用方法の例を示します。その他の例は、「コマンドラインの例」を参照してください。

  • ContactInfoCacheから、自宅の住所がマサチューセッツで勤務先は別の州である従業員を選択します。

    select key().firstName, key().lastName from "ContactInfoCache" where homeAddress.state is 'MA' and workAddress.state != "MA"
    
  • ContactInfoCacheキャッシュから、年齢が42より高い従業員を選択します。

    select key().firstName, key().lastName, age from "ContactInfoCache" where age > 42