疑似列はストリーム要素と同じように動作しますが、実際にはタプルの一部ではありません。
疑似列からの選択はできますが、値の変更はできません。疑似列は引数のない関数にも似ています(1.1.11項「関数」を参照)。
Oracle CQLでは、次の疑似列がサポートされています。
基本ストリームまたは派生したストリーム(ストリームに対して評価するビュー)の各ストリーム要素には、関連する要素時間があります。ELEMENT_TIME
擬似列により、この時間がOracle CQLネイティブ・タイプbigint
として返されます。
この項の内容は次のとおりです。
詳細は、以下を参照してください。
ELEMENT_TIME
疑似列の値は、ストリーム要素のチャネルをシステム・スタンプ付きか、アプリケーション・スタンプ付きのいずれかとして構成するかにより異なります。
この場合、ストリーム要素の要素時間は、Oracle CEPシステムで、システム指定の時間の2つの値を除算し、経過した実時間とおおよそ一致する時間を計算することによって指定されます。
詳細は、Eclipse用Oracle Complex Event Processing開発者ガイドのシステム・タイムスタンプ付きチャネルに関する項を参照してください。
この場合は、関連する要素時間は、アプリケーションで、アプリケーション・アセンブリ・ファイルwlevs:expression
要素を使用して、派生タイムスタンプ式を指定することにより指定されます。
Oracle CEPでは、この式の結果は次のように処理されます。
詳細は、Eclipse用Oracle Complex Event Processing開発者ガイドのアプリケーション・タイムスタンプ付きチャネルに関する項を参照してください。
派生タイムスタンプ式が、Oracle CQLネイティブ・タイプint
に対して評価を行う場合、対応するbigint
値として結果が返されます。この式がOracle CQLネイティブ・タイプbigint
に対して評価を行う場合は、その値がそのまま返されます。
この項では、様々な問合せでELEMENT_TIME
を使用する方法を説明します。
例3-1は、select文でELEMENT_TIME
疑似列を使用する方法を示しています。ストリームS1
にはスキーマ(c1 integer)
があります。例3-2に示す入力ストリームがある場合、この問合せは例3-3に示す結果を返します。関数to_timestamp
を使用して、Long
値をタイムスタンプ値に変換しています。
例3-1 Select文でのELEMENT_TIME疑似列
<query id="q4"><![CDATA[ select c1, to_timestamp(element_time) from S1[range 10000000 nanoseconds slide 10000000 nanoseconds] ]]></query>
例3-3 出力リレーション
Timestamp Tuple Kind Tuple 8000 + 80,12/31/1969 17:00:08 8010 - 80,12/31/1969 17:00:08 9000 + 90,12/31/1969 17:00:09 9010 - 90,12/31/1969 17:00:09 13000 + 130,12/31/1969 17:00:13 13010 - 130,12/31/1969 17:00:13 15000 + 150,12/31/1969 17:00:15 15010 - 150,12/31/1969 17:00:15 23000 + 230,12/31/1969 17:00:23 23010 - 230,12/31/1969 17:00:23 25000 + 250,12/31/1969 17:00:25 25010 - 250,12/31/1969 17:00:25
問合せにGROUP BY
句が含まれる場合、SELECT
文で直接ELEMENT_TIME
疑似列を使用することはできません。かわりに、3.2.2.2項「GROUP BYでのELEMENT_TIMEの使用」に説明されているように、ビューを使用します。
例3-4の問合せQ1
があるとします。GROUP BY
句があるため、問合せのSELECT
文でELEMENT_TIME
を使用することはできません。
例3-4 GROUP BYを含む問合せ
<query id="Q1"><![CDATA[ SELECT R.queryText AS queryText, COUNT(*) AS queryCount FROM queryEventChannel [range 30 seconds] AS R GROUP BY queryText ]]></query>
かわりに、例3-5に示すようなビューを作成します。V1
に相当する派生したストリームには、特定のqueryText
グループに対して(queryText
、queryCount
、maxTime
)が変わるたびに、ストリーム要素が含められます。
例3-5 ビュー
<view id="V1"><![CDATA[ ISTREAM ( SELECT R.queryText AS queryText, COUNT(*) AS queryCount, MAX(R.ELEMENT_TIME) as maxTime FROM queryEventChannel [range 30 seconds] AS R GROUP BY queryText ) ]]></view>
ビューV1の出力要素に関連付けられている要素時間は、出力イベントの属性maxTimeの値と同じである必要はありません。たとえば、ウィンドウがスライドし、queryEventChannel入力ストリームからの要素がそのウィンドウで期限切れとなった場合に、queryTextグループのqueryCountが変わり、出力となります。ただし、そのウィンドウに入る入力ストリームqueryEventChannelからの新しいイベントがないので、そのウィンドウ内のすべてのイベント間のmaxTimeは変わらず、この出力イベントのmaxTime属性の値は、以前の出力イベントのこの属性値と同じになります。
ただし、出力イベントのELEMENT_TIMEは、出力イベントのELEMENT_TIMEは出力イベントの"maxTime"属性の値とは異なるなど、入力ストリームからの最新イベントとは異なり、イベントがウィンドウで期限切れとなった瞬間と同じになります。
ビューV1の出力イベントのELEMENT_TIMEを選択するには、例3-6に示すように問合せを作成します。
例3-7は、pattern問合せでELEMENT_TIME
疑似列を使用する方法を示します。Nth.status
の値が>= F.status
で、そのタプルのNth.ELEMENT_TIME
値と最後にF
に一致したタプルとの差がjava.lang.Math.Bigint(Long)
として指定された間隔に満たない場合、タプルまたはイベントは相関変数Nth
に一致します。