演算子はデータ項目を操作し、結果を返します。構文上、演算子はオペランドの前後、または2つのオペランドの間に置かれます。
演算子は、オペランドまたは引数と呼ばれる個々のデータ項目を操作します。演算子は特殊文字またはキーワードで表します。たとえば、乗算演算子はアスタリスク(*
)で表します。
Oracle CQLには次の演算子が用意されています。
単項: 単項演算子は1つのオペランドのみを操作します。単項演算子は通常、オペランドとともに次の形式で使用します。
operator operand
バイナリ: 二項演算子は2つのオペランドを操作します。二項演算子は通常、オペランドとともに次の形式で使用します。
operand1 operator operand2
特殊な形式を持つ他の演算子では3つ以上のオペランドを使用できます。オペランドにnullが指定された場合、結果は常にnullになります。この規則に従わない唯一の演算子は、連結(||)です。
優先順位とは、Oracle CEPによって同一の式の異なる演算子が評価される順序です。複数の演算子を含む式を評価する場合、Oracle CEPでは優先順位の高い演算子が優先順位の低い演算子よりも先に評価されます。優先順位の等しい演算子は式の左から右に評価されます。
表4-1は、Oracle CQL演算子の優先順位レベルを高い順に示しています。同じ行にある演算子の優先順位は同じです。
演算子 | 演算 |
---|---|
|
同一、否定 |
|
乗算、除算 |
|
加算、減算、連結 |
Oracle CQL条件はOracle CQL演算子の後に評価されます。 |
第6章「条件」を参照 |
優先順位の例 次の例では、乗算の優先順位が加算よりも高いため、先に2と3の乗算が行われ、その結果が1に加算されます。
1+2*3
式の中でカッコを使用すると、演算子の優先順位をオーバーライドできます。カッコ内の式がカッコ外の式よりも先に評価されます。
表4-2は、Oracle CEPでサポートされる算術演算子を示しています。算術演算子を1つまたは2つの引数とともに使用して、数値を否定、加算、減算、乗算および除算できます。これらの演算子の一部は日時と期間の算術演算でも使用されます。演算子の引数は、数値データ型または数値データ型に暗黙的に変換される任意のデータ型に解決される必要があります。
特定のケースでは、Oracle CEPによって、引数が演算に必要なデータ型に変換されます。たとえば、整数と浮動小数点数を加算する場合は、整数の引数が浮動小数点数に変換されます。結果の式のデータ型は浮動小数点数です。詳細は、「暗黙的なデータ型変換」を参照してください。
表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> |
二重否定または負の値の減算を表す場合に、連続する2つのマイナス記号(--)を算術式で使用しないでください。スペースまたはカッコを使用して、連続するマイナス記号を区切る必要があります。
Oracle CEPでは、数値リテラル、日時リテラル、期間リテラルを使用した算術演算がサポートされています。
詳細は、以下を参照してください。
連結演算子は文字列を操作します。表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 CEPでは長さ0の文字列がnullとして処理されますが、長さ0の文字列と別のオペランドを連結した結果は常に別のオペランドになります。そのため、nullが生成されるのは2つのnull文字列を連結した場合のみです。ただし、将来のOracle CEPバージョンではこの処理が変更される場合があります。nullの可能性のある式を連結するには、NVL
関数を使用して明示的に式を長さ0の文字列に変換します。
例4-1に、連結演算子を使用して文字列「xyz」をselect文のc2
の値に付加する方法を示します。
Oracle CQLでは、次の範囲ベースのストリームからリレーションへのウィンドウ演算子がサポートされています。
詳細は、以下を参照してください。
この時間ベースの範囲ウィンドウでは瞬間的なリレーションが出力されます。このため、時間t
のnow
ウィンドウの出力は、その瞬間t
に到着したすべてのタプルになります。Oracle CEPの時間の最小単位はナノ秒であるため、これらのすべてのタプルは1ナノ秒後に期限切れになります。
例については、「S [now]の例」を参照してください。
例
S[now]の例
例4-2の問合せq1
と例4-3のデータ・ストリームS
があるとします。タイムスタンプはナノ秒(1 sec = 10^9 nanoseconds
)で示されています。例4-4は、時間5000 ms
に問合せで返されるリレーションを示します。時間5002 ms
には空のリレーションが返されます。
例4-3 S [now]のストリーム入力
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
例4-4 S [now]の時間5000000000 nsのリレーション出力
Timestamp Tuple Kind Tuple 5000000000 + 33,4.4 5000000000 + 23,56.33 5000000001 - 33,4.4 5000000001 - 23,56.33
この時間ベースの範囲ウィンドウでは、サイズT
の時間単位の間隔をスライドさせ、並べられたストリームの最新部分を取得することで、時間の経過に沿った出力リレーションが定義されます。
例については、「S [range T]の例」を参照してください。
例
S [range T]の例
例4-5の問合せq1
があるとします。例4-6のデータ・ストリームS
がある場合に、例4-7のリレーションが問合せで返されます。デフォルトでは、範囲の時間単位はsecond
であるため(time_spec::=を参照)、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 CEPに通知します。 |
例4-6 S [range T]のストリーム入力
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
例4-7 S [range T]のリレーション出力
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
この時間ベースの範囲ウィンドウでは、過去のタプルを維持する必要のある期間(範囲)と、タプルの出力を表示する頻度(スライド)を指定できます。そのため、2つのタプルが期間n*T2
と(n+1)*T2
の間に到着した場合、これらは(n+1)*T2
の時点でのみ見えるようになり(ウィンドウに入り)、(n+1)*T2+T1
の時点でウィンドウから期限切れになります。
例については、「S [range T1 slide T2]の例」を参照してください。
例
S [range T1 slide T2]の例
例4-8の問合せq1
があるとします。例4-9のデータ・ストリームS
がある場合に、例4-10のリレーションが問合せで返されます。デフォルトでは、範囲の時間単位はsecond
であるため(time_spec::=を参照)、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
に期限切れになります。
例4-8 S [range T1 slide T2]の問合せ
<query id="q1"><![CDATA[ SELECT * FROM S [range 10 slide 5] ]]></query>
例4-9 S [range T1 slide T2]のストリーム入力
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
例4-10 S [range T1 slide T2]のリレーション出力
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
この時間ベースの範囲ウィンドウでは、T = infinity
である場合に、時間t
のリレーションが時間t
までのS
のすべての要素から取得されたタプルで構成されるように、出力リレーションが定義されます。要素はウィンドウ内で無限に維持されます。
例については、「S [range unbounded]の例」を参照してください。
例
S [range unbounded]の例
例4-11の問合せq1
と例4-12のデータ・ストリームS
があるとします。タイムスタンプはミリ秒(1 s = 1000 ms
)で示されています。要素は到着した時点でリレーションに挿入されます。どの要素も削除されません。例4-13は時間5000 ms
に問合せで返されるリレーションを示し、例4-14は時間205000 ms
に問合せで返されるリレーションを示します。
例4-11 S [range unbounded]の問合せ
<query id="q1"><![CDATA[ SELECT * FROM S [range unbounded] ]]></query>
例4-12 S [range unbounded]のストリーム入力
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
例4-13 S [range unbounded]の時間5000 msのリレーション出力
Timestamp Tuple Kind Tuple 1000: + 10,0.1 1002: + 15,0.14 5000: + 33,4.4
例4-14 S [range unbounded]の時間205000 msのリレーション出力
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
この定数値ベースの範囲ウィンドウでは、ストリーム要素E
の値の差がC
未満のタプルから成る、識別子E
に基づいて並べられたストリームの最新部分を取得することで、出力リレーションが定義されます。ストリーム要素E
の値とリレーションの任意のタプルの値の差がC
以上の場合、タプルは削除の対象になります。
例については、次の項を参照してください。
例
S [range C on E]の例: 定数値
例4-15の問合せtkdata56_q0
と例4-16のデータ・ストリームtkdata56_S0
があるとします。ストリームtkdata56_S0
のスキーマは(c1 integer, c2 float)
です。例4-17は、問合せで返されるリレーションを示します。この例では、時間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未満でないため、削除対象になります。
例4-15 S [range C on E]定数値: 問合せ
<query id="tkdata56_q0"><![CDATA[ select * from tkdata56_S0 [range 10 on c1] ]]></query>
例4-16 S [range C on E]定数値: ストリーム入力
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
例4-17 S [range C on E]定数値: リレーション出力
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
を使用できます。例4-18の問合せtkdata56_q2
と例4-19のデータ・ストリームtkdata56_S1
があるとします。ストリームtkdata56_S1
のスキーマは(c1 timestamp, c2 double)
です。例4-20は、問合せで返されるリレーションを示します。
例4-18 S [range C on E] INTERVAL値: 問合せ
<query id="tkdata56_q2"><![CDATA[ select * from tkdata56_S1 [range INTERVAL "530 0:0:0.0" DAY TO SECOND on c1] ]]></query>
Oracle CQLでは、次のタプルベースのストリームからリレーションへのウィンドウ演算子がサポートされています。
詳細は、以下を参照してください。
タプルベースのウィンドウでは、並べられたストリームの最後のN
タプルのウィンドウをスライドさせることで、時間の経過に沿った出力リレーションが定義されます。
S [rows N]
の出力リレーションR
の場合、時間t
のリレーションは、大きいタイムスタンプ(<= t
)を持つS
のN
個のタプル(または、t
までのS
の長さが<= N
の場合はすべてのタプル)で構成されます。
同じタイムスタンプを持つ複数のタプルがある場合は、N
個のタプルが返されることを保証するため、Oracle CEPによって確定的でない方法で1つのタプルが選択されます。このため、タプルベースのウィンドウはタイムスタンプが一意でないストリームには適していない場合があります。
デフォルトでは、スライドは1です。
例については、「S [rows N]の例」を参照してください。
例
S [rows N]の例
例4-21の問合せq1
と例4-22のデータ・ストリームS
があるとします。タイムスタンプはミリ秒(1 s = 1000 ms
)で示されています。要素はS [Range 1]
の場合と同様に挿入および削除されます(「S [range T]の例」を参照)。
例4-23は、時間1003 ms
に問合せで返されるリレーションを示します。この時点のS
の長さはrows
値(3)以下であるため、その時点までに挿入されたS
のすべてのタプル、つまりタプル(10,0.1)
および(15,0.14)
が問合せで返されます。
例4-24は、時間1007 ms
に問合せで返されるリレーションを示します。この時点のS
の長さはrows
値(3)を超えているため、1007 ms
以下の大きいタイムスタンプを持つS
の3つのタプル、つまりタプル(15,0.14)
、(33,4.4)
および(23,56.33)
が問合せで返されます。
例4-25は、時間2001 ms
に問合せで返されるリレーションを示します。この時点では、Oracle CEPによってデフォルトの範囲(およびスライド)の1000 ms
(1 s
)を超えてウィンドウに留まっている要素が削除されます。この時点のS
の長さはrows
値(3)以下であるため、その時点までに挿入されたS
のすべてのタプル、つまりタプル(17,1.3)
が問合せで返されます。
例4-22 S [rows N]のストリーム入力
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
例4-24 S [rows N]の時間1007 msのリレーション出力
Timestamp Tuple Kind Tuple 1002: + 15,0.14 1004: + 33,4.4 1006: + 23,56.33
例4-25 S [rows N]の時間2001 msのリレーション出力
Timestamp Tuple Kind 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
タプルベースのウィンドウでは、並べられたストリームの最後のN1
タプルのウィンドウをスライドさせることで、時間の経過に沿った出力リレーションが定義されます。
S [rows N1 slide N2]
の出力リレーションR
の場合、時間t
のリレーションは、大きいタイムスタンプ(<= t
)を持つS
のN1
個のタプル(または、t
までのS
の長さが<= N
の場合はすべてのタプル)で構成されます。
同じタイムスタンプを持つ複数のタプルがある場合は、N
個のタプルが返されることを保証するため、Oracle CEPによって確定的でない方法で1つのタプルが選択されます。このため、タプルベースのウィンドウはタイムスタンプが一意でないストリームには適していない場合があります。
整数のストリーム要素数としてスライドN2
を構成できます。Oracle CEPではN2
個の要素を受け取るまで、リレーションへの要素の追加が遅延されます。
例については、「S [rows N]の例」を参照してください。
例
S [rows N1 slide N2]の例
例4-26の問合せtkdata55_q0
と例4-27のデータ・ストリームtkdata55_S55
があるとします。ストリームtkdata55_S55
のスキーマは(c1 integer, c2 float)
です。例4-28は、出力リレーションを示します。
例4-28に示すように、時間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個数のタプルが到着します。この時点で、rows
値で指定された制約を満たすため、最も古いタプル(20,0.1)
が削除対象になります。つまり、出力リレーションに含まれる要素は5つまでという制約です。この時点で、出力リレーションに含まれるタプルは(15,0.14)
、(5,0.2)
、(8,0.2)
、(10,0.22)
および(20,0.25)
です。時間600000までに、別のslide
個数のタプルが到着します。この時点で、rows
値の制約を満たすため、最も古いタプル(15,0.14)
および(5,0.2)
が削除対象になります。この時点で、出力リレーションに含まれるタプルは(8,0.2)
、(10,0.22)
、(20,0.25)
、(30,0.3)
および(40,0.4)
です。
例4-26 S [rows N1 slide N2]の問合せ
<query id="tkdata55_q0"><![CDATA[ select * from tkdata55_S55 [rows 5 slide 2 ] ]]></query>
例4-27 S [rows N1 slide N2]のストリーム入力
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
例4-28 S [rows N1 slide N2]のリレーション出力
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
Oracle CQLでは、次の分割されたストリームからリレーションへのウィンドウ演算子がサポートされています。
(time_spec::=、non_mt_attr_list::=)
詳細は、以下を参照してください。
ストリームS
に対するこの分割されたスライディング・ウィンドウでは、正の整数のタプル数N
とストリーム属性のサブセット{A1,... Ak}
をパラメータとして受け取り、次のことを行います。
属性A1,... Ak
の同一性に基づいて、S
を異なるサブストリームに論理的に分割します(SQL GROUP BY
と同様)。
各サブストリームで、サイズN
のタプルベースのスライディング・ウィンドウを個別に計算します。
例については、「S[partition by A1, ..., Ak rows N]の例」を参照してください。
例
S[partition by A1, ..., Ak rows N]の例
例4-29の問合せqPart_row2
と例4-30のデータ・ストリームSP1
があるとします。ストリームSP1
のスキーマは(c1 integer, name char(10))
です。この問合せは、例4-31に示すリレーションを返します。デフォルトでは、範囲(およびスライド)は1秒です。タイムスタンプはミリ秒(1 s = 1000 ms
)で示されています。
注意: ストリーム入力の例で、h で始まる行(h 3800 など)はハートビート入力タプルです。これは、ハートビート値よりも小さいタイムスタンプを持つこれ以上の入力がないことをOracle CEPに通知します。 |
例4-29 S[partition by A1, ..., Ak rows N]の問合せ
<query id="qPart_row2"><![CDATA[ select * from SP1 [partition by c1 rows 2] ]]></query>
例4-30 S[partition by A1, ..., Ak rows N]のストリーム入力
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
例4-31 S[partition by A1, ..., Ak rows N]のリレーション出力
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
ストリームS
に対するこの分割されたスライディング・ウィンドウでは、正の整数のタプル数N
とストリーム属性のサブセット{A1,... Ak}
をパラメータとして受け取り、次のことを行います。
属性A1,... Ak
の同一性に基づいて、S
を異なるサブストリームに論理的に分割します(SQL GROUP BY
と同様)。
各サブストリームで、サイズN
および範囲T
のタプルベースのスライディング・ウィンドウを個別に計算します。
例については、「S[partition by A1, ..., Ak rows N range T]の例」を参照してください。
例
S[partition by A1, ..., Ak rows N range T]の例
例4-32の問合せqPart_range2
と例4-33のデータ・ストリームSP5
があるとします。ストリームSP5
のスキーマは(c1 integer, name char(10))
です。この問合せは、例4-34に示すリレーションを返します。デフォルトでは、範囲の時間単位はsecond
であるため(time_spec::=を参照)、range 2
はrange 2 seconds
と同等です。タイムスタンプはミリ秒(1 s = 1000 ms
)で示されています。
例4-32 S[partition by A1, ..., Ak rows N range T]の問合せ
<query id="qPart_range2"><![CDATA[ select * from SP5 [partition by c1 rows 2 range 2] ]]></query>
例4-33 S[partition by A1, ..., Ak rows N range T]のストリーム入力
Timestamp Tuple 1000 1,abc 2000 1,abc 3000 1,abc 4000 1,abc 5000 1,def 6000 1,xxx h 200000000
例4-34 S[partition by A1, ..., Ak rows N range T]のリレーション出力
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
ストリームS
に対するこの分割されたスライディング・ウィンドウでは、正の整数のタプル数N
とストリーム属性のサブセット{A1,... Ak}
をパラメータとして受け取り、次のことを行います。
属性A1,... Ak
の同一性に基づいて、S
を異なるサブストリームに論理的に分割します(SQL GROUP BY
と同様)。
各サブストリームで、サイズN
、範囲T
およびスライドT2
のタプルベースのスライディング・ウィンドウを個別に計算します。
例については、「S[partition by A1, ..., Ak rows N]の例」を参照してください。
例
S[partition by A1, ..., Ak rows N range T1 slide T2]の例
例4-35の問合せqPart_rangeslide
と例4-36のデータ・ストリームSP1
があるとします。ストリームSP1
のスキーマは(c1 integer, name char(10))
です。この問合せは、例4-37に示すリレーションを返します。デフォルトでは、範囲とスライドの時間単位はsecond
であるため(time_spec::=を参照)、range 1 slide 1
はrange 1 second slide 1 second
と同等です。タイムスタンプはミリ秒(1 s = 1000 ms
)で示されています。
例4-35 S[partition by A1, ..., Ak rows N range T1 slide T2]の問合せ
<query id="qPart_rangeslide"><![CDATA[ select * from SP1 [partition by c1 rows 1 range 1 slide 1] ]]></query>
例4-36 S[partition by A1, ..., Ak rows N range T1 slide T2]のストリーム入力
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
例4-37 S[partition by A1, ..., Ak rows N range T1 slide T2]のリレーション出力
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
タプルs
がR(t) - R(t-1)
に含まれている場合は常に、つまり、t
の時点でs
がR
に挿入された場合は常に、リレーションR
に適用されたIstream
(「挿入ストリーム」を意味する)には(s,t)
が含まれます。同じタイムスタンプでタプルの挿入と削除の両方が発生した場合、Istream
では挿入が出力されません。
例4-38では、selectによってフィルタ条件(viewq3.ACCT_INTRL_ID = ValidLoopCashForeignTxn.ACCT_INTRL_ID)
を満たすタプルのストリームが出力されます。now
ウィンドウによってviewq3
がリレーションに変換され、これはフィルタ条件によってリレーションとして維持されます。リレーションからストリームへのIStream
演算子によって、フィルタ出力がストリームに変換されます。
例4-38 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
の差分を簡単に検出できます。
詳細は、以下を参照してください。
タプルs
がR(t-1) - R(t)
に含まれている場合は常に、つまり、t
の時点でs
がR
から削除された場合は常に、リレーションR
に適用されたDstream
(「削除ストリーム」を意味する)には(s,t)
が含まれます。
例4-39では、問合せによってストリームS
の入力が10分遅延されます。ストリームS
はrangeウィンドウ演算子によってリレーションに変換されますが、Dstream
によってストリームに戻されます。
時間の最小単位を分と想定します。表4-4は、次の入力ストリームTradeInputs
の入力について、rangeウィンドウ演算子のリレーション(S[Range 10 minutes]
)とDstream
のストリームのコンテンツを示しています。
Time Value 05 1,1 25 2,2 50 3,3
表4-4 DStreamの出力例
入力ストリームS | リレーション出力 | リレーションのコンテンツ | DStream出力 |
---|---|---|---|
|
|
|
|
|
|
+ |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
+ |
時間15、35および60の時点で、リレーションは空{}
です(空のセット)。
Dstream
演算子とDIFFERENCES USING
句を組み合せて、Dstream
の差分を簡単に検出できます。
詳細は、以下を参照してください。
Rstream
演算子は、入力リレーションの現在の状態全体を維持し、各時間ステップごとにすべてのタプルを挿入として出力します。
Rstream
では各瞬間のリレーション全体の状態が出力されるため、リレーション・セットが非常に小さい場合を除き、コストがかかる可能性があります。
例4-40では、Rstream
によって時間Now
のwhere
句でフィルタ処理されたリレーション全体の状態が出力されます。
例4-40 RStream
<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>
詳細は、idstream_clause::=を参照してください。