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 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 でのサブクエリ) が定義され、各ビューは前のビューに基づいています。ビューは常に inputChannel
などの着信チャネルに対して機能します。lastEvents
という最初のビューは inputChannel
から直接選択します。後続のビューは inputChannel
から直接選択するか、前に定義されたビューから選択します。ビューの選択文で返された結果はビューのリレーションに残ったまま維持され、出力チャネルには転送されません。これはクエリの動作です。この例では、inputChannel
からの直接の選択と、前に定義されたビューからの選択の両方を行うクエリ BBAQuery
が定義されます。クエリの選択句から返された結果は、関連付けられた出力チャネルに転送されます (この例では outputChannel
)。BBAQuery
は、タプルベースのストリームからリレーションへの演算子 (またはスライド枠) を使用します。
これらの要素の詳細については、以下を参照してください。
Oracle CEP サーバと各ツールの詳細については、以下を参照してください。
この節では、Oracle CQL を使用して操作する 2 つの基本的な Oracle CEP オブジェクトについて説明します。
Oracle CQL を使用して、ストリームとリレーションの以下の操作を実行できます。
リレーションからリレーションへの演算子 : 1 つ以上の他のリレーションからのリレーションの生成
ストリームからリレーションへの演算子 (枠) : ストリームからのリレーションの生成
リレーションからストリームへの演算子 : リレーションからのストリームの生成
ストリームからストリームへの演算子 : 1 つ以上の他のストリームからのストリームの生成
ストリームは、Oracle CQL クエリでの操作の対象となる主なデータ ソースです。
ストリーム S
は複数の要素セット (s,T)
のバッグです。s
は S
のスキーマを持ち、T
は時間に属します。
ストリーム要素はタプルとタイムスタンプのペアであり、タイムスタンプを持つタプルの挿入シーケンスとして表すことができます。言い換えると、ストリームとはタイムスタンプを持つタプルのシーケンスです。同じタイムスタンプを持つ複数のタプルがある場合があります。入力ストリームのタプルは、タイムスタンプが増加する順にシステムに到着する必要があります。詳細については、節 1.1.10「時間」を参照してください。
ストリームには名前付き属性のセットで構成される関連付けられたスキーマがあり、ストリームのすべてのタプルはスキーマに準拠しています。
「ストリームのタプル」という用語はストリーム要素のデータ部分 (タイムスタンプ データは除く) の順序付きリストを表します (<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 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
アセンブリ ソースを示します。eventTypeName
プロパティはイベント タイプ PriceEvent
を指定します。event-type-repository
はこのイベントのプロパティ名とタイプを定義します。
例 1-3 ストリームのスキーマ定義
<wlevs:event-type-repository> <wlevs:event-type type-name="PriceEvent"> <wlevs:properties> <wlevs:property name="cusip" type="java.lang.String" /> <wlevs:property name="bid" type="java.lang.Double" /> <wlevs:property name="srcId" type="java.lang.String" /> <wlevs:property name="bidQty" type="java.lang.Integer" /> <wlevs:property name="ask" type="java.lang.Double" /> <wlevs:property name="askQty" type="java.lang.Integer" /> <wlevs:property name="seq" type="java.lang.Long" /> <wlevs:property name="sector" type="java.lang.String" /> </wlevs:properties> </wlevs:event-type> </wlevs:event-type-repository> <wlevs:adapter advertise="true" id="PriceAdapter" <wlevs:instance-property name="port" value="9008" /> <wlevs:instance-property name="eventTypeName" value="PriceEvent" /> <wlevs:instance-property name="eventPropertyNames" value="srcId,sector,cusip,bid,ask,bidQty,askQty,seq" /> </wlevs:adapter>
図 1-2 に示すようにイベント ソース、チャネル、およびプロセッサが接続されると、ストリームを使用する Oracle CQL 文を作成できます (例 1-4 を参照)。
例 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 CEP IDE Eclipse 開発者ガイド』の「チャネル コンポーネント コンフィグレーション」を参照してください。
例 1-5 selector を使用したクエリ結果出力の制御
<channel> <name>filteredStream</name> <selector>Yr3Sector Yr2Sector</selector> </channel>
詳細については、以下を参照してください。
時間で変化するリレーション R
は、時間ドメインから R
のスキーマを持つ無制限のタプルのバッグへのマッピングです。
リレーションとは、並べ替えられていない、時間で変化するタプルのバッグです。言い換えると、瞬間的なリレーションです。各瞬間において、リレーションは制限されたセットです。また、リレーションの変化する状態を表す挿入、削除、または更新を含む、タイムスタンプを持つタプルのシーケンスとして表すこともできます。
ストリームと同様、リレーションにはすべてのタプルが準拠する固定スキーマがあります。
Oracle CEP では基本および派生ストリームとリレーションがサポートされています。外部ソースは基本のストリームとリレーションにデータを提供します。
基本 (明示的な) ストリームは Oracle CEP アダプタに到着するソース データ ストリームであるため、時間は非減少です。つまり、各イベントが同一の時間の値を持つ場合があります。
派生した (暗黙的な) ストリーム/リレーションは、クエリ演算子で生成される中間のストリーム/リレーションです。これらの中間の演算子は (ビューを通じて) 指定できるため、以降のクエリで指定できます。
派生したリレーションは、クエリ演算子で生成される中間のリレーションです。これらの中間の演算子は (ビューを通じて) 指定できるため、以降のクエリで指定できます。
Oracle CEP では、ユーザ自身は基本リレーションを作成しません。基本リレーションは Oracle CEP サーバで必要に応じて作成されます。
リレーションが時間で変化するタプルのバッグであると言う場合、時間は時間ドメインの瞬間を指します。入力リレーションは、時間の経過に沿ったリレーションの変化を表す、タイムスタンプを持つ更新のシーケンスとしてシステムに提示されます。更新はタプルの挿入または削除のいずれかです。更新はタイムスタンプが増加する順にシステムに到着する必要があります。詳細については、節 1.1.10「時間」を参照してください。
デフォルトでは、Oracle CEP で生成されるリレーションにはタイムスタンプと Oracle CEP Tuple Kind インジケータが含まれています (例 1-6 を参照)。
例 1-6 リレーション出力の Oracle CEP Tuple Kind インジケータ
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 Tuple Kind インジケータは以下のとおりです。
onUpdateEvent
の com.bea.wlevs.ede.api.RealtionSink
メソッドの呼び出しで示される更新タプルの場合は U
(詳細については、『Oracle CEP Java API Reference』を参照してください)。
サイレント操作をコンフィグレーションするには、『Oracle CEP IDE Eclipse 開発者ガイド』の「wlevs:channel」で属性 is-silent-relation
に関する説明を参照してください。
このマニュアルでは、リレーションは常に非サイレントとして示されています。つまり、タイムスタンプと Oracle CEP Tuple Kind インジケータが常に表示されます (例 1-6 を参照)。
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 では、以下の種類の組み込み枠がサポートされています。
範囲 : 時間ベース
S[Range T]
またはオプションで、
S[Range T1 Slide T2]
範囲 : 時間ベース (無限)
S[Range Unbounded]
範囲 : 時間ベース (現在)
S[Now]
範囲 : 定数値
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 秒ごとの結果が必要である」ことを示します。
キーワード Partition By
では、Partition By
で指定された属性の同一性に基づいて、データ ストリーム S
が異なるサブストリームに論理的に分割されます。たとえば、S[Partition By A,C Rows 2]
のように分割を指定すると、A
と C
の値のペアの固有な組み合わせごとにサブストリームが作成され、それらのサブストリームに対して Rows
の指定が適用されます。Rows
の指定は、「2 タプルに相当するデータを参照する必要がある」ことを示します。デフォルトでは、範囲 (およびスライド) は 1 秒です。
独自のユーザ定義のカスタム枠を作成することもできます。
詳細については、以下を参照してください。
ストリームからリレーションへの演算結果を、さらに処理を行うためストリームに戻すことができます。
例 1-8 では、select によってフィルタ条件 (viewq3.ACCT_INTRL_ID = ValidLoopCashForeignTxn.ACCT_INTRL_ID)
を満たすタプルのストリームが出力されます。now 枠によって viewq3
がリレーションに変換され、これはフィルタ条件によってリレーションとして維持されます。リレーションからストリームへの IStream
演算子によって、フィルタ出力がストリームに変換されます。
例 1-8 リレーションからストリームへの演算
<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 Tuple Kind インジケータ」を参照してください。
ストリームからストリームへの演算に特定の演算子はありません。その代わり、以下を使用してストリームからストリームへの演算を実行します。
ストリームからリレーションへの演算子によって、ストリームをリレーションに変換します。詳細については、節 1.1.3「ストリームからリレーションへの演算子 (枠)」を参照してください。
リレーションからリレーションへの演算子によって、リレーショナル フィルタを実行します。詳細については、節 1.1.2「リレーションからリレーションへの演算子」を参照してください。
リレーションからストリームへの演算子によって、リレーションをストリームに戻します。詳細については、節 1.1.4「リレーションからストリームへの演算子」を参照してください。
ただし、リレーションからリレーションへの一部の演算子 (filter や project など) はストリームからストリームへの演算子としても機能します。例 1-9 に示すクエリがあるとします。入力 S
はストリームであると想定され、このクエリではストリーム要素 c1
が 50 を超える場合にストリームが出力として生成されます。
例 1-9 ストリームからストリームへの演算
<processor> <name>cqlProcessor</name> <rules> <query id="q0"><![CDATA[ select * from S where c1 > 50 ]]></query> </rules> </processor>
また、Oracle CQL では以下の直接的なストリームからストリームへの演算子がサポートされています。
MATCH_RECOGNIZE
: この句を使用して、入力ストリームの各種のパターン認識クエリを作成します。詳細については、節 1.1.7「パターン認識」を参照してください。
XMLTABLE
: この句を使用して、XPath 式を使用して xmltype
ストリーム要素のデータを解析します。詳細については、節 14.2.5「XMLTable のクエリ」を参照してください。
Oracle CQL クエリは、Oracle CQL 構文で表され、1 つ以上のストリーム、リレーション、またはビューからのデータを取得するために Oracle CEP CQL プロセッサで実行される操作です。[REGISTER|CREATE] QUERY
文を使用して作成した最上位の SELECT
文はクエリと呼ばれます。詳細については、節 14.2「クエリ」を参照してください。
Oracle CQL ビューは、ストリームまたはリレーションでの代替の選択項目を表します。Oracle CQL では、サブクエリの代わりにビューを使用します。[REGISTER|CREATE] VIEW
文を使用して作成した VIEW
文はビューと呼ばれます。詳細については、節 14.3「ビュー」を参照してください。
結合は、複数のストリーム、ビュー、またはリレーションから行を結合するクエリです。詳細については、節 14.4「結合」を参照してください。
詳細については、第 14 章「Oracle CQL のクエリ、ビュー、および結合」を参照してください。
Oracle CQL MATCH_RECOGNIZE
構成体は、パターン認識を実行するための主な手段です。
入力ストリームの連続するイベントまたはタプルのシーケンスが特定の条件を満たす場合は、パターンが構成されます。Oracle CQL のパターン認識機能では、着信イベントまたはタプルの属性に条件を定義し、相関変数と呼ばれる String
名を使用してこれらの条件を識別できます。照合されるパターンは、これらの相関変数に対する正規表現として指定され、さまざまな着信タプルが有効な一致として見なされるために満たす必要のある条件のシーケンスまたは順序が決定されます。
詳細については、第 15 章「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 の table
および cache
イベント ソースはプル データ ソースです。つまり、Oracle CEP はイベント ソースを定期的にポーリングします。
Oracle CQL プロセッサを使用すると、リレーショナル データベース テーブルをイベント ソースとして指定できます。このイベント ソースでクエリを実行したり、他のイベント ソースと結合したりできます。詳細については、以下を参照してください。
『Oracle CEP 管理者ガイド』の「リレーショナル データベースへのアクセスのコンフィグレーション」
『Oracle CEP IDE Eclipse 開発者ガイド』の「Oracle CQL プロセッサのテーブル ソースのコンフィグレーション」
Oracle CQL プロセッサを使用すると、キャッシュをイベント ソースとして指定できます。Now
枠を使用する場合にのみ、このイベント ソースでクエリを実行したり、他のイベント ソースと結合できます。詳細については、以下を参照してください。
『Oracle CEP IDE Eclipse 開発者ガイド』の「キャッシングのコンフィグレーション」
『Oracle CEP IDE Eclipse 開発者ガイド』の「Oracle CQL プロセッサのキャッシュ ソースのコンフィグレーション」
『Oracle CEP 入門』の「Oracle Continuous Query Language (CQL) のサンプル」
CQL プロセッサに接続されている Oracle CQL イベント シンクはクエリ結果のコンシューマです。
Oracle CEP では、イベント シンクとして以下の要素を使用できます。
アダプタ (JMS、HTTP、およびファイル)
チャネル
プロセッサ
キャッシュ
同一のクエリを複数のイベント シンクや、異なる種類のイベント シンクに関連付けることができます。
Oracle CEP では、Oracle CEP IDE for Eclipse を使用してイベント処理ネットワーク (EPN) を作成し、イベント ソースとイベント シンクを定義します (図 1-4 を参照)。この EPN で、アダプタ PriceAdapter
はチャネル priceStream
のイベント ソースであり、チャネル priceStream
は Oracle CQL プロセッサ filterFanoutProcessor
のイベント ソースです。同様に、Oracle CQL プロセッサ filterFanoutProcessor
はチャネル priceStream
のイベント シンクです。
詳細については、以下を参照してください。
関数は、データ項目を操作して結果を返す点で演算子と同様です。関数が演算子と異なる点は、引数の形式です。この形式により、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 CEP ストリームの重要な部分です。ただし、タイプスタンプは必ずしもクロック タイムと同じである必要はありません。たとえば、アプリケーション ドメインで時間を定義し、シーケンス番号で表すことができます。タイムスタンプは、タイムスタンプの値が増加する順に更新がシステムに到着することだけを保証するよう要求されます。
タイムスタンプの順序の要件は、1 つのストリームまたはリレーションに固有のものです。たとえば、異なるストリームのタプルは任意の順序で相互配置できます。
Oracle CEP ではアプリケーション時間またはシステム時間を監視できます。
アプリケーション タイムスタンプまたはシステム タイムスタンプの操作をコンフィグレーションするには、『Oracle CEP IDE Eclipse 開発者ガイド』の「wlevs:channel」で子要素 application-timestamped
に関する説明を参照してください。
システム タイムスタンプを持つリレーションまたはストリームの場合、時間はリレーションまたはストリームのデータ ソースでのデータの到着に依存します。指定された時間 (たとえば 1 分など) が経過してもアクティビティが発生しない (ストリームまたはリレーションのソースにデータが到着しない) 場合、Oracle CEP ではシステム タイムスタンプを持つリレーションまたはストリームでハートビートが生成されます。リレーションまたはストリームが指定のソースによって設定されるか、またはハートビートが毎分生成されます。これにより、リレーションまたはストリームの遅れが 1 分を超えることはなくなります。
ハートビートを構成するには、『Oracle CEP IDE Eclipse 開発者ガイド』の「ハートビート」を参照してください。
システム タイムスタンプを持つストリームとリレーションの場合、2 つのイベントが同じ時間値を持つことがないようにシステムによって時間が割り当てられます。ただし、アプリケーション タイムスタンプを持つストリームとリレーションの場合は、イベントが同じ時間値を持つ場合があります。
アプリケーションのタイムスタンプが (非減少ではなく) 厳密に増加することが分かっている場合は、wlevs:channel
属性 is-total-order
を true
に設定できます。これにより、Oracle CEP エンジンでは特定の最適化を行えるようになり、通常は処理のレイテンシの減少につながります。
is-total-order
をコンフィグレーションするには、『Oracle CEP IDE Eclipse 開発者ガイド』の「wlevs:application-timestamped」を参照してください。
Oracle CEP スケジューラは、スケジュールのアルゴリズムと頻度に従って、各 Oracle CQL クエリを連続的に実行します。
スケジューラの詳細については、『Oracle CEP IDE Eclipse 開発者ガイド』の「scheduler」を参照してください。
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-10 を参照)。
例 1-10 通常の 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[
および ]]>
で囲む必要があります (例 1-10 を参照)。
Oracle CQL 文を発行する場合は、文の定義内でスペースを使用する任意の場所に、1 つ以上のタブ、キャリッジ リターン、またはスペースを含めることができます。このため、Oracle CEP では例 1-11 と例 1-12 の Oracle CQL 文が同じように評価されます。
例 1-11 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-12 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 CEP CQL 言語リファレンス』では、わかりやすくするため Oracle CQL 文をrule 、view 、または query 要素と共に示しています。 |
このリファレンスのすべての Oracle CQL 文は (第 16 章「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 CEP サーバの詳細については、『Oracle CEP 管理者ガイド』を参照してください。
Oracle CEP では、Oracle CQL 開発プロセスを簡素化する以下のツールが提供されます。
Oracle CEP IDE for Eclipse : Oracle CEP アプリケーション開発の完全なライフサイクルをサポートする Eclipse ベースの統合開発環境。Oracle CQL 構文のハイライト表示と検証、グラフィカルなイベント処理ネットワーク エディタ、コンポーネントとアプリケーション アセンブリのコンフィグレーション ファイルの効率的な管理などが含まれます。
詳細については、『Oracle CEP IDE Eclipse 開発者ガイド』を参照してください。
Oracle CEP Visualizer : Oracle CEP アプリケーション、クエリ、キャッシュ、およびクラスタ化の実行時のコンフィグレーションと管理を提供する、豊富な機能を備えた Oracle CEP のグラフィカル ユーザ インタフェース。
詳細については、『Oracle CEP Visualizer ユーザ ガイド』を参照してください。