ヘッダーをスキップ
Oracle® Coherence開発者ガイド
リリース3.6.1
B61368-02
  ドキュメント・ライブラリへ移動
ライブラリ
製品リストへ移動
製品
目次へ移動
目次

前
 
次
 

24 Coherenceの問合せ言語の使用方法

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

この章は次の各項で構成されています。


注意:

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

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


Coherenceの問合せ言語構文について

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


注意:

現在のCohQLのリリースでは、サブ問合せはサポートされていません。

この項は、次のトピックで構成されています。

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

問合せ構文の基本

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

パス式の使用法

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およびValue擬似関数の使用方法

多くのユーザーがオブジェクトを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プログラミング言語の表記規則に従って定義されます。ブール値は、リテラルの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演算子は、"_"および"%"のワイルドカードを使用できます。

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
    

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

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

キャッシュの作成

問合せの送信を開始する前に、まず既存のキャッシュに接続するか、新規キャッシュを作成する必要があります。そうするには、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"

注意:

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

特に:

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

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

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


次に例を示します。

  • 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がサポートする集計関数は、COUNTAVGMINMAX、および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文は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"
    

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

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を作成する、カンマ区切りのリストです。1つ以上の要素が存在する場合には、MultiExtractorが使用されます。KeyExtractorを作成する場合には、key()擬似関数を使用してパス式を開始します。

索引の自然な順序が適用されます。

次に例を示します。

  • ordersキャッシュ内の属性lastnameで索引を作成します。

    create index "orders" lastname
    

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

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

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

次に例を示します。

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

    drop 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
    

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章「構成について」を参照してください。

スクリプトには、JLINE_HOME環境変数とCOHERENCE_HOME環境変数の設定オプションも用意されています。COHERENCE_HOMEがコンピュータで未設定の場合、スクリプト内のその環境変数をCoherenceのインストール場所に設定します。JLINE_HOME環境変数はJLine JARの場所に設定する必要があります。これは、コマンド履歴内を上下の矢印で移動させるような、コマンドラインの拡張編集機能で使用されます。ただし、JLineはCohQLの使用には必要ありません。

出荷状態では、スクリプトはjline-0.9.94.jarライブラリがCOHERENCE_HOME/bin/ディレクトリ内に格納されていると想定します。ライブラリが見つからない場合には、JARがロードされなかったことを示すメッセージが表示されます。JARをCOHERENCE_HOME/bin/ディレクトリにコピーするか、JARの場所をポイントするJLINE_HOME変数を変更します。JARは、次の場所からダウンロードできます。

http://jline.sourceforge.net/

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

次の手順は、起動スクリプトを使用して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と入力します。

    通常、最初の文は新規キャッシュを作成するか、既存のキャッシュに接続するためのものです。「キャッシュの作成」を参照してください。

    コマンドラインの例」では、コマンドライン・ツールを用いる一連の問合せ文を示しています。

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

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

表24-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

コマンドラインの例

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

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

例には、コマンドを説明する注釈とそれらの出力が太字イタリックのフォントで追加されています。次に例を示します。

< This is an annotation. >  

例24-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"

   < 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

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);

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

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

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

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

フィルタを強調表示する単純な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)
    

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

  • キャッシュ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を選択します。

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

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

UPDATEの例

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

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

KeyおよびValue擬似関数の例

この項では、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