この章では、データのストリーミングをサポートするコンストラクトが追加された、SQLに基づく問合せ言語であるOracle Continuous Query Language (Oracle CQL)について説明します。Oracle CQLを使用すると、Oracle Event Processingを使用してデータ・ストリームに対する問合せを表現できます。
Oracle Event Processing(以前の名称はWebLogic Event Server)は、高パフォーマンスのイベント駆動アプリケーションを開発するためのJavaサーバーです。それは、Equinox OSGiに基づく軽量Javaアプリケーション・コンテナであり、Oracle CQLベースの機能豊富な宣言的環境を提供し、企業活動の管理の効率と効果を向上させるOracle Event Processingサービス・エンジンなどの共有サービスが備わっています。Oracle Event Processingでは、JRockit Real Timeを使用してきわめて高いスループットとマイクロ秒単位の待機時間をサポートし、完全なリアルタイム・エンドツーエンドのJava Event-Driven Architecture (EDA)開発プラットフォームで使用するEclipse開発者ツール用のOracle Event Processing VisualizerおよびOracle Event Processing IDEを提供します。
この章の内容は次のとおりです。
データベースは、格納された有限のデータ・セットに対して問合せを実行するために最適化されています。ただし、最近の多くのアプリケーションは、連続的な無制限のデータ・セットに対して問合せを長時間実行する必要があります。設計上、格納されたデータ・セットは、データの大部分が繰り返し問い合され、更新頻度が比較的低い場合に向いています。これとは対照的に、データ・ストリームは、新規要素の挿入を通じて継続的に、通常は排他的に変化するデータを表します。データの大部分を複数回操作することは、不要であるか、実用的ではありません。
センサー・データ・アプリケーション、財務表示、ネットワーク性能測定ツール、ネットワーク監視およびトラフィック管理アプリケーション、クリックストリーム分析ツールなどの多くの種類のアプリケーションでは、データ・セットのかわりにデータ・ストリームが生成されます。これらの種類のアプリケーション・データを管理および処理する際は、厳密な時間によるフォーカスを使用して、データ管理および問合せ機能を作成します。
こうした要件に対応するために、構造化データ・レコードのストリームと格納されたリレーションの概念をサポートするデータ管理インフラストラクチャのOracle Event Processingが導入されました。
統一的な宣言フレームワークを提供するために、データのストリーミングをサポートするコンストラクトが追加されたSQLに基づく問合せ言語のOracle Continuous Query Language (Oracle CQL)が提供されています。
Oracle CQLは次の理念に基づいて設計されています。
連続するデータ・ストリームと従来の格納されたデータ・セットに対する大量の問合せをサポートするスケーラビリティ。
複雑なシナリオを扱う包括性。たとえば、構成を通じて、問合せの様々な中間ビューを作成できます。
図1-1は、Oracle Event Processingアーキテクチャの概観です。Oracle Event Processingサーバーには、Oracle Event Processingアプリケーション用に軽量Springコンテナがあります。この図のOracle Event Processingアプリケーションは、イベント・データを入力チャネルに提供するイベント・アダプタで構成されています。入力チャネルは、入力チャネルから提供されるイベントを操作する1つ以上のOracle CQL問合せに関連付けられたOracle CQLプロセッサに接続されています。Oracle CQLプロセッサは、問合せ結果の書込み先となる出力チャネルに接続されています。出力チャネルは、出力チャネルから受信したイベントに基づいてアクションを実行するユーザー定義のPlain Old Java Object (POJO)である、イベントBeanに接続されています。
Oracle Event Processingを使用すると、JMS、リレーショナル・データベース表、ローカル・ファイルシステムのファイルなどの各種データ・ソースに対するイベント・アダプタを定義できます。複数の入力チャネルをOracle CQLプロセッサに接続したり、Oracle CQLプロセッサを複数の出力チャネルに接続できます。出力チャネルを別のOracle CQLプロセッサ、アダプタ、キャッシュまたはイベントBeanに接続できます。
Oracle Event Processing IDE for EclipseおよびOracle Event Processing Visualizerを使用して、次の操作を行います。
図1-1のようなイベント処理ネットワーク(EPN)を作成します。
1つ以上のOracle CQL問合せをEPNのOracle CQLプロセッサに関連付けます。
作成したOracle Event Processingアプリケーションをパッケージ化し、実行するためにOracle Event Processingサーバーにデプロイします。
例1-1に示すような、通常のOracle CQL文があるとします。
例1-1 通常のOracle CQL文
<?xml version="1.0" encoding="UTF-8"?> <n1:config xsi:schemaLocation="http://www.bea.com/ns/wlevs/config/application wlevs_application_config.xsd" xmlns:n1="http://www.bea.com/ns/wlevs/config/application" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <processor> <name>cqlProcessor</name> <rules> <view id="lastEvents" schema="cusip bid ask"><![CDATA[ select cusip, bid, srcId, bidQty, ask, askQty, seq from inputChannel[partition by srcId, cusip rows 1] ]]></view> <view id="bidask" schema="cusip bid ask"><![CDATA[ select cusip, max(bid), min(ask) from lastEvents group by cusip ]]></view> <view ...><![CDATA[ ... ]]></view> ... <view id="MAXBIDMINASK" schema="cusip bidseq bidSrcId bid askseq askSrcId ask bidQty askQty"><![CDATA[ select bid.cusip, bid.seq, bid.srcId as bidSrcId, bid.bid, ask.seq, ask.srcId as askSrcId, ask.ask, bid.bidQty, ask.askQty from BIDMAX as bid, ASKMIN as ask where bid.cusip = ask.cusip ]]></view> <query id="BBAQuery"><![CDATA[ ISTREAM(select bba.cusip, bba.bidseq, bba.bidSrcId, bba.bid, bba.askseq, bba.askSrcId, bba.ask, bba.bidQty, bba.askQty, "BBAStrategy" as intermediateStrategy, p.seq as correlationId, 1 as priority from MAXBIDMINASK as bba, inputChannel[rows 1] as p where bba.cusip = p.cusip) ]]></query> </rules> </processor>
この例では、複数のリレーションを作成するために複数のビュー(Oracle CQLでの副問合せ)が定義され、各ビューは前のビューに基づいています。ビューは常にinputChannel
などの着信チャネルに対して機能します。lastEvents
という最初のビューはinputChannel
から直接選択します。後続のビューはinputChannel
から直接選択するか、前に定義されたビューから選択します。ビューの選択文で返された結果はビューのリレーションに残ったまま維持され、出力チャネルには転送されません。これは問合せの動作です。この例では、inputChannel
からの直接の選択と、前に定義されたビューからの選択の両方を行う問合せBBAQuery
が定義されます。問合せのselect句から返された結果は、関連付けられている出力チャネルに転送されます(この例ではoutputChannel
)。BBAQuery
は、タプルベースのストリームからリレーションへの演算子(またはスライディング・ウィンドウ)を使用します。
これらの要素の詳細は、次の項を参照してください。
Oracle Event Processingサーバーおよびツールの詳細は、次を参照してください。
『Oracle Fusion Middleware Oracle Event Processing開発者ガイドfor Eclipse』
『Oracle Fusion Middleware Oracle Event Processing Visualizerユーザーズ・ガイド』
『Oracle Fusion Middleware Oracle Event Processing管理者ガイド』
この項では、Oracle CQLを使用して操作する2つの基本的なOracle Event Processingオブジェクトについて説明します。
Oracle CQLを使用して、ストリームとリレーションの次の操作を実行できます。
リレーションからリレーションへの演算子: 1つ以上の他のリレーションからのリレーションの生成
ストリームからリレーションへの演算子(ウィンドウ): ストリームからのリレーションの生成
リレーションからストリームへの演算子: リレーションからのストリームの生成
ストリームからストリームへの演算子: 1つ以上の他のストリームからのストリームの生成
ストリームは、Oracle CQL問合せでの操作の対象となる主なデータ・ソースです。
ストリームS
は要素のバッグ(またはマルチセット)(s,T)
のバッグです。s
はS
のスキーマを持ち、T
は時間ドメインに属します。
ストリーム要素はタプルとタイムスタンプのペアであり、タイムスタンプを持つタプルの挿入シーケンスとして表すことができます。言い換えると、ストリームとはタイムスタンプを持つタプルのシーケンスです。同じタイムスタンプを持つ複数のタプルがある場合があります。入力ストリームのタプルは、タイムスタンプが増加する順にシステムに到着する必要があります。詳細は、1.1.13項「時間」を参照してください。
ストリームには名前付き属性のセットで構成される関連付けられたスキーマがあり、ストリームのすべてのタプルはスキーマに準拠しています。
「ストリームのタプル」という用語はストリーム要素のデータ部分(タイムスタンプ・データは除く)の順序付きリストを表します(<s,t>
のs
)。例1-2は、株価表示データ・ストリームがどのように表示されるかを示しています。各ストリーム要素は、<timestamp value>
、<stock symbol>
および<stock price>
で構成されます。
例1-2 株価表示データ・ストリーム
... <timestampN> NVDA,4 <timestampN+1> ORCL,62 <timestampN+2> PCAR,38 <timestampN+3> SPOT,53 <timestampN+4> PDCO,44 <timestampN+5> PTEN,50 ...
ストリーム要素<timestampN+1> ORCL,62
のタプルはORCL,62
です。
定義により、ストリームは無制限です。
この項の内容は、次のとおりです。
詳細は、次を参照してください。
『Oracle Fusion Middleware Oracle Event Processing開発者ガイドfor Eclipse』のストリームとリレーションを表すチャネルに関する項
Oracle Event Processingではストリームは、図1-2のように、チャネルとして表されます。Oracle Event Processing IDE for Eclipseを使用して、ストリーム・イベント・ソース(PriceAdapter
)をチャネル(priceStream
)に接続し、チャネルをOracle CQLプロセッサ(filterFanoutProcessor
)に接続して、プロセッサにイベントを提供します。Oracle CQLプロセッサをチャネル(filteredStream
)に接続し、Oracle CQL問合せ結果を下流コンポーネント(図1-2には表示されていません)に出力します。
注意: Oracle Event Processingでは、チャネルを使用してイベント・ソースをOracle CQLプロセッサに接続し、Oracle CQLプロセッサをイベント・シンクに接続する必要があります。他のOracle Event Processingプロセッサ・タイプでは、チャネルはオプションです。 |
ストリームに接続するイベント・ソースにより、ストリームのスキーマが確定します。図1-2では、PriceAdapter
アダプタにより、priceStream
ストリームのスキーマが確定しています。例1-3は、PriceAdapter
のイベント処理ネットワーク(EPN)アセンブリ・ファイルを示しています。eventTypeName
プロパティによって、イベント・タイプPriceEvent
を指定しています。event-type-repository
で、このイベントのプロパティ名とタイプを定義しています。
例1-3 チャネルのスキーマ定義
... <wlevs:event-type-repository> <wlevs:event-type type-name="PriceEvent"> <wlevs:properties> <wlevs:property name="cusip" type="char" /> <wlevs:property name="bid" type="double" /> <wlevs:property name="srcId" type="char" /> <wlevs:property name="bidQty" type="int" /> <wlevs:property name="ask" type="double" /> <wlevs:property name="askQty" type="int" /> <wlevs:property name="seq" type="bigint" /> <wlevs:property name="sector" type="char" /> </wlevs:properties> </wlevs:event-type> </wlevs:event-type-repository> <wlevs:adapter id="PriceAdapter" provider="loadgen"> <wlevs:instance-property name="port" value="9011"/> <wlevs:listener ref="priceStream"/> </wlevs:adapter> <wlevs:channel id="priceStream" event-type="PriceEvent"> <wlevs:listener ref="filterFanoutProcessor"/> </wlevs:channel> <wlevs:processor id="filterFanoutProcessor" provider="cql"> <wlevs:listener ref="filteredStream"/> </wlevs:processor> ...
図1-2に示すようにイベント・ソース、チャネルおよびプロセッサが接続されると、ストリームを使用するOracle CQL文を作成できます。例1-4に、filterFanoutProcessr
のOracle CQL文を定義するコンポーネント構成ファイルを示します。
例1-4 priceStreamを使用するfilterFanoutProcessor Oracle CQL問合せ
<processor> <name>filterFanoutProcessor</name> <rules> <query id="Yr3Sector"><![CDATA[ select cusip, bid, srcId, bidQty, ask, askQty, seq from priceStream where sector="3_YEAR" ]]></query> <query id="Yr2Sector"><![CDATA[ select cusip, bid, srcId, bidQty, ask, askQty, seq from priceStream where sector="2_YEAR" ]]></query> <query id="Yr1Sector"><![CDATA[ select cusip, bid, srcId, bidQty, ask, askQty, seq from priceStream where sector="1_YEAR" ]]></query> </rules> </processor>
例1-4に示すようにプロセッサの複数の問合せを指定した場合は、すべての問合せ結果がプロセッサの発信チャネルに出力されます(図1-2のfilteredStream
)。
オプションで、コンポーネント構成ファイルでchannel
要素のselector
属性を使用して、出力される問合せ結果を制御できます(例1-5を参照)。この例では、問合せYr3Sector
およびYr2Sector
の問合せ結果はfilteredStreamに出力されますが、問合せYr1Sector
の問合せ結果は出力されません。詳細は、『Oracle Fusion Middleware Oracle Event Processing開発者ガイドfor Eclipse』のチャネルを使用したEPNステージの接続に関する項を参照してください。
例1-5 channel要素のselector子要素を使用した、チャネルに出力される問合せ結果の制御
<channel> <name>filteredStream</name> <selector>Yr3Sector Yr2Sector</selector> </channel>
アップストリーム・プロセッサで問合せを作成する前にselector
が含まれているchannel
要素を構成できます。この場合、selector
内の名前と一致するように問合せ名を指定する必要があります。
詳細は、『Oracle Fusion Middleware Oracle Event Processing開発者ガイドfor Eclipse』のダウンストリーム・チャネルに出力する問合せの制御に関する項を参照してください。
時間的に変化するリレーションR
は、時間ドメインからR
のスキーマを持つ無制限のタプルのバッグへのマッピングです。
リレーションは、順序がなく、時間的に変化するタプルのバッグです: 言い換えると、瞬間的な関係です。各瞬間において、リレーションは制限されたセットです。また、リレーションの変化する状態を表すように、挿入、削除、または更新を含む、タイムスタンプを持つタプルのシーケンスとして表すこともできます。
ストリームと同様、リレーションにはすべてのタプルが準拠する固定スキーマがあります。
Oracle Event Processingでは基本および派生ストリームとリレーションがサポートされています。外部ソースは基本のストリームとリレーションにデータを提供します。
基本(明示的な)ストリームはOracle Event Processingアダプタに到着するソース・データ・ストリームであるため、時間は非減少です。つまり、各イベントが同一の時間の値を持つ場合があります。
派生した(暗黙的な)ストリーム/リレーションは、問合せ演算子で生成される中間のストリーム/リレーションです。これらの中間の演算子は(ビューを通じて)指定できるため、以降の問合せで指定できます。
基本リレーションは入力リレーションです。
派生したリレーションは、問合せ演算子で生成される中間のリレーションです。これらの中間の演算子は(ビューを通じて)指定できるため、以降の問合せで指定できます。
Oracle Event Processingでは、ユーザー自身は基本リレーションを作成しません。基本リレーションはOracle Event Processingサーバーで必要に応じて作成されます。
リレーションが時間で変化するタプルのバッグであると言う場合、時間は時間ドメインの瞬間を指します。入力リレーションは、時間の経過に沿ったリレーションの変化を表す、タイムスタンプを持つ更新のシーケンスとしてシステムに提示されます。更新はタプルの挿入または削除のいずれかです。更新はタイムスタンプが増加する順にシステムに到着する必要があります。
詳細は、次を参照してください。
『Oracle Fusion Middleware Oracle Event Processing開発者ガイドfor Eclipse』のストリームとリレーションを表すチャネルに関する項
デフォルトでは、Oracle Event Processingで生成されるリレーションに、タイム・スタンプとOracle Event Processingタプル種類インジケータが、例1-6のように含まれます。
例1-6 リレーション出力のOracle Event Processingタプル種類インジケータ
Timestamp Tuple Kind Tuple 1000: + ,abc,abc 2000: + hihi,abchi,hiabc 6000: - ,abc,abc 7000: - hihi,abchi,hiabc 8000: + hi1hi1,abchi1,hi1abc 9000: + ,abc,abc 13000: - hi1hi1,abchi1,hi1abc 14000: - ,abc,abc 15000: + xyzxyz,abcxyz,xyzabc 20000: - xyzxyz,abcxyz,xyzabc
Oracle Event Processingタプル種類インジケータは次のとおりです。
挿入タプルの場合は+
削除タプルの場合は-
onUpdateEvent
でcom.bea.wlevs.ede.api.RealtionSink
メソッドを呼び出したときに示される更新済タプルの場合はU
(詳細は、Oracle Fusion Middleware Oracle Event Processing Java APIリファレンスを参照してください)。
Oracle CQLのリレーションからリレーションへの演算子は、SQLで表される従来のリレーショナル問合せから派生しています。
SQL問合せで従来のリレーションが参照される任意の場所において、Oracle CQLでリレーションを参照できます。
次のような、スキーマcar_id
integer
、speed integer
、exp_way integer
、lane integer
、dir integer
およびseg integer
を持つストリームCarSegStr
の例があるとします。
例1-7では、任意の時点で、この問合せの出力リレーションに直前の30秒間に位置-速度の測定を送信した自動車のセットが含まれます。
例1-7 リレーションからリレーションへの演算
<processor> <name>cqlProcessor</name> <rules> <view id="CurCarSeg" schema="car_id exp_way lane dir seg"><![CDATA[ select distinct car_id, exp_way, lane, dir, seg from CarSegStr [range 30 seconds] ]]></query> </rules> </processor>
distinct
演算子はリレーションからリレーションへの演算子です。distinct
を使用すると、Oracle Event Processingから選択された重複タプルの各セットのコピーが1つのみ返されます。重複タプルとはselectリスト内の各式と一致する値を持つタプルです。distinctはselect_clause
と集計関数で使用できます。
distinct
の詳細は、次の項を参照してください。
Oracle CQLでは、スライディング・ウィンドウに基づいた、ストリームからリレーションへの演算がサポートされています。通常、S[W]
はリレーションです。時間T
のリレーションには、T
までにストリームS
に適用されたウィンドウW
のすべてのタプルが含まれます。
window_type::=
Oracle CQLでは、次の種類の組込みウィンドウがサポートされています。
Range: 時間ベース
S[Range T]
またはオプションで、
S[Range T1 Slide T2]
Range: 時間ベース(無制限)
S[Range Unbounded]
Range: 時間ベース(現在)
S[Now]
Range: 定数値
S[Range C on ID]
タプルベース:
S[Rows N]
またはオプションで、
S[Rows N1 Slide N2]
分割:
S[Partition By A1 ... Ak Rows N]
またはオプションで、
S[Partition By A1 ... Ak Rows N Range T]
または
S[Partition By A1 ... Ak Rows N Range T1 Slide T2]
この項では、ストリームからリレーションへの演算子の次のプロパティについて説明します。
詳細は、次を参照してください。
キーワードRange
およびRows
は問合せで操作するデータの量を指定します。
Range
では指定の期間内に到着するタプルの数が指定されます。
Rows
ではタプルの数が指定されます。
Slideキーワードは、問合せからの出力を参照する頻度を、Rangeキーワードは、問合せイベントまでの時間の範囲を指定します。RangeとSlideを一緒に使用すると、問合せを行うイベントのセットになり、そのセットは、問合せウィンドウのスライド先に基づいて変わります。したがって、セット時間は、問合せのためにイベントが取り出される時間です。時間間隔は、スライドのために指定した時間で割った実際の時間(イベントのタイムスタンプで測定)です。ここからの残りが0ならば、セット時間は、スライドに指定した時間を掛けた時間間隔です。残りが0より大きい場合は、セット時間は、時間間隔 + 1に、スライドに指定した時間を掛けた値です。これを表すもう1つの方法は、timeInterval = actualTime / slideSpecificationif((actualTime % slideSpecification) == 0) // No remainder setTime = timeInterval * slideSpecificationelse setTime = (timeInterval + 1) * slideSpecificationの式です。
図1-3で、Range
の指定は「5秒間に相当するデータを参照する必要がある」ことを示し、Slide
の指定は「5秒ごとの結果が必要である」ことを示します。この場合、各Range
の指定の終わりに問合せで結果が返されます(「問合せ開始時と空のリレーションの場合のRange、RowsおよびSlide」の項で説明されているように特定の条件を除く)。
図1-4で、Range
の指定は「10秒間に相当するデータを参照する必要がある」ことを示し、Slide
の指定は「5秒ごとの結果が必要である」ことを示します。この場合、各Range
の指定中に2回、問合せで結果が返されます(1.1.3.1.1項「問合せ開始時と空のリレーションの場合のRange、RowsおよびSlide」で説明されているように特定の条件を除く)。
表1-1は、範囲ベースとタプル・ベースのストリームからリレーションへのウィンドウ演算子に関するデフォルトのRange
、Range
の単位およびSlide
(該当する場合)のリストです。
表1-1 デフォルトのRangeおよびタプルベースのストリームからリレーションへの演算子
ウィンドウ演算子 | デフォルトのRange | デフォルトのRange単位 | デフォルトのSlide |
---|---|---|---|
|
|
|
1ナノ秒 |
タプルベースのストリームからリレーションへのウィンドウ演算子 |
なし |
なし |
1タプル |
図1-3および図1-4の説明では、問合せが一定時間実行された後、定常状態条件であると想定されています。表1-2は、問合せ開始時の時間や空のリレーションなど、特定の場合のRange
、Rows
およびSlide
の動作のリストです。
表1-2 問合せ開始時と空のリレーションの場合のRange、RowsおよびSlide
演算子または関数 | 結果 |
---|---|
|
空のリレーションの場合、 |
|
空のリレーションの場合、 |
詳細および例は、次を参照してください。
キーワードPartition By
では、Partition By
で指定された属性の同一性に基づいて、データ・ストリームS
が異なるサブストリームに論理的に分割されます。たとえば、S[Partition By A,C Rows 2]
のように分割を指定すると、A
とC
の値のペアの固有な組合せごとにサブストリームが作成され、それらのサブストリームに対してRows
の指定が適用されます。Rows
の指定は、「2タプルに相当するデータを参照する必要がある」ことを示します。
詳細は、1.1.3.1項「Range、RowおよびSlide」を参照してください。
Oracle CQL問合せにおいて、リレーションが予想される場所でストリームを参照する際(一般に、from
句で)、デフォルトでストリームにRange Unbounded
ウィンドウが適用されます。たとえば、例1-8と例1-9の問合せは同等です。
例1-9 同等の問合せ
<query id="q1"><![CDATA[ IStream(select * from InputChannel[RANGE UNBOUNDED]) ]]></query>
詳細は、1.1.4項「リレーションからストリームへの演算子」を参照してください。
ストリームからリレーションへの演算結果を、さらに処理を行うためストリームに戻すことができます。
例1-10では、selectによってフィルタ条件(viewq3.ACCT_INTRL_ID = ValidLoopCashForeignTxn.ACCT_INTRL_ID)
を満たすタプルのストリームが出力されます。nowウィンドウによってviewq3
がリレーションに変換され、これはフィルタ条件によってリレーションとして維持されます。リレーションからストリームへのIStream
演算子によって、フィルタ出力がストリームに変換されます。
例1-10 リレーションからストリームへの演算子
<processor> <name>cqlProcessor</name> <rules> <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> </rules> </processor>
Oracle CQLでは、リレーションからストリームへの次の演算子がサポートされています。
IStream
: 挿入ストリーム。
T
の時点でr
がR
にあり、T-1
の時点でr
がRにない場合、IStream(R)
にはすべての(r,T)
が含まれます。
詳細は、「リレーションからストリームへのIStream演算子」を参照してください。
DSteam
: 削除ストリーム。
T-1
の時点でr
がR
にあり、T
の時点でr
がR
にない場合、DStream(R)
にはすべての(r,T)
が含まれます。
詳細は、「リレーションからストリームへのDStream演算子」を参照してください。
RStream
: リレーション・ストリーム。
T
の時点でr
がR
にある場合、RStream(R)
にはすべての(r,T)
が含まれます。
詳細は、「リレーションからストリームへのRStream演算子」を参照してください。
デフォルトでは、Oracle Event Processingで生成されるリレーションには操作インジケータが含まれるため、挿入、削除および更新(UPDATE SEMANTICS
を使用している場合)を識別できます。詳細は、1.1.1.3項「リレーションとOracle Oracle Event Processingタプル種類インジケータ」を参照してください。
Oracle CQL問合せでモノトニックなリレーションが作成される際は常に、デフォルトでIStream
演算子が追加されます。
リレーションR
がモノトニックになるのは、t1 <= t2
のときにR(t1)
がR(t2)
のサブセットである場合にかぎられます。
Oracle CQLでは、従来の静的なモノトニック・テストを使用します。たとえば、基本リレーションが追加専用として認識される場合、その基本リレーションはモノトニックです。どのストリームS
に対してもS[Range Unbounded]
はモノトニックであり、2つのモノトニック・リレーションの結合もモノトニックです。
リレーションがモノトニックでない場合(たとえば、S[range 10 seconds]
のようなウィンドウがある場合)、問合せ作成者の意図(IStream
、DStream
またはRStream
)を判断できないため、このような場合、Oracle CQLはデフォルトではリレーションからストリームへの演算子を追加しません。
一般に、ストリームからストリームへの演算は、次のように実行します。
ストリームからリレーションへの演算子によって、ストリームをリレーションに変換します。詳細は、1.1.3項「ストリームからリレーションへの演算子(ウィンドウ)」を参照してください。
リレーションからリレーションへの演算子によって、リレーショナル・フィルタを実行します。詳細は、1.1.2項「リレーションからリレーションの演算子」を参照してください。
リレーションからストリームへの演算子によって、リレーションをストリームに戻します。詳細は、1.1.4項「リレーションからストリームへの演算子」を参照してください。
ただし、一部のリレーションからリレーションへの演算子(フィルタやプロジェクトなど)は、ストリームからストリームへの演算子として機能することもできます。例1-11のような問合せについて検討します。入力S
はストリームであり、問合せによって、ストリーム要素c1
が50を超えるストリームが出力として生成されると想定します。
例1-11 ストリームからストリームへの演算
<processor> <name>cqlProcessor</name> <rules> <query id="q0"><![CDATA[ select * from S where c1 > 50 ]]></query> </rules> </processor>
これは、デフォルトのストリームからリレーションへの演算子およびリレーションからストリームへの演算子を適用した結果です。例1-11のストリームS
にデフォルトの[Range Unbounded]
ウィンドウが追加されます。その後、この問合せはモノトニック・リレーションと評価されるため、IStream
が追加されます。
詳細は、次を参照してください。
また、Oracle CQLでは次の直接的なストリームからストリームへの演算子がサポートされています。
MATCH_RECOGNIZE
: この句を使用して、入力ストリームの各種のパターン認識問合せを作成します。詳細は、1.1.7項「パターン認識」を参照してください。
XMLTABLE
: この句を使用して、XPath式を使用してxmltype
ストリーム要素のデータを解析します。詳細は、20.2.6項「XMLTableの問合せ」を参照してください。
Oracle CQL問合せは、Oracle CQL構文で表され、1つ以上のストリーム、リレーションまたはビューからデータを取得するためにOracle Event Processing CQLプロセッサで実行される操作です。<query>
要素で作成した最上位のSELECT
文は問合せと呼ばれます。詳細は、20.2項「問合せ」を参照してください。
Oracle CQLビューは、ストリームまたはリレーションでの代替の選択項目を表します。Oracle CQLでは、副問合せのかわりにビューを使用します。<view>
要素で作成した最上位のSELECT
文はビューと呼ばれます。詳細は、20.3項「ビュー」を参照してください。
各問合せおよびビューには、問合せおよびビューを含むプロセッサで一意の識別子が必要です。例1-12は、id
がq0
の問合せを示します。id
値は、識別子::=で指定された仕様に準拠する必要があります。
例1-12 問合せおよびビューID属性
<processor> <name>cqlProcessor</name> <rules> <query id="q0"><![CDATA[ select * from S where c1 > 50 ]]></query> </rules> </processor>
結合は、複数のストリーム、ビューまたはリレーションから行を結合する問合せです。詳細は、20.4項「結合」を参照してください。
詳細は、第20章「Oracle CQLの問合せ、ビューおよび結合」を参照してください。
Oracle CQL MATCH_RECOGNIZE
コンストラクトは、パターン認識を実行するための主な手段です。
入力ストリームの連続するイベントまたはタプルのシーケンスが特定の条件を満たす場合は、パターンが構成されます。Oracle CQLのパターン認識機能では、着信イベントまたはタプルの属性に条件を定義し、相関変数と呼ばれるString
名を使用してこれらの条件を識別できます。照合されるパターンは、これらの相関変数に対する正規表現として指定され、様々な着信タプルが有効な一致として見なされるために満たす必要のある条件のシーケンスまたは順序が決定されます。
詳細は、第21章「MATCH_RECOGNIZEを使用したパターン認識」を参照してください。
Oracle Event Processingイベント・ソースはOracle CQL問合せが操作するデータのプロデューサを識別します。Oracle CQLイベント・シンクは問合せ結果のコンシューマを識別します。
この項では、Oracle CQL問合せでアクセスできるイベント・ソースとイベント・シンクの種類、およびイベント・ソースとイベント・シンクへの接続方法について説明します。
Oracle Event Processingイベント・ソースはOracle CQL問合せが操作するデータのプロデューサを識別します。
Oracle Event Processingでは、イベント・ソースとして次の要素を使用できます。
アダプタ(JMS、HTTPおよびファイル)
チャネル
プロセッサ
表
キャッシュ
注意: Oracle Event Processingでは、チャネルを使用してイベント・ソースをOracle CQLプロセッサに接続し、Oracle CQLプロセッサをイベント・シンクに接続する必要があります。他のOracle Event Processingプロセッサ・タイプでは、チャネルはオプションです。詳細は、1.1.1項「ストリームとリレーション」を参照してください。 |
Oracle Event Processingイベント・ソースは、通常はプッシュ・データ・ソースです。つまり、Oracle Event Processingでは、データの準備ができたイベント・ソースからの通知を待ちます。
Oracle Event Processingのリレーション・データベース表およびキャッシュ・イベント・ソースはプル・データ・ソースです。つまり、Oracle Event Processingは、データ・ストリーム上でのイベントの到着時にイベント・ソースをポーリングします。
詳細は、次を参照してください。
CQLプロセッサに接続されているOracle CQLイベント・シンクは問合せ結果のコンシューマです。
Oracle Event Processingでは、イベント・シンクとして次の要素を使用できます。
アダプタ(JMS、HTTPおよびファイル)
チャネル
プロセッサ
キャッシュ
同一の問合せを複数のイベント・シンクや、異なる種類のイベント・シンクに関連付けることができます。
Oracle Event Processingでは、Oracle Event Processing IDE for Eclipseを使用してイベント処理ネットワーク(EPN)を作成し、イベント・ソースとイベント・シンクを定義します(図1-5を参照)。このEPNで、アダプタPriceAdapter
はチャネルpriceStream
のイベント・ソースであり、チャネルpriceStream
はOracle CQLプロセッサfilterFanoutProcessor
のイベント・ソースです。同様に、Oracle CQLプロセッサfilterFanoutProcessor
はチャネルpriceStream
のイベント・シンクです。
詳細は、次を参照してください。
『Oracle Fusion Middleware Oracle Event Processing開発者ガイドfor Eclipse』
Oracle CQLを使用して、次の表データにアクセスできます。
詳細は、1.1.8項「イベント・ソースとイベント・シンク」を参照してください。
Oracle CQLプロセッサを使用すると、リレーショナル・データベース表をイベント・ソースとして指定できます。このイベント・ソースで問合せを実行したり、他のイベント・ソースと結合したりできます。
詳細は、20.6項「Oracle CQL問合せとリレーショナル・データベース表」を参照してください。
Oracle CQLのXMLTABLE
句を使用すると、XPath式を使用してxmltype
ストリームのデータを列に解析し、列名でデータに容易にアクセスできます。
詳細は、20.2.6項「XMLTableの問合せ」を参照してください。
TABLE
句を使用して、リレーションとして、Oracle CQL問合せのFROM
句内の組込みまたはユーザー定義関数から配列またはCollection
型として返された複数の行にアクセスします。
詳細は、次を参照してください。
Oracle CQLプロセッサを使用すると、Oracle Event Processingキャッシュをイベント・ソースとして指定できます。now
ウィンドウを使用する場合にのみ、このイベント・ソースで問合せを実行したり、他のイベント・ソースと結合できます。
詳細は、次を参照してください。
関数は、データ項目を操作して結果を返す点で演算子と同様です。関数が演算子と異なる点は、引数の形式です。この形式により、0、1、2個、またはより多数の引数を操作できます。
function(argument, argument, ...)
引数を持たない関数は疑似列と同じです(第3章「疑似列」を参照)。ただし、疑似列ではリレーションの各タプルで異なる値が返されますが、引数を持たない関数では各タプルに対して通常は同じ値が返されます。
Oracle CQLには、ストリーム・データの操作を実行する、次のような広範な組込み関数が用意されています。
問合せのストリームまたはビューの各行ごとに単一の結果行を返す単一行関数
単一のタプルのかわりにタプルのグループに基づいて単一の集計結果を返す集計関数
Coltオープン・ソース・ライブラリに基づいた、高性能な科学技術計算のための単一行の統計的かつ高度な算術演算
Coltオープン・ソース・ライブラリに基づいた、高性能な科学技術計算のための集計の統計的かつ高度な算術演算
java.lang.Math
クラスに基づいた統計的かつ高度な算術演算
アプリケーションで必要な機能がOracle CQL組込み関数に用意されていない場合は、oracle.cep.extensibility.functions
パッケージのクラスを使用して、ユーザー定義関数をJavaで簡単に作成できます。ユーザー定義の集計関数および単一行関数を作成できます。オーバーロード関数の作成、および組込み関数のオーバーライドができます。
Oracle CQL関数の所定の型以外のデータ型の引数を使用してOracle CQL関数を呼び出した場合、Oracle Event ProcessingではOracle CQL関数を実行する前に、その引数を所定のデータ型に変換しようと試みます。
注意: 関数名では、大/小文字が区別されます。
|
詳細は、次を参照してください。
Oracle CQLデータ・カートリッジ・フレームワークにより、任意のドメイン・オブジェクトとOracle CQL言語を密接に統合し、ドメイン・オブジェクト・フィールド、メソッドおよびコンストラクタを、Oracle CQL問合せ内でOracle CQLネイティブ型と同じように使用できます。
現在、Oracle Event Processingには次のデータ・カートリッジが用意されています。
Oracle Javaデータ・カートリッジ: このデータ・カートリッジは、Oracle CQLの問合せおよびビューでOracle CQLネイティブ型と同じように使用できる、Javaの型、メソッド、フィールドおよびコンストラクタを公開します。
第15章「Oracle Javaデータ・カートリッジ」を参照してください。
Oracle Spatial: このデータ・カートリッジは、Oracle CQLの問合せおよびビューでOracle CQLネイティブ型と同じように使用できる、Oracle Spatialの型、メソッド、フィールドおよびコンストラクタを公開します。
第16章「Oracle Spatial」を参照してください。
Oracle JDBCデータ・カートリッジ: このデータ・カートリッジにより、Oracle CQLのネイティブ型と同様に、複数の表やデータ・ソースに対する任意のSQL関数をOracle CQL問合せおよびビュー内に組み込めます。
詳細は、次を参照してください。
タイムスタンプはOracle Event Processingストリームの重要な部分です。ただし、タイプスタンプは必ずしもクロック・タイムと同じである必要はありません。たとえば、アプリケーション・ドメインで時間を定義し、シーケンス番号で表すことができます。タイムスタンプは、タイムスタンプの値が増加する順に更新がシステムに到着することだけを保証するよう要求されます。
タイムスタンプの順序の要件は、1つのストリームまたはリレーションに固有のものです。たとえば、異なるストリームのタプルは任意の順序で相互配置できます。
Oracle Event Processingでは、アプリケーション時間またはシステム時間を監視できます。
アプリケーション・タイムスタンプまたはシステム・タイムスタンプの操作を構成するには、『Oracle Fusion Middleware Oracle Event Processing開発者ガイドfor Eclipse』のwlevs:channelの子要素application-timestamped
に関する項を参照してください。
システム・タイムスタンプを持つリレーションまたはストリームの場合、時間はリレーションまたはストリームのデータ・ソースでのデータの到着に依存します。指定された時間(たとえば1分など)が経過してもアクティビティが発生しない(ストリームまたはリレーションのソースにデータが到着しない)場合、Oracle Event Processingではシステム・タイムスタンプを持つリレーションまたはストリームでハートビートが生成されます。リレーションまたはストリームに指定のソースによってデータが移入されるか、またはOracle Event Processingによってハートビートが毎分生成されます。これにより、リレーションまたはストリームの遅れが1分を超えることはなくなります。
ハートビートを構成するには、『Oracle Fusion Middleware Oracle Event Processing開発者ガイドfor Eclipse』のハートビートに関する項を参照してください。
システム・タイムスタンプを持つストリームとリレーションの場合、2つのイベントが同じ時間値を持つことがないようにシステムによって時間が割り当てられます。ただし、アプリケーション・タイムスタンプを持つストリームとリレーションの場合は、イベントが同じ時間値を持つ場合があります。
アプリケーションのタイムスタンプが(非減少ではなく)厳密に増加することが分かっている場合は、wlevs:channel
属性is-total-order
をtrue
に設定できます。これにより、Oracle Event Processingエンジンでは特定の最適化を行えるようになり、通常は処理の待機時間の減少につながります。
is-total-order
を構成するには、『Oracle Fusion Middleware Oracle Event Processing開発者ガイドfor Eclipse』のwlevs:application-timestampedに関する項を参照してください。
Oracle Event Processingスケジューラは、スケジュールのアルゴリズムと頻度に従って、各Oracle CQL問合せを連続的に実行します。
スケジューラの詳細は、『Oracle Fusion Middleware Oracle Event Processing開発者ガイドfor Eclipse』のスケジューラに関する項を参照してください。
Oracle CQLには、問合せやビューを作成する文が用意されています。
この項の内容は、次のとおりです。
詳細は、次を参照してください。
Oracle Event Processing IDE for EclipseまたはOracle Event Processing Visualizerを使用して、Oracle Event Processing CQLプロセッサに関連付けられたXML構成ファイルにOracle CQL文を書き込みます。このXMLファイルは構成ソースと呼ばれます。
構成ソースはwlevs_application_config.xsd
スキーマに準拠している必要があり、rule
、view
またはquery
要素のみを含むことができます(例1-13を参照)。
例1-13 通常のOracle CQLプロセッサ構成ソース・ファイル
<?xml version="1.0" encoding="UTF-8"?> <n1:config xsi:schemaLocation="http://www.bea.com/ns/wlevs/config/application wlevs_application_config.xsd" xmlns:n1="http://www.bea.com/ns/wlevs/config/application" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <processor> <name>cqlProcessor</name> <rules> <view id="lastEvents" schema="cusip bid srcId bidQty ask askQty seq"><![CDATA[ select cusip, bid, srcId, bidQty, ask, askQty, seq from inputChannel[partition by srcId, cusip rows 1] ]]></view> <view id="bidask" schema="cusip bid ask"><![CDATA[ select cusip, max(bid), min(ask) from lastEvents group by cusip ]]></view> <view ...><![CDATA[ ... ]]></view> ... <view id="MAXBIDMINASK" schema="cusip bidseq bidSrcId bid askseq askSrcId ask bidQty askQty"><![CDATA[ select bid.cusip, bid.seq, bid.srcId as bidSrcId, bid.bid, ask.seq, ask.srcId as askSrcId, ask.ask, bid.bidQty, ask.askQty from BIDMAX as bid, ASKMIN as ask where bid.cusip = ask.cusip ]]></view> <query id="BBAQuery"><![CDATA[ ISTREAM(select bba.cusip, bba.bidseq, bba.bidSrcId, bba.bid, bba.askseq, bba.askSrcId, bba.ask, bba.bidQty, bba.askQty, "BBAStrategy" as intermediateStrategy, p.seq as correlationId, 1 as priority from MAXBIDMINASK as bba, inputChannel[rows 1] as p where bba.cusip = p.cusip) ]]></query> </rules> </processor>
Oracle CQLプロセッサのコンポーネント構成ファイルでOracle CQL問合せを作成する場合は、次のルールに従います。
view
またはquery
要素ごとに1つのOracle CQL文を指定できます。
Oracle CQL文はセミコロン(;
)で終わることはできません。
Oracle CQL文は<![CDATA[
および]]>
で囲む必要があります(例1-13を参照)。
Oracle CQLを発行する場合は、文の定義内でスペースを使用する任意の場所に、1つ以上のタブ、キャリッジ・リターン、またはスペースを含めることができます。このため、Oracle Event Processingでは例1-14と例1-15のOracle CQL文が同じように評価されます。
例1-14 Oracle CQL: ホワイトスペースなしの書式設定
<processor> <name>cqlProcessor</name> <rules> <query id="QTollStr"><![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> </rules> </processor>
例1-15 Oracle CQL: ホワイトスペースを含む書式設定
<processor> <name>cqlProcessor</name> <rules> <query id="QTollStr"><![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> </rules> </processor>
予約語、キーワード、識別子およびパラメータでは大文字と小文字は区別されません。ただし、テキスト・リテラルと引用名では大文字と小文字が区別されます。
詳細は、次を参照してください。
Oracle CQL文ではコメントは許可されていません。詳細は、2.6項「コメント」を参照してください。
注意: 『Oracle Fusion Middleware Oracle Event Processing CQL言語リファレンス』では、わかりやすくするためにOracle CQL文で |
Oracle CQLの問合せ、ビューおよび結合を作成する際、問合せを簡易化するためにOracle CQLで用意されている構文のショートカットとデフォルトを使用できます。
詳細は、次を参照してください。
『Oracle Fusion Middleware Oracle Event Processingスタート・ガイド』のHelloWorldの例に関する項
このリファレンスのすべてのOracle CQL文は(第22章「Oracle CQL文」を参照)、次の項に編成されています。
構文 構文図では、文を構成するキーワードとパラメータを示します。
注意: すべてのキーワードとパラメータがすべての状況で有効なわけではありません。各文および句の「セマンティクス」を参照し、構文上の制限を理解するようにしてください。 |
目的 「目的」では文の基本的な使用について示します。
要件 「要件」では必要な権限、および文を使用する前に実行する必要のある手順を示します。
セマンティクス 「セマンティクス」では構文を構成するキーワード、パラメータおよび句の目的と、それらに適用されることのある制限などの使用上の注意点を示します。(この章で使用されているキーワードやパラメータの表記規則の説明は、このリファレンスの「はじめに」を参照してください。)
例 「例」では文の様々な句とパラメータの使用例を示します。
Oracle CQLは新しいテクノロジですが、SQL99のサブセットに基づいています。
Oracleでは業界に受け入れられた標準への準拠に努め、SQL標準調査会に積極的に参加しています。OracleではOracle CQLの標準化を積極的に推進しています。
Oracle Event Processingサーバーとツールを使用すると、Oracle CQLを使用するOracle Event Processingアプリケーションの効率的な作成、パッケージ化、デプロイ、デバッグおよび管理ができます。
Oracle Event Processingサーバーでは、Oracle Event Processingアプリケーション用の軽量のSpringコンテナを提供し、サーバーとアプリケーションのライフサイクルを管理し、JRockitリアルタイムJVMに決定性ガベージ・コレクションの他、様々な必須のサービス(セキュリティ、Jetty、JMX、JDBC、HTTPパブリッシュ/サブスクライブ、ロギング、デバッギングなど)を提供します。
Oracle Event Processingサーバーの詳細は、『Oracle Fusion Middleware Oracle Event Processing管理者ガイド』を参照してください。
Oracle Event Processingでは、Oracle CQL開発プロセスを簡素化する次のツールが用意されています。
Oracle Event Processing IDE for Eclipseは、Oracle Event Processingアプリケーションを開発するプログラマ向けのツールです(図1-6を参照)。
Oracle Event Processing IDE for Eclipseは、Oracle Event Processingアプリケーションの開発、デプロイおよびデバッグを支援するために設計されたEclipse IDEのプラグインです。
Oracle Event Processing IDE for Eclipseの主な機能は次のとおりです。
イベント駆動型アプリケーションの作成をただちに開始するためのプロジェクト作成ウィザードおよびテンプレート。
JavaやXMLファイルなどのOracle Event Processingアプリケーションに共通のソース・ファイル用の高度なエディタ。
IDEからOracle Event Processingサーバー・インスタンスをシームレスに開始、停止およびデプロイするための統合されたサーバー管理。
統合化されたデバッグ。
イベント処理アプリケーション内を参照および移動できる、イベント処理ネットワーク(EPN)のビジュアルなデザイン・ビュー。
IDE内からOracle Event Processing Visualizerを使用できるようにするOracle Event Processing Visualizerの統合サポート(1.4.2.2項「Oracle Event Processing Visualizer」を参照)。
詳細は、次の資料を参照してください。
『Oracle Fusion Middleware Oracle Event Processing開発者ガイドfor Eclipse』
http://www.oracle.com/technology/products/event-driven-architecture/cep-ide/11/index.html
Oracle CEP Visualizerという高度なランタイム管理コンソールが用意されています(図1-7を参照)。
Oracle Event Processing Visualizerを使用すると、Oracle Event Processingサーバー・ドメインとこれらにデプロイするOracle Event Processingアプリケーションを、ブラウザから管理、チューニングおよび監視できます。Oracle Event Processing Visualizerでは、Oracle CQLおよびEPLのルールの管理や作成のサポートを含む、洗練された様々なランタイム管理ツールが提供されます。
詳細は、『Oracle Fusion Middleware Oracle Event Processing Visualizerユーザーズ・ガイド』を参照してください。