この節では、以下の項目について説明します。
中括弧 { および } は、Java 配列初期化構文に準拠する配列定義演算子です。配列は、ユーザ定義関数に渡す場合や、SELECT 句で配列データを選択する場合に便利です。
配列定義は中括弧で囲まれた 0 個以上の式から成ります。配列定義内では、定数、算術式、またはイベント プロパティなどの任意の型の式を使用できます。配列定義の構文は以下のとおりです。
{ [expression [,expression [,…]]] }
actions というイベント プロパティを返す次の文について考えます。エンジンでは actions プロパティは 2 つの要素の長さを持つ java.lang.String 値の配列として作成されます。配列内の最初の要素には RFIDEvent イベントの observation プロパティ値が含まれ、2 つ目の要素には command プロパティが含まれます。
SELECT {observation, command} AS actions
FROM RFIDEvent RETAIN ALL
エンジンでは配列定義内の式で返される型に基づいて、配列の型を決定します。たとえば、配列定義内のすべての式で整数値が返される場合、配列の型は java.lang.Integer[] です。すべての式で返される型が整数値や double 値のように互換性のある数値型の場合、エンジンでは配列要素の値が変換され、適切な型が返されます。この例では java.lang.Double[] です。式の型が変換不能な場合、またはオブジェクト値が返された場合は、返される配列の型は Object[] です。配列定義では null 値を使用できます。
ユーザ定義関数へのパラメータとして配列を使用すると便利です。
SELECT *
FROM RFIDEvent RETAIN ALL
WHERE Filter.myFilter(zone, {1,2,3})
IN 演算子は、指定の値がリスト内の任意の値と一致するかどうかを決定します。演算子の構文は以下のとおりです。
test_expression [NOT] IN (expression [,expression [,…]] )
test_expression は任意の有効な式です。IN キーワードの後に一致をテストする式のリストが続きます。省略可能な NOT キーワードでは、述部の結果が否定されます。
IN 式の結果の型は Boolean です。test_expression の値がカンマ区切りのリスト内の任意の式と等しい場合、結果の値は true です。それ以外の場合、結果の値は false です。すべての式は test_expression と同じ型または互換性のある型である必要があります。
次の例では、IN キーワードを適用して RFIDEvents の特定のコマンド タイプを選択する方法を示します。
SELECT *
FROM RFIDEvent RETAIN ALL
WHERE command IN ('OBSERVATION', 'SIGNAL')
この文は、次と同等です。
SELECT * FROM RFIDEvent RETAIN ALL WHERE command = 'OBSERVATION' OR symbol = 'SIGNAL'
BETWEEN 演算子はテストする範囲を指定します。演算子の構文は以下のとおりです。
test_expression [NOT] BETWEEN begin_expression AND end_expression
test_expression は任意の有効な式であり、begin_expression および end_expression で定義された式に含まれる範囲に対してテストする式です。NOT キーワードでは、述部の結果が否定されます。
BETWEEN 式の結果の型は Boolean です。test_expression の値が begin_expression の値以上であり、かつ end_expression の値以下である場合は、結果は true になります。
次の例では、BETWEEN キーワードを使用して価格が 55 ~ 60 (その値を含む) の範囲内にあるイベントを選択する方法を示します。
SELECT * FROM StockTickEvent RETAIN ALL WHERE price BETWEEN 55 AND 60
BETWEEN キーワードを使用しない同等の式は、以下のとおりです。
SELECT * FROM StockTickEvent RETAIN ALL WHERE price >= 55 AND price <= 60
begin_expression と end_expression は順序を逆にすることもでき、クエリへの影響はありません。たとえば、次の例は上の例と同等です。
SELECT * FROM StockTickEvent RETAIN ALL WHERE price BETWEEN 60 AND 55
LIKE 演算子は標準の SQL パターン照合を提供します。SQL パターン照合では _ を使用して任意の 1 文字を照合し、% を使用して任意の数の文字 (0 個の文字を含む) を照合できます。EPL では、デフォルトで SQL パターンの大文字と小文字が区別されます。LIKE の構文は以下のとおりです。
test_expression [NOT] LIKE pattern_expression [ESCAPE string_literal]
test_expression は String 型または数値の結果を生成する任意の有効な式です。省略可能な NOT キーワードでは、述部の結果が否定されます。LIKE キーワードの後に、String 型の結果を生成する任意の有効な標準の SQL pattern_expression が続きます。省略可能な ESCAPE キーワードは、パターン内の _ および % 値をエスケープするのに使用されるエスケープ文字を示します。
LIKE 式の結果の型は Boolean です。test_expression の値が pattern_expression と一致する場合、結果の値は true です。それ以外の場合、結果の値は false です。LIKE キーワードの例を以下に示します。
SELECT * FROM PersonLocationEvent RETAIN ALL WHERE name LIKE '%Jack%'
次の例では、WHERE 句で suffix プロパティが 1 つの _ 文字であるイベントが照合されます。
SELECT * FROM PersonLocationEvent RETAIN ALL WHERE suffix LIKE '!_' ESCAPE '!'
REGEXP 演算子は Java の java.util.regex パッケージを通じて実装されている正規表現に基づいたパターン照合の形式です。REGEXP の構文は以下のとおりです。
test_expression [NOT] REGEXP pattern_expression
test_expression は String 型または数値の結果を生成する任意の有効な式です。省略可能な NOT キーワードでは、述部の結果が否定されます。REGEXP キーワードの後に、String 型の結果を生成する任意の有効な正規表現 pattern_expression が続きます。
REGEXP 式の結果の型は Boolean です。test_expression の値が正規表現 pattern_expression と一致する場合、結果の値は true です。それ以外の場合、結果の値は false です。
REGEXP 演算子の例を以下に示します。
SELECT * FROM PersonLocationEvent RETAIN ALL WHERE name REGEXP '*Jack*'
FOLLOWED BY 演算子では、まず左側の式が true になる必要があり、その場合にのみ右側の式で一致するイベントが評価されます。
たとえば、次のパターンではイベント A が検索され、これが検出された場合にイベント B が検索されます。
A FOLLOWED BY B
イベント A の直後にイベント B が続く必要はありません。イベント A とイベント B の間で他のイベントが発生する場合でも、この式は true に評価されます。この動作が適切でない場合は、NOT 演算子を使用できます。
WITHIN 修飾子の動作はストップウォッチと同じです。関連付けられているパターン式が指定の時間内に true にならなかった場合、エンジンでは false として評価されます。WITHIN 修飾子は、節 2.4.4「時間間隔の指定」で指定されているとおり、時間間隔をパラメータとして受け取ります。
このパターンは、文の作成後 5 秒以内に A イベントが到着すると発動します。
A WITHIN 5 seconds
このパターンは 5 秒以内に到着するすべての A イベントで発動します。
EVERY 演算子は、EVERY キーワードで修飾されたサブ式が true または false に評価された場合に、パターンのサブ式を再度開始するよう通知します。EVERY 修飾子を指定しない場合は、NOT 式の内部に含まれていないパターン内の最初のイベント ストリームのソースに暗黙的な EVERY 演算子が修飾子として挿入されます。
EVERY 演算子は包含されているパターンのサブ式のファクトリのように動作します。含まれているパターンのサブ式が発動し、イベントのチェックを終了すると、EVERY によって同じイベントまたはイベント セットの以降の発生をリスンする新しいパターンのサブ式が開始されます。
EVERY 演算子内のパターンのサブ式が true になるたびに、エンジンでは新しいアクティブなサブ式が開始され、それ以降のイベント、またはパターンのサブ式に一致するタイミング条件が参照されます。
このパターンは、A イベントの後に B イベントが続いた場合に発動し、B イベント後に再び照合する試みを続行します。
EVERY (A FOLLOWED BY B)
このパターンも A イベントの後に B イベントが続いた場合に発動しますが、A イベント後に再び照合する試みを続行します。
EVERY A FOLLOWED BY B
このパターンの EVERY は指定が無くても暗黙的に同じ場所に付与されるため、省略可能です。