プライマリ・コンテンツに移動
Oracle® Fusion Middleware Oracle Event Processing Oracle CQL言語リファレンス
12c リリース(12.1.3)
E57533-04
目次へ移動
目次

前
前へ
次
次へ

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>

二重否定または負の値の減算を表す場合に、連続する2つのマイナス記号(--)を算術式で使用しないでください。スペースまたはカッコを使用して、連続するマイナス記号を区切る必要があります。

Oracle Event Processingでは、数値リテラル、日時リテラル、期間リテラルを使用した算術演算がサポートされています。

詳細は、次を参照してください。

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つのいずれかの相関変数を意味するように、PATTERN句の意味を変更します。

<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]

この時間ベースの範囲ウィンドウでは瞬間的なリレーションが出力されます。このため、時間tnowウィンドウの出力は、その瞬間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ごとに出力の表示を確認することを意味するため、10001002および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]ウィンドウではINTERVALTIMESTAMPを使用できます。問合せ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)を持つSN個のタプル(または、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)を持つSN1個のタプル(または、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を異なるサブストリームに論理的に分割します(SQL GROUP 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を異なるサブストリームに論理的に分割します(SQL GROUP 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 2range 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を異なるサブストリームに論理的に分割します(SQL GROUP 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 1range 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.8.1 ユーザー定義ウィンドウの実装

oracle.cep.extensibility.windowsパッケージのクラスを使用すると、次の種類のユーザー定義ウィンドウを作成できます。

  • 汎用時間ウィンドウ

4.8.1.1 ユーザー定義の汎用時間ウィンドウの実装方法

ユーザー定義の汎用時間ウィンドウを実装するには、GenericTimeWindowインタフェースを実装するJavaクラスを実装します。

ユーザー定義の汎用時間ウィンドウを実装するには:

  1. Javaクラスを実装します。
    import java.io.IOException;
    import java.sql.Timestamp;
    
    import oracle.cep.extensibility.windows.GenericTimeWindow;
    
    public class MyRangeSlideWindow implements GenericTimeWindow {
        private long range;
        private long slide;
    
        public void setInputParams(Object[] obj) throws IOException{
            if(obj.length != 2)
                throw new IOException("inappropriate number of arguments");
            range = (((Integer)obj[0]).intValue())*1000;
            slide = (((Integer)obj[1]).intValue())*1000;
        }
    
        public boolean visibleW(Timestamp t, Timestamp visTs) {
            long actual = t.getTime();
            if(getVisibleTs(actual) < actual)
                return false;
            visTs.setTime(getVisibleTs(actual));
            return true;
        }
    
        private long getVisibleTs(long time) {
            if(slide > 1) {
                long t = time / slide;
                if((time % slide) == 0)
                    return(t*slide);
                else
                    return((t+1)*slide);
            } else
                return time;
        }
    
        public boolean canOutputTsGTInputTs() {
            if(slide > 1)
                return true;
            return false;
        }
     
        public boolean expiredW(Timestamp ts, Timestamp expTs) {
            long actual = ts.getTime();
            long visibleTs = getVisibleTs(actual);
            long expiredTs = visibleTs + range;
            expTs.setTime(expiredTs);
            // This is the border line case, when range > slide and visibleTs < range
                if(visibleTs < range)
                    return false;
            return true;
        }
    }
    
  2. ウィンドウをOracle CQLに登録します。
    ...
    <rule id="range_slide"><![CDATA[ 
        register window range_slide(winrange int, winslide int) implement using "MyRangeSlideWindow"
    ]]></rule>
    ...
    <query id="q79"><![CDATA[ 
        select * from S12 [range_slide(10,5)] 
    ]]></query>
    ...
    
  3. FROM句でユーザー定義ウィンドウを使用します。

4.9 リレーションからストリームへのIStream演算子

リレーションRへ適用されるIstream (「ストリームの挿入」の略)には、タプルsR(t) - R(t-1)の中にある場合、つまりstの時点で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演算子

リレーションRに適用されるDStream (Delete streamの略)には、タプルsR(t-1) - R(t)の中にある場合、つまりtの時点でsRから削除される場合は常に(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出力

05    1,1

+ 05    1,1

{1, 1}

05    1,1

- 15    1,1

{}

+15    1,1

25    2,2

+ 25    2,2

{2,2}

25    2,2

- 35    2,2

{}

+35    2,2

50    3,3

+ 50    3,3

{3,3}

50    3,3

- 60    3,3

{}

+60    3,3

時間15、35および60の時点で、リレーションは空{}です(空のセット)。

Dstream演算子とDIFFERENCES USING句を組み合せて、Dstreamの差分を簡単に検出できます。

詳細は、次を参照してください。

4.11 リレーションからストリームへのRStream演算子

Rstream演算子は、入力リレーションの現在の状態全体を維持し、各時間ステップごとにすべてのタプルを挿入として出力します。

Rstreamでは各瞬間のリレーション全体の状態が出力されるため、リレーション・セットが非常に小さい場合を除き、コストがかかる可能性があります。

次の例では、Rstreamによって時間Nowwhere句でフィルタ処理されたリレーション全体の状態が出力されます。

<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>