ヘッダーをスキップ
Oracle® Complex Event Processing CQL言語リファレンス
11g リリース1(11.1.1.4.0)
B61613-02
  目次へ移動
目次
索引へ移動
索引

前
 
次
 

1 Oracle CQLの概要

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開発ツールが用意されています。

1.1 Oracle CQLの基本

格納されている有限なデータ・セットに対して問合せを実行する場合には、データベースが最適です。しかし、多くの最新のアプリケーションでは、連続する無制限のデータ・セットに対する長時間の問合せ実行が要求されます。設計上、格納されたデータ・セットは大量のデータに対して反復的に問合せを実行したり、あまり頻繁に更新を行わない場合に適しています。これに対して、データ・ストリームは絶えず変化するデータを表します。多くの場合は、新しい要素の挿入のみが行われます。大量のデータの反復的な操作は不要であると同時に非実用的です。

センサー・データ・アプリケーション、財務表示、ネットワーク性能測定ツール、ネットワーク監視およびトラフィック管理アプリケーション、クリックストリーム分析ツールなどの多くの種類のアプリケーションでは、データ・セットのかわりにデータ・ストリームが生成されます。これらの種類のアプリケーション・データを管理および処理する際は、厳密な時間によるフォーカスを使用して、データ管理および問合せ機能を作成します。

こうした要件に応えるために、構造化データ・レコードのストリームと格納されたリレーションの概念をサポートするデータ管理インフラストラクチャの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)です。

図1-1 Oracle CEPアーキテクチャ

図1-1の説明が続きます
「図1-1 Oracle CEPアーキテクチャ」の説明

Oracle CEPを使用すると、JMS、リレーショナル・データベース表、ローカル・ファイルシステムのファイルなどの各種データ・ソースに対するイベント・アダプタを定義できます。複数の入力チャネルをOracle CQLプロセッサに接続したり、Oracle CQLプロセッサを複数の出力チャネルに接続できます。出力チャネルを別のOracle CQLプロセッサ、アダプタ、キャッシュまたはイベントBeanに接続できます。

Oracle CEP IDE for EclipseとOracle CEP Visualizerを使用して、次のことを行います。

例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サーバーと各ツールの詳細は、次の資料を参照してください。

1.1.1 ストリームとリレーション

この項では、Oracle CQLを使用して操作する2つの基本的なOracle CEPオブジェクトについて説明します。

Oracle CQLを使用して、ストリームとリレーションの次の操作を実行できます。

1.1.1.1 ストリーム

ストリームは、Oracle CQL問合せでの操作の対象となる主なデータ・ソースです。

ストリームSは要素のバッグ(またはマルチセット)(s,T)のバッグです。sSのスキーマを持ち、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です。

定義により、ストリームは無制限です。

この項の内容は次のとおりです。

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

1.1.1.1.1 ストリームおよびチャネル

Oracle CEPではストリームはチャネルとして表されます(図1-2を参照)。Oracle CEP IDE for Eclipseを使用して、ストリーム・イベント・ソース(PriceAdapter)をチャネル(priceStream)に接続し、チャネルをOracle CQLプロセッサ(filterFanoutProcessor)に接続して、プロセッサにイベントを提供します。Oracle CQLプロセッサをチャネル(filteredStream)に接続し、Oracle CQL問合せ結果を下流コンポーネント(図1-2には表示されていません)に出力します。

図1-2 イベント処理ネットワーク内のストリーム

図1-2の説明が続きます
「図1-2 イベント処理ネットワーク内のストリーム」の説明


注意:

Oracle CEPでは、チャネルを使用してイベント・ソースをOracle CQLプロセッサに接続し、Oracle CQLプロセッサをイベント・シンクに接続する必要があります。他のOracle CEPプロセッサ・タイプでは、チャネルはオプションです。

1.1.1.1.2 チャネルのスキーマ

ストリームに接続するイベント・ソースによってストリームのスキーマが決定されます。図1-2では、PriceAdapterアダプタによってpriceStreamストリームのスキーマが決定されます。例1-3PriceAdapterイベント処理ネットワーク(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.1.1.1.3 チャネルの問合せ

図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.1.1.1.4 ダウンストリーム・チャネルに出力する問合せの制御

例1-4に示すように、プロセッサに1つ以上の問合せを指定する場合、すべての問合せ結果がプロセッサのアウトバウンド・チャネルに出力されます(図1-2filteredStream)。

オプションで、コンポーネント構成ファイルで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開発者ガイドのダウンストリーム・チャネルに出力する問合せの制御に関する項を参照してください。

1.1.1.2 リレーション

時間で変化するリレーションRは、時間ドメインからRのスキーマを持つ無制限のタプルのバッグへのマッピングです。

リレーションとは、並べ替えられていない、時間で変化するタプルのバッグです。言い換えると、瞬間的なリレーションです。各瞬間において、リレーションは制限されたセットです。また、リレーションの変化する状態を表す挿入、削除または更新を含む、タイムスタンプを持つタプルのシーケンスとして表すこともできます。

ストリームと同様、リレーションにはすべてのタプルが準拠する固定スキーマがあります。

Oracle CEPでは基本および派生ストリームとリレーションがサポートされています。外部ソースは基本のストリームとリレーションにデータを提供します。

基本(明示的な)ストリームはOracle CEPアダプタに到着するソース・データ・ストリームであるため、時間は非減少です。つまり、各イベントが同一の時間の値を持つ場合があります。

派生した(暗黙的な)ストリーム/リレーションは、問合せ演算子で生成される中間のストリーム/リレーションです。これらの中間の演算子は(ビューを通じて)指定できるため、以降の問合せで指定できます。

基本リレーションは入力リレーションです。

派生したリレーションは、問合せ演算子で生成される中間のリレーションです。これらの中間の演算子は(ビューを通じて)指定できるため、以降の問合せで指定できます。

Oracle CEPでは、ユーザー自身は基本リレーションを作成しません。基本リレーションはOracle CEPサーバーで必要に応じて作成されます。

リレーションが時間で変化するタプルのバッグであると言う場合、時間は時間ドメインの瞬間を指します。入力リレーションは、時間の経過に沿ったリレーションの変化を表す、タイムスタンプを持つ更新のシーケンスとしてシステムに提示されます。更新はタプルの挿入または削除のいずれかです。更新はタイムスタンプが増加する順にシステムに到着する必要があります。

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

  • Eclipse用Oracle Complex Event Processing開発者ガイドのストリームおよびリレーションを表すチャネルに関する項

  • 1.1.13項「時間」

1.1.1.3 リレーションとOracle CEPタプル種類インジケータ

デフォルトでは、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タプル種類インジケータは次のとおりです。

  • 挿入タプルの場合は+

  • 削除タプルの場合は-

  • onUpdateEventcom.bea.wlevs.ede.api.RealtionSinkメソッドの呼出しで示される更新タプルの場合はU(詳細は、Oracle Complex Event Processing Java APIリファレンスを参照してください)。

1.1.2 リレーションからリレーションへの演算子

Oracle CQLのリレーションからリレーションへの演算子は、SQLで表される従来のリレーショナル問合せから派生しています。

SQL問合せで従来のリレーションが参照される任意の場所において、Oracle CQLでリレーションを参照できます。

次のような、スキーマcar_id integerspeed integerexp_way integerlane integerdir 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の詳細は、次の項を参照してください。

1.1.3 ストリームからリレーションへの演算子(ウィンドウ)

Oracle CQLでは、スライディング・ウィンドウに基づいた、ストリームからリレーションへの演算がサポートされています。通常、S[W]はリレーションです。時間Tのリレーションには、TまでにストリームSに適用されたウィンドウWのすべてのタプルが含まれます。

window_type::=

window_type.pngについては周囲のテキストで説明しています。

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]

この項では、ストリームからリレーションへの演算子の次のプロパティについて説明します。

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

1.1.3.1 Range、RowおよびSlide

キーワードRangeおよびRowsは問合せで操作するデータの量を指定します。

  • Rangeでは指定の期間内に到着するタプルの数が指定されます。

  • Rowsではタプルの数が指定されます。

キーワードSlideは必要とする結果の間隔を表します。

図1-3で、Rangeの指定は「5秒間に相当するデータを参照する必要がある」ことを示し、Slideの指定は「5秒ごとの結果が必要である」ことを示します。この場合、各Rangeの指定の終わりに問合せで結果が返されます(「問合せ開始時と空のリレーションの場合のRange、RowsおよびSlide」の項で説明されているように特定の条件を除く)。

図1-3 RangeおよびSlide: 等しい(定常状態条件)

図1-3の説明が続きます
「図1-3 RangeおよびSlide: 等しい(定常状態条件)」の説明

図1-4で、Rangeの指定は「10秒間に相当するデータを参照する必要がある」ことを示し、Slideの指定は「5秒ごとの結果が必要である」ことを示します。この場合、各Rangeの指定中に2回、問合せで結果が返されます(1.1.3.1.1項「問合せ開始時と空のリレーションの場合のRange、RowsおよびSlide」で説明されているように特定の条件を除く)。

図1-4 RangeおよびSlide: 異なる(定常状態条件)

図1-4の説明が続きます
「図1-4 RangeおよびSlide: 異なる(定常状態条件)」の説明

表1-1は、範囲ベースとタプル・ベースのストリームからリレーションへのウィンドウ演算子に関するデフォルトのRangeRangeの単位およびSlide(該当する場合)のリストです。

表1-1 デフォルトのRangeおよびタプルベースのストリームからリレーションへの演算子

ウィンドウ演算子 デフォルトのRange デフォルトのRange単位 デフォルトのSlide

範囲ベースのストリームからリレーションへのウィンドウ演算子


Unbounded

seconds

1ナノ秒

タプルベースのストリームからリレーションへのウィンドウ演算子


なし

なし

1タプル


1.1.3.1.1問合せ開始時と空のリレーションの場合のRange、RowsおよびSlide

図1-3および図1-4の説明では、問合せが一定時間実行された後、定常状態条件であると想定されています。表1-2は、問合せ開始時の時間や空のリレーションなど、特定の場合のRangeRowsおよびSlideの動作のリストです。

表1-2 問合せ開始時と空のリレーションの場合のRange、RowsおよびSlide

演算子または関数 結果

COUNT(*)またはCOUNT(expression)

空のリレーションの場合、RangeまたはRowsに相当するデータの累積前、および最初のSlide前にすぐに0を返します(GROUP BYがない場合)。

SUM(attribute)および他の集計関数

空のリレーションの場合、RangeまたはRowsに相当するデータの累積前、および最初のSlide前にすぐにnullを返します。


詳細および例は、次を参照してください。

1.1.3.2 分割

キーワードPartition Byでは、Partition Byで指定された属性の同一性に基づいて、データ・ストリームSが異なるサブストリームに論理的に分割されます。たとえば、S[Partition By A,C Rows 2]のように分割を指定すると、ACの値のペアの固有な組合わせごとにサブストリームが作成され、それらのサブストリームに対してRowsの指定が適用されます。Rowsの指定は、「2タプルに相当するデータを参照する必要がある」ことを示します。

詳細は、1.1.3.1項「Range、RowおよびSlide」を参照してください。

1.1.3.3 デフォルトのストリームからリレーションへの演算子

Oracle CQL問合せにおいて、リレーションが予想される場所でストリームを参照する際(一般に、from句で)、デフォルトでストリームにRange Unboundedウィンドウが適用されます。たとえば、例1-8例1-9の問合せは同等です。

例1-8 ストリームからリレーションへの演算子なしの問合せ

<query id="q1"><![CDATA[ 
    select * from InputChannel
]]></query>

例1-9 同等の問合せ

<query id="q1"><![CDATA[ 
    IStream(select * from InputChannel[RANGE UNBOUNDED])
]]></query>

詳細は、1.1.4項「リレーションからストリームへの演算子」を参照してください。

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では、リレーションからストリームへの次の演算子がサポートされています。

デフォルトでは、Oracle CEPで生成されるリレーションには操作インジケータが含まれるため、挿入、削除および更新(UPDATE SEMANTICSを使用している場合)を識別できます。詳細は、1.1.1.3項「リレーションとOracle CEPタプル種類インジケータ」を参照してください。

1.1.4.1 デフォルトのリレーションからストリームへの演算子

Oracle CQL問合せでモノトニックなリレーションが作成される際は常に、デフォルトでIStream演算子が追加されます。

リレーションRがモノトニックになるのは、t1 <= t2のときにR(t1)R(t2)のサブセットである場合にかぎられます。

Oracle CQLでは、控えめな静的モノトニシティ・テストを使用します。たとえば、追加のみであることが明確な場合、基本リレーションはモノトニックです。S[Range Unbounded]はすべてのストリームSに対してモノトニックであり、2つのモノトニック・リレーションの結合もモノトニックです。

リレーションがモノトニックでない場合(たとえば、S[range 10 seconds]のようなウィンドウがある場合)、問合せ作成者の意図(IStreamDStreamまたはRStream)を判断できないため、このような場合、Oracle CQLはデフォルトではリレーションからストリームへの演算子を追加しません。

1.1.5 ストリームからストリームへの演算子

一般に、ストリームからストリームへの演算は、次のように実行します。

ただし、リレーションからリレーションへの一部の演算子(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の問合せ」を参照してください。

1.1.6 問合せ、ビューおよび結合

Oracle CQL問合せは、Oracle CQL構文で表され、1つ以上のストリーム、リレーションまたはビューからのデータを取得するためにOracle CEP CQLプロセッサで実行される操作です。<query>要素で作成した最上位のSELECT文は問合せと呼ばれます。詳細は、18.2項「問合せ」を参照してください。

Oracle CQLビューは、ストリームまたはリレーションでの代替の選択項目を表します。Oracle CQLでは、副問合せのかわりにビューを使用します。<view>要素で作成した最上位のSELECT文はビューと呼ばれます。詳細は、18.3項「ビュー」を参照してください

各問合せおよびビューには、問合せおよびビューを含むプロセッサで一意の識別子が必要です。例1-12は、idq0の問合せを示します。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の問合せ、ビューおよび結合」を参照してください。

1.1.7 パターン認識

Oracle CQL MATCH_RECOGNIZEコンストラクトは、パターン認識を実行するための主な手段です。

入力ストリームの連続するイベントまたはタプルのシーケンスが特定の条件を満たす場合は、パターンが構成されます。Oracle CQLのパターン認識機能では、着信イベントまたはタプルの属性に条件を定義し、相関変数と呼ばれるString名を使用してこれらの条件を識別できます。照合されるパターンは、これらの相関変数に対する正規表現として指定され、様々な着信タプルが有効な一致として見なされるために満たす必要のある条件のシーケンスまたは順序が決定されます。

詳細は、第19章「MATCH_RECOGNIZEを使用したパターン認識」を参照してください。

1.1.8 イベント・ソースとイベント・シンク

Oracle CEPイベント・ソースはOracle CQL問合せが操作するデータのプロデューサを識別します。Oracle CQLイベント・シンクは問合せ結果のコンシューマを識別します。

この項では、Oracle CQL問合せでアクセスできるイベント・ソースとイベント・シンクの種類、およびイベント・ソースとイベント・シンクへの接続方法について説明します。

1.1.8.1 イベント・ソース

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は、データ・ストリーム上でのイベントの到着時にイベント・ソースをポーリングします。

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

1.1.8.2 イベント・シンク

CQLプロセッサに接続されているOracle CQLイベント・シンクは問合せ結果のコンシューマです。

Oracle CEPでは、イベント・シンクとして次の要素を使用できます。

  • アダプタ(JMS、HTTPおよびファイル)

  • チャネル

  • プロセッサ

  • キャッシュ

同一の問合せを複数のイベント・シンクや、異なる種類のイベント・シンクに関連付けることができます。

1.1.8.3 イベント・ソースとイベント・シンクの接続

Oracle CEPでは、Oracle CEP IDE for Eclipseを使用してイベント処理ネットワーク(EPN)を作成し、イベント・ソースとイベント・シンクを定義します(図1-5を参照)。このEPNで、アダプタPriceAdapterはチャネルpriceStreamのイベント・ソースであり、チャネルpriceStreamはOracle CQLプロセッサfilterFanoutProcessorのイベント・ソースです。同様に、Oracle CQLプロセッサfilterFanoutProcessorはチャネルpriceStreamのイベント・シンクです。

図1-5 イベント処理ネットワークのイベント・ソースとイベント・シンク

図1-5の説明が続きます
「図1-5 イベント処理ネットワークのイベント・ソースとイベント・シンク」の説明

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

1.1.9 表イベント・ソース

Oracle CQLを使用して、次の表データにアクセスできます。

詳細は、1.1.8項「イベント・ソースとイベント・シンク」を参照してください。

1.1.9.1 リレーショナル・データベース表イベント・ソース

Oracle CQLプロセッサを使用すると、リレーショナル・データベース表をイベント・ソースとして指定できます。このイベント・ソースで問合せを実行したり、他のイベント・ソースと結合したりできます。

詳細は、18.6項「Oracle CQL問合せとリレーショナル・データベース表」を参照してください。

1.1.9.2 XML表イベント・ソース

Oracle CQLのXMLTABLE句を使用すると、XPath式を使用してxmltypeストリームのデータを列に解析し、列名でデータに容易にアクセスできます。

詳細は、18.2.6項「XML表問合せ」を参照してください。

1.1.9.3 関数表イベント・ソース

TABLE句を使用して、リレーションとして、Oracle CQL問合せのFROM句内の組込みまたはユーザー定義関数から配列またはCollection型として返された複数の行にアクセスします。

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

1.1.10 キャッシュ・イベント・ソース

Oracle CQLプロセッサを使用すると、Oracle CEPキャッシュをイベント・ソースとして指定できます。nowウィンドウを使用する場合にのみ、このイベント・ソースで問合せを実行したり、他のイベント・ソースと結合できます。

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

1.1.11 関数

関数は、データ項目を操作して結果を返す点で演算子と同様です。関数が演算子と異なる点は、引数の形式です。この形式により、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 CEPではOracle CQL関数を実行する前に、予期されるデータ型に引数を変換しようと試みます。


注意:

関数名では、大/小文字が区別されます。
  • 組込み関数: 小文字のみを使用できます。

  • ユーザー定義関数: welvs:function要素のfunction-name属性で、大/小文字の区別が決定されます。


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

1.1.12 データ・カートリッジ

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データ・カートリッジ」を参照してください。

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

1.1.13 時間

タイムスタンプは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-ordertrueに設定できます。これにより、Oracle CEPエンジンでは特定の最適化を行えるようになり、通常は処理の待機時間の減少につながります。

is-total-orderを構成するには、Eclipse用Oracle Complex Event Processing開発者ガイドのwlevs:application-timestampedに関する項を参照してください。

Oracle CEPスケジューラは、スケジュールのアルゴリズムと頻度に従って、各Oracle CQL問合せを連続的に実行します。

スケジューラの詳細は、Eclipse用Oracle Complex Event Processing開発者ガイドのスケジューラに関する項を参照してください。

1.2 Oracle CQL文

Oracle CQLには、問合せやビューを作成する文が用意されています。

この項の内容は次のとおりです。

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

1.2.1 表記規則

Oracle CEP IDE for EclipseまたはOracle CEP Visualizerを使用して、Oracle CEP CQLプロセッサに関連付けられたXML構成ファイルにOracle CQL文を作成します。このXMLファイルは構成ソースと呼ばれます。

構成ソースはwlevs_application_config.xsdスキーマに準拠している必要があり、ruleviewまたは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[ 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要素のみを使用しています。

1.2.2 構文のショートカットとデフォルト

Oracle CQLの問合せ、ビューおよび結合を作成する際、問合せを簡易化するためにOracle CQLで用意されている構文のショートカットとデフォルトを使用できます。

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

1.2.3 ドキュメントの表記規則

このリファレンスのすべてのOracle CQL文は(第20章「Oracle CQL文」を参照)、次の項に編成されています。

構文 構文図では、文を構成するキーワードとパラメータを示します。


注意:

すべてのキーワードとパラメータがすべての状況で有効な訳ではありません。各文および句の「セマンティクス」を参照し、構文上の制限を理解するようにしてください。

目的 「目的」では文の基本的な使用について示します。

要件 「要件」では必要な権限、および文を使用する前に実行する必要のある手順を示します。

セマンティクス 「セマンティクス」では、構文に含まれるキーワード、パラメータおよび句の目的と、これらに適用される制限およびその他の備考を示します(この章で使用しているキーワードとパラメータの表記規則については、このリファレンスの「はじめに」で説明しています)。

例 「例」では文の様々な句とパラメータの使用例を示します。

1.3 Oracle CQLとSQL標準

Oracle CQLは新しいテクノロジですが、SQL99のサブセットに基づいています。

Oracleでは業界に受け入れられた標準への準拠に努め、SQL標準調査会に積極的に参加しています。OracleではOracle CQLの標準化を積極的に推進しています。

1.4 Oracle CEPサーバーとツールのサポート

Oracle CEPサーバーおよびツールを使用すると、Oracle CQLを使用するOracle CEPアプリケーションの作成、パッケージ化、デプロイ、デバッグおよび管理を効率的に行うことができます。

1.4.1 Oracle CEPサーバー

Oracle CEPサーバーは、Oracle CEPアプリケーション用の軽量なSpringコンテナを提供し、サーバーとアプリケーションのライフサイクルを管理します。確定的ガベージ・コレクションを行うJRockit real-time JVMのほか、Jetty、JMX、JDBC、HTTPパブリッシュ-サブスクライブ、ロギングとデバッグなどの各種の重要なサービスを提供します。

『Oracle Complex Event Processing管理者ガイド』のOracle CEPサーバーに関する項を参照してください。

1.4.2 Oracle CEPツール

Oracle CEPでは、Oracle CQL開発プロセスを簡素化する次のツールが用意されています。

1.4.2.1 Oracle CEP IDE for Eclipse

Oracle CEP IDE for Eclipseは、Oracle CEPアプリケーションを開発するプログラマ向けのツールです(図1-6を参照)。

図1-6 Oracle CEP IDE for Eclipse

図1-6の説明が続きます
「図1-6 Oracle CEP IDE for Eclipse」の説明

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」を参照)。

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

1.4.2.2 Oracle CEP Visualizer

Oracle CEP Visualizerという高度な実行時管理コンソールが用意されています(図1-7を参照)。

図1-7 Oracle CEP Visualizer

図1-7の説明が続きます
「図1-7 Oracle CEP Visualizer」の説明

Oracle CEP Visualizerを使用すると、Oracle CEPサーバー・ドメインおよびこれらにデプロイするOracle CEPアプリケーションをブラウザから管理、チューニングおよび監視できます。Oracle CEP Visualizerには、Oracle CQLおよびEPLルールの管理および作成のサポートなどを含む、様々な高機能の実行時管理ツールが用意されています。

詳細は、『Oracle Complex Event Processing Visualizerユーザーズ・ガイド』を参照してください。