eXtreme Scale 照会のための参照

WebSphere® eXtreme Scale は独自の言語を持ち、それによってユーザーはデータを照会することができます。

ObjectGrid 照会の FROM 文節

FROM 文節は、照会を適用するオブジェクトの集合を指定します。各集合は、抽象スキーマ名と識別変数 (範囲変数)、または単一値または多値リレーションシップと識別変数を識別する集合メンバー宣言のいずれかによって識別されます。

概念的には、照会のセマンティクスは、まずタプルの一時的な集合を形成することであり、R と呼ばれます。タプルは、FROM 文節で識別される集合からのエレメントで構成されています。 各タプルには、FROM 文節内の各集合からのエレメントが 1 つ含まれています。集合のメンバー宣言で指定された制約に従って、すべての可能な組み合わせが形成されます。パーシスタント・ストア内にレコードがないコレクションを識別するスキーマ名がある場合は、一時集合 R は空です。

FROM の使用例

DeptBean オブジェクトには、レコード 10、20、30 があります。EmpBean オブジェクトには、部門 10 に関連付けられたレコード 1、2、および 3 と、部門 20 に関連付けられたレコード 4 および 5 があります。部門 30 に関連付けられた従業員はいません。

FROM DeptBean d, EmpBean e

この文節によって、15 のタプルを持つ一時集合 R が形成されます。

FROM DeptBean d, DeptBean d1

この文節によって、9 のタプルを持つ一時集合 R が形成されます。

FROM DeptBean d, IN (d.emps) AS e

この文節によって、5 のタプルを持つ一時集合 R が形成されます。部門 30 には従業員がいないため、R 一時集合内にはありません。部門 10 は 3 回、部門 20 は 2 回、R 一時集合に含まれます。

IN(d.emps) as e を使用する代わりに、JOIN 述部を使用すると次のようになります。

FROM DeptBean d JOIN d.emps as e

一時集合が形成されると、WHERE 文節の検索条件が R 一時集合に適用され、新しい一時集合 R1 が形成されます。ORDER BY 文節と SELECT 文節が R1 に適用されて、最終的な結果セットが形成されます。

識別変数は、FROM 文節で IN 演算子またはオプションの AS 演算子を使用して宣言される変数です。

FROM DeptBean AS d, IN (d.emps) AS e

これは、下記と同じです。

FROM DeptBean d, IN (d.emps) e

抽象スキーマ名として宣言される識別変数は、範囲変数と呼びます。前の照会では、「d」が範囲変数です。多値パス式として宣言される識別変数は、コレクション・メンバー宣言と呼びます。前の例では、「d」および「e」の値がコレクション・メンバー宣言です。

FROM 文節内での単一値パス式の使用例を示します。

FROM EmpBean e, IN(e.dept.mgr) as m

ObjectGrid 照会の SELECT 文節

SELECT 文節の構文を、以下の例に示します。

SELECT { ALL | DISTINCT } [ selection , ]* selection

selection  ::= {single_valued_path_expression |
                identification_variable |
                OBJECT ( identification_variable) |
	       aggregate_functions } [[ AS ] id ]

SELECT 文節は、以下のエレメントの 1 つ以上で構成されます。FROM 文節で定義される単一の識別変数、オブジェクト参照やオブジェクト値を評価する単一値パス式、および集約関数。DISTINCT キーワードを使用し、重複参照を取り除くことができます。

スカラー副選択は、単一値を返す副選択です。

SELECT の使用例

従業員 John の収入を超える従業員をすべて検索します。

SELECT OBJECT(e) FROM EmpBean ej, EmpBean eWHERE ej.name = 'John' and e.salary > ej.salary

収入が 20000 に満たない従業員が 1 人以上いる部門をすべて検索します。

SELECT DISTINCT e.dept FROM EmpBean e where e.salary < 20000

照会には、任意の値を評価するパス式を含めることができます。

SELECT e.dept.name FROM EmpBean e where e.salary < 20000

前の照会では、収入が 20000 に満たない従業員がいる部門の名前値の集合が返されます。

照会は、集約値を返すこともできます。

SELECT avg(e.salary) FROM EmpBean e

収入の低い従業員について、名前とオブジェクト参照を取得する照会は、次のようになります。

SELECT e.name as name , object(e) as emp from EmpBean e where e.salary < 50000

ObjectGrid 照会の WHERE 文節

WHERE 文節には、以下のエレメントで構成される検索条件が含まれています。 検索条件が TRUE と評価されると、結果セットにタプルが追加されます。

ObjectGrid 照会のリテラル

ストリング・リテラルは、単一引用符で囲みます。ストリング・リテラル内にある単一引用符は、2 つの単一引用符で表します。例: 'Tom''s。

数値リテラルは、以下の任意の値が使用可能です。

  • 57、-957、+66 などの厳密値
  • Java long 型でサポートされる任意の値
  • 57.5、-47.02 などの小数リテラル
  • 7E3、-57.4E-2 などの概算数値
  • 「F」修飾子を含めた浮動小数点型 (例えば、「1.0F」)
  • 「L」修飾子を含めた long 型 (例えば、「123L」)

ブール・リテラルは TRUE および FALSE です。

一時リテラルは、属性のタイプに基づいて JDBC エスケープ構文の後に続きます。

  • java.util.Date: yyyy-mm-ss
  • java.sql.Date: yyyy-mm-ss
  • java.sql.Time: hh-mm-ss
  • java.sql.Timestamp: yyyy-mm-dd hh:mm:ss.f...
  • java.util.Calendar: yyyy-mm-dd hh:mm:ss.f...

列挙型リテラルは、完全修飾列挙型クラス名を使用する Java 列挙型リテラル構文によって表されます。

ObjectGrid 照会の入力パラメーター

順序位置または変数名を使用して、入力パラメーターを指定することができます。入力パラメーターを使用して照会を記述することを強く推奨します。入力パラメーターを使用すると、ObjectGrid が実行アクションの間に照会計画をキャッチできるようになり、パフォーマンスが向上するためです。

入力パラメーターは、以下の型のいずれかが可能です。Byte、Short、Integer、Long、Float、Double、BigDecimal、BigInteger、String、 Boolean、Char、java.util.Date、java.sql.Date、java.sql.Time、 java.sql.Timestamp、java.util.Calendar、Java SE 5 enum、Entity または POJO Object、または Java byte[] 形式のバイナリー・データ・ストリング。

入力パラメーターにヌル値を含めないでください。ヌル値の存在を検索するには、NULL 述部を使用してください。

定位置パラメーター

定位置入力パラメーターは、次のように疑問符 (?) の後ろに正数を付けたものを使用して定義します。

?[正整数]

定位置入力パラメーターは 1 から始まる番号が付けられており、照会の引数に対応しています。したがって、入力引数の数を超える入力パラメーターを照会に含めることはできません。

例: SELECT e FROM Employee e WHERE e.city = ?1 and e.salary >= ?2

名前付きパラメーター

名前付き入力パラメーターは、次の形式で変数名を使用して定義します。:[パラメーター名]

例: SELECT e FROM Employee e WHERE e.city = :city and e.salary >= :salary

ObjectGrid 照会の BETWEEN 述部

BETWEEN 述部は、ある値が他の 2 つの値の間にあるかどうかを調べます。

式 [NOT] BETWEEN 式 2 AND 式 3

例 1

e.salary BETWEEN 50000 AND 60000

これは、下記と同じです。

e.salary >= 50000 AND e.salary <= 60000

例 2

e.name NOT BETWEEN 'A' AND 'B'

これは、下記と同じです。

e.name < 'A' OR e.name > 'B'

ObjectGrid 照会の IN 述部

IN 述部は、1 つの値を、値のセットと比較します。以下の 2 つの形式のいずれかを使用して IN 述部を使用できます。

expression [NOT] IN ( subselect )expression [NOT] IN ( value1, value2, .... )

ValueN の値は、リテラル値でも入力パラメーターでも構いません。式は、参照型に対する評価は行うことができません。

例 1

e.salary IN ( 10000, 15000 )

is equivalent to

( e.salary = 10000 OR e.salary = 15000 )

例 2

e.salary IN ( select e1.salary from EmpBean e1 where e1.dept.deptno = 10)

is equivalent to

e.salary = ANY ( select e1.salary from EmpBean e1 where e1.dept.deptno = 10)

例 3

e.salary NOT IN ( select e1.salary from EmpBean e1 where e1.dept.deptno = 10)

is equivalent to

e.salary <> ALL ( select e1.salary from EmpBean e1 where e1.dept.deptno = 10)

ObjectGrid 照会の LIKE 述部

LIKE 述部は、ある特定のパターンのストリング値を検索します。

string-expression [NOT] LIKE pattern [ ESCAPE escape-character ]

パターン値は、ストリング型のストリング・リテラルまたはパラメーター・マーカーで、アンダースコアー (_) は任意の 1 文字を表し、パーセント ( % ) は空シーケンスを含む任意の文字シーケンスを表します。 その他の文字はその文字自身を表します。エスケープ文字は、文字 _ および % の検索に使用できます。 エスケープ文字は、ストリング・リテラルとしても、入力パラメーターとしても指定できます。

ストリング式がヌルの場合、結果は不明となります。

ストリング式とパターンの両方が空の場合は、結果は true となります。

'' LIKE '' is true
'' LIKE '%' is true
e.name LIKE '12%3' is true for '123' '12993' and false for '1234'
e.name LIKE 's_me' is true for 'some' and 'same', false for 'soome'
e.name LIKE '/_foo' escape '/' is true for '_foo', false for 'afoo'
e.name LIKE '//_foo' escape '/' is true for '/afoo' and for '/bfoo'
e.name LIKE '///_foo' escape '/' is true for '/_foo' but false for '/afoo'

ObjectGrid 照会の NULL 述部

NULL 述部は、ヌル値をテストします。

{single-valued-path-expression | input_parameter} IS [NOT] NULL

e.name IS NULL
e.dept.name IS NOT NULL
e.dept IS NOT NULL

ObjectGrid 照会の EMPTY コレクション述部

EMPTY コレクション述部を使用して、コレクションが空であるかどうかを検査します。

多値リレーションシップが空であるかどうかを検査するには、次の構文を使用します。

collection-valued-path-expression IS [NOT] EMPTY

Empty コレクション述部。従業員のいない部門を検索する照会は次のようになります。

SELECT OBJECT(d) FROM DeptBean d WHERE d.emps IS EMPTY

ObjectGrid 照会の MEMBER OF 述部

以下の式は、単一値パス式または入力パラメーターで指定されたオブジェクト参照が、指定した集合のメンバーであるかどうかを検査します。集合価パス式が空の集合を指定している場合、MEMBER OF 式の値は FALSE になります。

{ single-valued-path-expression | input_parameter } [ NOT ] MEMBER [ OF ] collection-valued-path-expression

指定する部門番号のメンバーではない従業員を検索する照会は、次のようになります。

SELECT OBJECT(e) FROM EmpBean e , DeptBean d 
WHERE e NOT MEMBER OF d.emps AND d.deptno = ?1
以下は、マネージャーが指定の部門番号のメンバーである従業員を検出します。
SELECT OBJECT(e) FROM EmpBean e, DeptBean d 
WHERE e.dept.mgr MEMBER  OF d.emps  and d.deptno=?1

ObjectGrid 照会の EXISTS 述部

EXISTS 述部は、副選択によって指定された条件の有無を検査します。

EXISTS (副選択)

副選択から最低 1 つの値が返されると EXISTS の結果は true になり、値が返されない場合は結果は false になります。

EXISTS 述部を否定するには、述部の前に NOT 論理演算子を指定します。

1000000 を超える収入がある従業員が最低 1 人いる部門を返す照会は、次のようになります。

SELECT  OBJECT(d) FROM  DeptBean d 
WHERE EXISTS ( SELECT  e  FROM IN (d.emps) e WHERE  e.salary > 1000000 )
従業員がいない部門を返す照会は次のようになります。
SELECT OBJECT(d) FROM DeptBean d 
WHERE NOT EXISTS  ( SELECT e FROM IN (d.emps) e)
次の例に示すように、前の照会を書き換えることもできます。

SELECT OBJECT(d) FROM DeptBean d WHERE SIZE(d.emps)=0

ObjectGrid 照会の ORDER BY 文節

ORDER BY 文節は、結果集合内のオブジェクトの順序を指定します。次に例を挙げます。

ORDER BY [ order_element ,]* order_element order_element ::={ path-expression }[ ASC | DESC ]

パス式では、byte、short、int、long、float、double、char などのプリミティブ型、または Byte、Short、Integer、Long、Float、Double、BigDecimal、String、Character、 java.util.Date、java.sql.Date、java.sql.Time、 java.sql.Timestamp、java.util.Calendar などのラッパー型の単一値フィールドを指定する必要があります。ASC 順序エレメントは、結果を昇順に表示するよう指定します (デフォルト)。DESC 順序エレメントは、結果を降順に表示するよう指定します。

部門オブジェクトを返します。部門番号を降順で表示します。

SELECT OBJECT(d) FROM DeptBean d ORDER BY d.deptno DESC

従業員オブジェクトを返し、部門番号と部門名でソートします。

SELECT OBJECT(e) FROM EmpBean e ORDER BY e.dept.deptno ASC, e.name DESC

ObjectGrid 照会集約関数

集約関数は、1 セットの値を操作して単一のスカラー値を返します。これらの関数は、select メソッドおよび subselect メソッドで使用できます。以下に、集約の例を示します。

SELECT SUM (e.salary) FROM EmpBean e WHERE e.dept.deptno =20

この集約では、部門 20 の給料の合計を計算します。

集約関数は、AVG、COUNT、MAX、MIN、および SUM です。集約関数の構文を、以下の例で示します。

aggregation-function ( [ ALL | DISTINCT ] expression )

または:

COUNT( [ ALL | DISTINCT ] identification-variable )

DISTINCT オプションを使用すると、関数を適用する前に重複値が除去されます。ALL オプションは、デフォルトのオプションで、重複値は除去されません。NULL 値は集約関数の計算においては無視されますが、COUNT(identification-variable) 関数を使用する場合は無視されず、セット内のすべてのエレメントの数が返されます。

戻りの型の定義

MAX および MIN 関数は、すべての数値、ストリング、または日時のデータ型に適用でき、対応するデータ型を返します。SUM および AVG 関数は、入力として数値型を必要とします。AVG 関数は double 型を返します。SUM 関数は、入力型が integer 型の場合は long 型を返しますが、入力が Java BigInteger 型の場合は、Java BigInteger 型を返します。SUM 関数は、入力型が integer 型でない場合は double 型を返しますが、入力が Java BigDecimal 型の場合は、Java BigDecimal 型を返します。COUNT 関数は、コレクション以外のすべてのデータ型を入力でき、long 型を返します。

空集合に適用される場合は、SUM、AVG、MAX、および MIN 関数は NULL 値を返すことができます。COUNT 関数は、空集合に適用されるとゼロ (0) を戻します。

GROUP BY および HAVING 文節の使用

集約関数で使用される値のセットは、照会の FROM および WHERE 文節に起因するコレクションによって決定されます。セットをグループに分割して、各グループに集約関数を適用することができます。このアクションを実行するには、照会で GROUP BY 文節を使用します。GROUP BY 文節によりグループ化メンバーが定義され、パス式のリストが構成されます。各パス式には、プリミティブ型の byte、short、int、long、float、double、boolean、char か、またはラッパー型の Byte、Short、Integer、Long、Float、Double、BigDecimal、String、 Boolean、Character、java.util.Date、java.sql.Date、java.sql.Time、 java.sql.Timestamp、java.util.Calendar、Java SE 5 enum の各フィールドを指定します。

以下の例では、照会で GROUP BY 文節を使用して各部門の平均給与を計算する場合を示します。

SELECT e.dept.deptno, AVG ( e.salary) FROM EmpBean e GROUP BY e.dept.deptno

セットをグループに分割する場合は、NULL 値は別の NULL 値と等しいとみなされます。

グループ化は HAVING 文節を使用してフィルター操作でき、集約関数またはグループ化メンバーを組み込む前にグループ・プロパティーをテストします。このフィルター操作は、WHERE 文節が FROM 文節からタプル (すなわち、戻りコレクション値のレコード) をフィルター操作する方法に類似しています。HAVING 文節の例を以下に示します。

SELECT e.dept.deptno, AVG ( e.salary) FROM EmpBean e
GROUP BY e.dept.deptno
HAVING COUNT(e) > 3 AND e.dept.deptno > 5
この照会は、従業員が 3 人より多く、部門番号が 5 より大きい部門の平均給与を返します。

GROUP BY 文節がなくても、HAVING 文節を使用することができます。この場合は、完全なセットは単一グループとして扱われ、HAVING 文節が適用されます。