演算子はデータ項目を操作し、結果を返します。構文上、演算子はオペランドの前後、または 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 演算子の後に評価されます |
第 12 章「条件」を参照 |
優先順位の例 以下の例では、乗算の優先順位が加算よりも高いため、先に 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 秒 = 10^9 ナノ秒
) で示されています。例 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 秒 = 1000 ms
) で示されています。最初の 1000 ms
の間隔に存在している要素が枠に入ります。つまり、タプル (10,0.1)
および (15,0.14)
です。時間 2000 ms
には、この間隔よりも長い間枠に留まっていたタプルがリレーションから削除の対象になります。つまり、タプル (10,0.1)
です。時間 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 秒 = 1000 ms
) で示されています。スライド値は 5 秒であり、これはユーザが 5 秒ごとに出力の表示を確認することを意味するため、1000、1002、5000 に到着したすべてのタプルは 5000 の時点で枠に入ります。これらのタプルは 5 秒 = 5000 ms に枠に入りますが、範囲値は 10 秒 = 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 秒 = 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 秒 = 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
の長さは 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 秒 = 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 秒 = 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
、範囲 T1
、スライド 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 秒 = 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>
詳細については、xstream_clause::= を参照してください。
タプル s
が R(t-1) - R(t)
に含まれている場合は常に、つまり、t
の時点で s
が R
から削除された場合は常に、リレーション R
に適用された Dstream
(「削除ストリーム」を意味する) には (s,t)
が含まれます。
例 4-39 では、クエリによってストリーム S
の入力が 10 分遅延されます。ストリーム S
は range 枠演算子によってリレーションに変換されますが、Dstream
によってストリームに戻されます。
例 4-39 DStream
<query id="BBAQuery"><![CDATA[ Dstream(select * from S[range 10 minutes]) ]]></query>
時間の最小単位を分と想定します。表 4-4 は、以下の入力ストリーム TradeInputs
からの入力について、range 枠演算子のリレーションと Dstream
のストリームのコンテンツを示しています。
Time Value 05 1,1 25 2,2 50 3,3
表 4-4 Dstream の出力例
入力ストリーム S | リレーション S[Range 10 minutes] の出力 | Dstream 出力 |
---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
時間 15 の時点で、リレーションは空です : R(15) = {}
(空のセット)
詳細については、xstream_clause::= を参照してください。
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>
詳細については、xstream_clause::= を参照してください。