Oracle® Fusion Middleware

Oracle Event Processing EPL言語リファレンス

11gリリース1(11.1.1.9)

B55579-07(原本部品番号:E14304-09)

2015年2月

Oracle Event Processingアプリケーションでのストリーミング・データの問合せ用言語である、イベント処理言語(EPL)のリファレンスを提供する開発者向けのドキュメント。EPLは非推奨になったことに注意してください。新たな開発ではOracle Continuous Query Language (Oracle CQL)を使用する必要があります。

Oracle Fusion Middleware Oracle Event Processing EPL言語リファレンス 11gリリース1 (11.1.1.9)

B55579-07

Copyright © 2007, 2015, Oracle and/or its affiliates.All rights reserved.

原本著者: Oracle Corporation

このソフトウェアおよび関連ドキュメントの使用と開示は、ライセンス契約の制約条件に従うものとし、知的財産に関する法律により保護されています。ライセンス契約で明示的に許諾されている場合もしくは法律によって認められている場合を除き、形式、手段に関係なく、いかなる部分も使用、複写、複製、翻訳、放送、修正、ライセンス供与、送信、配布、発表、実行、公開または表示することはできません。このソフトウェアのリバース・エンジニアリング、逆アセンブル、逆コンパイルは互換性のために法律によって規定されている場合を除き、禁止されています。

ここに記載された情報は予告なしに変更される場合があります。また、誤りが無いことの保証はいたしかねます。誤りを見つけた場合は、オラクル社までご連絡ください。

このソフトウェアまたは関連ドキュメントを、米国政府機関もしくは米国政府機関に代わってこのソフトウェアまたは関連ドキュメントをライセンスされた者に提供する場合は、次の通知が適用されます。

U.S. GOVERNMENT END USERS: Oracle programs, including any operating system, integrated software, any programs installed on the hardware, and/or documentation, delivered to U.S. Government end users are "commercial computer software" pursuant to the applicable Federal Acquisition Regulation and agency-specific supplemental regulations.As such, use, duplication, disclosure, modification, and adaptation of the programs, including any operating system, integrated software, any programs installed on the hardware, and/or documentation, shall be subject to license terms and license restrictions applicable to the programs.No other rights are granted to the U.S. Government.

このソフトウェアもしくはハードウェアは様々な情報管理アプリケーションでの一般的な使用のために開発されたものです。このソフトウェアもしくはハードウェアは、危険が伴うアプリケーション(人的傷害を発生させる可能性があるアプリケーションを含む)への用途を目的として開発されていません。このソフトウェアもしくはハードウェアを危険が伴うアプリケーションで使用する際、安全に使用するために、適切な安全装置、バックアップ、冗長性(redundancy)、その他の対策を講じることは使用者の責任となります。このソフトウェアもしくはハードウェアを危険が伴うアプリケーションで使用したことに起因して損害が発生しても、オラクル社およびその関連会社は一切の責任を負いかねます。

OracleおよびJavaはOracle Corporationおよびその関連企業の登録商標です。その他の名称は、それぞれの所有者の商標または登録商標です。

Intel、Intel Xeonは、Intel Corporationの商標または登録商標です。すべてのSPARCの商標はライセンスをもとに使用し、SPARC International, Inc.の商標または登録商標です。AMD、Opteron、AMDロゴ、AMD Opteronロゴは、Advanced Micro Devices, Inc.の商標または登録商標です。UNIXは、The Open Groupの登録商標です。

このソフトウェアまたはハードウェア、そしてドキュメントは、第三者のコンテンツ、製品、サービスへのアクセス、あるいはそれらに関する情報を提供することがあります。適用されるお客様とOracle Corporationとの間の契約に別段の定めがある場合を除いて、Oracle Corporationおよびその関連会社は、第三者のコンテンツ、製品、サービスに関して一切の責任を負わず、いかなる保証もいたしません。適用されるお客様とOracle Corporationとの間の契約に定めがある場合を除いて、Oracle Corporationおよびその関連会社は、第三者のコンテンツ、製品、サービスへのアクセスまたは使用によって損失、費用、あるいは損害が発生しても一切の責任を負いかねます。

このドキュメントの情報は、情報共有の目的のみに使用され、顧客諮問委員会の会員の立場で考慮されるか、ベータ・トライアル版契約のみに準じる必要があります。資料、規約または機能性を配信する義務はなく、購買決定に依存すべきではないものとします。このドキュメントに記載されている開発、リリース、およびすべての機能または機能性の時期は、オラクル社の独自の判断に従うものとします。

このドキュメントは、ソフトウェアまたは印刷物などの形式にかかわらず、オラクル社の独占的な財産である機密情報を含みます。この機密資料へのアクセスと使用は、オラクル社との間で締結され遵守に同意したOracle Master Agreement、Oracle License and Services Agreement、Oracle PartnerNetwork Agreement、オラクル販売契約、あるいはその他のライセンス契約の条件にしたがうものとします。オラクル社の文書による事前承諾なしに、このドキュメントおよびここに含まれる情報を開示、コピー、再生、またはオラクル社外部の他者に配布することはできません。このドキュメントは使用許諾契約の一部ではなく、オラクル社の子会社またはアフィリエイトとの契約上の合意に組み込まれません。

目次

例一覧

図一覧

表一覧

タイトルおよび著作権情報

はじめに

- 対象読者

- ドキュメントのアクセシビリティについて

- 関連ドキュメント

- 表記規則

1 イベント処理言語(EPL)の概要

- 1.1 EPL言語の概要

- 1.2 イベント表現

- 1.2.1 イベント・オブジェクト

- 1.2.2 Plain Old Java Objectイベント

- 1.2.3 Mapイベント

- 1.2.4 イベント・プロパティ

- 1.2.5 動的なイベント・プロパティ

- 1.2.6 ユーザー定義関数を使用した他のイベント・プロパティの処理

- 1.2.7 イベント・シンク

- 1.3 処理モデル

- 1.3.1 イベント・ストリーム

- 1.3.2 スライディング・ウィンドウ

- 1.3.2.1 行ベースのスライディング・ウィンドウ

- 1.3.2.2 時間ベースのスライディング・ウィンドウ

- 1.3.3 バッチ・ウィンドウ

- 1.3.3.1 時間ベースのバッチ・ウィンドウ

- 1.3.3.2 行ベースのバッチ・ウィンドウ

- 1.3.4 副問合せとWHERE句

- 1.3.5 集約

- 1.4 使用例

- 1.4.1 フィードごとのレートの計算

- 1.4.2 最高値の株価の計算

- 1.4.3 位置データの分類

- 1.4.4 急速な減衰の検出

- 1.4.5 ネットワークの異常性の検出

- 1.4.6 欠落したイベントの検出

- 1.4.7 端末アクティビティ・データの概要

- 1.4.8 センサー・データの読取り

- 1.4.9 トランザクション・イベントの組合せ

- 1.4.10 リアル・タイム・パフォーマンスのモニター

- 1.4.11 削除されたトランザクション・イベントの検出

2 EPLリファレンス: 句

- 2.1 EPL文で使用可能な句の概要

- 2.2 SELECT

- 2.2.1 特定のイベント・プロパティの選択

- 2.2.2 式の使用

- 2.2.3 イベント・プロパティのエイリアス

- 2.2.4 すべてのイベント・プロパティの選択

- 2.2.5 ISTREAMおよびRSTREAMキーワードによる新しいイベントと古いイベントの選択

- 2.3 FROM

- 2.3.1 内部結合

- 2.3.2 外部結合

- 2.3.3 副問合せ式

- 2.3.4 パラメータ化されたSQL問合せ

- 2.4 RETAIN

- 2.4.1 すべてのイベントの保持

- 2.4.2 ウィンドウのサイズの指定

- 2.4.3 バッチ・ウィンドウとスライディング・ウィンドウの指定

- 2.4.4 時間間隔の指定

- 2.4.4.1 BASED ON句

- 2.4.5 プロパティ名の指定

- 2.4.6 PARTION BY句を使用したウィンドウの分割

- 2.4.7 WITH句を使用した最大/最小/一意な値の保持

- 2.5 MATCHING

- 2.5.1 FOLLOWED BY演算子

- 2.5.2 AND演算子

- 2.5.3 OR演算子

- 2.5.4 NOT演算子

- 2.5.5 EVERY演算子

- 2.5.6 WITHIN演算子

- 2.5.7 一致したパターンのイベント構造

- 2.6 WHERE

- 2.7 GROUP BY

- 2.8 HAVING

- 2.8.1 MATCHING、WHEREおよびGROUP BY句との対話

- 2.9 ORDER BY

- 2.10 OUTPUT

- 2.10.1 GROUP BYおよびHAVING句との対話

- 2.11 INSERT INTO

- 2.12 単純副問合せと相関副問合せ

- 2.13 パラメータ化された問合せ

- 2.13.1 一般的な使用法

- 2.13.2 プロセッサ構成ファイルでのパラメータ化されたEPL文の使用

- 2.13.3 プログラムでのプリペアドEPL文の使用

3 EPLリファレンス: 演算子

- 3.1 EPL演算子の概要

- 3.2 算術演算子

- 3.3 論理演算子と比較演算子

- 3.4 連結演算子

- 3.5 二項演算子

- 3.6 配列定義演算子

- 3.7 リスト演算子と範囲演算子

- 3.7.1 IN演算子

- 3.7.2 BETWEEN演算子

- 3.8 文字列演算子

- 3.8.1 LIKE演算子

- 3.8.2 REGEXP演算子

- 3.9 時相演算子

- 3.9.1 FOLLOWED BY演算子

- 3.9.2 WITHIN演算子

- 3.9.3 EVERY演算子

4 EPLリファレンス: 関数

- 4.1 単一行関数

- 4.1.1 MIN関数とMAX関数

- 4.1.2 COALESCE関数

- 4.1.3 CASE制御フロー関数

- 4.1.4 PREV関数

- 4.1.4.1 各グループの前のイベント

- 4.1.4.2 制限

- 4.1.5 PRIOR関数

- 4.1.5.1 PREV関数との比較

- 4.1.6 INSTANCEOF関数

- 4.1.7 CAST関数

- 4.1.8 EXISTS関数

- 4.2 集約関数

- 4.3 ユーザー定義関数

5 EPLへのプログラミング・インタフェース

- 5.1 Javaプログラミング・インタフェース

例一覧

- 1-1 列挙データ型ProcessStatus

- 1-2 列挙データ型ProcessStatusを使用するイベント

- 1-3 列挙データ型を評価するユーザー定義関数

- 1-4 アプリケーション・アセンブリ・ファイルへのユーザー定義関数の登録

- 1-5 ユーザー定義関数を使用したEPL問合せでの列挙データ型の評価

図一覧

- 1-1 イベント・ストリームの例

- 1-2 行ベースのスライディング・ウィンドウの例

- 1-3 時間ベースのスライディング・ウィンドウの例

- 1-4 時間ベースのバッチ・ウィンドウの例

- 1-5 副問合せとWHERE句の例

- 1-6 行ベースのスライディング・ウィンドウに到達するイベント

表一覧

- 1-1 イベント表現

- 1-2 イベント・プロパティ

- 1-3 動的プロパティの構文

- 2-1 EVERY演算子の例

- 3-1 算術演算子

- 3-2 論理演算子と比較演算子

- 3-3 連結演算子

- 3-4 二項演算子

- 4-1 組込みの単一行関数

- 4-2 集約関数

はじめに

このリファレンスでは、ストリーミング・データをサポートするコンストラクトが追加された、SQLに基づく問合せ言語であるOracle Event Processing Language (Oracle EPL)について詳細に説明します。Oracle EPLを使用すると、データ・ストリームに対する問合せを作成して、Oracle Event Processingを使用してイベント処理を実行できます。

注意:
Oracle EPLは、Oracle Continuous Query Language (Oracle CQL)でで置き換えられています。詳細は、『Oracle Fusion Middleware Oracle Event Processing CQL言語リファレンス』を参照してください。

Oracle Event Processing(以前の名称はWebLogic Event Server)は、高パフォーマンスのイベントドリブン・アプリケーションを開発するためのJavaサーバーです。それは、Equinox OSGiベースの軽量Javaアプリケーション・コンテナであり、ストリーミング・データをサポートするコンストラクトが追加されたSQLベースの問合せ言語Oracle Continuous Query Language (Oracle CQL)に基づく機能豊富で宣言的な環境を提供するOracle Event Processingサービス・エンジンなどの共有サービスも備えており、企業活動の管理の効率と効果を向上させる上で役に立ちます。Oracle Event Processingは、JRockit Real Timeを使用して極めて高いスループットとマイクロ秒のレイテンシをサポートし、完全リアルタイムでエンドツーエンドのJava Event-Driven Architecture (EDA)開発プラットフォームに対してOracle Event Processing VisualizerおよびOracle Event Processing IDE for Eclipseの開発者ツールを提供します。

対象読者

このドキュメントは、Oracle EPLのすべてのユーザーを対象としています。

ドキュメントのアクセシビリティについて

Oracleのアクセシビリティについての詳細情報は、Oracle Accessibility ProgramのWebサイトhttp://www.oracle.com/pls/topic/lookup?ctx=acc&id=docaccを参照してください。

Oracleサポートへのアクセス

サポートをご購入のOracleのお客様は、My Oracle Supportにアクセスして電子サポートを受けることができます。詳細情報はhttp://www.oracle.com/pls/topic/lookup?ctx=acc&id=infoか、聴覚に障害のあるお客様はhttp://www.oracle.com/pls/topic/lookup?ctx=acc&id=trsを参照してください。

関連ドキュメント

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

- Oracle Fusion Middleware Oracle Event Processingスタート・ガイド

- Oracle Fusion Middleware Oracle Event Processing管理者ガイド

- Oracle Fusion Middleware Oracle Event Processing for Eclipse開発者ガイド

- Oracle Fusion Middleware Oracle Event Processing Visualizerユーザーズ・ガイド

- Oracle Fusion Middleware Oracle Event Processing Java APIリファレンス

- Oracle Fusion Middleware Oracle Event Processing CQL言語リファレンス

- http://download.oracle.com/docs/cd/B28359_01/server.111/b28286/toc.htmの『Oracle Database SQL言語リファレンス』

- SQL99仕様(ISO/IEC 9075-1:1999、ISO/IEC 9075-2:1999、ISO/IEC 9075-3:1999およびISO/IEC 9075-4:1999)

- Oracle Event Processingフォーラム: http://forums.oracle.com/forums/forum.jspa?forumID=820

- Oracle Event Processingサンプル: http://www.oracle.com/technologies/soa/complex-event-processing.html

表記規則

このドキュメントでは次の表記規則を使用します。

規則

意味

太字

太字は、操作に関連するGraphical User Interface要素、または本文中で定義されている用語および用語集に記載されている用語を示します。

斜体

イタリックは、ユーザーが特定の値を指定するプレースホルダー変数を示します。

固定幅フォント

固定幅フォントは、段落内のコマンド、URL、サンプル内のコード、画面に表示されるテキスト、または入力するテキストを示します。

1 イベント処理言語(EPL)の概要

この章では、ストリーミング・データ用の問合せ言語であるOracle Event Processing Language (EPL)の概要について説明します。EPLを使用すると、Oracle Event Processingを使用したデータ・ストリームに対して問合せを表現できます。EPLは非推奨になったことに注意してください。新たな開発ではOracle Continuous Query Language (Oracle CQL)を使用する必要があります。

この章には次の項が含まれます:

- EPL言語の概要

- イベント表現

- 処理モデル

- ユース・ケース

1.1 EPL言語の概要

イベント・プロセッサ・モジュールは、イベント表現、処理モデル、プログラミング・インタフェースおよび言語仕様という機能コンポーネントに分けることができます。

イベントはJavaBeans規則に準拠するPOJOとして表現されます。イベント・プロパティはPOJOのgetterメソッドを通じて公開されます。可能な場合は、EPL文の実行結果もPOJOとして返されます。ただし、イベント・ストリームが結合された場合など、型のないイベントが返される場合があります。この場合、Mapコレクション・インタフェースのインスタンスが返されます。詳細は、1.2項「イベント表現」を参照してください。

EPL処理モデルは連続的です。文の制約を満たす着信イベントを受信すると結果がすぐに出力されます。出力時には、出力ウィンドウに入れられる新しいイベントの挿入イベント、および出力ウィンドウから出される古いイベントの削除イベントという2種類のイベントが生成されます。これらのいずれかまたは両方のイベントが発生すると、リスナーにアタッチおよび通知されます。詳細は、1.3項「処理モデル」を参照してください。

着信イベントは、スライディング・ウィンドウまたはバッチ・ウィンドウで処理されます。スライディング・ウィンドウでは、1件の増分データに対して徐々にウィンドウが変化してイベントが処理されます。これに対し、バッチ・ウィンドウでは別個のデータ・チャンクに対してウィンドウが変化してイベントが処理されます。ウィンドウのサイズは、保持されるイベントの最大数またはイベントが保持される最大時間によって定義されます。

EPLプログラミング・インタフェースでは、文を個別にコンパイルするか、URLを通じて一括でロードできます。文の繰り返し、取得、開始、および停止が可能です。リスナーは文にアタッチされ、挿入イベントまたは削除イベントあるいはその両方が発生した場合に通知されます。

イベント処理言語はSELECT、FROM、WHERE、GROUP BY、HAVINGおよびORDER BY句を使用するSQLに似た言語です。ストリームはデータ・ソースとしての表に相当し、イベントはデータの基本単位としての行に相当します。イベントはデータで構成されるため、結合による相関、副問合せによるフィルタ処理、グループ化による集約などのSQLの概念が効果的に利用されます。INSERT INTO句は、下流処理が行われるイベントを他のストリームに転送する手段として作り直されています。JDBCを通じてアクセス可能な外部データは、ストリーム・データで照会および結合されます。SQLには含まれない、イベント処理に固有の言語構造を提供するRETAIN、MATCHING、OUTPUT句などの追加の句も使用できます。

RETAIN句は、本質的にはストリーム・データに対する仮想ウィンドウを定義することで、問合せが実行されるデータ量に制約を付与します。データの範囲が表で制限されるリレーショナル・データベース・システムとは異なり、イベント処理システムでは問合せのデータをより動的に制限する代替手段が提供されます。

MATCHING句は固有のパターンに一致するイベントのシーケンスを検出します。AND、OR、FOLLOWED BYなどの時相演算子や論理演算子を使用することで、任意の複雑な式を通じてイベントの発生またはイベントの欠落の両方を検出できます。

OUTPUT句は下流プロセッサの過負荷を回避するために文の実行結果を抑制します。結果的に生成された最初または最後のイベントの全体または一部が、時間ベースまたは行ベースのバッチで渡されます。

最後の節では、実際的なシナリオのもとで言語機能を例示するいくつかの使用例を示します。

1.2 イベント表現

EPLを使用すると、イベントをイベント・オブジェクトとして表現できます。詳細については、以下を参照。

- 1.2.1項「イベント・オブジェクト」

- 1.2.1項「Plain Old Java Objectイベント」

- 1.2.3項「Mapイベント」

すべてのイベント・オブジェクトにはプロパティが含まれます。詳細については、以下を参照。

- 1.2.4項「イベント・プロパティ」

- 1.2.5項「動的イベント・プロパティ」

- 1.2.6項「ユーザー定義関数を使用した他のイベント・プロパティの処理」

イベントはイベント・シンクによって消費されます。詳細は、1.2.7項「イベント・シンク」を参照してください。

1.2.1 イベント・オブジェクト

イベントは、過去に発生したアクションまたは状態変更の不変レコードです。イベント・オブジェクトの状態情報はイベント・プロパティで取得されます。イベントは、POJOまたはjava.util.Mapを拡張するcom.bea.wlevs.cep.event.MapEventObjectのいずれかで表現されます。

表1-1 イベント表現

Javaクラス

説明

java.lang.Object

JavaBeans規則に準拠し、getterメソッドを持つ任意のJava POJO。

com.bea.wlevs.ede.api.MapEventObject

Mapイベントはキーと値のペアです。

1.2.2 Plain Old Java Objectイベント

Plain old Java object (POJO)イベントは、JavaBeans形式のgetterメソッドを通じてイベント・プロパティを公開するオブジェクト・インスタンスです。イベント・クラスまたはインタフェースは必ずしも完全にJavaBeans仕様に準拠している必要はありませんが、EPLエンジンがイベント・プロパティを取得するためには必須のJavaBeans getterメソッドが存在している必要があります。

EPLでは、スーパー・クラスを拡張したり、1つまたは複数のインタフェースを実装したりするJavaBeans形式のイベント・クラスがサポートされています。また、EPL文ではJavaインタフェース・クラスおよび抽象クラスを参照できます。

イベントを表現するクラスは不変的に作成する必要があります。イベントは過去に発生した状態変更やアクションの記録であるため、関連するイベント・プロパティは変更不能である必要があります。ただし、これは厳密な要件ではなく、EPLエンジンでは可変イベントも受諾されます。

1.2.3 Mapイベント

イベントはjava.util.Mapインタフェースを拡張するcom.bea.wlevs.ede.api.MapEventObjectインタフェースを実装するオブジェクトによっても表現されます。Mapイベントのイベント・プロパティは、java.util.Mapインタフェースで公開されるgetメソッドを通じてアクセスできる各エントリの値です。

Map内のエントリはイベント・プロパティを表現します。EPL文で指定されたイベント・プロパティ名をエンジンが参照できるようするために、キーの型はjava.util.Stringである必要があります。値には任意の型を使用できます。MapではPOJOも値として示されます。

1.2.4 イベント・プロパティ

EPL式では、simple、indexed、mapped、およびnestedのイベント・プロパティを使用できます。以下の表に、異なる型のプロパティ、およびイベント式での構文の概要を示します。この構文を使用すると、JavaBeansオブジェクト・グラフ、XML構造、およびMapイベントを深い所まで照会できます。

表1-2 イベント・プロパティ

タイプ

説明

構文

例

Simple

取得可能な1つの値を持つプロパティ。プロパティ型にはプリミティブ型(intやjava.lang.Stringなど)または他の複合型を使用できます。

name

sensorId

Nested

nestedプロパティは、イベントの他のプロパティ内に存在するプロパティです。Mapとして表現されるイベントには他のPOJOイベントのみをネストでき、他のMapイベントはネストできません。

name.nestedname

sensor.value

Indexed

indexedプロパティにはオブジェクトの順序付きコレクションが格納され(すべて同一の型)、整数の値を持つ正の数の索引(添字)によって個別にアクセスされます。Mapとして表現されるイベントではindexedプロパティはサポートされません。

name[index]

sensor[0]

Mapped

mappedプロパティはキーを持つオブジェクトのコレクションを格納します(すべて同一の型)。標準のJavaBeans APIに対する拡張機能として、EPLは文字列値のキーを受け入れるプロパティをmappedプロパティと見なします。マップとして表現されるイベントではindexedプロパティはサポートされません。

name('key')

sensor('light')

次のようなEmployeeEventイベント・クラスがあると想定します。この例のmappedプロパティとindexedプロパティではJavaオブジェクトが返されますが、Java言語のプリミティブ型(intやStringなど)を返すこともできます。AddressオブジェクトおよびEmployeeオブジェクト自身は、Addressオブジェクトの町名やEmployeeオブジェクトの従業員名など内部にネストするプロパティを持つことができます。

public class EmployeeEvent {
public String getFirstName();
public Address getAddress(String type);
public Employee getSubordinate(int index);
public Employee[] getAllSubordinates();
}

simpleイベント・プロパティにはプロパティ値を返すgetterメソッドが必要です。上の例では、getFirstName getterメソッドによって型StringのfirstNameイベント・プロパティが返されます。

indexedイベント・プロパティには次のいずれかのgetterメソッドが必要です。

- getSubordinateメソッドのように、整数型のキー値を受け取り、プロパティ値を返すメソッド。

- Employeeの配列を返すgetAllSubordinates getterメソッドのように、配列型を返すメソッド。

EPL文では、indexedプロパティへのアクセス時に構文property[index]を使用します。

mappedイベント・プロパティでは、getAddressメソッドのように、String型のキー値を受け取りプロパティ値を返すgetterメソッドが必要です。EPL文またはイベント・パターン文では、mappedプロパティへのアクセス時に構文property ('key')を使用します。

nestedイベント・プロパティにはネストするオブジェクトを返すgetterメソッドが必要です。getAddressおよびgetSubordinateメソッドは、ネストするオブジェクトを返すmappedプロパティとindexedプロパティです。EPL文では、nestedプロパティへのアクセス時に構文property.nestedPropertyを使用します。

すべてのEPL文では、1つまたは複数のイベント・プロパティ名が予期される任意の場所で、indexedプロパティ、mappedプロパティ、nestedプロパティ、またはこれらの組み合わせを使用できます。次の例では、indexed、mapped、およびnestedプロパティの異なる組み合わせを示します。

address('home').streetName
subordinate[0].name='anotherName'
allSubordinates[1].name
subordinate[0].address('home').streetName

同様に、この構文は、SELECTリスト、WHERE句、JOIN条件などEPL文でイベント・プロパティ名が予期されるすべての場所で使用できます。

SELECT firstName, address('work'), subordinate[0].name, subordinate[1].name
FROM EmployeeEvent RETAIN ALL
WHERE address('work').streetName = 'Park Ave'

1.2.5 動的なイベント・プロパティ

動的な(つまり、チェックされていない)プロパティは、文のコンパイル時に認識される必要のないイベント・プロパティです。Oracle Event Processingではこれらの動的プロパティを実行時に解決します。

動的プロパティの背景にある概念としては、基になるイベント表現で必ずしも事前にプロパティを認識する必要がないということがあります。文のコンパイル時に認識されない追加のプロパティが基になるイベントに含まれていて、EPL文を使用してこれらのプロパティを照会する必要がある場合があります。この概念は、豊富な機能を持つオブジェクト指向のドメイン・モデルを表現するイベントで特に便利です。

動的プロパティの構文は、プロパティ名と疑問符から成ります。indexed、mapped、およびnestedプロパティを動的プロパティにすることもできます。以下の表に、動的イベント・プロパティの型、およびそれらの識別のために使用される構文を示します。

表1-3動的プロパティの構文

イベント・プロパティ型

構文

動的なSimple

name?

動的なIndexed

name[index]?

動的なMapped

name('key')?

動的なNested

name?.nestedPropertyName

動的プロパティでは常にjava.lang.Object型が返されます。実行時に処理されるイベントに動的プロパティが存在しない場合、動的プロパティではnull値が返されます。

たとえば、itemプロパティを指定するOrderEventイベントを考えます。itemプロパティの型はObjectであり、ServiceまたはProductのいずれかのインスタンスへの参照が保持されます。どちらになるかは実行時に明らかになります。さらに、ServiceおよびProductクラスでpriceというプロパティが提供されると想定します。動的プロパティを使用すると、以下のように、いずれかのオブジェクト(ServiceまたはProduct)からpriceプロパティを取得する問合せを指定できます。

SELECT item.price?
FROM OrderEvent RETAIN ALL EVENTS

2つ目の例として、Serviceクラスに含まれているserviceNameプロパティがProductクラスには含まれていないと想定します。実行時、以下の問合せはServiceオブジェクトの場合にserviceNameプロパティの値を返します。しかし、Productオブジェクトに対して問合せを実行すると、ProductsにはserviceNameプロパティが含まれないためnull値が返されます。

SELECT item.serviceName?
FROM OrderEvent RETAIN ALL EVENTS

次に、OrderEventに複数の実装クラスがあり、そのうちのいくつかにのみtimestampプロパティが含まれている場合を考えます。以下の問合せは、プロパティが含まれているOrderEventインタフェースで実装されているtimestampプロパティを返します。

SELECT timestamp?
FROM OrderEvent RETAIN ALL EVENTS

前述の問合せは、型java.lang.Objectのtimestamp?という1つの列を返します。

動的プロパティをネストした場合は、動的プロパティの下にあるすべてのプロパティも動的プロパティと見なされます。次の例は、detail動的プロパティで返されたオブジェクトのdirectionプロパティをたずねています。

SELECT detail?.direction
FROM OrderEvent RETAIN ALL EVENTS

上の問合せは、以下と同等です。

SELECT detail?.direction?
FROM OrderEvent RETAIN ALL EVENTS

以下は、動的プロパティと共に使用すると便利な機能です。

- CAST関数は動的プロパティの値(または式の値)を指定の型にキャストします。4.1.7項「CAST関数」を参照してください。

- EXISTS関数は動的プロパティが存在するかどうかをチェックします。イベントにその名前のプロパティが存在する場合はtrueを返し、イベントにプロパティが存在しない場合はfalseを返します。4.1.8項「EXISTS関数」を参照してください。

- INSTANCEOF関数は動的プロパティの値(または式の値)が指定の型であるかどうかをチェックします。4.1.6項「INSTANCEOF関数」を参照してください。

1.2.6 ユーザー定義関数を使用した他のイベント・プロパティの処理

EPLでサポートされていないデータ型をイベントが使用している場合は、ユーザー定義関数を作成してEPL問合せでそのデータ型を評価できます。

例1-1のようなenumデータ型があるとします。例1-2に示すイベントでは、このenumデータ型を使用しています。EPLではenumデータ型がサポートされていません。

例1-1 列挙データ型ProcessStatus

package com.oracle.app;

public enum ProcessStatus {
OPEN(1),
CLOSED(0)}
}

例1-2 列挙データ型ProcessStatusを使用するイベント

package com.oracle.app;

import com.oracle.capp.ProcessStatus;

public class ServiceOrder {
private String serviceOrderId;
private String electronicSerialNumber;
private ProcessStatus status;
...
}

ユーザー定義関数を作成し(例1-3を参照)、アプリケーション・アセンブリ・ファイルに関数を登録することで(例1-4を参照)、このenumデータ型をEPL問合せで評価できます(例1-5を参照)。

例1-3 列挙データ型を評価するユーザー定義関数

package com.oracle.app;

import com.oracle.capp.ProcessStatus;
public class CheckIfStatusClosed {
public boolean execute(Object[] args) {
ProcessStatus arg0 = (ProcessStatus)args[0];
if (arg0 == ProcessStatus.OPEN)
return Boolean.FALSE;
else
return Boolean.TRUE;
}
}

例1-4 アプリケーション・アセンブリ・ファイルへのユーザー定義関数の登録

<wlevs:processor id="testProcessor">
<wlevs:listener ref="providerCache"/>
<wlevs:listener ref="outputCache"/>
<wlevs:cache-source ref="testCache"/>
<wlevs:function function-name="statusClosed" exec-method=”execute” />
<bean class="com.oracle.app.CheckIfStatusClosed"/>
</wlevs:function>
</wlevs:processor>

例1-5 ユーザー定義関数を使用したEPL問合せでの列挙データ型の評価

<query id="rule-04"><![CDATA[
SELECT
meter.electronicSerialNumber,
meter.exceptionKind
FROM
MeterLogEvent AS meter,
ServiceOrder AS svco
WHERE
meter.electronicSerialNumber = svco.electronicSerialNumber and
svco.serviceOrderId IS NULL OR statusClosed(svco.status)
]]></query>

詳細は、第4章「EPLリファレンス関数」を参照してください。

1.2.7 イベント・シンク

イベント・シンクは、EPL文で指定された条件に一致するイベントが発生した場合に、プログラムによる通知を受信する手段を提供します。以下の場合に、シンクへの通知が行われます。

- EPL文で指定された条件に一致する新しいイベントが発生した場合。これらはISTREAMイベントと呼ばれます。

- 以前EPL文で指定された条件と一致していた古いイベントが、期限切れになったか、または新たに発生した着信イベントがこれらに取って代わったために、出力ウィンドウからプッシュされた場合。これらはRSTREAMイベントと呼ばれます。

これらの通知が発生した場合の詳しい例は、1.3項「処理モデル」で説明しています。

ISTREAMイベントを受信するには、com.bea.wlevs.ede.api.EventSinkインタフェースを使用します。実装では、結果が使用可能になった場合にエンジンによって呼び出される単一のonEventメソッドを指定する必要があります。このインタフェースでは、新しいイベントのみがリスナーに送信されます。

public interface EventSink extends EventListener {
void onEvent(List<Object> newEvents)
throws RejectEventException;
}

エンジンでは、文の結果をPOJOまたはMapEventObjectインスタンスのリストとしてイベント・シンクに提供します。ワイルドカードでの選択の場合、結果はエンジンに送信された元のイベント・オブジェクト・タイプに一致します。式のjoinsおよびselect句の場合、結果のオブジェクトはcom.bea.wlevs.ede.api.MapEventObjectインタフェースを実装します。

1.3 処理モデル

EPL処理モデルは、1.3.1項「イベント・ストリーム」で説明するイベント・ストリームに基づいています。

イベント・ストリームで操作する問合せは、次の項に従って表現します。

- 1.3.2項「スライディング・ウィンドウ」

- 1.3.3項「バッチ・ウィンドウ」

- 1.3.4項「副問合せとWHERE句」

- 1.3.5項「集約」

1.3.1 イベント・ストリーム

EPL処理モデルは継続的です。文へのリスナーはエンジンでその文のイベントが処理されるとすぐに、文で選択されているイベント・ストリーム、RETAIN句の制約、フィルタ、および出力レートに応じて更新されたデータを受信します。

この節では、非常に単純なEPL文の出力を示します。この文はデータ・ウィンドウを使用せず、いずれのフィルタも適用せずにイベント・ストリームを選択します。

SELECT * FROM Withdrawal RETAIN ALL

この文はすべてのWithdrawalイベントを選択します。エンジンでWithdrawal型またはWithdrawalの下位の型のイベントが処理されるたびに、すべての更新リスナーが呼び出され、文の各リスナーに新しいイベントが渡されます。

挿入ストリームという用語は、新しいイベントが到着し、データ・ウィンドウまたは集約に入れられることを示します。この例の挿入ストリームは、到着するWithdrawalイベントのストリームであり、更新リスナーに新しいイベントとしてポストされます。

次の図は、時間の経過に沿って到着する一連のWithdrawalイベント1 - 6を示しています。この図を含め、この節に示す図のカッコ内の数字はWithdrawalイベントのamountプロパティの値を示します。

図1-1 イベント・ストリームの例

前述の例の文ではRETAIN句が指定されていないため、新しいイベントのみがエンジンによって文のリスナーにポストされ、古いイベントはポストされません。

1.3.2 スライディング・ウィンドウ

スライディング・ウィンドウには、行ベースおよび時間ベースの2種類があります。以下の節では、これらの各項目について示します。

1.3.2.1 行ベースのスライディング・ウィンドウ

行ベースのスライディング・ウィンドウでは、ストリームの直前のN件のイベントのみを保持するようエンジンに通知します。次の文は、Withdrawalイベント・ストリームに長さ枠を適用します。この文は、データ枠、およびデータ枠に入るまたは枠から出るイベントの概念を示しています。

SELECT * FROM Withdrawal RETAIN 5 EVENTS

この文のウィンドウのサイズは5件のイベントです。エンジンにより到着するすべてのWithdrawalイベントがウィンドウに入れられます。ウィンドウが一杯になると、最も古いWithdrawalイベントがウィンドウからプッシュされます。エンジンは更新リスナーに対し、ウィンドウに入れられるすべてのイベントを新しいイベントとして示し、ウィンドウから出されるすべてのイベントを古いイベントとして示します。

挿入ストリームという用語が到着する新しいイベントを示すのに対し、削除ストリームという用語はデータ・ウィンドウから出されるイベント、または集約値を変更するイベントを示します。この例の削除ストリームは、長さウィンドウから退去するWithdrawalイベントのストリームであり、これらのイベントは古いイベントとして更新リスナーにポストされます。

次の図は、イベントの到着に応じて変化する長さウィンドウの内容と、更新リスナーにポストされるイベントを示します。

図1-2 行ベースのスライディング・ウィンドウの例

以前と同様、到着するすべてのイベントは新しいイベントとして更新リスナーにポストされます。また、イベントW_1は、イベントW_6の到着時に長さウィンドウから出され、古いイベントとして更新リスナーにポストされます。

長さウィンドウと同様、時間ウィンドウでは指定の期間内で最新のイベントが保持されます。たとえば、5秒の時間ウィンドウでは直前の5秒間のイベントが保持されます。秒の経過につれて、時間ウィンドウでは最も古いイベントがウィンドウから実際にプッシュされ、その結果1つまたは複数の古いイベントが更新リスナーにポストされます。

EPLでは、省略可能なISTREAMおよびRSTREAMキーワードがSELECT句およびINSERT INTO句でサポートされています。これにより、データ・ウィンドウに入れられるイベントまたは出されるイベントのみを転送したり、現在または以前の集約値のみを選択したりするなど、挿入ストリームまたは削除ストリームに基づいた操作を行うようエンジンに通知できます。

1.3.2.2 時間ベースのスライディング・ウィンドウ

時間ベースのスライディング・ウィンドウは、システム時間に基づいて、過去の指定された時間間隔までの範囲を示す変化するウィンドウです。行ベースのスライディング・ウィンドウと同様、時間ベースのスライディング・ウィンドウでは問合せで処理されるイベント数を制限できます。

次の図は、時間ウィンドウの動作を示しています。この図では、イベントのグループ化やフィルタ処理を行わず、単にイベントを選択する問合せを想定します。

SELECT * FROM Withdrawal RETAIN 4 SECONDS

この図は指定の時間tから開始し、t+4秒、t+5秒、およびそれ以降の時点における時間ウィンドウの内容を示しています。

図1-3 時間ベースのスライディング・ウィンドウの例

図では、以下の動作を示しています。

1. 時間t + 4秒の時点でイベントW_1が到着し、時間ウィンドウに入ります。エンジンにより新しいイベントが更新リスナーに報告されます。

2. 時間t + 5秒の時点でイベントW_2が到着し、時間ウィンドウに入ります。エンジンにより新しいイベントが更新リスナーに報告されます。

3. 時間t + 6.5秒の時点でイベントW_3が到着し、時間ウィンドウに入ります。エンジンにより新しいイベントが更新リスナーに報告されます。

4. 時間t + 8秒の時点でW_1が時間ウィンドウから離れます。エンジンによりイベントは古いイベントとして更新リスナーに報告されます。

実際的な例として、直前の4秒間の各口座の平均引出し額が1000を超えるすべての口座を決定する必要がある場合を考えます。この問題を解決する文は、以下のとおりです。

SELECT account, AVG(amount)
FROM Withdrawal RETAIN 4 SECONDS
GROUP BY account
HAVING amount > 1000

1.3.3 バッチ・ウィンドウ

行ベースおよび時間ベースのウィンドウは両方ともバッチ処理に対応できます。次の節では、これらの概念について示します。

1.3.3.1 時間ベースのバッチ・ウィンドウ

時間ベースのバッチ・ウィンドウではイベントがバッファ・リングされ、指定された時間間隔ごとにそれらのイベントが1回の更新で解放されます。長さベースのバッチ・ウィンドウと同様、時間ベースのバッチ・ウィンドウではイベントの評価が制御されます。

次の図は、時間バッチ・ビューの動作を示しています。この図では、以下の単純な問合せを想定しています。

SELECT * FROM Withdrawal RETAIN BATCH OF 4 SECONDS

この図は指定の時間tから開始し、t + 4秒、t + 5秒、およびそれ以降の時点における時間ウィンドウの内容を示しています。

図1-4 時間ベースのバッチ・ウィンドウの例

図では、以下の動作を示しています。

1. 時間t + 1秒の時点でイベントW_1が到着し、バッチに入ります。更新リスナーへの通知の呼出しは発生しません。

2. 時間t + 3秒の時点でイベントW_2が到着し、バッチに入ります。更新リスナーへの通知の呼出しは発生しません。

3. 時間t + 4秒の時点でエンジンによりバッチ内のイベントが処理され、新しいバッチが開始されます。エンジンによりイベントW_1およびW_2が更新リスナーに報告されます。

4. 時間t + 6.5秒の時点でイベントW_3が到着し、バッチに入ります。更新リスナーへの通知の呼出しは発生しません。

5. 時間t + 8秒の時点でエンジンによりバッチ内のイベントが処理され、新しいバッチが開始されます。エンジンによりイベントW_3が新しいデータとして更新リスナーに報告されます。エンジンによりイベントW_1およびW_2が古いデータ(前回のバッチ)として更新リスナーに報告されます。

1.3.3.2 行ベースのバッチ・ウィンドウ

行ベースのウィンドウでもバッチ処理を行えます。たとえば、次の問合せは5件のイベントが受信されるまで何も処理せずに待機します。

SELECT * FROM Withdrawal RETAIN BATCH OF 5 EVENTS

5件のイベントを受信すると問合せが実行され、再び新しい5件のイベントを受信するまで処理を待機します。

1.3.4 副問合せとWHERE句

イベント・ストリームに対するフィルタは副問合せ式内で使用され、イベントがデータ・ウィンドウ内に入る前にイベントを指定のストリームからフィルタで除外します。このフィルタ処理はWHERE句の実行前に発生します。残りのEPL文で処理されるデータ量が軽減され、パフォーマンスが向上するため、可能な場合は、WHERE句に対し、副問合せ内でフィルタ処理を完了します。

次の文は、金額が200以上のWithdrawalイベントを選択する副問合せを示します。

SELECT * FROM (SELECT * FROM Withdrawal WHERE amount >= 200) RETAIN 5 EVENTS

この副問合せでは、金額が200未満のWithdrawalイベントは外部問合せのウィンドウに入らず、そのため更新リスナーには渡されません。

図1-5 副問合せとWHERE句の例

文中のWHERE句およびHAVING句では、文のデータ・ウィンドウや他のビュー内でイベントが処理された後、処理の後半で可能性のある結果行が消去されます。

次の文は、副問合せを使用せず、WithdrawalイベントにWHERE句を適用します。

SELECT * FROM Withdrawal RETAIN 5 EVENTS WHERE amount >= 200

WHERE句は新しいイベントと古いイベントの両方に適用されます。次の図に示すとおり、到着するイベントは"amount"プロパティの値にかかわらずウィンドウに入れられます。ただし、WHERE句を満たすイベントのみが更新リスナーに渡されます。また、イベントはデータ・ウィンドウを離れますが、WHERE句の条件を満たすイベントのみが古いイベントとして更新リスナーにポストされます。

図1-6 行ベースのスライディング・ウィンドウに到達するイベント

イベント・ストリームのフィルタは指定可能なフィルタ・タイプの中でより限定的ですが、WHERE句には複雑な条件を含めることができます。次の文のWHERE句はWHERE句内のjava.lang.Math Javaライブラリ・クラスのceil関数に適用されます。INSERT INTO句により、最初の文の結果が2番目の文で使用可能になります。

INSERT INTO BigWithdrawal
SELECT * FROM Withdrawal RETAIN ALL WHERE Math.ceil(amount) >= 200
SELECT * FROM BigWithdrawal RETAIN ALL

1.3.5 集約

集約関数を介してイベントを集約する文では、集約された値の変化に伴い、削除ストリーム・イベントもポストされます。2つのWithdrawalイベントを受信した場合にアラートを発生する以下の文について考えます。

SELECT COUNT(*) AS mycount
FROM Withdrawal RETAIN ALL
HAVING COUNT(*) = 2

エンジンで2つ目のwithdrawalイベントが検出されると、エンジンにより新しいイベントが更新リスナーにポストされます。その新しいイベントのmycountプロパティの値は2です。さらに、エンジンで3つ目のWithdrawalイベントが検出されると、以前のカウントの値を含む古いイベントがエンジンにより更新リスナーにポストされます。その古いイベントのmycountプロパティの値も2です。

ISTREAMまたはRSTREAMキーワードを使用すると、更新リスナーにポストされる新しいイベントまたは古いイベントを除去できます。次の文では、ISTREAMキーワードを使用した結果、2つ目のWithdrawalイベントを受信した際にエンジンで更新リスナーが1回のみ呼び出されます。

SELECT ISTREAM COUNT(*) AS mycount
FROM Withdrawal RETAIN ALL
HAVING COUNT(*) = 2

1.4 使用例

次の使用例では、言語のさまざまな機能の使用方法の例を示します。

1.4.1 フィードごとのレートの計算

スループットの統計および急速な減衰の検出のために、各マーケット・データ・フィードごとに毎秒のティック数を計算します。

マーケット・データ・イベント・ストリームのソースからの1秒間のイベントをバッチにまとめるEPL文を使用できます。フィードおよびフィードごとのイベント数を出力値として指定します。このデータをさらに処理するために、出力イベントをTicksPerSecondイベント・ストリームに挿入します。

INSERT INTO TicksPerSecond
SELECT feed, COUNT(*) AS cnt
FROM MarketDataEvent
RETAIN BATCH OF 1 SECOND
GROUP BY feed

1.4.2 最高値の株価の計算

最高値の株価を計算するため、固有の各銘柄記号に対し、トランザクションのブロック・サイズが10を超える100件のイベントを保持するスライディング・ウィンドウを定義します。たとえば、5000の銘柄記号がある場合、5,000 x 100の5,000,000件のイベントが保持されます。ブロック・サイズが10を越えるMarketTradeイベントのみがウィンドウに入れられ、価格の高い上位100件のイベントのみが保持されます。

結果は銘柄記号別にグループ化され、平均価格が100未満の銘柄記号は出力から除外され、アルファベット順に並べられます。

SELECT symbol, AVG(price)
FROM (SELECT * FROM MarketTrade WHERE blockSize > 10)
RETAIN 100 EVENTS WITH LARGEST price PARTITION BY symbol
GROUP BY symbol
HAVING AVG(price) >= 100
ORDER BY symbol

1.4.3 位置データの分類

高速道路の自動車の位置および方向に関する情報が含まれる自動車位置のイベント・データに基づいて、自動車が進むルートを検出します。まずcarIdによってデータを分類することで特定の自動車に関する情報を特定し、次に高速道路、方向で分類し、方向をプロットします。これらの情報に基づいて自動車の速度が計算されます。

最初のPARTITION BY carIdでは自動車位置イベントが自動車ごとにグループ化され、さらにその後のPARTITION BY expressway PARTITION BY directionではより詳細な位置および方向のプロパティ値によって、データがさらに分類されます。この問合せで保持されるイベント数は4ですが、これは最後のPARTITION BY句で保持された最大数に適用されます。このため、個別の分類プロパティ値に対し、最大4件のイベントが保持されます。

SELECT carId, expressway, direction,
SUM(segment)/(MAX(timestamp)-MIN(timestamp)) AS speed
FROM CarLocationEvent
RETAIN 4 events
PARTITION BY carId PARTITION BY expressway PARTITION BY direction

1.4.4 急速な減衰の検出

任意のタイミングの毎秒ティック数が直前の10秒間の毎秒ティック数の75%を下回った場合にアラートを発することにより、急速な減衰を定義します。

直前の10秒間の毎秒ティック数は、最初の文で計算されたTicksPerSecondイベントを使用し、直前の10秒間の平均を取ることで計算できます。次に、現在のレートを変化する平均値と比べ、平均値の75%に満たないレートをフィルタ処理します。

SELECT feed, AVG(cnt) AS avgCnt, cnt AS feedCnt
FROM TicksPerSecond
RETAIN 10 seconds
GROUP BY feed
HAVING cnt < AVG(cnt) * 0.75

1.4.5 ネットワークの異常性の検出

顧客側でのチェック・インの作業中に、端末でハードウェアの問題が検出されたり、ネットワークが停止したりする場合があります。このような状況では、顧客を支援するチーム・メンバーに警告する必要があります。端末で問題が検出された場合はOutOfOrderイベントが発行されます。パターンでは端末でout-of-orderが通知され、顧客がチェック・イン処理中である状況が検出されます。

SELECT ci.term
MATCHING ci:=Checkin FOLLOWED BY
( OutOfOrder (term.id=ci.term.id) AND NOT
(Cancelled (term.id=ci.term.id) OR
Completed (term.id=ci.term.id) ) WITHIN 3 MINUTES )

セルフサービスの各端末では、以下の4つのうちいずれかのイベントを発行できます。

- Checkin - 顧客がチェック・イン・ダイアログを開始したことを示します。

- Cancelled - 顧客がチェック・イン・ダイアログを取り消したことを示します。

- Completed - 顧客がチェック・イン・ダイアログを完了したことを示します。

- OutOfOrder - 端末でハードウェアの問題が検出されたことを示します。

すべてのイベントでは、イベントをパブリッシュした端末の情報と、タイム・スタンプが提供されます。端末の情報はtermというプロパティに格納され、端末のidが指定されます。すべてのイベントは類似の情報を含んでいるため、各イベントを基本クラスTerminalEventのサブタイプとしてモデル化し、すべてのイベントで共有される端末情報がこのクラスで提供されます。これにより、すべての端末イベントを多態的に扱うことができ、派生したイベント・タイプを親イベント・タイプと同様に扱うことができるため問合せが簡素化されます。

1.4.6 欠落したイベントの検出

Statusイベントは定期的に60秒間隔で到着するため、MATCHING句を使用した一時的なパターン照合を利用して、時間通りに到着しなかったイベントを検出できます。WITHIN演算子を使用して送信や処理による遅延の可能性を考慮した65秒のウィンドウを保持し、NOT演算子を使用してterm.idがT1に等しいStatusイベントの欠落を検出します。

SELECT 'terminal 1 is offline'
MATCHING NOT Status(term.id = 'T1') WITHIN 65 SECONDS
OUTPUT FIRST EVERY 5 MINUTES

1.4.7 端末アクティビティ・データの概要

端末アクティビティの統計情報をスタッフ側にリアル・タイムに提示することで、システムをモニターし、問題を特定することが可能になります。次のサンプル問合せでは、イベント・タイプごとのカウントが毎分取得されます。CountPerTypeイベント・ストリームを通じて使用可能なこのデータをさらに利用して、記録された使用法パターンに対して結合および比較したり、単にアクティビティをリアル・タイムで要約できます。

INSERT INTO CountPerType
SELECT type, COUNT(*) AS countPerType
FROM TerminalEvent
RETAIN 10 MINUTES
GROUP BY type
OUTPUT ALL EVERY 1 MINUTE

1.4.8 センサー・データの読取り

このサンプルでは、いずれかのリーダーの範囲内にパレットが含まれている場合に、RFIDリーダーのアレイがRFIDタグを検知します。リーダーは、リーダーのセンサーID、調査時刻、調査したタグなどの調査情報が含まれるXMLドキュメントを生成します。リーダーのセンサーIDごとに直前の60秒間のタグの総数が計算されます。

SELECT ID AS sensorId, SUM(countTags) AS numTagsPerSensor
FROM AutoIdRFIDExample
RETAIN 60 SECONDS
WHERE Observation[0].Command = 'READ_PALLET_TAGS_ONLY'
GROUP BY ID

1.4.9 トランザクション・イベントの組合せ

このサンプルでは、トランザクションの各コンポーネントが含まれている組み合わせイベントを検出するEPL文を作成します。イベント照合は、直前の30分間に到着したイベントに制限されます。この文はINSERT INTO構文を使用してCombinedEventイベント・ストリームを生成します。

INSERT INTO CombinedEvent(transactionId, customerId, supplierId,
latencyAC, latencyBC, latencyAB)
SELECT C.transactionId, customerId, supplierId,
C.timestamp - A.timestamp,
C.timestamp - B.timestamp,
B.timestamp - A.timestamp
FROM TxnEventA A, TxnEventB B, TxnEventC C
RETAIN 30 MINUTES
WHERE A.transactionId = B.transactionId AND
B.transactionId = C.transactionId

1.4.10 リアル・タイム・パフォーマンスのモニター

過去30分間のイベントの最小、最大、および平均の合計レイテンシ(AおよびCの間の時間差)を導くには、以下のEPLを使用できます。また、イベント・サーバーをモニターするため、ダッシュボードUIはイベントのサブセットをサブスクライブして、サーバーとエンド・ツー・エンドのレイテンシなどのシステム・パフォーマンスを計測します。システム全体を流れる各イベントがUIでモニターされることは期待できないため、モニター・アプリケーションでの処理が可能なイベントのサブセットに出力を制限する手段が必要になります。最後の1つのイベントのみ、またはすべてのイベントを出力できます。

SELECT MIN(latencyAC) as minLatencyAC,
MAX(latencyAC) as maxLatencyAC,
AVG(latencyAC) as avgLatencyAC
FROM CombinedEvent
RETAIN 30 MINUTES
GROUP BY customerId
OUTPUT LAST 50 EVERY 1 SECOND

1.4.11 削除されたトランザクション・イベントの検出

OUTER JOINを使用すると、3つのすべてのイベントを通じて成功しなかったトランザクションを検出できます。TxnEventAまたはTxnEventBイベントが、直前の30分間のイベントで構成されるそれぞれの時間ウィンドウを離れた場合、EPLによりEventC行が見つからない行がフィルタで除外されます。

SELECT *
FROM TxnEventA A
FULL OUTER JOIN TxnEventC C ON A.transactionId = C.transactionId
FULL OUTER JOIN TxnEventB B ON B.transactionId = C.transactionId
RETAIN 30 MINUTES
WHERE C.transactionId is null

2 EPLリファレンス: 句

この章では、イベント処理言語(EPL)の句のリファレンスについて説明します。EPLは非推奨になったことに注意してください。新たな開発ではOracle Continuous Query Language (Oracle CQL)を使用する必要があります。

この章には次の項が含まれます:

- EPL文で使用可能な句の概要

- SELECT

- FROM

- RETAIN

- MATCHING

- WHERE

- GROUP BY

- HAVING

- ORDER BY

- OUTPUT

- INSERT INTO

- 単純副問合せと相関副問合せ

- パラメータ化された問合せ

2.1 EPL文で使用可能な句の概要

イベント処理言語(EPL)の上位レベルBNFは以下のとおりです。

[ INSERT INTO insert_into_def ]
SELECT select_list
{ FROM stream_source_list /  MATCHING pattern_expression }
[ WHERE search_conditions ]
[ GROUP BY grouping_expression_list ]
[ HAVING grouping_search_conditions ]
[ ORDER BY order_by_expression_list ]
[ OUTPUT output_specification ]

リテラル・キーワードでは大文字と小文字が区別されません。以降の節では、それぞれの句について詳しく示します。組込みの演算子と関数の詳細は、第3章「EPLリファレンス: 演算子」および第4章「EPLリファレンス: 関数」を参照してください。

2.2 SELECT

すべてのEPL文にはSELECT句が必要です。SELECT句を使用して、ワイルドカード*ですべてのプロパティを選択するか、イベント・プロパティおよび式のリストを指定できます。SELECT句は、文でパブリッシュされる、または文から抽出される結果イベントのイベント・タイプ(イベント・プロパティの名前と型)を定義します。

SELECT句では、文にアタッチされている更新リスナーにイベントがポストされるしくみを制御する省略可能なISTREAMおよびRSTREAMキーワードも提供されます。

SELECT句の構文の概要を次に示します。

SELECT [RSTREAM | ISTREAM] ( expression_list | * )

次の例では、イベント・データのソースを定義するFROM句を使用します。FROM句については、2.3項「FROM」で説明しています。

2.2.1 特定のイベント・プロパティの選択

返される特定のイベント・プロパティを選択するには:

SELECT event_property [, event_property] [, ...]
FROM stream_def

次の文では、直前の100の株価表示イベントで、量のカウントと標準偏差が選択されます。

SELECT COUNT, STDDEV(volume)
FROM StockTick RETAIN 100 EVENTS

2.2.2 式の使用

The SELECT 句には1つまたは複数の式を含めることができます。

SELECT expression [, expression] [, ...]
FROM stream_def

次の文では、株価表示イベントの直前30秒間の時間バッチで価格と量の乗算値が選択されます。

SELECT volume * price
FROM StockTick RETAIN BATCH OF 30 SECONDS

2.2.3 イベント・プロパティのエイリアス

以下の構文で、イベント・プロパティおよび式のエイリアスを指定できます。

SELECT [event_property | expression] AS identifier [,…]

次の文では、価格と量の乗算値が選択され、イベント・プロパティの名前volPriceが指定されます。

SELECT volume * price AS volPrice
FROM StockTick RETAIN 100 EVENTS

2.2.4 すべてのイベント・プロパティの選択

ストリーム内のすべてのイベント・プロパティを選択する構文は以下のとおりです。

SELECT *
FROM stream_def

次の文では、直前の30秒間のすべてのStockTickイベント・プロパティが選択されます。

SELECT *
FROM StockTick RETAIN 30 SECONDS

結合文では、SELECT *構文を使用すると、結合されたストリーム自身を表すイベントが含まれるイベント・プロパティが選択されます。

SELECT句ではワイルドカード*と式を組み合せることもできます。この組み合わせにより、すべてのイベント・プロパティのほか、SELECT句の一部として含まれる追加の式で指定された計算値が選択されます。この例では、株価表示イベントのすべてのプロパティのほか、pricevolumeという名前が指定された、価格と量により計算された乗算値が選択されます。

SELECT *, price * volume AS pricevolume
FROM StockTick RETAIN ALL

2.2.5 STREAMおよびRSTREAMキーワードによる新しいイベントと古いイベントの選択

SELECT句の省略可能なISTREAMおよびRSTREAMキーワードは、リスナーを更新するために文にポストするイベント・ストリームを定義します。いずれのキーワードも指定しない場合、エンジンでは挿入ストリームおよび削除ストリームの両方のイベントが文のリスナーにポストされます。挿入ストリームはそれぞれの枠、ストリーム、または集約に入れられたイベントで構成され、削除ストリームはそれぞれの枠または変更された集約結果を離れたイベントで構成されます。挿入イベントおよび削除イベントの詳細は、1.2.7項「イベント・シンク」で説明しています。

STREAMキーワードを指定することにより、更新リスナーに挿入ストリーム・イベントのみをポストするようエンジンに通知できます。エンジンでは削除ストリーム・イベントがポストされなくなります。RSTREAMキーワードを指定することにより、更新リスナーに削除ストリーム・イベントのみをポストするようエンジンに通知できます。エンジンでは挿入ストリーム・イベントがポストされなくなります。

次の文では、30秒の時間ウィンドウを離れるイベントのみが選択されます。

SELECT RSTREAM *
FROM StockTick RETAIN 30 SECONDS

SELECT句のISTREAMおよびRSTREAMキーワードは、2.11項「INSERT INTO」で説明しているとおり、INSERT INTO句で使用可能な同じ名前のキーワードに対応します。SELECT句のキーワードが文に対する更新リスナーにポストされるイベント・ストリームを制御するのに対し、INSERT INTO句の同名のキーワードはエンジンによって他の文で使用できるようになるイベント・ストリームを指定します。

2.3 FROM

すべてのEPL文にはFROMまたはMATCHING句のいずれかが必要です。FROM句は、イベント・データのソースとして1つまたは複数のイベント・ストリームを指定します。MATCHING句については、2.5項「MATCHING」で説明しています。

FROM stream_expression [ inner_join | outer_join ]

inner_joinではストリーム式のカンマ区切りのリストとして指定します。

(, stream_expression )*

outer_joinの定義は次のとおりです。

((LEFT|RIGHT|FULL) OUTER JOIN stream_expression ON prop_name = prop_name)*

内部結合の詳細は、2.3.1項「内部結合」、外部結合の詳細は、2.3.2項「外部結合」で説明しています。

stream_expressionはストリーム・データのソースとして使用されるイベント・タイプ名を定義し、より複雑なシナリオでは、ネストされたEPL文としての副問合せ式、またはJDBCデータにアクセスするパラメータ化されたSQL問合せを定義します。これらのすべてのケースで、stream_expressionにはオプションとして他の式のあいまいなプロパティ名参照を修飾する識別子としてのエイリアスと、残りの問合せで処理されるストリーム・データのウィンドウを定義するRETAIN句を含むことができます。

(stream_name | subquery_expr | param_sql_query) [[AS] alias]] [RETAIN retain_expr]
subquery_expr: ( epl_statement )
param_sql_query: database_name ('parameterized_sql_query')

subquery_exprは副問合せまたはネストされたEPL文をカッコで囲んで定義します。副問合せは外部EPL文で処理されるイベント・ストリーム・データを事前にフィルタ処理するために使用されます。たとえば、次の問合せでは、外部EPL問合せで処理されるデータはReutersフィードからのStockTickイベントのみに制限されます。

SELECT stockSymbol, AVG(price)
FROM (SELECT * FROM StockTick WHERE feedName = 'Reuters' )
RETAIN 1 MINUTE PARTITION BY stockSymbol
GROUP BY stockSymbol

副問合せは任意にネストできますが、INSERT INTOまたはOUTPUT句を含むことはできません。上位レベルのEPL文とは異なり、副問合せ内ではRETAIN句を省略できます。副問合せ式の詳細は、2.3.3項「副問合せ式」で説明しています。

param_sql_queryはパラメータ化されたSQL問合せをカッコで囲まれた引用符で指定し、これによりJDBCを通じてアクセス可能な参照および履歴データを取得できます。database_nameは問合せが実行されるデータベースの名前を識別します。データベース接続の確立、接続の作成および切断の制御、および問合せ結果のキャッシュ・ポリシーの設定のための構成情報はこのデータベース名に関連付けられています。パラメータ化されたSQL問合せの詳細は、2.3.4項「パラメータ化されたSQL問合せ」で説明しています。

RETAIN句は、問合せ処理の前にFROM句にリストされたストリームから読み取られるイベント・データの量を定義します。保持の異なるポリシーが必要な場合は、ストリームごとに独自のRETAIN句を指定できます。それ以外の場合、RETAIN句は、すべてのストリームに適用されるようにFROM句の末尾に追加します。本質的に、RETAIN句はFROM句内で自身の前にあるすべてのストリームに適用されます。

たとえば、次のEPL文では、StockTickイベントは5件保持され、Newsイベントは3件保持されます。

SELECT t.stockSymbol, t.price, n.summary
FROM StockTick t RETAIN 5 EVENTS, News n RETAIN 3 EVENTS
WHERE t.stockSymbol = n.stockSymbol

ただし、次の文では、StockTickイベントは4件、Newsイベントは4件保持されます。

SELECT t.stockSymbol, t.price, n.summary
FROM StockTick t, News n RETAIN 4 EVENTS
WHERE t.stockSymbol = n.stockSymbol

副問合せ式の例外を除いて、すべてのストリーム・ソースにはRETAIN句による制約が必要です。このため、上位レベルのEPL文としてFROM句には少なくとも末尾に1つのRETAIN句が含まれている必要があります。パラメータ化されたSQL問合せからの外部データはRETAIN句の影響を受けません。RETAIN句の詳細は、2.4項「RETAIN」で説明しています。

2.3.1 内部結合

FROM句には2つ以上のイベント・ストリームを含めることができるため、両方のストリームにより結果イベントが決定されます。2つ以上のストリームのイベントを関連付けるためにEPLが使用する結合条件はWHERE句にリストされます。たとえば、結合されたストリーム・ソースのいずれにもイベント・データが発生しなかった場合など、条件が満たされない場合、出力は生成されません。

いずれかのイベント・ストリームにイベントが到着した各時点で、2つのイベント・ストリームが結合され、WHERE句に応じて出力イベントが生成されます。

この例では、2つのイベント・ストリームが結合されます。最初のイベント・ストリームは、直前の30分間が保持される不正警告イベントから成ります。2つ目のストリームは、直前の30秒が考慮される引出しイベントです。これらのストリームは口座番号で結合されます。

SELECT fraud.accountNumber AS accntNum,
fraud.warning AS warn, withdraw.amount AS amount,
MAX(fraud.timestamp, withdraw.timestamp) AS timestamp,
'withdrawlFraud' AS desc
FROM FraudWarningEvent AS fraud RETAIN 30 MIN,
WithdrawalEvent AS withdraw RETAIN 30 SEC
WHERE fraud.accountNumber = withdraw.accountNumber

2.3.2 外部結合

EPLでは、個数制限のないイベント・ストリーム間の左外部結合、右外部結合、および完全外部結合がサポートされています。ストリーム・ソースにイベント・データが存在しない場合でも、LEFT、RIGHT、またはFULL修飾子に応じて出力が生成されます。

外部結合が左外部結合の場合、句の左側にあるストリームの各イベントについて出力イベントが発生します。たとえば、下の左外部結合では、イベント・ストリームOrderList内のイベントにイベントが一致しない場合であっても、ストリームRfidEvent内の各イベントの出力が取得されます。

SELECT *
FROM RfidEvent AS rfid
LEFT OUTER JOIN
OrderList AS orderlist
ON rfid.itemId = orderList.itemId
RETAIN 30 SECONDS

同様に、結合が右外部結合の場合、句の右側にあるストリームの各イベントについて出力イベントが発生します。たとえば、下の右外部結合では、イベント・ストリームRfidEvent内のイベントにイベントが一致しない場合であっても、ストリームOrderList内の各イベントの出力が取得されます。

SELECT *
FROM RfidEvent AS rfid
RIGHT OUTER JOIN
OrderList AS orderlist
ON rfid.itemId = orderList.itemId
RETAIN 30 SECONDS

すべてのタイプの外部結合では、結合条件が満たされない場合、到着したイベントのイベント・プロパティで選択リストが計算され、他のすべてのイベント・プロパティはnullと見なされます。

SELECT *
FROM RfidEvent AS rfid
FULL OUTER JOIN
OrderList AS orderlist
ON rfid.itemId = orderList.itemId
RETAIN 30 SECONDS

外部結合の最後のタイプは完全外部結合です。完全外部結合では、いずれかのイベント・ストリームにイベントが到着した各時点で、1つまたは複数の出力イベントが生成されます。下の例では、RfidEventまたはOrderListイベントが到着すると、1つまたは複数の出力イベントが生成されます。

2.3.3 副問合せ式

副問合せ式は、FROM句のカッコ内にネストされたEPL文です。副問合せにはINSERT INTO句またはOUTPUT句を含めることはできません。また、上位レベルのEPL文とは異なり、RETAIN句は省略可能です。

副問合せ式は、式を包含しているEPL文の前に実行されるため、外部の文で処理されるイベント・データを事前にフィルタ処理する際に便利です。たとえば、次の問合せでは、直前の100のStockTickイベントで特定の銘柄の変化する平均値が計算されます。

SELECT AVG(price)
FROM (SELECT * FROM StockTick WHERE stockSymbol = 'ACME' )
RETAIN 100 EVENTS

WHERE句が外部問合せ内に置かれた場合は、他の銘柄記号のStockTickイベントがウィンドウに入れられ、平均価格の計算に使用されるイベント数が軽減されます。

また、副問合せを使用する目的には、a)内部のイベント・ソース構造を外部EPL文で必要とされる構造に変換する場合、またはb)複数のイベント・ストリームを結合して単一のイベント・ストリームを形成する場合があります。これにより、INSERT INTO句を使用して複数のEPL文を接続する代わりに、単一のEPL文を使用できます。たとえば、次の問合せでは、EventAおよびEventBからのトランザクション・データが結合され、結合されたデータが外部問合せで使用されます。

SELECT custId, SUM(latency)
FROM (SELECT A.customerId AS custId, A.timestamp -B.timestamp AS latency
FROM EventA A, EventB B
WHERE A.txnId = B.txnId)
RETAIN 30 MIN
GROUP BY custId

副問合せ自身に副問合せを含めることができるため、任意のレベルのネストが許可されます。

2.3.4 パラメータ化されたSQL問合せ

パラメータ化されたSQL問合せでは、EPL文に含まれるSQLを介して、JDBCを通じてアクセス可能な参照および履歴データに対する問合せを実行できます。EPLからこれらのデータ・ソースにアクセスできるようにするには、いくつかの構成が必要です。

現在適用される制限には、以下のものがあります。

- 1つのイベント・ストリームのみを1つのSQL問合せに結合できます。2つ以上のイベント・ストリームとSQL問合せの結合はサポートされていません。

- SQL問合せのストリームではRETAIN句に指定された制限が無視されます(つまり、SQL問合せに時間ベースまたはイベント・ベースの枠を作成することはできません)。ただし、INSERT INTO構文を使用して、結合の結果を他の文に対して使用可能にできます。

- データベース・ソフトウェアではコンパイル時に文のメタデータを提供するJDBCのプリコンパイルされた文をサポートしている必要があります。ほとんどの主なデータベースではこの機能が提供されます。

問合せ文字列は一重または二重引用符を付けてカッコで囲みます。問合せには1つまたは複数の置換パラメータを含めることができます。問合せ文字列は変更されずにデータベース・ソフトウェアに渡されるため、ストアド・プロシージャ・コールを含む、データベースで認識される任意のSQL問合せ構文を作成できます。

SQL問合せ文字列の置換パラメータは${event_property_name}という形式を取ります。エンジンでは文の実行時にevent_property_nameが結合イベント・ストリーム内のイベントで提供される実際のイベント・プロパティ値に解決されます。

エンジンではSQL問合せの出力列の型がデータベース・ソフトウェアで返される文の結果セットのメタデータによって決定されます。実際の問合せ結果はjava.sql.ResultSetのgetObjectを通じて取得されます。

次のEPL文の例では、CustomerCallEventイベントで構成されるイベント・ストリームが、データベースMyCustomerDBおよび表Customerに対するSQL問合せの結果と結合されます。

SELECT custId, cust_name
FROM CustomerCallEvent,
MyCustomerDB (' SELECT cust_name FROM Customer WHERE cust_id = ${custId} ')
RETAIN 10 MINUTES

前述の例ではCustomerCallEventでcustIdというイベント・プロパティが提供されていると想定します。SQL問合せではCustomer表から顧客名が選択されます。SQLのWHERE句ではCustomer表の列cust_idが各CustomerCallEventイベントのcustIdの値と照合されます。エンジンでは新しいCustomerCallEventが検出されるたびにSQL問合せが実行されます。

指定の顧客IDの列がSQL問合せで返されなかった場合、エンジンは出力イベントを生成しません。列が返された場合、エンジンではSQL問合せで返される列ごとに1つの出力イベントが生成されます。次の節で説明しているように、外部結合を使用して、SQL問合せで列が返されない場合でもエンジンで出力イベントが生成されるかどうかを制御できます。

次の例では、イベント・ストリームCustomerCallEventに30秒の時間ウィンドウが追加されます。また、選択されたプロパティの名前がcustomerNameおよびcustomerIdに変更されます。これは、EQL問合せのSELECT句でSQL問合せによる列名の指定がどのように使用されるかを示しています。この例ではASキーワードを介して明示的なストリーム名を使用します。

SELECT customerId, customerName
FROM CustomerCallEvent AS cce RETAIN 30 SECONDS,
MyCustomerDB
("SELECT cust_id AS customerId, cust_name AS customerName
FROM Customer WHERE cust_id = ${cce.custId}") AS cq

時間ウィンドウなどの任意のウィンドウでは、イベントがウィンドウに入ると挿入イベントが生成され、イベントがウィンドウを離れると削除イベントが生成されます。エンジンでは挿入ストリームおよび削除ストリームの両方のケースで、各CustomerCallEventに対して指定のSQL問合せが実行されます。パフォーマンスの最適化として、SELECT句のISTREAMまたはRSTREAMキーワードを使用して、挿入イベントまたは削除イベントのみを結合するようエンジンに通知し、SQL問合せの実行数を軽減できます。

パラメータ化されたSQL問合せを外部結合で使用することもできます。SQL問合せで行が返されるかどうかにかかわらず各イベントの出力イベントが必要な場合は、次の文のように、左外部結合を使用します。SQL問合せで行が返されない場合は、結合の結果によって選択されたプロパティにnull値が挿入されます。

SELECT custId, custName
FROM CustomerCallEvent AS cce
LEFT OUTER JOIN
MyCustomerDB
("SELECT cust_id, cust_name AS custName
FROM Customer WHERE cust_id = ${cce.custId}") AS cq
ON cce.custId = cq.cust_id
RETAIN 10 MINUTES

前述の文では、SQL問合せで行が返されない場合でも、SQL問合せで選択されたすべての列を含む出力イベントが各CustomerCallEventに対して常に少なくとも1つ生成されます。外部結合ではON式が必要なことに注意してください。ONはSQL問合せで返された行に対する追加のフィルタとして動作します。

2.4 RETAIN

FROM句には少なくとも1つのRETAIN句が必要です。RETAIN句はFROM句で自身の前にリストされているすべてのストリーム・ソースに適用されます。概念的に、問合せの実行対象となる各ストリーム・ソースのイベント・データの枠が定義されます。RETAIN句の構文は以下のとおりです。

RETAIN
( ALL [EVENTS] ) |
( [BATCH OF]
( integer (EVENT|EVENTS) ) | ( time_interval (BASED ON prop_name)* )
( WITH [n] (LARGEST | SMALLEST | UNIQUE) prop_name )*
( PARTITION BY prop_name )* )

RETAIN句の各側面について、詳細を次に示します。

2.4.1 すべてのイベントの保持

ストリーム・ソースのすべてのイベントを保持するには、RETAIN句でALL [EVENTS]を指定します。

SELECT AVG(price)
FROM StockTick RETAIN ALL EVENTS

この場合、発生するすべてのStockTickイベントに基づいて平均価格が計算されます。ただし、数量が大きいシナリオでの計算時に各イベント・オブジェクトの全体または部分を保持する必要があるとメモリーが不足する可能性があるため、このオプションは慎重に使用する必要があります。この例としては重み設定された平均値の計算などがあります。

2.4.2 ウィンドウのサイズの指定

問合せの実行時に保持されるイベント・データの量を決定するには2つの方法があります。最初のオプションでは、保持されるイベントの最大数を指定します。たとえば、次の問合せでは、平均価格を計算するStockTickイベントが最大100件保持されます。

SELECT AVG(price)
FROM StockTick RETAIN 100 EVENTS

新しいStockTickイベントが到着するたびに、最大100件のイベントを使用して平均価格が計算されます。

2つ目のオプションでは、イベント・データが収集される時間間隔を指定します。たとえば、次の問合せでは1分間相当のStockTickイベントが保持され、このデータに対して平均価格が計算されます。

SELECT AVG(price)
FROM StockTick RETAIN 1 MINUTE

この場合、新しいStockTickイベントが到着するたびに平均価格が計算されます。ただし、1分以上前に到着したイベントはウィンドウから削除され、ウィンドウ内の残りのイベントに基づいて平均価格が再計算されます。

2.4.3 バッチ・ウィンドウとスライディング・ウィンドウの指定

デフォルトでは、イベント・データが保持されるウィンドウはスライディング・ウィンドウです。スライディング・ウィンドウでは、ウィンドウが一杯になると新しいイベントがウィンドウに入るときに古いイベントが削除されます。スライディング・ウィンドウでは、新しいイベントがウィンドウに入れられた場合または古いイベントがウィンドウを離れた場合、あるいはその両方の場合に、問合せが再実行されます。もう1つの方法としては、問合せ実行の前にイベント・データのバッチを指定します。ウィンドウが一杯にならないと問合せは実行されません。それ以降は、ウィンドウがまた一杯になるまで新しいイベント・データが再び収集されてから、問合せが再実行されます。

たとえば、次の問合せでは100件のイベントがバッチで収集された後、平均価格を計算する問合せが実行されます。

SELECT AVG(price)
FROM StockTick RETAIN BATCH OF 100 EVENTS

実行後は、次の100件のイベントがバッチ収集されてから問合せが再実行されます。

スライディング・ウィンドウとバッチ・ウィンドウの詳細は、1.3項「処理モデル」を参照してください。

2.4.4 時間間隔の指定

RETAIN句の時間間隔は、日数、時間、分、秒またはミリ秒単位で指定します。

time_interval: [day-part][hour-part][minute-part][seconds-part][milliseconds-part]
day-part: number ("days" | "day")
hour-part: number ("hours" | "hour" | "hr")
minute-part: number ("minutes" | "minute" | "min")
seconds-part: number ("seconds" | "second" | "sec")
milliseconds-part: number ("milliseconds" | "millisecond" | "msec" | "ms")

時間間隔のいくつかの例を示します。

10 seconds
10 minutes 30 seconds
20 sec 100 msec
0.5 minutes
1 day 2 hours 20 minutes 15 seconds 110 milliseconds

2.4.4.1 BASED ON句

デフォルトでは、時間間隔の経過は内部システム・クロックに基づいています。ただし、場合によっては、イベント・プロパティのタイム・スタンプの値に基づいた時間が必要になることもあります。この場合は、BASED ON句を使用してlong型のタイム・スタンプ値が含まれるプロパティ名を指定できます。この例では、StockTickイベントにlong型のtimestampプロパティが含まれていることが予期され、この値によってイベントの枠への参加と終了が制御されます。

SELECT AVG(price)
FROM StockTick RETAIN 1 MINUTE BASED ON timestamp

BASED ON句を使用する場合、FROM句の各ストリーム・ソースには関連付けられたtimestampプロパティが含まれている必要があり、そうでない場合はOracle Event Processingによって例外がスローされます。

2.4.5 プロパティ名の指定

RETAIN句では、プロパティはそのプロパティ名を使用するだけで参照できます。ただし、FROM句の複数のストリーム・ソースに同名のプロパティが含まれているためあいまいさが存在する場合は、エイリアス名の接頭辞を付け、ピリオドを後に付ける必要があります(SELECT句で参照されるプロパティの動作と同じです)。

2.4.6 PARTION BY句を使用したウィンドウの分割

PARTITION BY句を使用すると、リストされたプロパティの一意の値に基づいて、ウィンドウをさらに複数のウィンドウに分割できます。たとえば、次の問合せでは、ユニークな銘柄記号ごとに3件のイベントが保持されます。

SELECT stockSymbol, price
FROM StockTick RETAIN 3 EVENTS PARTITION BY stockSymbol

これは概念的にSQLまたはEPLのGROUP BY関数と同じです。ただし、PARTITION BY句ではウィンドウのサイズと分割のみが制御され、GROUP BY句のようにイベント・データは集約されません。ただし、多くの場合、PARTITION BY句は同じプロパティを指定してGROUP BY句と共に使用します。

次の例は、PARTITION BYとGROUP BYの間の対話を示しています。最初の例にはPARTITION BY句がありませんが、すべての銘柄記号にわたり合計10件のイベントが保持されます。

SELECT stockSymbol, AVG(price)
FROM StockTick RETAIN 10 EVENTS
GROUP BY stockSymbol

これらの10件のイベントに基づいてユニークな銘柄記号のセットごとに平均価格が計算されます。銘柄記号AAAがウィンドウに入れられた場合、BBBなどの異なる銘柄記号はウィンドウから離れます。これにより、AAAグループとBBBグループの両方の平均価格が変更されます。

2つ目の例はPARTITION BY句とGROUP BY句を使用します。

SELECT stockSymbol, AVG(price)
FROM StockTick RETAIN 10 EVENTS PARTITION BY stockSymbol
GROUP BY stockSymbol

この場合、ユニークな銘柄記号ごとに10件のイベントが保持されます。銘柄記号AAAがウィンドウに入れられた場合は、その銘柄に関連付けられたサブウィンドウのみに影響し、異なる銘柄記号の他のウィンドウは影響を受けません。このため、この場合はAAAの平均価格のみに影響します。

2.4.7 WITH句を使用した最大/最小/一意な値の保持

WITH句を使用すると、プロパティの最大値、最小値および一意の値をウィンドウ内に保持できます。たとえば、2つの最高値の株価を保持するには、次の文を使用します。

SELECT stockSymbol, price
FROM StockTick RETAIN ALL WITH 2 LARGEST price

時間ベースのウィンドウの場合、LARGESTまたはSMALLESTキーワードの前にある[n]修飾子は保持される値の個数を決定します。たとえば、次の文では1分間で発生した2つの最小価格が保持されます。

SELECT stockSymbol, price
FROM StockTick RETAIN 1 MINUTE WITH 2 SMALLEST price

この修飾子がない場合は、1つの最大値または最小値が保持されます。

UNIQUE修飾子により、特定のプロパティに対して同じ値を持つイベントのうち最新のイベントのみがウィンドウに保持されます。たとえば、次の問合せでは、ユニークな銘柄記号ごとに直前の株価表示のみが保持されます。

SELECT *
FROM StockTick RETAIN 1 DAY WITH UNIQUE stockSymbol

同じプロパティ値の古いイベントはエンジンにより古いイベントとしてポストされます。

2.5 MATCHING

すべてのEPL文にはMATCHINGまたはFROM句のいずれかが必要です。MATCHING句はEPL文で使用されるイベントを決定するためのもう1つのメカニズムです。これにより、指定されたパターンを満たす1つまたは複数の一連のイベントの発生が検出されます。パターン式は、パターンを形成するイベント・シーケンスを定義し、AND、OR、およびFOLLOWED BYなどの論理演算子で区切られたストリームへの参照で構成されます。2.4項「RETAIN」で指定されているとおり、省略可能なRETAIN句を使用して、一致したイベントが含まれる枠の特性を定義します。MATCHING句はWHEREまたはHAVING句よりも前に実行されます。

MATCHING句の構文は次のとおりです。

MATCHING pattern_expression [RETAIN retain_clause]

pattern_expressionの構文は次のとおりです。

[NOT|EVERY] stream_expression
( ( AND | OR | [NOT] FOLLOWED BY ) stream_expression )*
[WITHIN time_interval]

NOT演算子を使用すると、イベントの欠落を検出でき、EVERY演算子を使用すると、パターン照合が一致した後に継続する場合の動作を制御できます。stream_expressionは、オプションで変数にバインドされカッコ内の式でフィルタ処理される、ストリーム・ソース名です。

stream_expression: [var_name:=]stream_name [( filter_expression )]

また、stream_expressionをpattern_expressionにすることができ、これにより任意の複雑な式のネスト化が許可されます。

var_nameは、照合が起動される発生中のイベント・オブジェクトにバインドされます。これは、後に続くフィルタ式や、SELECTやWHERE句などの他の句で、他の任意のイベント・プロパティのように参照されます。stream_nameの後には、省略可能な、そのタイプの一致するイベントをフィルタ処理するカッコ内の式が続きます。式はイベントを適切なウィンドウに入れるための事前条件のように動作し、WHERE句の式と同じ構文を持ちます。すでに一致したイベントと関連付けるために、式の内部では前にバインドされた変数が使用されます。

time_intervalは、2.4.4「時間間隔の指定」で指定されている時間間隔であり、省略可能なWITHINキーワードの後に置かれ、前述の式が条件を満たすまで待機する時間を決定します。

次の例では、カテゴリが"Perishable"で、10秒以内にRFIDErrorが後に続き、idが一致したRFIDEventオブジェクトのIDと一致するRFIDEventイベントが参照されます。

SELECT *
MATCHING a:=RFIDEvent(category="Perishable")
FOLLOWED BY RFIDError(id=a.id) WITHIN 10 seconds
RETAIN 1 MINUTE

以降の節では、パターン照合の時相的な制約を表すためにMATCHING句で使用できる構文、セマンティクス、および追加の演算子について説明します。

2.5.1 FOLLOWED BY演算子

FOLLOWED BY時相演算子は、複数のイベント条件が特定の順序で発生した場合に一致します。まず左側の式がtrueになる必要があり、その場合にのみ右側の式で一致するイベントが評価されることが指定されます。

たとえば、次のパターンではイベントAが検索され、これが検出された場合にイベントBが検索されます。

A FOLLOWED BY B

イベントAの直後にイベントBが続く必要はありません。イベントAとイベントBの間で他のイベントが発生する場合でも、この式はtrueに評価されます。この動作が適切でない場合は、2.5.4項「NOT演算子」で説明しているNOT演算子を使用してください。

2.5.2 AND演算子

AND論理演算子では、式全体がtrueを返す前に両方のネストされたパターン式がtrueになる必要があります。MATCHING句のコンテキストでは、演算子は複数のイベント条件が発生した場合に一致しますが、必ずしも特定の順序である必要はありません。

たとえば、次のパターンは、イベントAとイベントBの両方が見つかった場合に一致します。

A AND B

パターンは、Aの後にBが続く任意のシーケンスでいずれの順序でも一致します。また、Aイベントの直後にBイベントが続く必要はありません。AイベントおよびBイベントの発生の間に他のイベントが発生してもこの式ではtrueが返されます。

2.5.3 OR演算子

OR論理演算子では、式全体がtrueを返す前にいずれかの式がtrueになる必要があります。MATCHING句のコンテキストでは、演算子は複数のイベント条件のいずれかが発生した場合に一致しますが、必ずしも特定の順序である必要はありません。

たとえば、次のパターンは、イベントAまたはイベントBのいずれでも一致します。

A OR B

次の例では、特定の価格を超える、または特定の量を超えるすべての株価表示が検出されます。

StockTick(price > 1.0) OR StockTick(volume > 1000)

2.5.4 NOT演算子

NOT演算子は式の実際の値を否定します。MATCHING句のコンテキストでは、演算子によってイベント条件の欠落が検出されます。

次のパターンでは、イベントBの前にイベントCが検出された場合は除いて、イベントAの後にイベントBが検出された場合にのみ一致します。

( A FOLLOWED BY B ) AND NOT C

2.5.5 EVERY演算子

EVERY演算子は、EVERYキーワードで修飾されたサブ式がtrueまたはfalseに評価された場合に、パターンのサブ式が再度開始される必要があることを示します。EVERY修飾子を指定しない場合は、NOT式の内部に含まれていないパターン内の最初のイベント・ストリームのソースに暗黙的なEVERY演算子が修飾子として挿入されます。

EVERY演算子は包含されているパターンのサブ式のファクトリのように動作します。含まれているパターンのサブ式が発動し、イベントのチェックを終了すると、EVERYによって同じイベントまたはイベント・セットの以降の発生をリスンする新しいパターンのサブ式が開始されます。

EVERY演算子内のパターンのサブ式がtrueになるたびに、エンジンでは新しいアクティブなサブ式が開始され、それ以降のイベント、またはパターンのサブ式に一致するタイミング条件が参照されます。

以下のようなイベント・シーケンスの例を考えます。

A_1 B_1 C_1 B_2 A_2 D_1 A_3 B_3 E_1 A_4 F_1 B_4

表2-1 EVERY演算子の例

例

説明

EVERY ( A FOLLOWED BY B )

イベントAとその後に続くイベントBが検出されます。Bが発生した時点でパターンが一致し、パターン照合が再開されてイベントAが再び検索されます。

組合せ{A_1, B_1}のB1で一致します。

組合せ{A_2, B_3}のB3で一致します。

組合せ{A_4, B_4}のB4で一致します。

EVERY A FOLLOWED BY B

パターンはすべてのイベントAとその後に続くイベントBで発動します。

組合せ{A_1, B_1}のB1で一致します。

組合せ{A_2, B_3}および{A3, B_3}のB3で一致します。

組合せ{A_4, B_4}のB4で一致します。

EVERY A FOLLOWED BY EVERY B

パターンはすべてのイベントAとその後に続くすべてのイベントBで発動します。つまり、イベントAの後にイベントBが来るすべての組み合わせです。

組合せ{A_1, B_1}のB1で一致します。

組合せ{A_1, B_2}のB2で一致します。

組合せ{A_1, B_3}、{A2, B_3}および{A3, B_3}のB3で一致します。

組合せ{A_1, B_4}、{A2, B_4}、{A3, B_4}および{A4, B_4}のB4で一致します。

これらの例では、パターン式に一致するイベントの複数の組み合わせでパターンが発動できることを示しています。

相互に続く3つのイベントに一致するサブ式でEVERY演算子を使用する場合を考えます。

EVERY (A FOLLOWED BY B FOLLOWED BY C)

パターンでは最初にイベントAが検索されます。イベントAが到着すると、イベントBが検索されます。イベントBの到着後、イベントCが検索されます。最終的にイベントCが到着するとパターンが一致します。エンジンではイベントAの検索が再開されます。

イベントBとイベントCの間に2つ目のイベントA_2が到着すると想定します。パターンはその時点でイベントCを探しているため、A_2は完全に無視されます。前の例で見てきたとおり、EVERY演算子ではサブ式が発動された場合にのみ、サブ式A FOLLOWED BY B FOLLOWED BY Cが再開されます。

次の文では、EVERY演算子はサブ式全体ではなく、Aイベントにのみ適用されます。

EVERY A FOLLOWED BY B FOLLOWED BY C

このパターンでは、イベントAが到着するタイミングにかかわらず、すべてのイベントAについてその後にイベントBとイベントCが続く場合にパターンが一致します。これは、AND NOT構文やRETAIN構文と共に使用してイベントがウィンドウ内にとどまる期間に制約を設けない限り、多くの場合に実用的でなくなります。

2.5.6 WITHIN演算子

WITHIN修飾子の動作はストップウォッチと同じです。関連付けられているパターン式が指定の時間内にtrueにならなかった場合、エンジンではfalseとして評価されます。WITHIN修飾子は、2.4.4項「時間間隔の指定」で指定されているとおり、時間間隔をパラメータとして受け取ります。

このパターンは、文の作成後5秒以内にAイベントが到着すると発動します。

A WITHIN 5 SECONDS

このパターンは5秒以内に到着するすべてのAイベントで発動します。

このパターンは、次の5秒間の任意の1つのAまたはBイベントに一致します。

(A or B) WITHIN 5 SECONDS

このパターンは、相互に10秒以内に発生する任意の2つのエラーに一致します。

A(status='ERROR') FOLLOWED BY B(status='ERROR') WITHIN 10 SECONDS

このパターンは、10秒以内にStatusイベントが発生しない場合に一致します。

NOT Status WITHIN 10 SECONDS

2.5.7 一致したパターンのイベント構造

パターンが一致した場合に生成されるイベントの構造は、MATCHING句内にバインドされている変数の共用体の構造によって決定されます。このため、一致したイベントからデータを取得するには変数のバインドが存在している必要があります。

たとえば、次のパターンがあるとした場合:

tick:=StockTick FOLLOWED BY news:=News(stockSymbol = tick.stockSymbol)

一致するイベントには、StockTick型のtickプロパティおよびNews型のnewsプロパティという2つのプロパティを持つ複合イベント型が含まれています。

2.6 WHERE

WHERE句はEPL文の省略可能な句です。WHERE句を使用してイベント・ストリームを結合し、イベントをフィルタ処理できます。WHERE句に集約関数を含めることはできません。集約関数を使用してフィルタ処理するには、HAVING句を使用する必要があります。

WHERE aggregate_free_expression

WHERE句では、比較演算子=、<、>、>=、<=、!=、<>、IS NULL、IS NOT NULLおよびANDとORを使用した論理結合がサポートされています。以下にいくつかの例を示します。

...WHERE fraud.severity = 5 AND amount > 500
... WHERE (orderItem.orderId IS NULL) OR (orderItem.class != 10)
... WHERE (orderItem.orderId = NULL) OR (orderItem.class <> 10)
... WHERE itemCount / packageCount > 10

2.7 GROUP BY

GROUP BY句はEPL文で省略可能です。GROUP BY句はEPL文の結果をグループに分割します。1つまたは複数のイベント・プロパティ名、または式の計算結果によるグループ化が可能です。集約関数と共に使用した場合、GROUP BYでは各サブグループで計算が取得されます。GROUP BYは集約関数なしに使用できますが、通常は混乱した結果が生成されます。

たとえば、次の文では、直前の30秒間のすべてのStockTickEventsの銘柄ごとの合計価格が返されます。

SELECT symbol, SUM(price)
FROM StockTickEvent RETAIN 30 SEC
GROUP BY symbol

GROUP BY句の構文は次のとおりです。

GROUP BY arregate_free_expression [, arregate_free_expression] [, …]

EPLでは、GROUP BY句の式に次の制限があります。

- GROUP BY句の式に集約関数を含めることはできません。

- SELECT句の集約関数で使用されるイベント・プロパティをGROUP BYの式でも使用することはできません。

GROUP BY句に複数の式をリストしてグループをネストできます。GROUP BYでセットが確立されると、集約関数が適用されます。この文では、直前の30秒間のすべての株価表示イベントの中央量が、銘柄および表示データ・フィード別にグループ化されてポストされます。EPLにより、各グループごとに1つのイベントが文の更新リスナーにポストされます。

SELECT symbol, tickDataFeed, MEDIAN(volume)
FROM StockTickEvent RETAIN 30 SECONDS
GROUP BY symbol, tickDataFeed

前述の文では、SELECTリスト内のイベント・プロパティ(symbolおよびtickDataFeed)がGROUP BY句にもリストされています。このため、この文は、SELECTリスト内の非集約イベント・プロパティがGROUP BY列に一致する必要があることを規定しているSQL標準に従っています。

EPLでは、SELECTリスト内の1つまたは複数のイベント・プロパティがGROUP BY句にリストされていない文もサポートされています。下の文はこのようなケースを示しています。この文では、直前の30秒間の株価表示の標準偏差が計算され、銘柄別に集約され、各イベントごとにsymbol、tickDataFeed、およびpriceの標準偏差がポストされます。

SELECT symbol, tickDataFeed, STDDEV(price)
FROM StockTickEvent RETAIN 30 SECONDS
GROUP BY symbol

上の例では、priceイベント・プロパティは依然としてsymbolに基づいて集約されますが、グループごとに1つのイベントではなく、着信イベントごとに1つのイベントが生成されます。

また、EPLでは、GROUP BY句の1つまたは複数のイベント・プロパティがSELECTリストに含まれていない文がサポートされています。この例では、symbolおよびtickDataFeedごとの平均偏差が計算され、グループごとに1つのイベントがポストされ、生成されたイベントにはsymbolとpriceの平均偏差が含まれています。ポストされた結果にtickDataFeedが含まれていないため、混乱が生じる可能性があります。

SELECT symbol, AVEDEV(price)
FROM StockTickEvent RETAIN 30 SECONDS
GROUP BY symbol, tickDataFeed

GROUP BYリストには式も使用できます。

SELECT symbol * price, count(*)
FROM StockTickEvent RETAIN 30 SECONDS
GROUP BY symbol * price

GROUP BY式の結果がnull値の場合、null値は固有のグループになります。すべてのnull値が同じグループに集約されます。COUNT(expression)集約関数ではnull値が考慮されず、null値のみが検出された場合、COUNTでは0が返されます。

文ではWHERE句をGROUP BYとともに使用できます。WHERE句の条件を満たしていないイベントはグループ化が実行される前に消去されます。たとえば、下の文では、量が100を超える直前の30秒間の株価表示数がポストされ、グループ(symbol)ごとに1つのイベントがポストされます。

SELECT symbol, count(*)
FROM StockTickEvent RETAIN 30 SECONDS
WHERE volume > 100
GROUP BY symbol

2.8 HAVING

HAVING句はEPL文で省略可能です。HAVING句を使用して、GROUP BY句で定義されたイベントを承認または拒否します。WHEREがSELECT句の条件を設定するのと同様、HAVING句はGROUP BY句の条件を設定します。ただし、WHERE句には集約関数を含めることができず、HAVINGでは多くの場合に集約関数が使用される点が異なります。

HAVING expression

この文は、HAVING句で集約関数を使用する例です。直前の30秒間の株価表示イベントで、合計価格が1000を超える銘柄についてのみ銘柄ごとの合計価格がポストされます。HAVING句により合計価格が1000以下のすべての銘柄が消去されます。

SELECT symbol, SUM(price)
FROM StockTickEvent RETAIN 30 SEC
GROUP BY symbol
HAVING SUM(price) > 1000

HAVING句に複数の条件を含めるには、AND、OR、またはNOTを使用して条件を組み合せます。これを示す下の文では、合計価格が1000を越え、平均量が500未満のグループのみが選択されます。

SELECT symbol, SUM(price), AVG(volume)
FROM StockTickEvent RETAIN 30 SEC
GROUP BY symbol
HAVING SUM(price) > 1000 AND AVG(volume) < 500

HAVING句を使用する文ではGROUP BY句も使用する必要があります。GROUP BYを省略すると、WHERE句で除外されないすべてのイベントが1つのグループとして返されます。この場合、HAVINGには集約関数を含めることができる点を除いて、HAVINGはWHEREと同様に動作します。

次の例が示すように、HAVING句はGROUP BY句なしでも使用できます。この例では、直前の30秒間のすべての株価表示イベントで価格が現在実行中の平均価格に満たないイベントがポストされます。

SELECT symbol, price, AVG(price)
FROM StockTickEvent RETAIN 30 SEC
HAVING price < AVG(price)

2.8.1 MATCHING、WHEREおよびGROUP BY句との対話

EPL文に副問合せ、MATCHING句、WHERE条件、GROUP BY句、およびHAVING条件が含まれている場合、最終結果はそれぞれの句が実行される順序によって決定されます。

1. 文に出現する副問合せが最初に実行されます。副問合せは、イベントが外部問合せのウィンドウに入れられるためのフィルタとして動作します。

2. MATCHING句にイベント・ストリームのフィルタ条件が存在する場合は、この条件によりウィンドウに入れられるイベントが指定されます。フィルタ条件を満たさないイベントはすべて破棄されます。

3. WHERE句により、検索条件に一致しないイベントが除外されます。

4. SELECTリストの集約関数で各グループの概略値が計算されます。

5. HAVING句により、検索条件に一致しないイベントが最終結果から除外されます。

次の問合せでは、SELECT句で集約関数を使用し、フィルタ、WHERE、GROUP BY、およびHAVING句を1つの文で使用する場合を示しています。

SELECT tickDataFeed, STDDEV(price)
FROM (SELECT * FROM StockTickEvent WHERE symbol='ACME')
RETAIN 10 EVENTS
WHERE volume > 1000
GROUP BY tickDataFeed
HAVING STDDEV(price) > 0.8

EPLではイベント・ストリームStockTickEventに対する副問合せを使用してイベントがフィルタされます。上の例では、直前の10件のイベントに対し銘柄ACMEのイベントのみがウィンドウに入れられ、他のすべてのイベントは単に破棄されます。WHERE句により、ウィンドウにポストされたイベントのうち、量が1000を超えるという条件に一致しないイベント(ウィンドウに入れられるイベントおよびウィンドウを離れるイベント)が削除されます。GROUP BY句に指定されているとおり、各表示データ・フィードごとに、残りのイベントにSTDDEV標準偏差の集約関数が適用されます。各tickDataFeed値につき1つのイベントが生成されます。EPLではHAVING句が適用され、priceの標準偏差が0.8を超えるtickDataFeedグループのイベントのみが承認されます。

2.9 ORDER BY

ORDER BY句はEPLで省略可能です。これを使用して、プロパティまたはプロパティを使用する式で出力イベントを順序付けします。たとえば、次の文では1分間の株価表示イベントがバッチ処理され、最初に価格、次に量によって並べ替えられます。

SELECT symbol
FROM StockTickEvent RETAIN BATCH OF 1 MINUTE
ORDER BY price, volume

ORDER BY句の構文は次のとおりです。

ORDER BY expression [ASC | DESC] [, expression [ASC | DESC] [,…]]

EPLでは、ORDER BY句の式に次の制限があります。

- ORDER BY句で使用するすべての集約関数はSELECT式でも使用する必要があります。

他の点では、SELECT句に使用できる任意の種類の式、およびSELECT句に定義されている任意のエイリアスは、ORDER BY句でも有効です。

2.10 OUTPUT

OUTPUT句はEPLで省略可能です。イベント出力の割合を制御または安定化させるためにこの句を使用します。たとえば、次の文では新しいイベントと古いイベントがバッチ処理され、これらが90秒間隔で出力されます。

SELECT *
FROM StockTickEvent RETAIN 5 EVENTS
OUTPUT EVERY 90 SECONDS

出力の割合を制限する構文は以下のとおりです。

OUTPUT [ALL | ( (FIRST | LAST) [number]] EVERY number [EVENTS | time_unit]

ここで

time_unit: MIN | MINUTE | MINUTES | SEC | SECOND | SECONDS | MILLISECONDS | MS

ALLキーワードはデフォルトであり、バッチ内のすべてのイベントが出力されることを指定します。バッチ・サイズは時間またはイベント数で指定できます。

FIRSTキーワードは出力バッチ内の最初のイベントのみが出力されることを指定します。省略可能な数値修飾子を使用して複数のイベントを出力できます。FIRSTキーワードでは、最初に一致したイベントが到着後すぐに出力されるようエンジンに指示され、その後は指定された時間間隔またはイベント数の一致するイベントは無視されます。時間間隔が経過するか、または一致するイベント数に到達した後は、同じサイクルが開始されます。

LASTキーワードは、指定の時間間隔内で最後のイベントのみを出力するか、または指定された数の一致するイベントが蓄積された後で最後のイベントのみを出力することを指定します。省略可能な数値修飾子を使用して複数のイベントを出力できます。

時間間隔は分またはミリ秒でも指定できます。次の文は最初の文と同じです。

SELECT *
FROM StockTickEvent RETAIN 5 EVENTS
OUTPUT EVERY 1.5 MINUTES

出力を安定化する2つ目の方法は、特定の数のイベントが収集されるまでイベントをバッチ処理する方法です。次の文では、新しい5件(またはそれ以上)あるいは古い5件(またはそれ以上)のイベントがバッチ処理された後で初めて出力されます。

SELECT *
FROM StockTickEvent RETAIN 30 SECONDS
OUTPUT EVERY 5 EVENTS

また、省略可能なLASTキーワードを使用してイベント出力をさらに変更できるため、最後のイベント(複数可)の出力のみが出力バッチに到着します。下の例では、最後の5件のイベントが3分ごとに出力されます。

SELECT *
FROM StockTickEvent RETAIN 30 SECONDS
OUTPUT LAST 5 EVERY 3 MINUTES

FIRSTキーワードを使用すると、間隔の開始時に通知を受け取ることができます。この例では、rateがしきい値を下回るたびに直ちに通知されます。

SELECT *
FROM TickRate RETAIN 30 SECONDS
WHERE rate < 100
OUTPUT FIRST EVERY 60 SECONDS

2.10.1 GROUP BYおよびHAVING句との対話

OUTPUT句がGROUP BYおよびHAVING句と対話する方法には2種類あります。まず、OUTPUT EVERY n EVENTSの場合、数字nはGROUP BY句に到着するイベントの数を指します。つまり、GROUP BY句でグループにつき1つのイベントのみが出力される場合、または到着するイベントがHAVING句の条件を満たしていない場合、実際に文で出力されるイベント数はnより少ない場合があります。

2つ目に、LASTおよびALLキーワードは、集約関数とGROUP BY句が含まれている文で使用する場合に特別な意味を持ちます。LASTキーワードは、集約値が最新のイベント・バッチで更新されているグループのみが出力されることを指定します。ALLキーワード(デフォルト)は、グループの集約値が更新されているかどうかに関係なく、これまでに見つかったすべてのグループの最新のデータが出力されることを指定します。

2.11 INSERT INTO

INSERT INTO句はEPLで省略可能です。この句を指定して、文の結果を後続の文で使用できるイベント・ストリームとして作成できます。また、この句を使用して、複数のイベント・ストリームを結合して1つのイベント・ストリームを作成できます。

INSERT INTO CombinedEvent
SELECT A.customerId AS custId, A.timestamp - B.timestamp AS latency
FROM EventA A, EventB B RETAIN 30 MIN
WHERE A.txnId = B.txnId

前述の文のINSERT INTO句ではタイプCombinedEventのイベントが生成されます。生成されたそれぞれのCombinedEventイベントには、custIdおよびlatencyという2つのイベント・プロパティが含まれています。上の文で生成されたイベントを後続の文で使用できます。たとえば、下の文では生成されたイベントを使用しています。

SELECT custId, SUM(latency)
FROM CombinedEvent RETAIN 30 MIN
GROUP BY custId

INSERT INTO句にはイベント・タイプ・エイリアスのみを含めるか、またはイベント・タイプ・エイリアスおよび1つまたは複数のイベント・プロパティ名を含めることができます。INSERT INTO句の構文は以下のとおりです。

INSERT [ISTREAM | RSTREAM] INTO event_type_alias [(prop_name [,prop_name, [,…]] ) ]

ISTREAM(デフォルト)およびRSTREAMキーワードは省略可能です。いずれのキーワードも指定しない場合、エンジンでは文で生成された挿入ストリーム・イベントがアタッチされた更新リスナーに提供されます。挿入ストリームはそれぞれのウィンドウまたはストリームに入れられるイベントで構成されます。RSTREAMキーワードを指定した場合、エンジンでは文で生成された削除ストリーム・イベントが提供されます。削除ストリームはそれぞれのウィンドウを離れるイベントで構成されます。

event_type_aliasはエンジンで生成されたイベントを指定する識別子です。文中では識別子を使用して、指定の名前のイベントをフィルタおよび処理できます。

また、エンジンでは、INSERT INTO句が含まれている文に更新リスナーがアタッチされることが許可されます。

イベント・ストリームを結合するには、結合する任意のEPL文で同じevent_type_alias識別子を使用するだけで済みます。使用するイベント・プロパティの数と名前が同じであり、イベント・プロパティのタイプが一致することを確認します。

EPLでは、INSERT INTO句に次の制限があります。

- 句にイベント・プロパティ名のリストを指定する場合は、SELECT句の要素数がINSERT INTO句の要素数に一致している必要があります。

- イベント・タイプ・エイリアスがすでに前の文で定義されていて、イベント・プロパティの名前と型が一致しない場合は、文の作成時に例外がスローされます。

次の例では、使用するプロパティ名が明示的に定義されたもう1つの形式のINSERT INTO句を示します。

INSERT INTO CombinedEvent (custId, latency)
SELECT A.customerId, A.timestamp - B.timestamp
FROM EventA A, EventB B RETAIN 30 MIN
WHERE A.txnId = B.txnId

RSTREAMキーワードを使用して、削除ストリーム・イベントのみを生成するようエンジンに指示します。これは、イベントがウィンドウに入れられたときでなくウィンドウを離れたときにアクションを起動する必要がある場合に便利です。下の文では、EventAとEventBが30分後にウィンドウを離れたときにCombinedEventイベントが生成されます。

INSERT RSTREAM INTO CombinedEvent
SELECT A.customerId AS custId, A.timestamp - B.timestamp AS latency
FROM EventA A, EventB B RETAIN 30 MIN
WHERE A.txnId = B.txnId

2.12 単純副問合せと相関副問合せ

副問合せは別の文の内部にあるSELECTです。EPLでは、EPL文のSELECT句およびWHERE句内の副問合せがサポートされています。副問合せでは、複雑な結合を必要とするような操作を実行するためのもう1つの手段が提供されます。また、副問合せでは複雑な結合よりも文が読みやすくなります。

EPLでは、単純副問合せと相関副問合せの両方がサポートされています。単純な副問合せでは、内部問合せが外部問合せの要素(行)を参照しません。次の例は、SELECT句内の単純な副問合せを示します。

SELECT assetId,
(SELECT zone
FROM ZoneClosed.std:lastevent) AS lastClosed
FROM RFIDEvent
SELECT assetId,
(SELECT zone
FROM ZoneClosed RETAIN ALL EVENTS) AS lastClosed
FROM RFIDEvent

次の例に示すように、外部問合せに依存している内部問合せは相関問合せと呼ばれます。問合せでは、内部問合せ内のWHERE句が外部問合せからのストリームを使用しています。

SELECT *
FROM RfidEvent AS RFID
WHERE 'Dock 1' =
(SELECT name
FROM Zones RETAIN ALL EVENTS WITH UNIQUE  zoneId
WHERE zoneId = RFID.zoneId)

前述の例はWHERE句内の副問合せを示します。文では、ゾーンIDに基づいて文字列定数とゾーン名が一致するRFIDイベントが選択されます。文ではRETAIN句にWITH UNIQUEサブ句を使用することで、ゾーンIDごとの最後のイベントのみが副問合せによる処理で保持されることが保証されます。

次の例はSELECT句内の相関副問合せです。この問合せのSELECT句では、ゾーンIDで関連付けられたZonesイベント・セットに対する副問合せによってゾーン名が取得されます。

SELECT zoneId,
(SELECT name
FROM Zones RETAIN ALL EVENTS WITH UNIQUE zoneId
WHERE zoneId = RFID.zoneId) AS name
FROM RFIDEvent

単純副問合せまたは相関副問合せで複数の行が返される場合、Oracle Event Processingでは副問合せの結果としてnull値が返されます。副問合せで返されるイベント数を制限するには、RETAIN句でWITH UNIQUEまたはPARTITION BYを使用することを検討します。

副問合せのSELECT句ではワイルドカードによる選択も可能であり、FROM句で定義されているイベント・タイプの基になるイベント・オブジェクトがイベント・プロパティとして返されます。例を示します。

SELECT
(SELECT *
FROM MarketData RETAIN 1 EVENT) AS md
MATCHING WITHIN 10 SECONDS

前述の文の出力イベントには、基になるMarketDataイベントがmdというプロパティに含まれています。文では、パターン定義に従って、10秒ごとに最後のMarketDataイベントがmdというプロパティに挿入されるか、またはMarketDataイベントがそれまで検出されなかった場合はnull値が挿入されます。

副問合せに適用される制限は以下のとおりです。

- 副問合せのストリーム定義では、副問合せの結果を制限するためのデータ・ウィンドウまたは他のビューを定義し、副問合せの実行で保持されるイベント数を軽減する必要があります。

- 副問合せで集約関数を使用することはできません。代わりに、INSERT INTO句を使用して副問合せで使用される集約結果を提供します。

- 副問合せはSELECT句、FROM句およびWHERE句でのみ構成される必要があります。副問合せの内部では、GROUP BYとHAVING句、結合、外部結合、および出力割合の制限は使用できません。

1つまたは複数の副問合せが含まれている文のパフォーマンスは、主に2つの要因に応じて変化します。1つ目には、副問合せによって、副問合せストリーム内の1つまたは複数の列がイコール記号(=)を使用して外側の文のストリームと関連付けられている場合、Oracle Event Processingでは行の迅速な取得のために、関連付けられた(結合された)キー値に基づいて適切な索引が自動的に構築されます。2つ目の要因には、副問合せストリーム内の行数とフィルタ条件(WHERE句)の複雑さがあります。これは、副問合せ・ストリーム内の各行がWHERE句のフィルタに対して評価される必要があるためです。

2.13 パラメータ化された問合せ

パラメータ化された問合せを使用すると、EPL問合せの内部に疑問符の形式でプレースホルダーを含めることができます。プレースホルダーは実行時に値とバインドされ、通常の文にコンパイルされます。プロセスはJDBCのPreparedStatementとほぼ同じです。

パラメータ化された問合せを使用すると、考えられるパラメータ値のそれぞれに個別のルールを作成する必要がなくなります。たとえば、シグナル・トレーディング・アプリケーションには照合の対象となる銘柄記号を選択する値のみが異なる300のルールが含まれています。実世界のアプリケーションでは、ルールのロジックが変更されるとそれによって300のルールすべてに同一の変更を加える必要が生じるため、300の個別のルールを管理することは厄介な作業です。代わりに、パラメータ化された問合せの手法によって、開発者は後から特定の銘柄記号の値にバインドされるプレースホルダーを問合せに配置できます。パラメータ化された問合せは、値とバインドされた後は通常の問合せにコンパイルされるため、問合せのパフォーマンスに悪影響を及ぼすことはありません。

パラメータ化されたEPL問合せに関連付けられたパラメータをJavaコードを作成せずに実行時に変更するには、『Oracle Fusion Middleware Oracle Event Processing管理者ガイド』のwlevs.Adminコマンドライン・リファレンスを使用します。

2.13.1 一般的な使用法

パラメータ化されたEPL問合せでは疑問符を使用してプレースホルダーの場所を指定します。現在定数を使用できる任意の式でプレースホルダーを使用できます。定数を使用するのと同じ場所にプレースホルダーを配置します。これは実際には、問合せのSELECTおよびWHERE句にのみプレースホルダーを指定できることを意味しています。RETAIN句でプレースホルダーを使用することはできません。

次の例は、パラメータ化された問合せを示します。

SELECT symbol, AVG(price) AS average, ? AS market
FROM StockTick t RETAIN ALL EVENTS
WHERE symbol = ?

この例では、SELECTおよびWHERE句の両方でプレースホルダーを指定する方法を示しています。実行時に、2つのプレースホルダーはNASDAQやORCLなどの値にバインドされるため、実行される実際のEPL文は以下のようになります。

SELECT symbol, AVG(price) AS average, NASDAQ AS market
FROM StockTick t RETAIN ALL EVENTS
WHERE symbol = ORCL

2.13.2 プロセッサ構成ファイルでのパラメータ化されたEPL文の使用

特定のプロセッサのEPLルールをコンポーネント構成ファイルで構成した場合は、<rule>要素を使用してEPL文を通常どおり指定します。2.13.1項「一般的な使用法」で説明しているように、疑問符を使用してプレースホルダーを指定します。

次に、<binding>要素を使用して、実行時にパラメータ化されたEPL文に渡す必要のあるカンマ区切りの値リストに対応する1つまたは複数の<params>要素を指定します。各<params>要素によって、新しいEPL問合せが新しいパラメータを使用して効率的に実行されます。<binding>のid属性を使用して、バインドが適用される特定のEPLルールを参照します。各<params>要素にはパラメータの単一のセットが含まれています。パラメータの順序はパラメータ化された問合せに出現する疑問符の順序に対応しています。

<params>のid属性を使用して個別のパラメータ・セットを一意に識別し、後からJMXまたはwlevs.Adminを使用して単一のパラメータ・セットを動的に削除できます。

構成ファイルのEPLルールのように、親要素<bindings>を使用して<binding>要素をグループにまとめます。

次の例では、2.13.1項「一般的な使用法」で説明している問合せについて、パラメータ化された問合せとランタイム・パラメータを指定する方法を示します。

<n1:config xmlns:n1="http://www.bea.com/ns/wlevs/config/application"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<processor>
<name>myProcessor</name>
<rules>
<rule id="MarketRule"><![CDATA[
SELECT symbol, AVG(price) AS average, ? AS market
FROM StockTick t RETAIN ALL EVENTS
WHERE symbol = ?
]]></rule>
</rules>
<bindings>
<binding id="MarketRule">
<params id="nasORCL">NASDAQ,ORCL</params>
<params id="nyJPM">NYSE,JPM</params>
<params id="nyWFC">NYSE,WFC</params>
</binding>
</bindings>
</processor>
</n1:config>

前述の例では、MarketRule EPL問合せに2つのプレースホルダーが含まれており、1つはSELECT句、もう1つはWHERE句にあります。<binding id="MarketRule">要素は、実行時にMarketRuleに渡されるパラメータ・セットのリストを指定します。各パラメータ・セットは単一の<params>要素で指定されます。パラメータ化された問合せには2つのプレースホルダーが含まれているため、各<params>要素にはカンマ区切りの2つの値が指定されています。

実行時に、上記のパラメータ化された問合せは以下の3つの問合せに効率的に分解されます。

SELECT symbol, AVG(price) AS average, NASDAQ AS market
FROM StockTick t RETAIN ALL EVENTS
WHERE symbol = ORCL
SELECT symbol, AVG(price) AS average, NYSE AS market
FROM StockTick t RETAIN ALL EVENTS
WHERE symbol = JPM
SELECT symbol, AVG(price) AS average, NYSE AS market
FROM StockTick t RETAIN ALL EVENTS
WHERE symbol = WFC

2.13.3 プログラムでのプリペアドEPL文の使用

アプリケーションでOracle Event Processing APIを使用してEPLルールを作成および実行し、パラメータ化されたルールを使用する場合は、com.bea.wlevs.ede.api.PreparedStatementインタフェースを使用して、提供されたパラメータ値に基づいたインタフェースを持つcom.bea.wlevs.ede.api.BoundStatementのインスタンスを作成します。

PreparedStatementおよびBoundStatementは両方とも、コンパイルされたEPL問合せを表す基本オブジェクトであるStatementを拡張します。PreparedStatementには、パラメータを問合せ内のプレースホルダーにバインドし、問合せ内のプレースホルダーの数を返し、バインドIDに基づいてBoundStatementのインスタンスを返す追加のメソッドがあります。BoundStatementには、EPL問合せのバインドに使用されるパラメータ値を取得し、実際のパラメータ化された問合せ自体を取得する追加のメソッドがあります。

PreparedStatementのstart()またはstop()メソッドが呼び出されると、Oracle Event ProcessingではPreparedStatementから作成されたすべてのBoundStatementsが起動または停止されます(これは、パラメータ化された問合せはそれ自身では実行不能であり、実際には固有のパラメータ値を使用して作成されたBoundStatementsのみが実行可能であるためです)。

これらのAPIの参照ドキュメントの詳細は、Oracle Fusion Middleware Oracle Event Processing Java APIリファレンスを参照してください。

次のJavaの例は、2.13.1項「一般的な使用法」で説明している問合せを使用してBoundStatementを作成する方法を示します。

String stmtString =
"select symbol, avg(price) as average, ? as market " +
"from StockTick t " +
"retain all events " +
"where symbol = ?"
;
processorImpl.createStatement(stmtString);
PreparedStatement preparedStmt = (PreparedStatement)processorImpl.createStatement(stmtString);
BoundStatement orclBoundStmt = preparedStmt.bind(new String[] {"NASDAQ","ORCL"});

3 EPLリファレンス: 演算子

この章では、イベント処理言語(EPL)の演算子のリファレンスについて説明します。EPLは非推奨になったことに注意してください。新たな開発ではOracle Continuous Query Language (Oracle CQL)を使用する必要があります。

この章には次の項が含まれます:

- EPL演算子の概要

- 算術演算子

- 論理演算子と比較演算子

- 連結演算子

- バイナリ演算子

- 配列定義演算子

- リスト演算子と範囲演算子

- 文字列演算子

- 時相演算子

3.1 EPL演算子の概要

EPLの算術および論理演算子の優先順位は、Java標準の算術および論理演算子の優先順位に従います。

3.2 算術演算子

以下の表に、使用可能な算術演算子の概要を示します。

表3-1算術演算子

演算子

説明

+, -

単項演算子として正または負の式を示します。二項演算子として加算または減算を行います。

*, /

二項演算子として乗算または除算を行います。

%

剰余の二項演算子です。

3.3 論理演算子と比較演算子

以下の表に、使用可能な論理演算子と比較演算子の概要を示します。

表3-2論理演算子と比較演算子

演算子

説明

NOT

後に続く条件がfalseの場合、trueを返し、trueの場合、falseを返します。

OR

いずれかのコンポーネント条件がtrueの場合、trueを返し、両方ともfalseの場合は、falseを返します。

AND

両方のコンポーネント条件がtrueの場合、trueを返し、いずれかがfalseの場合は、falseを返します。

=、!=、<、>、<=、>=、<>

比較演算子

3.4 連結演算子

以下の表に、使用可能な連結演算子の概要を示します。

表3-3 連結演算子

演算子

説明

||

文字列の連結

3.5 二項演算子

以下の表に、使用可能な二項演算子の概要を示します。

表3-4 二項演算子

演算子

説明

&

両オペランドが数値の場合はビット単位のAND(両オペランドがブール型の場合は条件のAND)。

|

両オペランドが数値の場合はビット単位のOR(両オペランドがブール型の場合は条件のOR)。

^

ビット単位の排他的OR(XOR)

3.6 配列定義演算子

中カッコ{および}は、Java配列初期化構文に準拠する配列定義演算子です。配列は、ユーザー定義関数に渡す場合や、SELECT句で配列データを選択する場合に便利です。

配列定義は中カッコで囲まれた0個以上の式から成ります。配列定義内では、定数、算術式、またはイベント・プロパティなどの任意の型の式を使用できます。配列定義の構文は以下のとおりです。

{ [expression [,expression [,…]]] }

actionsというイベント・プロパティを返す次の文について考えます。エンジンではactionsプロパティは2つの要素の長さを持つjava.lang.String値の配列として作成されます。配列内の最初の要素にはRFIDEventイベントのobservationプロパティ値が含まれ、2つ目の要素にはcommandプロパティが含まれます。

SELECT {observation, command} AS actions
FROM RFIDEvent RETAIN ALL

エンジンでは配列定義内の式で返される型に基づいて、配列の型を決定します。たとえば、配列定義内のすべての式で整数値が返される場合、配列の型はjava.lang.Integer[]です。すべての式で返される型が整数値やdouble値のように互換性のある数値型の場合、エンジンでは配列要素の値が変換され、適切な型が返されます。この例ではjava.lang.Double[]です。式の型が変換不能な場合、またはオブジェクト値が返された場合は、返される配列の型はObject[]です。配列定義ではnull値を使用できます。

ユーザー定義関数へのパラメータとして配列を使用すると便利です。

SELECT *
FROM RFIDEvent RETAIN ALL
WHERE Filter.myFilter(zone, {1,2,3})

3.7 リスト演算子と範囲演算子

この節では、以下の2つの演算子について説明します。

- 3.7.1項「IN演算子」

- 3.7.2項「BETWEEN演算子」

3.7.1 IN演算子

IN演算子は、指定の値がリスト内のいずれかの値と一致するかどうかを判定します。演算子の構文は以下のとおりです。

test_expression [NOT] IN (expression [,expression [,…]] )

test_expressionは任意の有効な式です。INキーワードの後に一致をテストする式のリストが続きます。省略可能なNOTキーワードでは、述部の結果が否定されます。

IN式の結果の型はBooleanです。test_expressionの値がカンマ区切りのリスト内の任意の式と等しい場合、結果の値はtrueです。それ以外の場合、結果の値はfalseです。すべての式はtest_expressionと同じ型または互換性のある型である必要があります。

次の例では、INキーワードを適用してRFIDEventsの特定のコマンド・タイプを選択する方法を示します。

SELECT *
FROM RFIDEvent RETAIN ALL
WHERE command IN ('OBSERVATION', 'SIGNAL')

この文は、次と同等です。

SELECT *
FROM RFIDEvent RETAIN ALL
WHERE command = 'OBSERVATION' OR symbol = 'SIGNAL'

3.7.2 BETWEEN演算子

BETWEEN演算子はテストする範囲を指定します。演算子の構文は以下のとおりです。

test_expression [NOT] BETWEEN begin_expression AND end_expression

test_expressionは任意の有効な式であり、begin_expressionおよびend_expressionで定義された式を含む範囲に対してテストする式です。NOTキーワードでは、述部の結果が否定されます。

BETWEEN式の結果の型はBooleanです。test_expressionの値がbegin_expressionの値以上であり、かつend_expressionの値以下である場合は、結果はtrueになります。

次の例では、BETWEENキーワードを使用して価格が55から60(その値を含む)の範囲内にあるイベントを選択する方法を示します。

SELECT *
FROM StockTickEvent RETAIN ALL
WHERE price BETWEEN 55 AND 60

BETWEENキーワードを使用しない同等の式は、次のとおりです。

SELECT *
FROM StockTickEvent RETAIN ALL
WHERE price >= 55 AND price <= 60

begin_expressionとend_expressionは順序を逆にすることもでき、問合せへの影響はありません。たとえば、次の例は上の例と同等です。

SELECT *
FROM StockTickEvent RETAIN ALL
WHERE price BETWEEN 60 AND 55

3.8 文字列演算子

この節では、以下の文字列演算子について説明します。

- 3.8.1項「LIKE演算子」

- 3.8.2項「REGEXP演算子」

3.8.1 LIKE演算子

LIKE演算子は標準のSQLパターン照合を提供します。SQLパターン照合では_を使用して任意の1文字を照合し、%を使用して任意の数の文字(0個の文字を含む)を照合できます。EPLでは、デフォルトでSQLパターンの大文字と小文字が区別されます。LIKEの構文は以下のとおりです。

test_expression [NOT] LIKE pattern_expression [ESCAPE string_literal]

test_expressionはString型または数値の結果を生成する任意の有効な式です。省略可能なNOTキーワードでは、述部の結果が否定されます。LIKEキーワードの後に、String型の結果を生成する任意の有効な標準のSQL pattern_expressionが続きます。省略可能なESCAPEキーワードは、パターン内の_および%値をエスケープするのに使用されるエスケープ文字を示します。

LIKE式の結果の型はBooleanです。test_expressionの値がpattern_expressionと一致する場合、結果の値はtrueです。それ以外の場合、結果の値はfalseです。LIKEキーワードの例を以下に示します。

SELECT *
FROM PersonLocationEvent RETAIN ALL
WHERE name LIKE '%Jack%'

次の例では、WHERE句でsuffixプロパティが1つの_文字であるイベントが照合されます。

SELECT *
FROM PersonLocationEvent RETAIN ALL
WHERE suffix LIKE '!_' ESCAPE '!'

3.8.2 REGEXP演算子

REGEXP演算子はJavaのjava.util.regexパッケージを通じて実装されている正規式に基づいたパターン照合の形式です。REGEXPの構文は以下のとおりです。

test_expression [NOT] REGEXP pattern_expression

test_expressionはString型または数値の結果を生成する任意の有効な式です。省略可能なNOTキーワードでは、述部の結果が否定されます。REGEXPキーワードの後に、String型の結果を生成する任意の有効な正規表現pattern_expressionが続きます。

REGEXP式の結果の型はBooleanです。test_expressionの値が正規表現pattern_expressionと一致する場合、結果の値はtrueです。それ以外の場合、結果の値はfalseです。

REGEXP演算子の例を次に示します。

SELECT *
FROM PersonLocationEvent RETAIN ALL
WHERE name REGEXP '*Jack*'

3.9 時相演算子

この節では、以下の時相演算子について説明します。

- 3.9.1項「FOLLOWED BY演算子」

- 3.9.2項「WITHIN演算子」

- 3.9.3項「EVERY演算子」

3.9.1 FOLLOWED BY演算子

FOLLOWED BY演算子では、まず左側の式がtrueになってから右側の式に一致するイベントがあるかどうかが確認されます。

たとえば、次のパターンではイベントAが検索され、これが検出された場合にイベントBが検索されます。

A FOLLOWED BY B

イベントAの直後にイベントBが続く必要はありません。イベントAとイベントBの間で他のイベントが発生する場合でも、この式はtrueに評価されます。この動作が適切でない場合は、NOT演算子を使用できます。

3.9.2 WITHIN演算子

WITHIN修飾子の動作はストップウォッチと同じです。関連付けられているパターン式が指定の時間内にtrueにならなかった場合、エンジンではfalseとして評価されます。WITHIN修飾子は、2.4.4項「時間間隔の指定」で指定されているとおり、時間間隔をパラメータとして受け取ります。

このパターンは、文の作成後5秒以内にAイベントが到着すると発動します。

A WITHIN 5 seconds

このパターンは5秒以内に到着するすべてのAイベントで発動します。

3.9.3 EVERY演算子

EVERY演算子は、EVERYキーワードで修飾されたサブ式がtrueまたはfalseに評価された場合に、パターンのサブ式が再度開始される必要があることを示します。EVERY修飾子を指定しない場合は、NOT式の内部に含まれていないパターン内の最初のイベント・ストリームのソースに暗黙的なEVERY演算子が修飾子として挿入されます。

EVERY演算子は包含されているパターンのサブ式のファクトリのように動作します。含まれているパターンのサブ式が発動し、イベントのチェックを終了すると、EVERYによって同じイベントまたはイベント・セットの以降の発生をリスンする新しいパターンのサブ式が開始されます。

EVERY演算子内のパターンのサブ式がtrueになるたびに、エンジンでは新しいアクティブなサブ式が開始され、それ以降のイベント、またはパターンのサブ式に一致するタイミング条件が参照されます。

このパターンは、Aイベントの後にBイベントが続いた場合に発動し、Bイベント後に再び照合する試みを続行します。

EVERY (A FOLLOWED BY B)

このパターンもAイベントの後にBイベントが続いた場合に発動しますが、Aイベント後に再び照合する試みを続行します。

EVERY A FOLLOWED BY B

このパターンのEVERYは指定が無くても暗黙的に同じ場所に付与されるため、省略可能です。

4 EPLリファレンス: 関数

この章では、イベント処理言語(EPL)の関数のリファレンスについて説明します。EPLは非推奨になったことに注意してください。新たな開発ではOracle Continuous Query Language (Oracle CQL)を使用する必要があります。

この章には次の項が含まれます:

- 単一行関数

- 集計関数

- ユーザー定義関数

4.1 単一行関数

単一行関数は、文で生成された1つの結果行につき1つの値を返します。これらの関数は、式が許可されている任意の場所で使用することができます。

EPLでは静的Javaライブラリ・メソッドを単一行関数として使用できます。また、組込みの単一行関数も提供されます。

EPLでは、以下のJavaライブラリ・パッケージが自動的にインポートされます。

- java.lang.*

- java.math.*

- java.text.*

- java.util.*

このため、以下の例のように、すべての式でJava静的ライブラリ・メソッドを使用できます。

SELECT symbol, Math.round(volume/1000)
FROM StockTickEvent RETAIN 30 SECONDS

他の任意のJavaクラスを使用することもできますが、完全修飾名を使用するか、インポートのために構成する必要があります。詳細は、4.3項「ユーザー定義関数」を参照してください。

以下の表に、使用可能な組込みの単一行関数の概要を示します。

表4-1組込みの単一行関数

単一行関数

結果

参照先

MAX(expression, expression [, expression [,…])

カンマ区切りの複数の式の中で最大の数値を返します。

4.1.1項「MIN関数とMAX関数」

MIN(expression, expression [, expression [,…])

カンマ区切りの複数の式の中で最小の値を返します。

4.1.1項「MIN関数とMAX関数」

COALESCE(expression, expression [, expression [,…])

リスト内の最初のnull以外の値を返します。null以外の値がない場合は、nullを返します。

4.1.2項「COALESCE関数」

CASE value
WHEN compare_value THEN result
[WHEN compare_value THEN result …]
[ELSE result]
END

最初の値と一致するcompare_valueの結果を返します。

4.1.3項「CASE制御フロー関数」

CASE value
WHEN condition THEN result
[WHEN condition THEN result …]
[ELSE result]
END

最初の条件を満たす結果を返します。

4.1.3項「CASE制御フロー関数」

PREV(expression, event_property)

データ・ウィンドウ内のイベント順序に関して、前のイベントのプロパティ値を返します。

4.1.4項「PREV関数」

PRIOR(integer, event_property)

本来のイベント到着の順序に関して、前のイベントのプロパティ値を返します。

4.1.5項「PRIOR関数」

SELECT
CASE
WHEN INSTANCEOF(item, com.mycompany.Service) THEN serviceName?
WHEN INSTANCEOF(item, com.mycompany.Product) THEN productName?
END
FROM OrderEvent

式で返される値の型が指定されたいずれかの値であるかどうかを示すブール値を返します。

4.1.6項「INSTANCEOF関数」

SELECT CAST(item.price?, double) FROM OrderEvent

指定した型に式の戻り値の型をキャストします。

4.1.7項「CAST関数」

SELECT EXISTS(item.serviceName?) FROM OrderEvent

関数へのパラメータで指定された動的プロパティがイベント内に存在するかどうかを示すブール値を返します。

4.1.8項「EXISTS関数」

ユーザー定義の単一行関数を作成することもできます。4.3項「ユーザー定義関数」を参照してください。

4.1.1 MIN関数とMAX関数

MINおよびMAX関数は複数の式パラメータを受け取ります。MIN関数はカンマで区切られたこれらの式の中で最小の数値を返し、MAX関数は最大の数値を返します。戻り値の型は、互換性のある、すべての戻り値の集約型です。

次の例では、MAX関数の戻り値の型はDoubleであり、値1.1が返されます。

SELECT MAX(1, 1.1, 2 * 0.5)
FROM ...

MIN関数は最小値を返します。次の文は、2つのタイム・スタンプの小さい方の値を決定する関数を使用しています。

SELECT symbol, MIN(ticks.timestamp, news.timestamp) AS minT
FROM StockTickEvent AS ticks, NewsEvent AS news RETAIN 30 SECONDS
WHERE ticks.symbol = news.symbol

MINおよびMAX関数は集約関数としても使用できます。この使用方法の説明は、4.2項「集約関数」を参照してください。

4.1.2 COALESCE関数

COALESCE関数の結果は、式のリストの中でnull以外の値を返す最初の式になります。戻り値の型は、互換性のある、すべての戻り値の集約型です。

次の例では、String型の値fooが返されます。

SELECT COALESCE(NULL, 'foo')
FROM …

4.1.3 CASE制御フロー関数

CASE制御フロー関数には2つのバージョンがあります。最初のバージョンは、値およびこの値と比較される比較値のリストを受け取り、最初の値が比較値と一致した結果を返します。2つ目のバージョンは、条件リストを受け取り、最初の条件を満たす結果を返します。

CASE式の戻り値の型は、互換性のある、すべての戻り値の集約型です。

次の例はCASE文の最初のバージョンです。戻り値の型はStringであり、値oneが返されます。

SELECT CASE 1 WHEN 1 THEN 'one' WHEN 2 THEN 'two' ELSE 'more' END
FROM …

CASE関数の2つ目のバージョンは条件リストを受け取ります。次の例では、戻り値の型はBooleanであり、Boolean値trueが返されます。

SELECT CASE WHEN 1>0 THEN true ELSE false END
FROM …

4.1.4 PREV関数

PREV関数は前のイベントのプロパティ値を返します。最初のパラメータは、データ枠で指定された順序で何番目の前のイベントであるかを指定します。第2パラメータは、関数により値が返される、前のイベントのプロパティ名です。

次の例では、現在のTradeイベントの2つ前のイベントのpriceプロパティの値が選択されます。

SELECT PREV(2, price)
FROM Trade RETAIN 10 EVENTS

PREV関数ではデータ・ウィンドウで指定された順序が考慮されるため、並べ替えられたウィンドウでこの関数を使用すると便利です。次の例では、最大量、2番目に大きい量、および3番目に大きい量を持つ3つのTradeイベントの銘柄が選択されます。

SELECT PREV(0, symbol), PREV(1, symbol), PREV(2, symbol)
FROM Trade RETAIN 10 EVENTS WITH LARGEST volume

何番目の前のイベントであるかを指定するパラメータには、Integer型の値を返す式を使用することもできます。次の文では、Tradeデータ・ウィンドウが、並べ替えられたTradeデータ・ウィンドウ内の特定の位置を参照するrankプロパティを提供するRankSelectionEventイベントと結合されます。

SELECT PREV(rank, symbol)
FROM Trade, RankSelectionEvent RETAIN 10 EVENTS WITH LARGEST volume

PREV関数は、指定されている何番目か前のイベントが現在のデータ・ウィンドウに含まれていない場合、NULL値を返します。次の例では、時間バッチ・ウィンドウを使用した例を示しています。このPREV関数では、前のイベントが同じイベント・バッチ内に存在しない任意のイベントに対してnull値が返されます。結果のnull値が適切でない場合は、下で説明しているPRIOR関数を使用できます。

SELECT PREV(1, symbol)
FROM Trade RETAIN BATCH OF 1 MINUTE

4.1.4.1 各グループの前のイベント

PREV関数とPARTITION BY句を組み合せることにより、指定のグループに含まれている前のイベントのプロパティ値が返されます。

たとえば、現在のイベントと同じ銘柄の前のイベントの価格を取得すると想定します。

この問題を解決する文は以下のとおりです。1分の時間ウィンドウでsymbolプロパティに対してウィンドウが分割されます。これにより、これまでにない新しい銘柄値がエンジンで検出されると、その銘柄のイベントを個別に保持する新しいウィンドウが作成されます。この結果、PREV関数では、イベントの銘柄値が持つそれぞれの時間ウィンドウ内にある前のイベントが返されます。

SELECT PREV(1, price) AS prevPrice
FROM Trade RETAIN 1 MIN PARTITION BY symbol

4.1.4.2 制限

PREV関数およびその結果に適用される制限は、次のとおりです。

- 関数は常に削除ストリーム(古いデータ)のイベントに対してnull値を返します。

- 関数はRETAIN句の制約のあるストリームでのみ使用できます。

4.1.5 PRIOR関数

PRIOR関数は前のイベントのプロパティ値を返します。最初のパラメータは、本来の到着順で何番目の前のイベントであるかを示す整数値です。第2パラメータは、関数により値が返される、前のイベントのプロパティ名です。

次の例では、現在のTradeイベントの2つ前のイベントのpriceプロパティの値が選択されます。

SELECT PRIOR(2, price)
FROM Trade RETAIN ALL

PRIOR関数は任意のイベント・ストリームまたはビューに対して使用でき、PREV関数のようにRETAIN句の制約をストリームに付与する必要がありません。関数は、イベントを提供するイベント・ストリーム内のイベントの到着順に基づいて動作します。

次の文では、長さのバッチ・ウィンドウを使用してTradeイベント3件ごとの平均量を計算し、イベント3件ごとに結果をポストします。SELECT句では現在の平均およびその前の平均を選択するためにPRIOR関数を使用します。

SELECT AVG(volume) AS avgVolume, AVG(PRIOR(3, volume))
FROM Trade RETAIN BATCH OF 3 EVENTS

4.1.5.1 PREV関数との比較

PRIOR関数はPREV関数とほぼ同様です。2つの関数の主な違いは以下のとおりです。

- PREV関数はウィンドウで指定された順序での前のイベントを返し、PRIOR関数はストリーム内の到着順序での前のイベントを返します。

- PREV関数ではRETAIN句が必要ですが、PRIOR関数では必要ありません。

- PREV関数はグループ化を考慮して前のイベントを返します。PRIOR関数はグループ化に関係なく前のイベントを返します。

- PREV関数は削除ストリームのイベント(データ・ウィンドウを離れるイベント)に対しnull値を返します。PRIOR関数にこの制限はありません。

4.1.6 INSTANCEOF関数

INSTANCEOF関数は、式で返される値の型が指定されたいずれかの値であるかどうかを示すブール値を返します。INSTANCEOF関数の最初のパラメータは評価される式です。第2パラメータ以降はJava型名です。

INSTANCEOF関数は実行時に式を評価して戻り値の型を決定し、式で返されたオブジェクトの型を定義されている型と比較します。式で返されたオブジェクトの型が指定された型のいずれかと一致する場合は、trueを返します。式で返された値がnullまたは指定されたどの型とも一致しない型の場合は、falseを返します。

INSTANCEOF関数は多くの場合、動的な(チェックされていない)プロパティとともに使用されます。動的プロパティとはコンパイル時に型が不明なプロパティです。

次の例では、INSTANCEOF関数を使用して、型に基づいて異なるプロパティを選択します。

SELECT
CASE
WHEN INSTANCEOF(item, com.mycompany.Service) THEN serviceName?
WHEN INSTANCEOF(item, com.mycompany.Product) THEN productName?
END
FROM OrderEvent

INSTANCEOF関数は、INSTANCEOFで調査した式がnullを返す場合はfalseを返します。

型パラメータに使用できる値は以下のとおりです。

- int、long、byte、short、char、double、float、stringの任意のJava組込み型(stringは、java.lang.Stringの短縮表記です)。型名では大文字と小文字が区別されません。たとえば、次の関数は動的なpriceプロパティがfloat型またはdouble型であるかどうかを調べます。

INSTANCEOF(price?, double, float)

- 調査するクラスの完全修飾クラス名。例:

INSTANCEOF(product, org.myproducer.Product)

型パラメータ・リストに使用できる値は以下のとおりです。

INSTANCEOF関数ではイベント・クラスのスーパークラス、およびスーパークラスによって直接または間接的に実装されたすべてのインタフェースが考慮されます。

4.1.7 CAST関数

CAST関数は式の戻り値の型を目的の型にキャストします。関数は2つのパラメータを受け取ります。最初のパラメータはプロパティ名、またはキャストする値が返される式です。第2パラメータはキャストする型です。

第2の型パラメータに使用できる値は以下のとおりです。

- int、long、byte、short、char、double、float、stringの任意のJava組込み型(stringは、java.lang.Stringの短縮表記です)。型名では大文字と小文字が区別されません。例:

cast(price, double)

- キャストするクラスの完全修飾クラス名。例:

cast(product, org.myproducer.Product)

CAST関数は多くの場合、動的な(チェックされていない)プロパティの型を提供するために使用されます。動的プロパティとはコンパイル時に型が不明なプロパティです。これらのプロパティの型は常にjava.lang.Objectです。

次の例は、CAST関数を使用してOrderEventでitemの動的なpriceプロパティをdouble値にキャストする方法を示します。

SELECT CAST(item.price?, double)
FROM OrderEvent

CAST関数は、式の結果を目的の型にキャストできない場合または式の結果自体がnullである場合、null値を返します。

CAST関数には、次の型変換ルールが適用されます。

- すべての数値型の場合、CAST関数は必要であれば数値型の変換にjava.lang.Numberを使用します。

- stringまたはjava.lang.Stringへのキャストの場合、CAST関数は式の結果に対してtoStringを呼び出します。

- アプリケーション・オブジェクトを含む他のオブジェクトへのキャストの場合、CAST関数ではJavaクラスのスーパークラス、およびスーパークラスによって直接または間接的に実装されたすべてのインタフェースが考慮されます。

4.1.8 EXISTS関数

EXISTS関数は、関数へのパラメータで指定された動的プロパティがイベント内に存在するかどうかを示すブール値を返します。EXISTS関数は唯一のパラメータとして1つの動的プロパティ名を受け取ります。

動的な(チェックされていない)プロパティでEXISTS関数を使用します。動的プロパティとはコンパイル時に型が不明なプロパティです。動的プロパティは、動的プロパティがイベントに存在しない場合、または動的プロパティが存在しても値がnullである場合、null値を返します。

EXISTS関数を使用した次の例では、serviceNameプロパティを持つオブジェクトがitemプロパティに含まれている場合、trueが返されます。itemプロパティがnullである場合、またはserviceNameというプロパティを持つオブジェクトがitemプロパティに含まれていない場合は、falseが返されます。

SELECT EXISTS(item.serviceName?)
FROM OrderEvent

4.2 集約関数

集約関数には、SUM、AVG、COUNT、MAX、MIN、MEDIAN、STDDEV、AVEDEVがあります。集約関数を使用してイベント・プロパティのデータを計算および要約できます。たとえば、直前の30秒間のすべての株価表示イベントの合計額を算出する場合は、以下のようになります。

SELECT SUM(price)
FROM StockTickEvent RETAIN 30 SECONDS

集約関数の構文は、以下のとおりです。

aggregate_function( [ALL | DISTINCT] expression)

イベント・ストリーム・ウィンドウや他のビュー内のすべてのイベント、または1つ以上のイベントのグループに集約関数を適用できます。EPLでは、集約関数が適用されるイベント・セットごとに1つの値が生成されます。

式は通常、イベント・プロパティ名です。ただし、定数、関数、または算術演算子でつながれたイベント・プロパティ名、定数、関数の任意の組み合わせを使用できます。

たとえば、価格が倍増したときに直前の30秒間のすべての株価表示イベントの平均額を算出する場合は、以下のようになります。

SELECT AVG(price * 2)
FROM StockTickEvent RETAIN 30 SECONDS

省略可能なキーワードDISTINCTをすべての集約関数とともに使用して、集約関数が適用される前に重複値を消去できます。デフォルトは、すべてのイベントで操作を実行する省略可能なキーワードALLです。

MINおよびMAX集約関数は単一行関数と同様に使用できます。使用方法は、4.1.1項「MIN関数とMAX関数」を参照してください。

以下の表に、集約関数の構文および生成される結果を示します。

表4-2 集約関数

集約関数

結果

SUM([ALL|DISTINCT] expression)

expressionに含まれる(個別の)値の合計。式に応じて、long、double、floatまたはinteger型の値を返します。

AVG([ALL|DISTINCT] expression)

expressionに含まれる(個別の)値の平均。double型の値を返します。

COUNT([ALL|DISTINCT] expression)

expressionに含まれる(個別の)null以外の値の個数。long型の値を返します。

COUNT(*)

イベント数(long型の値を返します)。

MAX([ALL|DISTINCT] expression)

expressionに含まれる(個別の)値の最大値。式自体で返される値と同じ型の値を返します。

MIN([ALL|DISTINCT] expression)

expressionに含まれる(個別の)値の最小値。式自体で返される値と同じ型の値を返します。

MEDIAN([ALL|DISTINCT] expression)

expressionに含まれる(個別の)値の中央値。double型の値を返します。

STDDEV([ALL|DISTINCT] expression)

expressionに含まれる(個別の)値の標準偏差。double型の値を返します。

Oracle Event Processingでは、数学上の精密な定義のかわりに標本標準偏差と呼ばれる共通基準をSTDDEVの内部実装に採用しています。Oracle Event Processingで使用されているSTDDEVの定義は以下のとおりです。

stddev(x) = (1/(N-1) * SUM{i=1 ... n}(xi - xavg) ) ^ (1/2)

AVEDEV([ALL|DISTINCT] expression)

expressionに含まれる(個別の)値の平均偏差。double型の値を返します。

Oracle Event Processingで使用されているAVEDEVの定義は以下のとおりです。

avedev(x) = 1/n * SUM{i=1 .. . n} (x_i ? xavg)

TREND(expression)

expressionの連続的な上昇ティック(正の数)、下降ティック(負の数)または変化なし(ゼロ)。

SELECT句およびHAVING句の中で集約関数を使用できます。WHERE句では集約関数を使用できませんが、WHERE句を使用して集約関数が適用されるイベントを制限できます。次の問合せでは、銘柄にかかわらず直前の10件の株価表示イベントについて、銘柄ACMEのみに対し株価表示イベントの平均額と合計額を計算します。

SELECT 'ACME stats' AS title, AVG(price) AS avgPrice, SUM(price) AS sumPrice
FROM StockTickEvent RETAIN 10 EVENTS
WHERE symbol='ACME'

前述の例では、要素10の長さのウィンドウはWHERE句の影響を受けず、銘柄に関係なくすべてのイベントが長さのウィンドウに入れられ、ウィンドウから出されます。直前の10件のACMEイベントのみが必要な場合は、以下のようにMATCHING句を追加する必要があります。

SELECT 'ACME stats' AS title, AVG(price) AS avgPrice, SUM(price) AS sumPrice
FROM (SELECT * FROM StockTickEvent WHERE symbol='ACME')
RETAIN 10 EVENT

集約関数は任意の型のイベント・プロパティまたは式で使用できますが、以下の制限があります。

- SUM、AVG、MEDIAN、STDDEV、AVEDEVは数値のイベント・プロパティのみで使用できます。

EPLでは、集約関数が動作するイベント・プロパティまたは式で返されるnull値はすべて無視されますが、例外的にCOUNT(*)関数ではnull値も考慮されます。データ・セットにイベントが含まれていない場合、またはデータ・セット内のすべてのイベントの集約式にnull値しか含まれていない場合、すべての集約関数はnullを返します。

集約ユーザー定義関数を作成することもできます。詳細は、4.3項「ユーザー定義関数」を参照してください。

4.3 ユーザー定義関数

ユーザー定義関数は、任意の場所で式自体として呼び出したり、式の内部で呼び出すことができます。関数は、文の作成時にクラス・ローダーによって解決可能なパブリック静的メソッドである必要があります。エンジンは文の作成時に関数の参照を解決し、パラメータの型を検証します。

注意:
EPL問合せでは多重呼出し不変のユーザー定義関数のみを使用できます。つまり、ユーザー定義関数を複数呼び出しても結果は変更されません。

次の例では、クラスMyClassで、2つのパラメータを受け取り、doubleなどの数値型を返すパブリック静的メソッドmyFunctionが公開されていると想定します。

SELECT 3 * MyClass.myFunction(price, volume) as myValue
FROM StockTick RETAIN 30 SECONDS

次の例で示すように、ユーザー定義関数では配列パラメータも使用できます。生成される配列の型の詳細は、3.6項「配列定義演算子」で説明しています。

SELECT *
FROM RFIDEvent RETAIN 10 MINUTES
WHERE com.mycompany.rfid.MyChecker.isInZone(zone, {10, 20, 30})

Oracle Event Processingは単一行および集約ユーザー定義関数の両方をサポートします。

詳細は、『Oracle Fusion Middleware Oracle Event Processing for Eclipse開発者ガイド』のwlevs:functionに関する項を参照してください。

5 EPLへのプログラミング・インタフェース

この章では、イベント処理言語(EPL)を処理するためのJava APIについて説明します。EPLは非推奨になったことに注意してください。新たな開発ではOracle Continuous Query Language (Oracle CQL)を使用する必要があります。

この章には次の項が含まれます:

- Javaプログラミング・インタフェース

5.1 Javaプログラミング・インタフェース

EPLへのJavaプログラミング・インタフェースのルートはcom.bea.wlevs.ede.api.Processorインタフェースです。このインタフェースには、EPL文をロード、コンパイル、開始、終了、および取得するメソッドが用意されています。

EPL文は、以下のメソッドを通じて個別にロードおよびコンパイルされます。

Statement createStatement(String query) throws StatementException;

問合せのコンパイルが失敗するとStatementExceptionがスローされます。また、以下のメソッドを使用すると、複数の文がURLからロードされます。

List<Statement> loadStatements (URL location) throws MultiStatementException;

問合せのコンパイルが失敗するとMultiStatementExceptionがスローされます。ルール・ファイルの構造は、『Oracle Fusion Middleware Oracle Event Processing for Eclipse開発者ガイド』のEPLプロセッサの構成に関する項で説明しています。createStatementを通じてコンパイルされた個々の問合せは永続化されず、URLの場所に置かれたルール・ファイルが影響を受けることはありません。

com.bea.wlevs.ede.api.Statementインタフェースでは、次のメソッドを使用してEPL文にイベント・シンクをアタッチできます。

void addEventSink (EventSink listener);

文の実行結果としてイベントが出力ウィンドウに追加された場合、エンジンによってccom.bea.wlevs.ede.api.EventSinkインタフェースに対し、次のメソッドが呼び出されます。

void onEvent (List newEvents);

詳細は、Oracle Fusion Middleware Oracle Event Processing Java APIリファレンスを参照してください。

オラクル社の法律上の注意点について

コピーライトについて

Copyright © 1994-2015, Oracle and/or its affiliates.All rights reserved.

商標と登録商標について

OracleおよびJavaはOracle Corporationおよびその関連企業の登録商標です。その他の名称は、それぞれの所有者の商標または登録商標です。

Intel、Intel Xeonは、Intel Corporationの商標または登録商標です。すべてのSPARCの商標はライセンスをもとに使用し、SPARC International, Inc.の商標または登録商標です。AMD、Opteron、AMDロゴ、AMD Opteronロゴは、Advanced Micro Devices, Inc.の商標または登録商標です。UNIXは、The Open Groupの登録商標です。

ライセンス制約の保証と結果的に生じる損害の免責

このソフトウェアおよび関連ドキュメントの使用と開示は、ライセンス契約の制約条件に従うものとし、知的財産に関する法律により保護されています。ライセンス契約で明示的に許諾されている場合もしくは法律によって認められている場合を除き、形式、手段に関係なく、いかなる部分も使用、複写、複製、翻訳、放送、修正、ライセンス供与、送信、配布、発表、実行、公開または表示することはできません。このソフトウェアのリバース・エンジニアリング、逆アセンブル、逆コンパイルは互換性のために法律によって規定されている場合を除き、禁止されています。

保証免責

ここに記載された情報は予告なしに変更される場合があります。また、誤りが無いことの保証はいたしかねます。誤りを見つけた場合は、オラクル社までご連絡ください。

制限付権利

このソフトウェアまたは関連ドキュメントを、米国政府機関もしくは米国政府機関に代わってこのソフトウェアまたは関連ドキュメントをライセンスされた者に提供する場合は、次の通知が適用されます。

U.S. GOVERNMENT END USERS: Oracle programs, including any operating system, integrated software, any programs installed on the hardware, and/or documentation, delivered to U.S. Government end users are "commercial computer software" pursuant to the applicable Federal Acquisition Regulation and agency-specific supplemental regulations.As such, use, duplication, disclosure, modification, and adaptation of the programs, including any operating system, integrated software, any programs installed on the hardware, and/or documentation, shall be subject to license terms and license restrictions applicable to the programs.No other rights are granted to the U.S. Government.

危険な用途への使用について

このソフトウェアもしくはハードウェアは様々な情報管理アプリケーションでの一般的な使用のために開発されたものです。このソフトウェアもしくはハードウェアは、危険が伴うアプリケーション（人的傷害を発生させる可能性があるアプリケーションを含む）への用途を目的として開発されていません。このソフトウェアもしくはハードウェアを危険が伴うアプリケーションで使用する際、安全に使用するために、適切な安全装置、バックアップ、冗長性（redundancy）、その他の対策を講じることは使用者の責任となります。このソフトウェアもしくはハードウェアを危険が伴うアプリケーションで使用したことに起因して損害が発生しても、オラクル社およびその関連会社は一切の責任を負いかねます。

第三者のコンテンツ、製品、サービスに対する免責事項

このソフトウェアまたはハードウェア、そしてドキュメントは、第三者のコンテンツ、製品、サービスへのアクセス、あるいはそれらに関する情報を提供することがあります。オラクル社およびその関連会社は、第三者のコンテンツ、製品、サービスに関して一切の責任を負わず、いかなる保証もいたしません。オラクル社およびその関連会社は、第三者のコンテンツ、製品、サービスへのアクセスまたは使用によって損失、費用、あるいは損害が発生しても一切の責任を負いかねます。

ドラフトのアルファ版およびベータ版ドキュメントについて

このドキュメントが試作版の場合:

このドキュメントは試作版であり、デモおよび暫定使用のみを目的としたものです。このソフトウェアを使用するハードウェアに限定するものではありません。オラクル社およびその関連会社は、このドキュメントに関して一切の責任を負わず、いかなる保証もいたしません。また、このドキュメントを使用したことによって損失、費用、あるいは損害が発生しても、一切の責任を負いかねます。