4 演算子
Oracle Continuous Query Language (Oracle CQL)の演算子のリファレンスを提供します。演算子は、データ項目を操作して提供される結果を返します。構文上、演算子はオペランドの前後、または2つのオペランドの間に置かれます。
4.1 演算子の概要
演算子は、オペランドまたは引数と呼ばれる個々のデータ項目を操作します。演算子は特殊文字またはキーワードで表します。たとえば、乗算演算子はアスタリスク(*)で表します。
Oracle CQLには次の演算子が用意されています。
4.1.1 単項演算子と二項演算子について
演算子は通常、次の2つに分類されます。
-
単項: 単項演算子は1つのオペランドのみを操作します。単項演算子は通常、オペランドとともに次の形式で使用します。
operator operand
-
バイナリ: 二項演算子は2つのオペランドを操作します。二項演算子は通常、オペランドとともに次の形式で使用します。
operand1 operator operand2
特殊な形式を持つ他の演算子では3つ以上のオペランドを使用できます。オペランドにnullが指定された場合、結果は常にnullになります。この規則に従わない唯一の演算子は、連結(||)です。
4.1.2 演算子の優先順位について
優先順位とは、Oracle Event Processingによって同じ式の異なる演算子が評価される順序です。複数の演算子を含む式を評価する場合、Oracle Event Processingでは優先順位の高い演算子が優先順位の低い演算子よりも先に評価されます。Oracle Event Processingでは、優先順位の等しい演算子は式の左から右に評価されます。
表4-1は、Oracle CQL演算子の優先順位レベルを高い順に示しています。同じ行にある演算子の優先順位は同じです。
表4-1 Oracle CQL演算子の優先順位
| 演算子 | 演算 |
|---|---|
|
|
同一、否定 |
|
|
乗算、除算 |
|
|
加算、減算、連結 |
|
Oracle CQL条件はOracle CQL演算子の後に評価されます。 |
「条件」を参照してください。 |
優先順位の例
次の式では、乗算は加算よりも優先順位が高いため、2と3を掛けた結果に1が加算されます。
1+2*3
式の中でカッコを使用すると、演算子の優先順位をオーバーライドできます。カッコ内の式がカッコ外の式よりも先に評価されます。
4.2 算術演算子
表4-2は、Oracle Event Processingでサポートされる算術演算子を示しています。算術演算子を1つまたは2つの引数とともに使用して、数値を否定、加算、減算、乗算および除算できます。これらの演算子の一部は日時と期間の算術演算でも使用されます。演算子の引数は、数値データ型または数値データ型に暗黙的に変換できる任意のデータ型に解決される必要があります。
特定のケースでは、Oracle Event Processingによって、引数が演算に必要なデータ型に変換されます。たとえば、整数と浮動小数点数を加算する場合は、整数の引数が浮動小数点数に変換されます。結果の式のデータ型は浮動小数点数です。詳細は、「暗黙的なデータ型変換」を参照してください。
表4-2 算術演算子
| 演算子 | 目的 | 例 |
|---|---|---|
|
+ - |
正または負の式を表す場合は単項演算子です。 |
<query id="q1"><![CDATA[ select * from orderitemsstream where quantity = -1 ]]></query> |
|
+ - |
加算または減算の場合は二項演算子です。 |
<query id="q1"><![CDATA[ select hire_date from employees where sysdate - hire_date > 365 ]]></query> |
|
* / |
乗算、除算。これらは二項演算子です。 |
<query id="q1"><![CDATA[ select hire_date from employees where bonus > salary * 1.1 ]]></query> |
4.3 連結演算子
連結演算子は文字列を操作します。表4-3は連結演算子を示しています。
表4-3 連結演算子
| 演算子 | 目的 | 例 |
|---|---|---|
|
|| |
文字列を連結します。 |
<query id="q263"><![CDATA[ select length(c2 || c2) + 1 from S10 where length(c2) = 2 ]]></query> |
2つの文字列を連結した結果は、別の文字列になります。両方の文字列がCHARデータ型の場合、結果はCHARデータ型の文字列になり、その最大文字数は2000です。文字列のデータ型にかかわらず、連結では文字列末尾の空白が維持されます。
Oracle Event Processingでは、長さ0の文字列はnullとして扱われますが、長さ0の文字列と別のオペランドとの連結の結果は常にその別のオペランドになるため、結果がnullになるのは2つのnull文字列が連結された場合にかぎられます。ただし、Oracle Event Processingの将来のバージョンでは、これが変更される可能性があります。nullになる可能性のある式を連結する場合は、NVL関数を使用してその式を長さ0の文字列に明示的に変換してください。
次の例に、連結演算子を使用して文字列「xyz」をselect文のc2の値に付加する方法を示します。
<query id="q264"><![CDATA[ select c2 || "xyz" from S10 ]]></query>
4.4 二者択一演算子
二者択一演算子を使用して、PATTERN句の意味を調整できます。表4-4は、連結演算子を示しています。
表4-4 二者択一演算子
| 演算子 | 目的 | 例 |
|---|---|---|
|
| |
他の相関変数の前にあるものではなく、1つか、もう1つのいずれかの相関変数を意味するように、 |
<query id="q263"><![CDATA[ select T.p1, T.p2, T.p3 from S MATCH_RECOGNIZE( MEASURES A.ELEMENT_TIME as p1, B.ELEMENT_TIME as p2 B.c2 as p3 PATTERN (A+ | B+) DEFINE A as A.c1 = 10, B as B.c1 = 20 ) as T ]]></query> |
二者択一演算子は、PATTERN句内のみに適用可能です。
次の例に、二者択一演算子を使用して、PATTERN句が「1回以上のAの後にBが1回以上、またはCが1回以上、いずれか先に来る方が続く」という意味になるように定義する方法を示します。
<query id="q264"><![CDATA[ select T.p1, T.p2, T.p3 from S MATCH_RECOGNIZE( MEASURES A.ELEMENT_TIME as p1, B.ELEMENT_TIME as p2 B.c2 as p3 PATTERN (A+ (B+ | C+)) DEFINE A as A.c1 = 10, B as B.c1 = 20 C as C.c1 = 30 ) as T ]]></query>
詳細は、「PATTERN句内でのグループ化および二者択一」を参照してください。
4.5 範囲ベースのストリームからリレーションへのウィンドウ演算子
Oracle CQLでは、次の範囲ベースのストリームからリレーションへのウィンドウ演算子がサポートされています。
注意:
非常に大きな数には接尾辞を付ける必要があります。接頭辞がない場合、Javaでは、非常に大きな数が整数として処理され、値が整数の範囲から外れる可能性があります。この場合、エラーがスローされます。
接頭辞は次のように追加します。
LongにはlまたはL
floatにはfまたはF
doubleにはdまたはD
big decimalにはnまたはN
次に例を示します。
SELECT * FROM channel0[RANGE 1368430107027000000l nanoseconds]
window_type_range::=
4.5.1 S[now]
この時間ベースの範囲ウィンドウでは瞬間的なリレーションが出力されます。このため、時間tのnowウィンドウの出力は、その瞬間tに到着したすべてのタプルになります。Oracle Event Processingの時間の最小単位はナノ秒であるため、これらのすべてのタプルは1ナノ秒後に期限切れになります。
例については、「S [now]の例」を参照してください。
4.5.1.1 例
S[now]の例
問合せとデータ・ストリームSがあるとします。タイムスタンプはナノ秒(1 sec = 10^9 nanoseconds)で示されています。次の例は、時間5000 msで問合せが返すリレーションを示しています。時間5002 msには空のリレーションが返されます。
<query id="q1"><![CDATA[ SELECT * FROM S [now] ]]></query>
Timestamp Tuple 1000000000 10,0.1 1002000000 15,0.14 5000000000 33,4.4 5000000000 23,56.33 10000000000 34,4.4 200000000000 20,0.2 209000000000 45,23.44 400000000000 30,0.3 h 800000000000
Timestamp Tuple Kind Tuple 5000000000 + 33,4.4 5000000000 + 23,56.33 5000000001 - 33,4.4 5000000001 - 23,56.33
4.5.2 S[range T]
この時間ベースの範囲ウィンドウでは、サイズTの時間単位の間隔をスライドさせ、並べられたストリームの最新部分を取得することで、時間の経過に沿った出力リレーションが定義されます。
例については、「S [range T]の例」を参照してください。
4.5.2.1 例
S [range T]の例
問合せq1について考えてみます。データ・ストリームSの場合、問合せはリレーションを返します。デフォルトでは、範囲の時間単位はsecondであるため、S[range 1]はS[range 1 second]と同等です。タイムスタンプはミリ秒(1 s = 1000 ms)で示されています。最初の1000 msの間隔に存在している要素、つまりタプル(10,0.1)がウィンドウに入ります。時間1002 msには、タプル(15,0.14)がウィンドウに入ります。時間2000 msには、この間隔よりも長い間ウィンドウに留まっていたタプル、つまりタプル(10,0.1)がリレーションから削除の対象になります。この時間、タプル(15,0.14)はまだリレーションに含まれます。時間2002 msには、タプル(15,0.14)が、ウィンドウに留まっていた期間がその時点で1000 msを超えたため、削除の対象になります。
注意:
ストリーム入力の例で、hで始まる行(h 3800など)はハートビート入力タプルです。これは、ハートビート値よりも小さいタイムスタンプを持つこれ以上の入力がないことをOracle Event Processingに通知します。
<query id="q1"><![CDATA[ SELECT * FROM S [range 1] ]]></query>
Timestamp Tuple 1000 10,0.1 1002 15,0.14 200000 20,0.2 400000 30,0.3 h 800000 100000000 40,4.04 h 200000000
Timestamp Tuple Kind Tuple 1000: + 10,0.1 1002: + 15,0.14 2000: - 10,0.1 2002: - 15,0.14 200000: + 20,0.2 201000: - 20,0.2 400000: + 30,0.3 401000: - 30,0.3 100000000: + 40,4.04 100001000: - 40,4.04
4.5.3 S[range T1 slide T2]
この時間ベースの範囲ウィンドウでは、過去のタプルを維持する必要のある期間(範囲)と、タプルの出力を表示する頻度(スライド)を指定できます。
タプルがtで表される時刻に到着するとします。スライド値をT2で表すとすると、タプルは表示され、次のタイムスタンプのいずれかに送られて出力されます。
-
t: タイムスタンプtがスライドT2の倍数の場合 -
Math.ceil(t/T2)*T2: タイムスタンプがスライドT2の倍数でない場合
範囲値をT1で表すとすると、タイムスタンプtで到着するタプルは、タイムスタンプt + T1で期限が切れます。ただし、スライドが指定されていて、その値がゼロ以外の値の場合、期限切れのタプルは、必ずしもタイムスタンプt + T1で出力されません。
期限切れのタプル(期限切れタイムスタンプはt + T1)は、次のタイムスタンプのいずれかで表示されます。
-
(t + T1): タイムスタンプ(t+T1)がスライドT2の倍数の場合。 -
Math.ceil((t+T1)/T2)*T2: タイムスタンプ(t+T1)がスライドT2の倍数でない場合。
例については、「S [range T1 slide T2]の例」を参照してください。
4.5.3.1 例
S [range T1 slide T2]の例
問合せq1について考えてみます。データ・ストリームSの場合、問合せはリレーションを返します。デフォルトでは、範囲の時間単位はsecondであるため、S[range 10 slide 5]はS[range 10 seconds slide 5 seconds]と同等です。タイムスタンプはミリ秒(1 s = 1000 ms)で示されています。スライド値は5 secであり、これはユーザーが5 secごとに出力の表示を確認することを意味するため、1000、1002および5000に到着したすべてのタプルは5000の時点でウィンドウに入ります。これらのタプルは5 sec=5000 msにウィンドウに入りますが、範囲値は10 sec = 10000 msであるため、15000 msに期限切れになります。
<query id="q1"><![CDATA[ SELECT * FROM S [range 10 slide 5] ]]></query>
Timestamp Tuple 1000 10,0.1 1002 15,0.14 5000 33,4.4 8000 23,56.33 10000 34,4.4 200000 20,0.2 209000 45,23.44 400000 30,0.3 h 800000
Timestamp Tuple Kind Tuple 5000: + 10,0.1 5000: + 15,0.14 5000: + 33,4.4 10000: + 23,56.33 10000: + 34,4.4 15000: - 10,0.1 15000: - 15,0.14 15000: - 33,4.4 20000: - 23,56.33 20000: - 34,44.4 200000: + 20,0.2 210000: - 20,0.2 210000: + 45,23.44 220000: - 45,23.44 400000: + 30,0.3 410000: - 30,0.3
4.5.4 S[range unbounded]
この時間ベースの範囲ウィンドウでは、T = infinityである場合に、時間tのリレーションが時間tまでのSのすべての要素から取得されたタプルで構成されるように、出力リレーションが定義されます。要素はウィンドウ内で無限に維持されます。
例については、「S [range unbounded]の例」を参照してください。
4.5.4.1 例
S [range unbounded]の例
問合せq1とデータ・ストリームがあるとします。タイムスタンプはミリ秒(1 s = 1000 ms)で示されています。要素は到着した時点でリレーションに挿入されます。どの要素も削除されません。次の例は、時間5000 msに問合せで返されるリレーションと、時間205000 msに問合せで返されるリレーションを示します。
<query id="q1"><![CDATA[ SELECT * FROM S [range unbounded] ]]></query>
Timestamp Tuple 1000 10,0.1 1002 15,0.14 5000 33,4.4 8000 23,56.33 10000 34,4.4 200000 20,0.2 209000 45,23.44 400000 30,0.3 h 800000
Timestamp Tuple Kind Tuple 1000: + 10,0.1 1002: + 15,0.14 5000: + 33,4.4
Timestamp Tuple Kind Tuple 1000: + 10,0.1 1002: + 15,0.14 5000: + 33,4.4 8000: + 23,56.33 10000: + 34,4.4 200000: + 20,0.2
4.5.5 S[range C on E]
この定数値ベースの範囲ウィンドウでは、ストリーム要素Eの値の差がC未満のタプルから成る、識別子Eに基づいて並べられたストリームの最新部分を取得することで、出力リレーションが定義されます。ストリーム要素Eの値とリレーションの任意のタプルの値の差がC以上の場合、タプルは削除の対象になります。
例については、次の項を参照してください。
4.5.5.1 例
S [range C on E]の例: 定数値
問合せtkdata56_q0とデータ・ストリームtkdata56_S0があるとします。ストリームtkdata56_S0のスキーマは(c1 integer, c2 float)です。次の例は、問合せが返すリレーションを示しています。この例では、時間200000の出力リレーションには次のタプルが含まれています: (5,0.1)、(8,0.14)、(10,0.2)。これらの各タプルのc1値の差は10未満です。時間250000にタプル(15,0.2)が追加されると、タプル(5,0.1)は差が15 - 5 = 10であり10未満でないため、削除対象になります。15 - 8 = 7は10未満であるため、タプル(8,0.14)は留まります。同様に、15 - 10 = 5も10未満であるため、タプル(10,0.2)は留まります。時間300000にタプル(18,0.22)が追加されると、タプル(8,0.14)は差が18 - 8 = 10であり10未満でないため、削除対象になります。
<query id="tkdata56_q0"><![CDATA[ select * from tkdata56_S0 [range 10 on c1] ]]></query>
Timestamp Tuple 100000 5, 0.1 150000 8, 0.14 200000 10, 0.2 250000 15, 0.2 300000 18, 0.22 350000 20, 0.25 400000 30, 0.3 600000 40, 0.4 650000 45, 0.5 700000 50, 0.6 1000000 58, 4.04
Timestamp Tuple Kind Tuple 100000: + 5,0.1 150000: + 8,0.14 200000: + 10,0.2 250000: - 5,0.1 250000: + 15,0.2 300000: - 8,0.14 300000: + 18,0.22 350000: - 10,0.2 350000: + 20,0.25 400000: - 15,0.2 400000: - 18,0.22 400000: - 20,0.25 400000: + 30,0.3 600000: - 30,0.3 600000: + 40,0.4 650000: + 45,0.5 700000: - 40,0.4 700000: + 50,0.6 1000000: - 45,0.5 1000000: + 58,4.04
S [range C on E]の例: INTERVALとTIMESTAMP
同様に、S[range C on ID]ウィンドウではINTERVALとTIMESTAMPを使用できます。問合せtkdata56_q2とデータ・ストリームtkdata56_S1があるとします。ストリームtkdata56_S1のスキーマは(c1 timestamp, c2 double)です。次の例は、問合せが返すリレーションを示しています。
<query id="tkdata56_q2"><![CDATA[ select * from tkdata56_S1 [range INTERVAL "530 0:0:0.0" DAY TO SECOND on c1] ]]></query>
Timestamp Tuple 10 "08/07/2004 11:13:48", 11.13 2000 "08/07/2005 12:13:48", 12.15 3400 "08/07/2006 10:15:58", 22.25 4700 "08/07/2007 10:10:08", 32.35
Timestamp Tuple Kind Tuple 10: + 08/07/2004 11:13:48,11.13 2000: + 08/07/2005 12:13:48,12.15 3400: - 08/07/2004 11:13:48,11.13 3400: + 08/07/2006 10:15:58,22.25 4700: - 08/07/2005 12:13:48,12.15 4700: + 08/07/2007 10:10:08,32.35
4.6 タプルベースのストリームからリレーションへのウィンドウ演算子
Oracle CQLでは、次のタプルベースのストリームからリレーションへのウィンドウ演算子がサポートされています。
window_type_tuple::=
4.6.1 S [rows N]
タプルベースのウィンドウでは、並べられたストリームの最後のNタプルのウィンドウをスライドさせることで、時間の経過に沿った出力リレーションが定義されます。
S [rows N]の出力リレーションRの場合、時間tのリレーションは、大きいタイムスタンプ(<= t)を持つSのN個のタプル(または、tまでのSの長さが<= Nの場合はすべてのタプル)で構成されます。
同じタイムスタンプを持つ複数のタプルがある場合は、N個のタプルが返されることを保証するため、Oracle Event Processingによって確定的でない方法で1つのタプルが選択されます。このため、タプルベースのウィンドウはタイムスタンプが一意でないストリームには適していない場合があります。
デフォルトでは、スライドは1です。
例については、「S [rows N]の例」を参照してください。
4.6.1.1 例
S [rows N]の例
問合せq1とデータ・ストリームSがあるとします。タイムスタンプはミリ秒(1 s = 1000 ms)で示されています。要素はS [Range 1]の場合と同様に挿入および削除されます(「S [range T]の例」を参照)。
次の例は、時間1002 msで問合せが返すリレーションを示しています。この時点のSの長さはrows値(3)以下であるため、その時点までに挿入されたSのすべてのタプル、つまりタプル(10,0.1)および(15,0.14)が問合せで返されます。
次の例は、時間1006 msで問合せが返すリレーションを示しています。この時点のSの長さはrows値(3)を超えているため、1006 ms以下の大きいタイムスタンプを持つSの3つのタプル、つまりタプル(15,0.14)、(33,4.4)および(23,56.33)が問合せで返されます。
次の例は、時間2000 msで問合せが返すリレーションを示しています。この時点で2000 ms以下の大きいタイムスタンプを持つSの3つのタプル、つまりタプル(45,23.44)、(30,0.3)および(17,1.3)が問合せで返されます。
<query id="q1"><![CDATA[ SELECT * FROM S [rows 3] ]]></query>
Timestamp Tuple 1000 10,0.1 1002 15,0.14 1004 33,4.4 1006 23,56.33 1008 34,4.4 1010 20,0.2 1012 45,23.44 1014 30,0.3 2000 17,1.3
Timestamp Tuple Kind Tuple 1000: + 10,0.1 1002: + 15,0.14
Timestamp Tuple Kind Tuple 1000: + 10,0.1 1002: + 15,0.14 1004: + 33,4.4 1006: - 10,0.1 1006: + 23,56.33
Timestamp Tuple Kind Tuple 1000 + 10,0.1 1002 + 15,0.14 1004 + 33,4.4 1006 - 10,0.1 1006 + 23,56.33 1008 - 15,0.14 1008 + 34,4.4 1008 - 33,4.4 1010 + 20,0.2 1010 - 23,56.33 1012 + 45,23.44 1012 - 34,4.4 1014 + 30,0.3 2000 - 20,0.2 2000 + 17,1.3
4.6.2 S [rows N1 slide N2]
タプルベースのウィンドウでは、並べられたストリームの最後のN1タプルのウィンドウをスライドさせることで、時間の経過に沿った出力リレーションが定義されます。
S [rows N1 slide N2]の出力リレーションRの場合、時間tのリレーションは、大きいタイムスタンプ(<= t)を持つSのN1個のタプル(または、tまでのSの長さが<= Nの場合はすべてのタプル)で構成されます。
同じタイムスタンプを持つ複数のタプルがある場合は、N個のタプルが返されることを保証するため、Oracle Event Processingによって確定的でない方法で1つのタプルが選択されます。このため、タプルベースのウィンドウはタイムスタンプが一意でないストリームには適していない場合があります。
整数のストリーム要素数としてスライドN2を構成できます。Oracle Event ProcessingではN2個の要素を受け取るまで、リレーションへの要素の追加が遅れます。
例については、「S [rows N]の例」を参照してください。
4.6.2.1 例
S [rows N1 slide N2]の例
問合せtkdata55_q0とデータ・ストリームtkdata55_S55があるとします。ストリームtkdata55_S55のスキーマは(c1 integer, c2 float)です。
時間100000では、タプル(20,0.1)のみがストリームに到着しているため、出力リレーションは空です。時間150000までに、slide値の指定する数(2)のタプルが到着します。この時点で、出力リレーションにはタプル(20,0.1)と(15,0.14)が含まれます。時間250000までに、さらにslide数のタプルが到着し、出力リレーションにはタプル(20,0.1)、(15,0.14)、(5,0.2)および(8,0.2)が含まれます。時間350000までに、さらにslide数のタプルが到着します。この時点で、最も古いタプル(20,0.1)は、rows値による制約を満たすために削除されます。つまり、出力リレーションには5以下の要素のみを含むことができるという制約です。この時点で、出力リレーションにはタプル(15,0.14)、(5,0.2)、(8,0.2)、(10,0.22)および(20,0.25)が含まれます。時間600000で、さらにslide数のタプルが到着します。この時点で、最も古いタプル(15,0.14)と(5,0.2)は、rows値の制約を満たすために削除されます。この時点で、出力リレーションにはタプル(8,0.2)、(10,0.22)、(20,0.25)、(30,0.3)および(40,0.4)が含まれます。
<query id="tkdata55_q0"><![CDATA[ select * from tkdata55_S55 [rows 5 slide 2 ] ]]></query>
Timestamp Tuple 100000 20, 0.1 150000 15, 0.14 200000 5, 0.2 250000 8, 0.2 300000 10, 0.22 350000 20, 0.25 400000 30, 0.3 600000 40, 0.4 650000 45, 0.5 700000 50, 0.6 100000000 8, 4.04
Timestamp Tuple Kind Tuple 150000: + 20,0.1 150000: + 15,0.14 250000: + 5,0.2 250000: + 8,0.2 350000: - 20,0.1 350000: + 10,0.22 350000: + 20,0.25 600000: - 15,0.14 600000: - 5,0.2 600000: + 30,0.3 600000: + 40,0.4 700000: - 8,0.2 700000: - 10,0.22 700000: + 45,0.5 700000: + 50,0.6
4.7 分割されたストリームからリレーションへのウィンドウ演算子
Oracle CQLでは、次の分割されたストリームからリレーションへのウィンドウ演算子がサポートされています。
window_type_partition::=
4.7.1 S [partition by A1,..., Ak rows N]
ストリームSに対するこの分割されたスライディング・ウィンドウでは、正の整数のタプル数Nとストリーム属性のサブセット{A1,... Ak}をパラメータとして受け取り、次のことを行います。
-
属性
A1,... Akの同一性に基づいて、Sを異なるサブストリームに論理的に分割します(SQLGROUP BYと同様)。 -
各サブストリームで、サイズ
Nのタプルベースのスライディング・ウィンドウを個別に計算します。
例については、「S[partition by A1, ..., Ak rows N]の例」を参照してください。
4.7.1.1 例
S[partition by A1, ..., Ak rows N]の例
問合せqPart_row2とデータ・ストリームSP1があるとします。ストリームSP1のスキーマは(c1 integer, name char(10))です。この問合せはリレーションを返します。デフォルトでは、範囲(およびスライド)は1秒です。タイムスタンプはミリ秒(1 s = 1000 ms)で示されています。
注意:
ストリーム入力の例で、hで始まる行(h 3800など)はハートビート入力タプルです。これは、ハートビート値よりも小さいタイムスタンプを持つこれ以上の入力がないことをOracle Event Processingに通知します。
<query id="qPart_row2"><![CDATA[ select * from SP1 [partition by c1 rows 2] ]]></query>
Timestamp Tuple 1000 1,abc 1100 2,abc 1200 3,abc 2000 1,def 2100 2,def 2200 3,def 3000 1,ghi 3100 2,ghi 3200 3,ghi h 3800 4000 1,jkl 4100 2,jkl 4200 3,jkl 5000 1,mno 5100 2,mno 5200 3,mno h 12000 h 200000000
Timestamp Tuple Kind Tuple 1000: + 1,abc 1100: + 2,abc 1200: + 3,abc 2000: + 1,def 2100: + 2,def 2200: + 3,def 3000: - 1,abc 3000: + 1,ghi 3100: - 2,abc 3100: + 2,ghi 3200: - 3,abc 3200: + 3,ghi 4000: - 1,def 4000: + 1,jkl 4100: - 2,def 4100: + 2,jkl 4200: - 3,def 4200: + 3,jkl 5000: - 1,ghi 5000: + 1,mno 5100: - 2,ghi 5100: + 2,mno 5200: - 3,ghi 5200: + 3,mno
4.7.2 S [partition by A1,..., Ak rows N range T]
ストリームSに対するこの分割されたスライディング・ウィンドウでは、正の整数のタプル数Nとストリーム属性のサブセット{A1,... Ak}をパラメータとして受け取り、次のことを行います。
-
属性
A1,... Akの同一性に基づいて、Sを異なるサブストリームに論理的に分割します(SQLGROUP BYと同様)。 -
各サブストリームで、サイズ
Nおよび範囲Tのタプルベースのスライディング・ウィンドウを個別に計算します。
例については、「S[partition by A1, ..., Ak rows N range T]の例」を参照してください。
4.7.2.1 例
S[partition by A1, ..., Ak rows N range T]の例
問合せqPart_range2とデータ・ストリームSP5があるとします。ストリームSP5のスキーマは(c1 integer, name char(10))です。この問合せはリレーションを返します。デフォルトでは、範囲の時間単位はsecondであるため、range 2はrange 2 secondsと同等です。タイムスタンプはミリ秒(1 s = 1000 ms)で示されています。
<query id="qPart_range2"><![CDATA[ select * from SP5 [partition by c1 rows 2 range 2] ]]></query>
Timestamp Tuple 1000 1,abc 2000 1,abc 3000 1,abc 4000 1,abc 5000 1,def 6000 1,xxx h 200000000
Timestamp Tuple Kind Tuple 1000: + 1,abc 2000: + 1,abc 3000: - 1,abc 3000: + 1,abc 4000: - 1,abc 4000: + 1,abc 5000: - 1,abc 5000: + 1,def 6000: - 1,abc 6000: + 1,xxx 7000: - 1,def 8000: - 1,xxx
4.7.3 S [partition by A1,..., Ak rows N range T1 slide T2]
ストリームSに対するこの分割されたスライディング・ウィンドウでは、正の整数のタプル数Nとストリーム属性のサブセット{A1,... Ak}をパラメータとして受け取り、次のことを行います。
-
属性
A1,... Akの同一性に基づいて、Sを異なるサブストリームに論理的に分割します(SQLGROUP BYと同様)。 -
各サブストリームで、サイズ
N、範囲T1およびスライドT2のタプルベースのスライディング・ウィンドウを個別に計算します。
例については、「S[partition by A1, ..., Ak rows N]の例」を参照してください。
4.7.3.1 例
S[partition by A1, ..., Ak rows N range T1 slide T2]の例
問合せqPart_rangeslideとデータ・ストリームSP1があるとします。ストリームSP1のスキーマは(c1 integer, name char(10))です。この問合せはリレーションを返します。デフォルトでは、範囲とスライドの時間単位はsecondであるため、range 1 slide 1はrange 1 second slide 1 secondと同等です。タイムスタンプはミリ秒(1 s = 1000 ms)で示されています。
<query id="qPart_rangeslide"><![CDATA[ select * from SP1 [partition by c1 rows 1 range 1 slide 1] ]]></query>
Timestamp Tuple 1000 1,abc 1100 2,abc 1200 3,abc 2000 1,def 2100 2,def 2200 3,def 3000 1,ghi 3100 2,ghi 3200 3,ghi h 3800 4000 1,jkl 4100 2,jkl 4200 3,jkl 5000 1,mno 5100 2,mno 5200 3,mno h 12000 h 200000000
Timestamp Tuple Kind Tuple 1000: + 1,abc 2000: + 2,abc 2000: + 3,abc 2000: - 1,abc 2000: + 1,def 3000: - 2,abc 3000: + 2,def 3000: - 3,abc 3000: + 3,def 3000: - 1,def 3000: + 1,ghi 4000: - 2,def 4000: + 2,ghi 4000: - 3,def 4000: + 3,ghi 4000: - 1,ghi 4000: + 1,jkl 5000: - 2,ghi 5000: + 2,jkl 5000: - 3,ghi 5000: + 3,jkl 5000: - 1,jkl 5000: + 1,mno 6000: - 2,jkl 6000: + 2,mno 6000: - 3,jkl 6000: + 3,mno 6000: - 1,mno 7000: - 2,mno 7000: - 3,mno
4.8 ユーザー定義のストリームからリレーションへのウィンドウ演算子
Oracle Event Processingには組込みのストリームからリレーションへの演算子が用意されていますが、Javaでユーザー定義の(または拡張可能な)ウィンドウを作成することで、それよりも高度な(またはアプリケーション固有の)ストリームからリレーションへの演算子を作成できます。ユーザー定義のウィンドウは、組込みのストリームからリレーションへのウィンドウ演算子を使用できる場所であれば、Oracle CQL文の任意の場所で使用できます。
注意:
また、ユーザー定義関数を作成することもできます(「ユーザー定義関数」を参照)。
4.9 リレーションからストリームへのIStream演算子
リレーションRへ適用されるIstream (「ストリームの挿入」の略)には、タプルsがR(t) - R(t-1)の中にある場合、つまりsがtの時点でRへ挿入される場合は常に(s,t)が含まれます。同じタイムスタンプでタプルの挿入と削除の両方が発生した場合、Istreamでは挿入が出力されません。
nowウィンドウによってviewq3がリレーションに変換され、これはフィルタ条件によってリレーションとして維持されます。リレーションからストリームへのIStream演算子によって、フィルタ出力がストリームに変換されます。
<query id="q3Txns"><![CDATA[ Istream( select TxnId, ValidLoopCashForeignTxn.ACCT_INTRL_ID, TRXN_BASE_AM, ADDR_CNTRY_CD, TRXN_LOC_ADDR_SEQ_ID from viewq3[NOW], ValidLoopCashForeignTxn where viewq3.ACCT_INTRL_ID = ValidLoopCashForeignTxn.ACCT_INTRL_ID ) ]]></query>
Istream演算子とDIFFERENCES USING句を組み合せて、Istreamの差分を簡単に検出できます。
詳細については、以下を参照:
4.10 リレーションからストリームへのDStream演算子
タプルsがR(t-1) - R(t)に含まれている場合は常に、つまり、tの時点でsがRから削除された場合は常に、リレーションRに適用されたDstream(「削除ストリーム」を意味する)には(s,t)が含まれます。同じタイムスタンプでタプルの挿入と削除の両方が発生した場合、Istreamでは挿入が出力されません。
次の例では、問合せによってストリームSの入力が10分遅延されます。ストリームSはrangeウィンドウ演算子によってリレーションに変換されますが、Dstreamによってストリームに戻されます。
<query id="BBAQuery"><![CDATA[ Dstream(select * from S[range 10 minutes]) ]]></query>
時間の最小単位を分と想定します。表4-5は、次の入力ストリームTradeInputsの入力について、rangeウィンドウ演算子のリレーション(S[Range 10 minutes])とDstreamのストリームのコンテンツを示しています。
Time Value 05 1,1 25 2,2 50 3,3
表4-5 DStreamの出力例
| 入力ストリームS | リレーション出力 | リレーションのコンテンツ | DStream出力 |
|---|---|---|---|
|
|
|
|
|
|
|
|
|
+ |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
+ |
時間15、35および60の時点で、リレーションは空{}です(空のセット)。
Dstream演算子とDIFFERENCES USING句を組み合せて、Dstreamの差分を簡単に検出できます。
詳細については、以下を参照:
4.11 リレーションからストリームへのRStream演算子
Rstream演算子は、入力リレーションの現在の状態全体を維持し、各時間ステップごとにすべてのタプルを挿入として出力します。
Rstreamでは各瞬間のリレーション全体の状態が出力されるため、リレーション・セットが非常に小さい場合を除き、コストがかかる可能性があります。
次の例では、Rstreamによって時間Nowのwhere句でフィルタ処理されたリレーション全体の状態が出力されます。
<query id="rstreamQuery"><![CDATA[ Rstream( select cars.car_id, SegToll.toll from CarSegEntryStr[now] as cars, SegToll where (cars.exp_way = SegToll.exp_way and cars.lane = SegToll.lane and cars.dir = SegToll.dir and cars.seg = SegToll.seg) ) ]]></query>


