Oracle Continuous Query Language(Oracle CQL)は、データのストリーミングをサポートするコンストラクトが追加されたSQLに基づく問合せ言語です。Oracle CQLを使用すると、Oracle CEPを使用して複合イベント処理(CEP)を行う、データ・ストリームに対する問合せを表現できます。
Oracle CEP(以前のWebLogic Event Server)は高性能なイベント駆動型アプリケーション開発用のJavaサーバーです。Equinox OSGiに基づく軽量なJavaアプリケーション・コンテナで、ビジネス業務管理の効率性と有効性を向上するため、機能豊富な宣言の環境を提供するOracle CEPサービス・エンジンなどの共有サービスを使用します。このサービスは、Oracle CQLを基盤としています。Oracle CEPではJRockit Real Timeを使用して非常に高いスループットとマイクロ秒の待機時間がサポートされ、完全にリアルタイムなエンドツーエンドのJavaイベント駆動アーキテクチャ(EDA)開発プラットフォーム用のOracle CEP VisualizerおよびOracle CEP IDE for Eclipse開発ツールが用意されています。
格納されている有限なデータ・セットに対して問合せを実行する場合には、データベースが最適です。しかし、多くの最新のアプリケーションでは、連続する無制限のデータ・セットに対する長時間の問合せ実行が要求されます。設計上、格納されたデータ・セットは大量のデータに対して反復的に問合せを実行したり、あまり頻繁に更新を行わない場合に適しています。これに対して、データ・ストリームは絶えず変化するデータを表します。多くの場合は、新しい要素の挿入のみが行われます。大量のデータの反復的な操作は不要であると同時に非実用的です。
センサー・データ・アプリケーション、財務表示、ネットワーク性能測定ツール、ネットワーク監視およびトラフィック管理アプリケーション、クリックストリーム分析ツールなどの多くの種類のアプリケーションでは、データ・セットのかわりにデータ・ストリームが生成されます。これらの種類のアプリケーション・データを管理および処理する際は、厳密な時間によるフォーカスを使用して、データ管理および問合せ機能を作成します。
こうした要件に応えるために、構造化データ・レコードのストリームと格納されたリレーションの概念をサポートするデータ管理インフラストラクチャのOracle CEPが導入されました。
統一的な宣言フレームワークを提供するために、データのストリーミングをサポートするコンストラクトが追加されたSQLに基づく問合せ言語のOracle Continuous Query Language(Oracle CQL)が提供されています。
Oracle CQLは次の理念に基づいて設計されています。
連続するデータ・ストリームと従来の格納されたデータ・セットに対する大量の問合せをサポートするスケーラビリティ。
複雑なシナリオを扱う包括性。たとえば、構成を通じて、問合せの様々な中間ビューを作成できます。
図1-1に、Oracle CEPアーキテクチャを簡単に示します。Oracle CEPサーバーはOracle CEPアプリケーション用の軽量なSpringコンテナを提供します。このOracle CEPアプリケーションは、入力チャネルにイベント・データを提供するイベント・アダプタで構成されています。入力チャネルは、入力チャネルから提供されたイベントを操作する1つ以上のOracle CQL問合せに関連付けられた、Oracle CQLプロセッサに接続されています。Oracle CQLプロセッサは、問合せ結果が書き込まれる出力チャネルに接続されています。出力チャネルはイベントBeanに接続されています。これは、出力チャネルから受け取ったイベントに基づいてアクションを実行するユーザー作成のPlain Old Java Object(POJO)です。
Oracle CEPを使用すると、JMS、リレーショナル・データベース表、ローカル・ファイルシステムのファイルなどの各種データ・ソースに対するイベント・アダプタを定義できます。複数の入力チャネルをOracle CQLプロセッサに接続したり、Oracle CQLプロセッサを複数の出力チャネルに接続できます。出力チャネルを別のOracle CQLプロセッサ、アダプタ、キャッシュまたはイベントBeanに接続できます。
Oracle CEP IDE for EclipseとOracle CEP Visualizerを使用して、次のことを行います。
図1-1のようなイベント処理ネットワーク(EPN)を作成します。
1つ以上のOracle CQL問合せをEPNのOracle CQLプロセッサに関連付けます。
Oracle CEPアプリケーションをパッケージ化し、実行のためOracle CEPサーバーにデプロイします。
例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 CEPサーバーと各ツールの詳細は、次の資料を参照してください。
Eclipse用Oracle Complex Event Processing開発者ガイド
『Oracle Complex Event Processing Visualizerユーザーズ・ガイド』
『Oracle Complex Event Processing管理者ガイド』
この項では、Oracle CQLを使用して操作する2つの基本的なOracle CEPオブジェクトについて説明します。
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
です。
定義により、ストリームは無制限です。
この項の内容は次のとおりです。
詳細は、以下を参照してください。
Eclipse用Oracle Complex Event Processing開発者ガイドのストリームおよびリレーションを表すチャネルに関する項
Oracle CEPではストリームはチャネルとして表されます(図1-2を参照)。Oracle CEP IDE for Eclipseを使用して、ストリーム・イベント・ソース(PriceAdapter
)をチャネル(priceStream
)に接続し、チャネルをOracle CQLプロセッサ(filterFanoutProcessor
)に接続して、プロセッサにイベントを提供します。Oracle CQLプロセッサをチャネル(filteredStream
)に接続し、Oracle CQL問合せ結果を下流コンポーネント(図1-2には表示されていません)に出力します。
注意: Oracle CEPでは、チャネルを使用してイベント・ソースをOracle CQLプロセッサに接続し、Oracle CQLプロセッサをイベント・シンクに接続する必要があります。他のOracle CEPプロセッサ・タイプでは、チャネルはオプションです。 |
ストリームに接続するイベント・ソースによってストリームのスキーマが決定されます。図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つ以上の問合せを指定する場合、すべての問合せ結果がプロセッサのアウトバウンド・チャネルに出力されます(図1-2のfilteredStream
)。
オプションで、コンポーネント構成ファイルでchannel
要素のselector
属性を使用して、出力される問合せ結果を制御できます(例1-5を参照)。この例では、問合せYr3Sector
およびYr2Sector
の問合せ結果はfilteredStreamに出力されますが、問合せYr1Sector
の問合せ結果は出力されません。詳細は、Eclipse用Oracle Complex Event Processing開発者ガイドのチャネル・コンポーネント構成に関する項を参照してください。
例1-5 channel要素のselector子要素を使用した、チャネルに出力される問合せ結果の制御
<channel> <name>filteredStream</name> <selector>Yr3Sector Yr2Sector</selector> </channel>
アップストリーム・プロセッサで問い合わせを作成する前にselector
が含まれているchannel
要素を構成できます。この場合、selector
内の名前と一致するように問合せ名を指定する必要があります。
詳細は、Eclipse用Oracle Complex Event Processing開発者ガイドのダウンストリーム・チャネルに出力する問合せの制御に関する項を参照してください。
時間で変化するリレーションR
は、時間ドメインからR
のスキーマを持つ無制限のタプルのバッグへのマッピングです。
リレーションとは、並べ替えられていない、時間で変化するタプルのバッグです。言い換えると、瞬間的なリレーションです。各瞬間において、リレーションは制限されたセットです。また、リレーションの変化する状態を表す挿入、削除または更新を含む、タイムスタンプを持つタプルのシーケンスとして表すこともできます。
ストリームと同様、リレーションにはすべてのタプルが準拠する固定スキーマがあります。
Oracle CEPでは基本および派生ストリームとリレーションがサポートされています。外部ソースは基本のストリームとリレーションにデータを提供します。
基本(明示的な)ストリームはOracle CEPアダプタに到着するソース・データ・ストリームであるため、時間は非減少です。つまり、各イベントが同一の時間の値を持つ場合があります。
派生した(暗黙的な)ストリーム/リレーションは、問合せ演算子で生成される中間のストリーム/リレーションです。これらの中間の演算子は(ビューを通じて)指定できるため、以降の問合せで指定できます。
派生したリレーションは、問合せ演算子で生成される中間のリレーションです。これらの中間の演算子は(ビューを通じて)指定できるため、以降の問合せで指定できます。
Oracle CEPでは、ユーザー自身は基本リレーションを作成しません。基本リレーションはOracle CEPサーバーで必要に応じて作成されます。
リレーションが時間で変化するタプルのバッグであると言う場合、時間は時間ドメインの瞬間を指します。入力リレーションは、時間の経過に沿ったリレーションの変化を表す、タイムスタンプを持つ更新のシーケンスとしてシステムに提示されます。更新はタプルの挿入または削除のいずれかです。更新はタイムスタンプが増加する順にシステムに到着する必要があります。
詳細は、以下を参照してください。
Eclipse用Oracle Complex Event Processing開発者ガイドのストリームおよびリレーションを表すチャネルに関する項
デフォルトでは、Oracle CEPで生成されるリレーションにはタイムスタンプとOracle CEPタプル種類インジケータが含まれています(例1-6を参照)。
例1-6 リレーション出力のOracle CEPタプル種類インジケータ
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 CEPタプル種類インジケータは次のとおりです。
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 CEPでは選択された重複するタプル・セットの1つのコピーのみが返されます。重複タプルとは selectリスト内の各式と一致する値を持つタプルです。distinctはselect_clause
と集計関数で使用できます。
distinct
の詳細は、次の項を参照してください。
Oracle CQLでは、スライディング・ウィンドウに基づいた、ストリームからリレーションへの演算がサポートされています。通常、S[W]
はリレーションです。時間T
のリレーションには、T
までにストリームS
に適用されたウィンドウW
のすべてのタプルが含まれます。
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
は必要とする結果の間隔を表します。
図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 CEPで生成されるリレーションには操作インジケータが含まれるため、挿入、削除および更新(UPDATE SEMANTICS
を使用している場合)を識別できます。詳細は、1.1.1.3項「リレーションとOracle CEPタプル種類インジケータ」を参照してください。
Oracle CQL問合せでモノトニックなリレーションが作成される際は常に、デフォルトでIStream
演算子が追加されます。
リレーションR
がモノトニックになるのは、t1 <= t2
のときにR(t1)
がR(t2)
のサブセットである場合にかぎられます。
Oracle CQLでは、控えめな静的モノトニシティ・テストを使用します。たとえば、追加のみであることが明確な場合、基本リレーションはモノトニックです。S[Range Unbounded]
はすべてのストリームS
に対してモノトニックであり、2つのモノトニック・リレーションの結合もモノトニックです。
リレーションがモノトニックでない場合(たとえば、S[range 10 seconds]
のようなウィンドウがある場合)、問合せ作成者の意図(IStream
、DStream
またはRStream
)を判断できないため、このような場合、Oracle CQLはデフォルトではリレーションからストリームへの演算子を追加しません。
一般に、ストリームからストリームへの演算は、次のように実行します。
ストリームからリレーションへの演算子によって、ストリームをリレーションに変換します。詳細は、1.1.3項「ストリームからリレーションへの演算子(ウィンドウ)」を参照してください。
リレーションからリレーションへの演算子によって、リレーショナル・フィルタを実行します。詳細は、1.1.2項「リレーションからリレーションの演算子」を参照してください。
リレーションからストリームへの演算子によって、リレーションをストリームに戻します。詳細は、1.1.4項「リレーションからストリームへの演算子」を参照してください。
ただし、リレーションからリレーションへの一部の演算子(filterやprojectなど)はストリームからストリームへの演算子としても機能します。例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
ストリーム要素のデータを解析します。詳細は、18.2.6項「XMLTableの問合せ」を参照してください。
Oracle CQL問合せは、Oracle CQL構文で表され、1つ以上のストリーム、リレーションまたはビューからのデータを取得するためにOracle CEP CQLプロセッサで実行される操作です。<query>
要素で作成した最上位のSELECT
文は問合せと呼ばれます。詳細は、18.2項「問合せ」を参照してください。
Oracle CQLビューは、ストリームまたはリレーションでの代替の選択項目を表します。Oracle CQLでは、副問合せのかわりにビューを使用します。<view>
要素で作成した最上位のSELECT
文はビューと呼ばれます。詳細は、18.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>
結合は、複数のストリーム、ビューまたはリレーションから行を結合する問合せです。詳細は、18.4項「結合」を参照してください。
詳細は、第18章「Oracle CQLの問合せ、ビューおよび結合」を参照してください。
Oracle CQL MATCH_RECOGNIZE
コンストラクトは、パターン認識を実行するための主な手段です。
入力ストリームの連続するイベントまたはタプルのシーケンスが特定の条件を満たす場合は、パターンが構成されます。Oracle CQLのパターン認識機能では、着信イベントまたはタプルの属性に条件を定義し、相関変数と呼ばれるString
名を使用してこれらの条件を識別できます。照合されるパターンは、これらの相関変数に対する正規表現として指定され、様々な着信タプルが有効な一致として見なされるために満たす必要のある条件のシーケンスまたは順序が決定されます。
詳細は、第19章「MATCH_RECOGNIZEを使用したパターン認識」を参照してください。
Oracle CEPイベント・ソースはOracle CQL問合せが操作するデータのプロデューサを識別します。Oracle CQLイベント・シンクは問合せ結果のコンシューマを識別します。
この項では、Oracle CQL問合せでアクセスできるイベント・ソースとイベント・シンクの種類、およびイベント・ソースとイベント・シンクへの接続方法について説明します。
Oracle CEPイベント・ソースはOracle CQL問合せが操作するデータのプロデューサを識別します。
Oracle CEPでは、イベント・ソースとして次の要素を使用できます。
アダプタ(JMS、HTTPおよびファイル)
チャネル
プロセッサ
表
キャッシュ
注意: Oracle CEPでは、チャネルを使用してイベント・ソースをOracle CQLプロセッサに接続し、Oracle CQLプロセッサをイベント・シンクに接続する必要があります。他のOracle CEPプロセッサ・タイプでは、チャネルはオプションです。詳細は、1.1.1項「ストリームとリレーション」を参照してください。 |
Oracle CEPイベント・ソースは、通常はプッシュ・データ・ソースです。つまり、Oracle CEPではデータの準備ができたイベント・ソースからの通知を予期します。
Oracle CEPのリレーション・データベース表およびキャッシュ・イベント・ソースはプル・データ・ソースです。つまり、Oracle CEPは、データ・ストリーム上でのイベントの到着時にイベント・ソースをポーリングします。
詳細は、以下を参照してください。
CQLプロセッサに接続されているOracle CQLイベント・シンクは問合せ結果のコンシューマです。
Oracle CEPでは、イベント・シンクとして次の要素を使用できます。
アダプタ(JMS、HTTPおよびファイル)
チャネル
プロセッサ
キャッシュ
同一の問合せを複数のイベント・シンクや、異なる種類のイベント・シンクに関連付けることができます。
Oracle CEPでは、Oracle CEP IDE for Eclipseを使用してイベント処理ネットワーク(EPN)を作成し、イベント・ソースとイベント・シンクを定義します(図1-5を参照)。このEPNで、アダプタPriceAdapter
はチャネルpriceStream
のイベント・ソースであり、チャネルpriceStream
はOracle CQLプロセッサfilterFanoutProcessor
のイベント・ソースです。同様に、Oracle CQLプロセッサfilterFanoutProcessor
はチャネルpriceStream
のイベント・シンクです。
詳細は、以下を参照してください。
Eclipse用Oracle Complex Event Processing開発者ガイド
Oracle CQLを使用して、次の表データにアクセスできます。
詳細は、1.1.8項「イベント・ソースとイベント・シンク」を参照してください。
Oracle CQLプロセッサを使用すると、リレーショナル・データベース表をイベント・ソースとして指定できます。このイベント・ソースで問合せを実行したり、他のイベント・ソースと結合したりできます。
詳細は、18.6項「Oracle CQL問合せとリレーショナル・データベース表」を参照してください。
Oracle CQLのXMLTABLE
句を使用すると、XPath式を使用してxmltype
ストリームのデータを列に解析し、列名でデータに容易にアクセスできます。
詳細は、18.2.6項「XML表問合せ」を参照してください。
Oracle CQLプロセッサを使用すると、Oracle CEPキャッシュをイベント・ソースとして指定できます。now
ウィンドウを使用する場合にのみ、このイベント・ソースで問合せを実行したり、他のイベント・ソースと結合できます。
詳細は、以下を参照してください。
関数は、データ項目を操作して結果を返す点で演算子と同様です。関数が演算子と異なる点は、引数の形式です。この形式により、0、1、2個、またはより多数の引数を操作できます。
function(argument, argument, ...)
引数を持たない関数は疑似列と同じです(第3章「疑似列」を参照)。ただし、疑似列ではリレーションの各タプルで異なる値が返されますが、引数を持たない関数では各タプルに対して通常は同じ値が返されます。
Oracle CQLには、ストリーム・データの操作を実行する、次のような広範な組込み関数が用意されています。
問合せのストリームまたはビューの各行ごとに単一の結果行を返す単一行関数
単一のタプルのかわりにタプルのグループに基づいて単一の集計結果を返す集計関数
アプリケーションで必要な機能がOracle CQL組込み関数に用意されていない場合は、oracle.cep.extensibility.functions
パッケージのクラスを使用して、ユーザー定義関数をJavaで簡単に作成できます。ユーザー定義の集計関数および単一行関数を作成できます。オーバーロード関数の作成、および組込み関数のオーバーライドができます。
Oracle CQL関数で予期される型以外のデータ型の引数を使用してOracle CQL関数を呼び出した場合、Oracle CEPではOracle CQL関数を実行する前に、予期されるデータ型に引数を変換しようと試みます。
注意: 関数名では、大/小文字が区別されます。
|
詳細は、以下を参照してください。
Oracle CQLデータ・カートリッジ・フレームワークにより、任意のドメイン・オブジェクトとOracle CQL言語を密接に統合し、ドメイン・オブジェクト・フィールド、メソッドおよびコンストラクタを、Oracle CQL問合せ内でOracle CQLネイティブ型と同じように使用できます。
現在、Oracle CEPには次のデータ・カートリッジが用意されています。
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問合せおよびビュー内に組み込めます。
第17章「Oracle CEP JDBCデータ・カートリッジ」を参照してください。
詳細は、以下を参照してください。
タイムスタンプはOracle CEPストリームの重要な部分です。ただし、タイプスタンプは必ずしもクロック・タイムと同じである必要はありません。たとえば、アプリケーション・ドメインで時間を定義し、シーケンス番号で表すことができます。タイムスタンプは、タイムスタンプの値が増加する順に更新がシステムに到着することだけを保証するよう要求されます。
タイムスタンプの順序の要件は、1つのストリームまたはリレーションに固有のものです。たとえば、異なるストリームのタプルは任意の順序で相互配置できます。
Oracle CEPではアプリケーション時間またはシステム時間を監視できます。
アプリケーション・タイムスタンプまたはシステム・タイムスタンプの操作を構成するには、Eclipse用Oracle Complex Event Processing開発者ガイドのwlevs:channel内の子要素application-timestamped
に関する項を参照してください。
システム・タイムスタンプを持つリレーションまたはストリームの場合、時間はリレーションまたはストリームのデータ・ソースでのデータの到着に依存します。指定された時間(たとえば1分など)が経過してもアクティビティが発生しない(ストリームまたはリレーションのソースにデータが到着しない)場合、Oracle CEPではシステム・タイムスタンプを持つリレーションまたはストリームでハートビートが生成されます。リレーションまたはストリームが指定のソースによって設定されるか、またはハートビートが毎分生成されます。これにより、リレーションまたはストリームの遅れが1分を超えることはなくなります。
ハートビートを構成するには、Eclipse用Oracle Complex Event Processing開発者ガイドのハートビートに関する項を参照してください。
システム・タイムスタンプを持つストリームとリレーションの場合、2つのイベントが同じ時間値を持つことがないようにシステムによって時間が割り当てられます。ただし、アプリケーション・タイムスタンプを持つストリームとリレーションの場合は、イベントが同じ時間値を持つ場合があります。
アプリケーションのタイムスタンプが(非減少ではなく)厳密に増加することが分かっている場合は、wlevs:channel
属性is-total-order
をtrue
に設定できます。これにより、Oracle CEPエンジンでは特定の最適化を行えるようになり、通常は処理の待機時間の減少につながります。
is-total-order
を構成するには、Eclipse用Oracle Complex Event Processing開発者ガイドのwlevs:application-timestampedに関する項を参照してください。
Oracle CEPスケジューラは、スケジュールのアルゴリズムと頻度に従って、各Oracle CQL問合せを連続的に実行します。
スケジューラの詳細は、Eclipse用Oracle Complex Event Processing開発者ガイドのスケジューラに関する項を参照してください。
Oracle CQLには、問合せやビューを作成する文が用意されています。
この項の内容は次のとおりです。
詳細は、以下を参照してください。
Oracle CEP IDE for EclipseまたはOracle CEP Visualizerを使用して、Oracle CEP 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問合せを作成する場合は、次のルールに従います。
Oracle CQL文は<![CDATA[
and ]]>
で囲む必要があります(例1-13を参照)。
Oracle CQLを発行する場合は、文の定義内でスペースを使用する任意の場所に、1つ以上のタブ、キャリッジ・リターン、またはスペースを含めることができます。このため、Oracle CEPでは例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.7項「コメント」を参照してください。
注意: Oracle Complex Event Processing CQL言語リファレンスでは、わかりやすくするためにOracle CQL文でview またはquery 要素のみを使用しています。 |
Oracle CQLの問合せ、ビューおよび結合を作成する際、問合せを簡易化するためにOracle CQLで用意されている構文のショートカットとデフォルトを使用できます。
詳細は、以下を参照してください。
『Oracle Complex Event Processingスタート・ガイド』のHelloWorld例に関する項
このリファレンスのすべてのOracle CQL文は(第20章「Oracle CQL文」を参照)、次の項に編成されています。
構文 構文図では、文を構成するキーワードとパラメータを示します。
注意: すべてのキーワードとパラメータがすべての状況で有効な訳ではありません。各文および句の「セマンティクス」を参照し、構文上の制限を理解するようにしてください。 |
目的 「目的」では文の基本的な使用について示します。
要件 「要件」では必要な権限、および文を使用する前に実行する必要のある手順を示します。
セマンティクス 「セマンティクス」では、構文に含まれるキーワード、パラメータおよび句の目的と、これらに適用される制限およびその他の備考を示します(この章で使用しているキーワードとパラメータの表記規則については、このリファレンスの「はじめに」で説明しています)。
例 「例」では文の様々な句とパラメータの使用例を示します。
Oracle CQLは新しいテクノロジですが、SQL99のサブセットに基づいています。
Oracleでは業界に受け入れられた標準への準拠に努め、SQL標準調査会に積極的に参加しています。OracleではOracle CQLの標準化を積極的に推進しています。
Oracle CEPサーバーおよびツールを使用すると、Oracle CQLを使用するOracle CEPアプリケーションの作成、パッケージ化、デプロイ、デバッグおよび管理を効率的に行うことができます。
Oracle CEPサーバーは、Oracle CEPアプリケーション用の軽量なSpringコンテナを提供し、サーバーとアプリケーションのライフサイクルを管理します。確定的ガベージ・コレクションを行うJRockit real-time JVMのほか、Jetty、JMX、JDBC、HTTPパブリッシュ-サブスクライブ、ロギングとデバッグなどの各種の重要なサービスを提供します。
『Oracle Complex Event Processing管理者ガイド』のOracle CEPサーバーに関する項を参照してください。
Oracle CEPでは、Oracle CQL開発プロセスを簡素化する次のツールが用意されています。
Oracle CEP IDE for Eclipseは、Oracle CEPアプリケーションを開発するプログラマ向けのツールです(図1-6を参照)。
Oracle CEP IDE for Eclipseは、Oracle CEPアプリケーションの開発、デプロイおよびデバッグを支援するために設計されたEclipse IDEのプラグインです。
Oracle CEP IDE for Eclipseの主な機能は、次のとおりです。
イベント駆動型アプリケーションの作成を直ちに開始するためのプロジェクト作成ウィザードおよびテンプレート。
JavaやXMLファイルなどのOracle CEPアプリケーションに共通のソース・ファイル用の高度なエディタ。
IDEからOracle CEPサーバー・インスタンスをシームレスに開始、停止およびデプロイするための統合化されたサーバー管理。
統合化されたデバッグ。
イベント処理アプリケーション内を参照および移動できる、イベント処理ネットワーク(EPN)のビジュアルなデザイン・ビュー。
Oracle CEP Visualizerの統合サポート。これにより、IDEからOracle CEP Visualizerを使用できます(1.4.2.2項「Oracle CEP Visualizer」を参照)。
詳細は、次の資料を参照してください。
Eclipse用Oracle Complex Event Processing開発者ガイド
http://www.oracle.com/technology/products/event-driven-architecture/cep-ide/11/index.html
Oracle CEP Visualizerという高度な実行時管理コンソールが用意されています(図1-7を参照)。
Oracle CEP Visualizerを使用すると、Oracle CEPサーバー・ドメインおよびこれらにデプロイするOracle CEPアプリケーションをブラウザから管理、チューニングおよび監視できます。Oracle CEP Visualizerには、Oracle CQLおよびEPLルールの管理および作成のサポートなどを含む、様々な高機能の実行時管理ツールが用意されています。
詳細は、『Oracle Complex Event Processing Visualizerユーザーズ・ガイド』を参照してください。