2.2. Ickle クエリー言語構文
Ickle クエリー言語は、フルテキスト用のいくつかの拡張機能を含む JPQL クエリー言語のサブセットです。
パーサー構文には、以下のような重要なルールがあります。
- 空白は重要ではありません。
- フィールド名ではワイルドカードはサポートされません。
- デフォルトのフィールドがないため、フィールド名またはパスは必ず指定する必要があります。
-
&&
および||
は、フルテキストと JPA 述語の両方で、AND
またはOR
の代わりに使用できます。 -
!
はNOT
の代わりに使用できます。 -
足りないブール値 Operator は
OR
として解釈されます。 - 文字列の用語は、一重引用符または二重引用符で囲む必要があります。
- ファジー性とブースティングは任意の順序で受け入れられず、常にファジー性が最初になります。
-
<>
の代わりに!=
が許可されます。 -
>
、>=
、<
、<=
演算子にはブースティングを適用できません。同じ結果を達成するために範囲を使用することができます。
2.2.1. Operator のフィルタリング
Ickle はインデックス化されたフィールドとインデックス化されていないフィールドの両方に使用できる多くの Operator のフィルタリングをサポートします。
Operator | 説明 | 例 |
---|---|---|
| 左のオペランドが引数として指定された値のコレクションからの要素のいずれかと等しいことを確認します。 |
|
| (文字列として想定される) 左側の引数が、JPA ルールに準拠するワイルドカードパターンと一致することを確認します。 |
|
| 左側の引数が指定の値と完全に一致することを確認します。 |
|
| 左側の引数が指定の値とは異なることを確認します。 |
|
| 左側の引数が指定の値よりも大きいことを確認します。 |
|
| 左側の引数が指定の値以上であることを確認します。 |
|
| 左側の引数が指定の値未満であることを確認します。 |
|
| 左側の引数が指定の値以下であることを確認します。 |
|
| 左側の引数が指定された範囲の制限の間にあることを確認します。 |
|
2.2.2. ブール値の条件
以下の例では、複数の属性条件を論理結合 (and
) および非結合 (or
) 演算子と組み合わせて、より複雑な条件を作成する方法を示しています。ブール値演算子のよく知られる演算子の優先順位ルールがここで適用されるため、Operator の順序は関連性がありません。ここで、or
が最初に呼び出された場合でも、and
Operator の優先順位は or
よりも高くなります。
# match all books that have "Data Grid" in their title # or have an author named "Manik" and their description contains "clustering" FROM org.infinispan.sample.Book WHERE title LIKE '%Data Grid%' OR author.name = 'Manik' AND description like '%clustering%'
ブール値の否定は論理演算子の中で優先され、次の単純な属性条件にのみ適用されます。
# match all books that do not have "Data Grid" in their title and are authored by "Manik" FROM org.infinispan.sample.Book WHERE title != 'Data Grid' AND author.name = 'Manik'
2.2.3. ネストされた条件
論理演算子の優先順位の変更は、括弧を使用して行います。
# match all books that have an author named "Manik" and their title contains # "Data Grid" or their description contains "clustering" FROM org.infinispan.sample.Book WHERE author.name = 'Manik' AND ( title like '%Data Grid%' OR description like '% clustering%')
2.2.4. SELECT ステートメントによるプロジェクション
一部のユースケースでは、属性のごく一部のみがアプリケーションによって実際に使用されている場合、特にドメインエンティティーにエンティティーが埋め込まれている場合、ドメインオブジェクト全体を返すのはやり過ぎです。クエリー言語を使用すると、プロジェクションを返す属性 (または属性パス) のサブセットを指定できます。デプロイメントが使用される場合、QueryResult.list()
はドメインエンティティー全体を返しませんが、Object[]
の List
(プロジェクト化された属性に対応する配列) を返します。
# match all books that have "Data Grid" in their title or description # and return only their title and publication year SELECT title, publicationYear FROM org.infinispan.sample.Book WHERE title like '%Data Grid%' OR description like '%Data Grid%'
2.2.4.1. キャッシュエントリーのバージョンのプロジェクション
version
プロジェクション機能を使用して、キャッシュのエントリーバージョンをプロジェクションできます。
# return the title, publication year and the cache entry version SELECT b.title, b.publicationYear, version(b) FROM org.infinispan.sample.Book b WHERE b.title like '%Data Grid%'
2.2.4.2. キャッシュエントリー値のプロジェクション
他のプロジェクションと共にキャッシュエントリーの値をプロジェクションできます。たとえば、この値を使用して、結果を返した同じ Object[]
内のキャッシュエントリーのバージョンとともにキャッシュエントリーの値をプロジェクションできます。
# return the cache entry value and the cache entry version SELECT b, version(b) FROM org.infinispan.sample.Book b WHERE b.title like '%Data Grid%'
2.2.4.3. スコアの射影
クエリーがインデックス化されている場合、各マッチングによって得られたスコアを他の射影と一緒に射影することが可能です。たとえば、同じ Object[]
が返したヒットのスコアとともにキャッシュエントリー値を射影するために使用できます。
# return the cache entry value and the the score of the matching SELECT b, score(b) FROM org.infinispan.sample.Book b WHERE b.title like '%Data Grid%'
ソート
1 つ以上の属性または属性パスに基づいて結果の順序は ORDER BY
句で行われます。複数の並べ替え基準が指定されている場合は、順序によって優先順位が決まります。
# match all books that have "Data Grid" in their title or description # and return them sorted by the publication year and title FROM org.infinispan.sample.Book WHERE title like '%Data Grid%' ORDER BY publicationYear DESC, title ASC
2.2.5. グループ化およびアグリゲーション
Data Grid には、グループ化フィールドのセットに従ってクエリー結果をグループ化し、各グループに分類される値のセットに集計関数を適用することにより、各グループからの結果の集計を構築する機能があります。グループ化と集計は、プロジェクションクエリー (SELECT 句に 1 つ以上のフィールドがあるクエリー) にのみ適用できます。
サポートされる集約は avg
、sum
、count
、max
および min
です。
グループ化フィールドセットは GROUP BY
句で指定し、グループ化フィールドの定義に使用される順番は関係ありません。プロジェクションで選択されたすべてのフィールドは、グループ化フィールドであるか、以下で説明するグループ化関数の 1 つを使用して集約される必要があります。Projection フィールドは集約され、同時にグループ化に使用できます。グループ化フィールドのみを選択し、集計フィールドは選択しないクエリーは有効です。例: ブックマークは作成者別にグループ化し、それらをカウントします。
SELECT author, COUNT(title) FROM org.infinispan.sample.Book WHERE title LIKE '%engine%' GROUP BY author
選択したすべてのフィールドに集計関数が適用され、グループ化にフィールドが使用されないプロジェクションクエリーが許可されます。この場合、集計は、単一のグローバルグループが存在するかのようにグローバルに計算されます。
集約
以下の集約関数をフィールドに適用できます。
集約関数 | 説明 |
---|---|
|
一連の数字の平均を計算します。許可される値は、 |
|
null 以外の行の数をカウントし、 |
|
見つかった最も大きな値を返します。許可される値は |
|
見つかった最小値を返します。許可される値は |
|
数字のセットの合計を計算します。null 以外の値がない場合、結果は代わりに |
フィールドタイプ | 戻り値のタイプ |
---|---|
Integral (BigInteger 以外) | ロング |
Float または Double | Double |
BigInteger | BigInteger |
BigDecimal | BigDecimal |
グループ化および集計を使用したクエリーの評価
集計クエリーには、通常のクエリーのようにフィルター条件を含めることができます。フィルタリングは、グループ化操作の前後の 2 つのステージで実行できます。グループ化操作の実行前に groupBy()
メソッドを起動する前に定義されたフィルター条件はすべて、キャッシュエントリーに直接 (最終的なデプロイメントではなく) キャッシュエントリーに適用されます。これらのフィルター条件は、照会されたエンティティータイプの任意のフィールドを参照でき、グループ化ステージの入力となるデータセットを制限することを目的としています。groupBy()
メソッドの呼び出し後に定義されたフィルター条件はすべて、デプロイメントおよびグループ化操作の結果がデプロイメントされます。このフィルター条件は、groupBy()
フィールドまたは集約されたフィールドのいずれかを参照できます。select 句で指定されていない集約フィールドを参照することは許可されています。ただし、非集計フィールドと非グループ化フィールドを参照することは禁止されています。このフェーズでフィルタリングすると、プロパティーに基づいてグループの数が減ります。通常のクエリーと同様に、並べ替えも指定できます。順序付け操作は、グループ化操作後に実行され、groupBy()
フィールドまたは集約されたフィールドのいずれかを参照できます。
2.2.6. DELETE ステートメント
以下の構文を使用して、Data Grid キャッシュからエントリーを削除できます。
DELETE FROM <entityName> [WHERE condition]
-
<entityName>
で単一のエンティティーのみを参照します。DELETE クエリーは結合を使用できません。 - WHERE 条件は任意です。
DELETE クエリーでは、次のいずれも使用できません。
- SELECT ステートメントによるプロジェクション
- グループ化およびアグリゲーション
- ORDER BY 句
Query.executeStatement()
メソッドを呼び出して、DELETE ステートメントを実行します。