Oracle® Fusion Middleware

Oracle CQLデータ・カートリッジによるアプリケーションの開発

12cリリース(12.2.1.2.0)

E82779-01(原本部品番号:E67755-01)

2016年10月

このガイドは、Oracle Stream Analyticsのデータ・カートリッジについて説明します。データ・カートリッジはOracle Continuous Query Language (Oracle CQL)を拡張し、単純型、複合型、配列型およびドメイン固有関数の形式のドメイン固有抽象データ型をサポートします。

Oracle Fusion Middleware Oracle CQLデータ・カートリッジによるアプリケーションの開発, 12c リリース(12.2.1.2.0)

E82779-01

Copyright © 2007, 2016, 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およびその関連会社は、第三者のコンテンツ、製品、サービスへのアクセスまたは使用によって損失、費用、あるいは損害が発生しても一切の責任を負いかねます。

目次

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

はじめに

- 対象読者

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

- 関連ドキュメント

- 表記規則

- 構文図

このガイドで説明する新機能

1 データ・カートリッジの概要

- 1.1 Oracle CQLデータ・カートリッジ・フレームワーク

- 1.2 名前

- 1.3 アプリケーション・コンテキスト

2 Oracle JDBCカートリッジおよびOracle Spatialデータ・カートリッジ

- 2.1 Oracle空間アプリケーション・コンテキストの構成方法

- 2.2 Oracle JDBCデータ・カートリッジ・アプリケーション・コンテキストの構成方法

3 Oracle JDBCデータ・カートリッジ

- 3.1 Oracle Stream Analytics JDBCデータ・カートリッジについて

- 3.1.1 データ・カートリッジ名

- 3.1.2 スコープ

- 3.1.3 パラメータの指定

- 3.1.4 Oracle Stream Analytics JDBCデータ・カートリッジ・アプリケーション・コンテキスト

- 3.1.4.1 EPNファイルでのJDBCカートリッジ・コンテキストの宣言

- 3.1.4.2 アプリケーション構成ファイルでのJDBCカートリッジ・コンテキストの構成

- 3.2 Oracle Event Processing JDBCデータ・カートリッジの使用

- 3.2.1 SQL文の定義: function要素

- 3.2.1.1 function要素の属性

- 3.2.1.2 function要素の子要素

- 3.2.1.2.1 param

- 3.2.1.2.2 return-component-type

- 3.2.1.2.3 sql

- 3.2.1.3 function要素の使用方法

- 3.2.1.3.1 複数のパラメータのあるJDBCカートリッジ・コンテキスト関数

- 3.2.1.3.2 PL/SQL関数の呼出し

- 3.2.1.3.3 複雑なJDBCカートリッジ・コンテキスト関数

- 3.2.1.3.4 JDBCカートリッジ・コンテキスト関数のオーバーロード

- 3.2.2 Oracle Stream Analytics JDBCデータ・カートリッジを使用したOracle CQL問合せの定義

- 3.2.2.1 SELECTリストのエイリアスの使用

- 3.2.2.2 TABLE句の使用

- 3.2.2.3 ネイティブCQL型をreturn-component-typeとして使用

4 Oracle Spatialデータ・カートリッジ

- 4.1 Oracle Spatialの理解

- 4.1.1 データ・カートリッジ名

- 4.1.2 スコープ

- 4.1.2.1 ジオメトリ・タイプ

- 4.1.2.2 要素情報配列

- 4.1.2.3 縦座標系および座標系とSDO_SRID

- 4.1.2.4 ジオメトリ索引

- 4.1.2.5 ジオメトリ比較演算子

- 4.1.2.6 ジオメトリ・フィルタ演算子

- 4.1.2.7 ジオメトリ集約

- 4.1.2.8 ジオメトリAPI

- 4.1.2.8.1 com.oracle.cep.cartridge.spatial.Geometryのメソッド

- 4.1.2.8.2 oracle.spatial.geometry.JGeometryのメソッド

- 4.1.3 データ型マッピング

- 4.1.4 Oracle Spatialアプリケーション・コンテキスト

- 4.2 Oracle Spatialの使用

- 4.2.1 Oracle Spatial Java APIジオメトリ・タイプへのアクセス方法

- 4.2.2 ジオメトリの作成方法

- 4.2.3 Geometry型のパブリックなメソッドおよびフィールドへのアクセス方法

- 第4.2.4項 ジオメトリ比較演算子の使用方法

- 4.2.5 ジオメトリ・フィルタ演算子の使用方法

- 4.2.6 ジオメトリ集約演算子の使用方

- 4.2.7 デフォルト測地座標の使用方法

- 4.2.8 他の測地座標の使用方法

5 Oracleビッグ・データ・カートリッジ

- 5.1 ビッグ・データとは

- 5.2 Hadoopデータ・カートリッジ

- 5.2.1 Oracle Stream Analytics Hadoopデータ・カートリッジについて

- 5.2.1.1 使用シナリオ: 購買データを使用した購入インセンティブの開発

- 5.2.1.2 データ・カートリッジ名

- 5.2.2 Oracle CQLでのHadoopデータ・ソースの使用

- 5.2.2.1 Oracle Stream AnalyticsとHadoopの統合の構成

- 5.2.2.2 HadoopシステムのファイルのEPNへの統合

- 5.2.2.3 Oracle CQLでのHadoopデータの使用

- 5.3 NoSQLデータ・カートリッジ

- 5.3.1 Oracle CQLプロセッサ問合せ

- 5.3.2 データ・カートリッジ名

- 5.3.3 Oracle CQLでのNoSQL Databaseの使用

- 5.3.3.1 NoSQL DatabaseのEPNへの統合

- 5.3.3.2 Oracle CQLでのNoSQLデータの使用

- 5.3.3.2.1 NoSQLストアからのエントリ取得に使用されるキーの書式設定

- 5.4 HBaseビッグ・データ・カートリッジ

- 5.4.1 HBaseカートリッジについて

- 5.4.2 HBaseカートリッジの使用

- 5.4.3 リリース12.2.1におけるHBaseカートリッジの制限

6 Oracle Javaデータ・カートリッジ

- 6.1 Oracle Javaデータ・カートリッジの理解

- 6.1.1 データ・カートリッジ名

- 6.1.2 クラスのロード

- 6.1.2.1 アプリケーション・クラス領域ポリシー

- 6.1.2.2 自動インポート禁止クラス領域ポリシー

- 6.1.2.3 サーバー・クラス領域ポリシー

- 6.1.2.4 クラスのロード例

- 6.1.3 メソッド解決

- 6.1.4 データ型マッピング

- 6.1.4.1 Javaデータ型StringおよびOracle CQLデータ型CHAR

- 6.1.4.2 リテラル

- 6.1.4.3 配列

- 6.1.4.4 コレクション

- 6.1.5 Oracle CQL問合せでのOracle Javaデータ・カートリッジのサポート

- 6.2 Oracle Javaデータ・カートリッジの使用

- 6.2.1 Java APIを使用した問合せ方法

- 6.2.2 エクスポートしたJavaクラスを使用した問合せ方法

- 6.2.3 Javaキャスト関数

7 データ・カートリッジ・フレームワーク

- 7.1 SPIについて

- 7.2 インタフェース

- 7.2.1 インタフェースの説明

- 7.2.2 例外

- 7.3 カートリッジの例

- 7.3.1 算術カートリッジ

- 7.3.2 データ・ソース・カートリッジ

- 7.4 ソース・コード

- 7.4.1 算術カートリッジ

- 7.4.2 データ・ソース・カートリッジ

A Oracle SpatialコマンドおよびAPIリファレンス

- A.1 ANYINTERACT

- A.2 buffer

- A.3 bufferPolygon

- A.4 CONTAIN

- A.5 convertTo2D

- A.6 convertTo3D

- A.7 createCircle

- A.8 createElemInfo

- A.9 createGeometry

- A.10 createLinearLineString

- A.11 createLinearMultiLineString

- A.12 createLinearPolygon

- A.13 createMultiPoint

- A.14 createPoint

- A.15 createRectangle

- A.16 distance

- A.17 einfogenerator

- A.18 FILTER

- A.19 get2dMbr

- A.20 INSIDE

- A.21 INSIDE3D

- A.22 NN

- A.23 ordsgenerator

- A.24 to_Geometry

- A.25 to_J3D_Geometry

- A.26 to_JGeometry

- A.27 WITHINDISTANCE

はじめに

このリファレンスでは、データのストリーミングをサポートするコンストラクトが追加された、SQLに基づく問合せ言語であるOracle Continuous Query Language (Oracle CQL)について詳細に説明します。Oracle CQLを使用すると、Oracle Event Processingを使用してイベント処理を実行するためのデータ・ストリームに対する問合せを表現できます。Oracle CQLは新しいテクノロジですが、SQL99のサブセットに基づいています。

対象読者

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

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

Oracleのアクセシビリティへの取り組みについては、Oracle Accessibility ProgramのWebサイト(http://www.oracle.com/pls/topic/lookup?ctx=acc&id=docacc)にアクセスしてください。

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 SOAおよびBPM製品の既知の問題: http://www.oracle.com/technetwork/middleware/soasuite/documentation/soaknownissues122120-3111966.html。

- Oracle Stream Analyticsの管理

- Oracle Stream Analyticsによるイベント処理のためのアプリケーション開発

- Oracle Stream Analyticsイベント処理スタート・ガイド

- Oracle Stream Analyticsのスキーマ・リファレンス

- Oracle Stream AnalyticsのVisualizerの使用

- Oracle Stream Analyticsのカスタマイズ

- Oracle CQL言語リファレンス

- Oracle Stream AnalyticsのJava APIリファレンス

- Oracle Stream Analyticsの使用

- Oracle Stream Analyticsスタート・ガイド

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

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

表記規則

このマニュアルでは次の表記規則を使用します。

表記規則

意味

太字

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

イタリック

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

固定幅フォント

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

構文図

このドキュメントには、Oracle CQL、SQL、PL/SQLまたはその他のコマンドライン・コンストラクトのグラフィカル形式またはバッカス・ナウア記法(BNF)による構文説明が含まれています。

このガイドで説明する新機能

製品名はこのリリースでOracle Stream ExplorerからOracle Stream Analyticsに変更されました。

使用しているスキンによっては、このガイドで示される画面は実装状態と異なる場合があります。相違点は軽微なものです。

項

変更内容

HBaseビッグ・データ・カートリッジ.

HBaseデータ・カートリッジについて説明する新しい項

1 データ・カートリッジの概要

Oracle Stream Analyticsデータ・カートリッジはOracle Continuous Query Language (Oracle CQL)を拡張し、ドメイン固有抽象データ型(単純型、複合型、配列型およびドメイン固有関数の形式)をサポートします。

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

- Oracle CQLデータ・カートリッジ・フレームワーク

- 名前

- アプリケーション・コンテキスト

1.1 Oracle CQLデータ・カートリッジ・フレームワーク

Oracle CQLデータ・カートリッジ・フレームワークにより、任意のドメインのデータ型および関数をOracle CQL言語に密接に統合できるようになります。密接な統合により、Oracle CQLネイティブ型および組込み関数を使用するのと同じ方法で、Oracle CQL問合せでデータ・カートリッジ拡張機能を使用できます。このフレームワークは、単純データ型と複合データ型の両方をサポートしています。複合データ型により、オブジェクト指向プログラミングが可能になります。

現在、Oracle Stream Analyticsは次のデータ・カートリッジを提供しています。

- Oracle JDBCデータ・カートリッジ: このデータ・カートリッジにより、Oracle CQL問合せおよびビューの複数の表およびデータ・ソースに対して、Oracle CQLネイティブ型と同じように、任意のSQL関数を統合できるようになります。

- Oracle Spatial: このデータ・カートリッジは、Oracle CQL問合せおよびビューで、Oracle CQLネイティブ型と同じように、Oracle Spatialの型、メソッド、フィールドおよびコンストラクタを公開します。

- Hadoopビッグ・データ・カートリッジ: このデータ・カートリッジは、Hadoop分散ファイル・システム(HDFS)の大容量データにアクセスするためにOracle CQLプロセッサを拡張します。

- NoSQLDBビッグ・データ・カートリッジ: このカートリッジは、Oracle NoSQL Databaseの大容量データにアクセスするためにOracle CQLプロセッサを拡張します。

- Oracle Javaデータ・カートリッジ: このデータ・カートリッジは、Oracle CQL問合せおよびビューで、Oracle CQLネイティブ型と同じように、Javaの型、メソッド、フィールドおよびコンストラクタを公開します。

1.2 名前

各データ・カートリッジは、データ・カートリッジ実装のネームスペースを定義する一意のカートリッジ名で識別されます。データ・カートリッジ名を使用して、型、メソッド、フィールドおよびコンストラクタへの参照の曖昧性を解消します。

Oracle CQLを使用してデータ・カートリッジの型、メソッド、フィールドおよびコンストラクタにアクセスする方法は、すべてのデータ・カートリッジ実装で同じです。たとえば、データ・カートリッジ関数はfunc_exprで参照でき、オプションでリンク名を使用できます。各データ・カートリッジでアクセスするデータは、各データ・カートリッジ実装に固有です。詳細は、次を参照してください。

- Oracle Javaデータ・カートリッジ

- Oracle Spatialデータ・カートリッジ

- Oracleビッグ・データ・カートリッジ

注意:

Oracleデータ・カートリッジの型名を単純化するには、『Oracle Fusion Middleware Oracle Stream Analytics Oracle CQL言語リファレンス』で説明しているエイリアスを使用できます。

1.3 アプリケーション・コンテキスト

データ・カートリッジの実装によっては、データ・カートリッジのインスタンスが提供する関数および型にOracle Stream Analyticsサーバーが伝播させるアプリケーション・コンテキストを定義できる場合があります。たとえば、Oracle Stream Analyticsサーバー・リソースまたはデフォルトのデータ・カートリッジ・オプションを構成して、このアプリケーション・コンテキスト情報を特定のデータ・カートリッジ・インスンタンスに関連付けることができます。

データ・カートリッジの実装によっては、データ・カートリッジのインスタンスおよびそのインスタンスが提供する複合オブジェクトにOracle Stream Analyticsサーバーが伝播させるアプリケーション・コンテキストを定義できる場合があります。

次の図はこのアプリケーション・コンテキストを説明しています。

図1-1 データ・カートリッジ・アプリケーション・コンテキスト

たとえば、Oracle Stream Analyticsサーバー・リソースまたはデフォルトのデータ・カートリッジ・オプションを構成して、このアプリケーション・コンテキスト情報を特定のデータ・カートリッジ・インスンタンスに関連付けることができます。

次の例が示すように、Oracle Stream Analyticsアプリケーションのイベント処理ネットワーク(EPN)アセンブリ・ファイルでデータ・カートリッジ実装で提供される要素(DATA_CARTRIDGE_CONTEXTと呼ぶ)を使用して、Oracle Spatialデータ・カートリッジのインスタンスのアプリケーション・コンテキストを定義します。

<DATA_CARTRIDGE_CONTEXT id="MyContext" ATTRIBUTE="" ... />

ここでは、DATA_CARTRIDGE_CONTEXTはデータ・カートリッジ実装で提供される要素であり、ATTRIBUTEはデータ・カートリッジが構成で公開する1つ以上の属性です。

Oracle CQL問合せでは、DATA_CARTRIDGE_NAMEを単独で使用するのではなく、DATA_CARTRIDGE_CONTEXT (次の例のMyContext)のidをリンクで使用します。Oracle Stream Analyticsサーバーは、コンテキスト・オブジェクトをデータ・カートリッジ・インスタンス内に設定し、データ・カートリッジ複合オブジェクトを検索します。

注意:

id値はDATA_CARTRIDGE_NAMEと異なる必要があります。

次の例では、デフォルト・リンク(@DATA_CARTRIDGE_NAME)により、デフォルト・アプリケーション・コンテキストがmyMethod呼出しに伝播されます。

<view  id="view1">
select com.mypackage.MyType.myMethod@DATA_CARTRIDGE_NAME( ... )
from S[NOW]
</view>

次の例では、リンク(@MyContext)によりユーザー定義アプリケーション・コンテキストがmyMethod呼出しに伝播されます。

<view  id="view1">
select com.mypackage.MyType.myMethod@MyContext(...)
from S[NOW]
</view>

次のデータ・カートリッジのアプリケーション・コンテキストを構成できます。

- Oracle空間データ・カートリッジ

- Oracle JDBCデータ・カートリッジ

2 Oracle JDBCカートリッジおよびOracle Spatialデータ・カートリッジ

この章では、Oracle Stream Analyticsで使用するOracle Continuous Query Language (CQL)を拡張するOracle JDBCカートリッジおよびOracle Spatialデータ・カートリッジの構成方法を説明します。

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

- Oracle空間アプリケーション・コンテキストの構成方法

- Oracle JDBCデータ・カートリッジ・アプリケーション・コンテキストの構成方法

2.1 Oracle空間アプリケーション・コンテキストの構成方法

Oracle Stream Analyticsアプリケーションのイベント処理ネットワーク(EPN)アセンブリ・ファイルで、spatial:context要素を使用して、Oracle Spatialインスタンスのアプリケーション・コンテキストを定義します。

com.oracle.cartridge.spatial.GeometryからのすべてのコンストラクタとメソッドおよびOracle Spatial機能は、spatial:contextを認識します。たとえば、SRIDがOracle Spatialアプリケーション・コンテキストの値から自動的に設定されます。

詳細は、『Oracle Spatial開発者ガイド』(http://download.oracle.com/docs/cd/E11882_01/appdev.112/e11830/sdo_objrelschema.htm#SPATL492)のSDO_SRIDに関する項を参照してください

Oracle Spatialアプリケーション・コンテキストを構成する手順:

1. Oracle JDeveloperで、EPNダイアグラムを開きます。

2. パッケージcom.oracle.cep.cartridge.spatialをOracle Stream AnalyticsアプリケーションのMANIFEST.MFファイルにインポートします。

3. EPNノードを右クリックして、Spatialコンテキストの構成、新規Spatialコンテキストの順に選択します。

4. 次のようにEPNファイルを編集して、必要なネームスペースおよびスキーマの場所のエントリを追加します。

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:osgi="http://www.springframework.org/schema/osgi"
xmlns:wlevs="http://www.bea.com/ns/wlevs/spring"
xmlns:spatial="http://www.oracle.com/ns/ocep/spatial"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/osgi
http://www.springframework.org/schema/osgi/spring-osgi.xsd
http://www.bea.com/ns/wlevs/spring
http://www.bea.com/ns/wlevs/spring/ocep-epn.xsd
http://www.oracle.com/ns/ocep/spatial
http://www.oracle.com/ns/ocep/spatial/ocep-spatial.xsd">

5. 次のように、EPNファイルを編集してspatial:context要素を追加します。

<spatial:context id="SpatialGRS80" />

6. このEPN内で一意の値をid属性に割り当てます。

これは、以降のOracle CQL問合せで、このアプリケーション・コンテキストを参照するときに使用される名前です。

注意:

id値は、Oracle Spatial名のspatialと異なる必要がります。

7. アプリケーション要件に応じて、spatial:context要素の他の属性を構成します。

表2-1は、spatial:context要素の属性のリストを示します。

表2-1 spatial:context要素の属性

属性

説明

anyinteract-tolerance

containまたはinside演算子のデフォルトの許容度。

デフォルト: 0.0000005

rof

バッファリングとプロジェクト化に使用するReciprocal Of Flattening (ROF)パラメータを定義します。

デフォルト: 298.257223563

sma

バッファリングとプロジェクト化に使用するSemi-Major Axis (SMA)パラメータを定義します。

デフォルト: 6378137.0

srid

SRID整数です。有効な値は次のとおりです。

- CARTESIAN: 直交座標系の場合。

- LAT_LNG_WGS84_SRID: WGS84座標系の場合。

- Oracle Spatial SDO_COORD_SYS表のCOORD_SYS_ID列の整数値。

デフォルト: LAT_LNG_WGS84_SRID

tolerance

バッファリングなどの幾何演算で無視される最短距離。

デフォルト: 0.000000001

次の例では、Geodetic Reference System 1980 (GRS80)座標系(srid="4269")を使用して、EPNアセンブリ・ファイルにSpatialGRS80という名前の空間コンテキストを作成する方法を説明します。

<spatial:context id="SpatialGRS80" srid="4269" sma="63787.0" rof="298.25722101" />

8. 名前によってこのアプリケーション・コンテキストを参照するOracle CQL問合せを作成します。

次の例は、Oracle CQL問合せでspatial:contextを参照する方法を示しています。この場合、問合せでリンク名SpatialGRS80が使用され、このアプリケーション・コンテキストがOracle Spatialに伝播されます。SpatialGRS80のspatial:context属性設定は、createPointメソッド・コールに適用されます。アプリケーション・コンテキストはSRIDを定義するため、createPointメソッドにその引数を渡す必要はありません。

<view  id="createPoint">
select com.oracle.cep.cartridge.spatial.Geometry.createPoint@SpatialGRS80(lng, lat, 0d)
from CustomerPos[NOW]
</view>

2.2 Oracle JDBCデータ・カートリッジ・アプリケーション・コンテキストの構成方法

次を使用して、Oracle JDBCデータ・カートリッジのインスタンスのアプリケーション・コンテキストを定義します。

- EPNアセンブリ・ファイルのjdbc:jdbc-context要素

- コンポーネント構成ファイルのjc:jdbc-ctx要素
jc:jdbc-ctx要素では次のことが可能です。

- jdbc:jdbc-contextを1つだけ参照する

- data-sourceを1つだけ参照する

- 1つ以上のSQL関数を定義する

注意:

SQL関数のすべてのSELECTリスト列に対して、別名を指定する必要があります。

Oracle JDBCデータ・カートリッジ・アプリケーション・コンテキストを構成する手順:

1. Oracle JDeveloperでEPNエディタを開きます。

2. EPNノードを右クリックし、「空間コンテキストの構成」→「新規空間コンテキスト」の順に選択します。

3. 次のようにEPNファイルを編集して、必要なネームスペースおよびスキーマの場所のエントリを追加します。

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:osgi="http://www.springframework.org/schema/osgi"
xmlns:wlevs="http://www.bea.com/ns/wlevs/spring"
xmlns:jdbc="http://www.oracle.com/ns/ocep/jdbc"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/osgi
http://www.springframework.org/schema/osgi/spring-osgi.xsd
http://www.bea.com/ns/wlevs/spring
http://www.bea.com/ns/wlevs/spring/ocep-epn.xsd
http://www.oracle.com/ns/ocep/jdbc
http://www.oracle.com/ns/ocep/jdbc/ocep-jdbc.xsd">

4. 次のように、EPNファイルを編集してjdbc:jdbc-context要素を追加します。

<jdbc:jdbc-context id="JdbcCartridgeOne"/>

5. このEPN内で一意の値をid属性に割り当てます。

これは、以降のOracle CQL問合せで、このアプリケーション・コンテキストを参照するときに使用される名前です。

注意:

id値は、Oracle JDBCデータ・カートリッジ名のjdbcと異なる必要があります。

6. 必要なプロセッサを右クリックし、「構成のソースに移動」を選択します。

7. 次のように、コンポーネント構成ファイルを編集して、必要なネームスペース・エントリを追加します。

<?xml version="1.0" encoding="UTF-8"?>
<wlevs:config
xmlns:wlevs="http://www.bea.com/ns/wlevs/config/application"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:jc="http://www.oracle.com/ns/ocep/config/jdbc
xsi:schemaLocation="
http://www.oracle.com/ns/ocep/config/jdbc
http://www.oracle.com/ns/ocep/config/jdbc/ocep_jdbc_context_config.xsd">

8. 次のように、コンポーネント構成ファイルを編集してjc:jdbc-ctx要素を追加します。

<jc:jdbc-ctx>
</jc:jdbc-ctx>

9. 次のように、name子要素を追加します。この値は、EPNアセンブリ・ファイルで定義したOracle JDBCアプリケーション・コンテキストの名前です。

<jc:jdbc-ctx>
<name>JdbcCartridgeOne</name>
</jc:jdbc-ctx>

10. 値がOracle Stream Analyticsサーバーのconfig.xmlファイルで定義されているデータソース名となる、data-source子要素を追加します。

次の例は、StockDSという名前のデータ・ソースを指定する方法を示しています。

<jc:jdbc-ctx>
<name>JdbcCartridgeOne</name>
<data-source>StockDS</data-source>
</jc:jdbc-ctx>

11. 次のように、function子要素を使用して、1つ以上のSQL関数を作成します。

<jc:jdbc-ctx>
<name>JdbcCartridgeOne</name>
<data-source>StockDS</data-source>
<function name="getDetailsByOrderIdName">
<param name="inpOrderId" type="int" />
<param name="inpName" type="char" />
<return-component-type>
com.oracle.cep.example.jdbc_cartridge.RetEvent
</return-component-type>
<sql><![CDATA[
SELECT
Employee.empName as employeeName,
Employee.empEmail as employeeEmail,
OrderDetails.description as description
FROM
PlacedOrders, OrderDetails , Employee
WHERE
PlacedOrders.empId = Employee.empId AND
PlacedOrders.orderId = OrderDetails.orderId AND
Employee.empName = :inpName AND
PlacedOrders.orderId = :inpOrderId
></sql>
</function>
</jc:jdbc-ctx>

注意:

SQL問合せのすべてのSELECTリスト列に対して、別名を指定する必要があります。

12. Oracle JDBCデータ・カートリッジ・アプリケーション・コンテキストを使用して、SQL関数を起動するOracle CQL問合せを作成します。

次の例は、Oracle CQL問合せでjdbc:jdbc-contextを参照する方法を示しています。この場合、問合せでリンク名JdbcCartridgeOneが使用され、このアプリケーション・コンテキストがOracle JDBCデータ・カートリッジに伝播されます。Oracle CQL問合せで、Oracle JDBCデータ・カートリッジ・コンテキストJdbcCartridgeOneで定義したgetDetailsByOrderIdName関数が呼び出されます。

<processor>
<name>Proc</name>
<rules>
<query id="q1"><![CDATA[
RStream(
select
currentOrder.orderId,
details.orderInfo.employeeName,
details.orderInfo.employeeemail,
details.orderInfo.description
from
OrderArrival[now] as currentOrder,
TABLE(getDetailsByOrderIdName@JdbcCartridgeOne(
currentOrder.orderId, currentOrder.empName
) as orderInfo
) as details
)
></query>
</rules>
</processor>

3 Oracle JDBCデータ・カートリッジ

Oracle Stream Analytics JDBCデータ・カートリッジを使用すると、データベースに対してSQL問合せを実行し、戻り値をCQL問合せで使用できます。

カートリッジの機能を使用する場合、SQL問合せをJDBCカートリッジ関数の定義と関連付けます。その後、CQL問合せから、関連付けられているSQL問合せをデータベースに対して実行するJDBCカートリッジ関数の呼出しが可能になります。この関数呼出しは、その関数呼出しを行うCQL問合せ内のCQLリレーションとしてSQL問合せの結果を使用できるようにするため、TABLE句内に含める必要があります。

注意:

Oracle CQL文からリレーショナル・データベース表にアクセスするにはOracle JDBCデータ・カートリッジを使用することをお薦めします。

TABLE句の詳細は、「TABLE句の使用」を参照してください。

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

- Oracle Stream Analytics JDBCデータ・カートリッジについて

- Oracle Event Processing JDBCデータ・カートリッジの使用

3.1 Oracle Stream Analytics JDBCデータ・カートリッジについて

Oracle Stream Analyticsストリームはストリーミング・データを持ち、データベースは通常は履歴データを保存します。履歴データ(1つ以上の表に保存されている)をOracle Stream Analyticsストリームのストリーミング・データに関連付けるには、Oracle Stream Analytics JDBCデータ・カートリッジを使用します。Oracle Stream Analytics JDBCデータ・カートリッジは、データベースに対して任意のSQL問合せを実行し、その結果をCQL問合せで使用します。この項では、Oracle Stream Analytics JDBCデータ・カートリッジを使用してストリーミング・データと履歴データを関連付ける方法を説明します。

この項では、次の内容について説明します。

- データ・カートリッジ名

- スコープ

- パラメータの指定

- Oracle Stream Analytics JDBCデータ・カートリッジ・アプリケーション・コンテキスト

3.1.1 データ・カートリッジ名

Oracle Stream Analytics JDBCデータ・カートリッジでは、カートリッジID com.oracle.cep.cartridge.jdbcが使用されます。このIDは予約されるので、他のカートリッジによって使用されません。

詳細は、「Oracle Stream Analytics JDBCデータ・カートリッジ・アプリケーション・コンテキスト」を参照してください。

3.1.2 スコープ

Oracle Stream Analytics JDBCデータ・カートリッジは、次の制限のもと、任意の複合SQL文をサポートします。

- SQL問合せのSELECTリストでは、ネイティブSQL型のみを使用できます。

- SELECTリストではユーザー定義型および複合型を使用できません。

- SQL問合せの各SELECTリスト列でエイリアス名を使用できます。エイリアス名を使用する場合は、selectリストが戻り型のプロパティ名に一致するようにします。

注意:

Oracle Stream Analytics JDBCデータ・カートリッジを使用するには、データ・ソースでOracle JDBCドライバのバージョン11.2以上を使用する必要があります。

3.1.3 パラメータの指定

JDBC関数のパラメータを指定するにはparam要素を使用します。パラメータはnameのvalueのペアで指定します。name属性は指定されたtypeのイベント・データを指定します。type属性はOracle CQLデータ型になります。Oracle CQLのデータ型については、『Oracle CQL言語リファレンス』を参照してください。

次の例は、paramとtypeペアを使用してgetDetailsByOrderIdName関数のパラメータを指定する構成ファイルの例を示しています。

注意:

この例で使用しているRetEventクラスは、表関数として複合型を返す方法の例です。このクラスの完全なコードは、「Oracle Event Processing JDBCデータ・カートリッジ」を参照してください。

...
<jc:jdbc-ctx>
<name>JdbcCartridgeOne</name>
<data-source>StockDS</data-source>
<function name="getDetailsByOrderIdName">
<param name="inpOrderId" type="int" />
<param name="inpName" type="char" />
<return-component-type>
com.oracle.cep.example.jdbc_cartridge.RetEvent
</return-component-type>
<sql><![CDATA[
SELECT
Employee.empName as employeeName,
Employee.empEmail as employeeEmail,
OrderDetails.description as description
FROM
PlacedOrders, OrderDetails , Employee
WHERE
PlacedOrders.empId = Employee.empId AND
PlacedOrders.orderId = OrderDetails.orderId AND
Employee.empName = :inpName AND
PlacedOrders.orderId = :inpOrderId
></sql>
</function>
</jc:jdbc-ctx>
...

3.1.4 Oracle Stream Analytics JDBCデータ・カートリッジ・アプリケーション・コンテキスト

Oracle Stream Analytics JDBCデータ・カートリッジを使用するには、アプリケーション開発時に、次の手順に従って1つ以上のアプリケーションの有効範囲内にあるJDBCカートリッジ・コンテキストを宣言および構成する必要があります。

- EPNファイル内でのJDBCカートリッジ・コンテキストの宣言

- アプリケーション構成ファイル内でのJDBCカートリッジ・コンテキストの構成

3.1.4.1 EPNファイル内でのJDBCカートリッジ・コンテキストの宣言

EPNファイル内でのJDBCカートリッジ・コンテキストの宣言手順:

1. Oracle Stream AnalyticsアプリケーションEPNアセンブリ・ファイルを編集して、必要なネームスペースおよびスキーマの場所のエントリを追加します。

2. EPNファイルにjdbc-contextタグのエントリを追加し、id属性を指定します。idは、このアプリケーションの有効範囲内にあるコンテキストの名前を示し、このコンテキストで定義されている関数を参照するCQL問合せで使用されます。idは、このコンテキストがアプリケーション構成ファイルで構成される際にも使用されます。

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:osgi="http://www.springframework.org/schema/osgi"
xmlns:wlevs="http://www.bea.com/ns/wlevs/spring"
xmlns:jdbc="http://www.oracle.com/ns/ocep/jdbc"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/osgi
http://www.springframework.org/schema/osgi/spring-osgi.xsd
http://www.bea.com/ns/wlevs/spring
http://www.bea.com/ns/wlevs/spring/http://www.bea.com/ns/wlevs/spring/ocep-epn.xsd
http://www.oracle.com/ns/ocep/jdbc
http://www.oracle.com/ns/ocep/jdbc/ocep-jdbc.xsd">

次の例は、JdbcCartridgeOneという名前のOracle Stream Analytics JDBCデータ・カートリッジ・アプリケーション・コンテキストをEPNアセンブリ・ファイルに作成する方法を示しています。

<jdbc:jdbc-context id="JdbcCartridgeOne"/>

3.1.4.2 アプリケーション構成ファイル内でのJDBCカートリッジ・コンテキストの構成

JDBCカートリッジ・コンテキストを構成するには、通常、アプリケーションの/wlevsディレクトリ内にあるコンポーネント構成ファイル内に構成の詳細を追加します。この構成は、チャネルおよびプロセッサなどの他のEPNコンポーネントの構成と同様です。

アプリケーション構成ファイル内でのJDBCカートリッジ・コンテキストの構成手順:

1. JDBCコンテキスト構成を追加する前に。次の例で示すように、必須のネームスペース・エントリを構成XMLファイルに追加します。

<?xml version="1.0" encoding="UTF-8"?>
<jdbcctxconfig:config xmlns:jdbcctxconfig="http://www.bea.com/ns/wlevs/config/application"
xmlns:jc="http://www.oracle.com/ns/ocep/config/jdbc">

2. JDBCカートリッジ・コンテキスト構成は、親レベルのタグであるjdbc-ctxの下で行われます。コンテキストでは、1つ以上の関数が定義され、それぞれ、単一のSQL問合せと関連付けられます。構成では、SQL問合せが実行されるデータベースを表すデータ・ソースも指定されます。各関数には、その関数を定義するSQL問合せに引数を渡すのに使用される入力パラメータが含まれ、また、関数によってreturn-component-typeが指定されます。この関数への呼出しは常にTABLE句内に含められるので、関数は常にコレクション型を返します。return-component-typeプロパティでは、そのコレクションのコンポーネントのタイプが指定されます。

nameプロパティの値は、EPNファイルのid属性に使用される値と一致する必要があります。

注意:

この例で使用しているRetEventクラスは、表関数として複合型を返す方法の例です。このクラスの完全なコードは、「Oracle Event Processing JDBCデータ・カートリッジの使用」を参照してください。

...
<jc:jdbc-ctx>
<name>JdbcCartridgeOne</name>
<data-source>StockDS</data-source>
<function name="getDetailsByOrderIdName">
<param name="inpOrderId" type="int" />
<param name="inpName" type="char" />
<return-component-type>
com.oracle.cep.example.jdbc_cartridge.RetEvent
</return-component-type>
<sql><![CDATA[
SELECT
Employee.empName as employeeName,
Employee.empEmail as employeeEmail,
OrderDetails.description as description
FROM
PlacedOrders, OrderDetails , Employee
WHERE
PlacedOrders.empId = Employee.empId AND
PlacedOrders.orderId = OrderDetails.orderId AND
Employee.empName = :inpName AND
PlacedOrders.orderId = :inpOrderId
></sql>
</function>
</jc:jdbc-ctx>
...
<processor>
<name>Proc</name>
<rules>
<query id="q1"><![CDATA[
RStream(
select
currentOrder.orderId,
details.orderInfo.employeeName,
details.orderInfo.employeeemail,
details.orderInfo.description
from
OrderArrival[now] as currentOrder,
TABLE(getDetailsByOrderIdName@JdbcCartridgeOne(
currentOrder.orderId, currentOrder.empName
) as orderInfo
) as details
)
></query>
</rules>
</processor>
...

3.2 Oracle Event Processing JDBCデータ・カートリッジの使用

一般に、Oracle Event Processing JDBCデータ・カートリッジは次のように使用します。

1. Oracle Event Processing JDBCカートリッジ・アプリケーションの有効範囲内にあるコンテキストを宣言および定義します。

詳細は、「Oracle Stream Analytics JDBCデータ・カートリッジ・アプリケーション・コンテキスト」を参照してください。

2. コンポーネント構成ファイル内のjc:jdbc-ctx要素で、1つ以上のSQL文を定義します。

詳細は、「SQL文の定義: function要素」を参照してください。

3. function要素のreturn-component-type子要素をJava beanとして指定する場合は、そのbeanを実装し、クラスがOracle Event Processingアプリケーション・クラスパス上に存在するようにします。

次の例は、標準的な実装を示しています。

注意:

RetEventクラスは、表関数として複合型を返す方法の例です。

package com.oracle.cep.example.jdbc_cartridge;

public class RetEvent
{
public String employeeName;
public String employeeEmail;
public String description;

/* Default constructor is mandatory */
public RetEvent1() {}

/* May contain getters and setters for the fields */

public String getEmployeeName() {
return this.employeeName;
}

public void setEmployeeName(String employeeName) {
this.employeeName = employeeName;
}

...

/* May contain other helper methods */

public int getEmployeeNameLength() {
return employeeName.length();
}
}

フィールドはパブリックとして宣言する必要があります。

JDBCカートリッジ・コンテキスト関数のreturn-component-typeクラスが、SQL問合せのSELECTリスト内のフィールドの1対1マッピングを持つ必要があります。つまり、関数を定義するSQL問合せのSELECTリスト内にあるすべてのフィールドが、その関数のreturn-component-typeであると宣言されるJavaクラス内に、対応するフィールド(名前が一致する)を持つ必要があり、持たない場合はOracle Event Processingでエラーが発生します。

詳細は、「return-component-type」を参照してください。

4. Oracle CQL TABLE句を使用してjc:jdbc-ctx要素で定義されるSQL文を呼び出し、SQLSELECTリストの別名で返される結果にアクセスする、1つ以上のOracle CQL問合せを定義します。

詳細は、「Oracle Stream Analytics JDBCデータ・カートリッジを使用したOracle CQL問合せの定義」を参照してください。

3.2.1 SQL文の定義: function要素

コンポーネント構成ファイルのjc:jdbc-cxt要素内でfunction子要素を使用してJDBCカートリッジ・コンテキスト関数を定義できます。

...
<jc:jdbc-ctx>
<name>JdbcCartridgeOne</name>
<data-source>StockDS</data-source>
<function name="getDetailsByOrderIdName">
<param name="inpOrderId" type="int" />
<param name="inpName" type="char" />
<return-component-type>
com.oracle.cep.example.jdbc_cartridge.RetEvent
</return-component-type>
<sql><![CDATA[
SELECT
Employee.empName as employeeName,
Employee.empEmail as employeeEmail,
OrderDetails.description as description
FROM
PlacedOrders, OrderDetails , Employee
WHERE
PlacedOrders.empId = Employee.empId AND
PlacedOrders.orderId = OrderDetails.orderId AND
Employee.empName = :inpName AND
PlacedOrders.orderId = :inpOrderId
></sql>
</function>
</jc:jdbc-ctx>
...

指定するjc:jdbc-cxt要素内で1つ以上のfunction要素を定義できます。

この項では、次の内容について説明します。

- function要素の属性

- function要素の子要素

- function要素の使用方法

3.2.1.1 function要素の属性

各function要素は表3-1にリストされた属性をサポートしています。

表3-1 function要素の属性

属性

説明

name

JDBCカートリッジ・コンテキスト関数の名前。

名前とシグネチャの組合せは、特定のOracle Stream Analytics JDBCデータ・カートリッジ・アプリケーション・コンテキスト内で一意である必要があります。詳細は、「JDBCカートリッジ・コンテキスト関数のオーバーロード」を参照してください。

3.2.1.2 function要素の子要素

各function要素では、次の子要素がサポートされます。

- param

- return-component-type

- sql

3.2.1.2.1 param

param子要素では、オプションの入力パラメータが指定されます。

SQL文では、ゼロ以上のパラメータを使用できます。各パラメータはparam要素内で定義されます。

param子要素は表3-2に示す属性をサポートしています。

表3-2 param要素の属性

属性

説明

name

入力パラメータの名前。

有効なパラメータ名は、A-Z、a-z、0-9および_(アンダースコア)の組合せで構成されます。

type

パラメータのデータ型。

データ型サポート - 入力パラメータparam要素のtype属性には、Oracle CQLネイティブのcom.bea.wlevs.ede.api.Typeデータ型のみを指定できます。

注意:

データ型の名前では大/小文字が区別されます。com.bea.wlevs.ede.api.Typeクラスで指定される文字を使用します。

詳細は表3-3を参照してください。

3.2.1.2.2 return-component-type

return-component-type子要素では、関数の戻り値が指定されます。この子要素は必須です。

JDBCデータ・カートリッジ関数によって返されるコレクション型のコンポーネント・タイプを表します。この関数は常にOracle CQL TABLE句内から呼び出され、常にコレクション型を返します。

詳細は、「TABLE句の使用方法」を参照してください。

データ型サポート - 次のいずれかの型をreturn-component-type要素の値として指定できます。

- Oracle CQLネイティブのcom.bea.wlevs.ede.api.Typeデータ型。

- Java beanなどの、Oracle CQL拡張可能Javaカートリッジ型。

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

- 表3-3

- Oracle Javaデータ・カートリッジ

3.2.1.2.3 sql

sql子要素では、SQL文が指定されます。この子要素は必須です。

各function要素には、単一行のSQL文を1つのみ含めることができます。SQL文自体は<![CDATA[>ブロック内に定義します。

SQL文では、param要素のname属性でコロン(:)接頭辞を使用して入力パラメータを指定します。

注意:

JDBCカートリッジ・コンテキスト関数内のすべてのSELECTリスト列に別名を指定する必要があります。

データ型サポート – 表3-3は、Oracle Stream Analytics JDBCデータ・カートリッジ・コンテキスト関数で使用できるSQL型および対応するOracle Stream AnalyticsのJava型およびcom.bea.wlevs.ede.api.Type型を示しています。

表3-3 SQL列型とそれに対応するOracle Stream Analyticsの型

SQL型

Oracle Stream AnalyticsのJava型

com.bea.wlevs.ede.api.Type

NUMBER

java.math.BigDecimal

bigdecimal

NUMBER

long

bigint

RAW

byte[]

byte

CHAR、VARCHAR

java.lang.String

char

NUMBER

double

double

FLOAT、NUMBER

float

float

INTEGER、NUMBER

int

int

TIMESTAMP

java.sql.Timestamp

timestamp

注意:

Java型のサイズがSQL型のサイズを超える場合、Oracle Stream AnalyticsアプリケーションでSQL型の最大サイズの値を制限する必要があります。CQL側で使用されるタイプの選択は、データベース列内の値の範囲で決定されるようにします。たとえば、SQL列が、整数の範囲の値が含まれている数値である場合、CQL側で"int"タイプを使用します。誤ったタイプを選択し、値が範囲外となった場合、Oracle Stream Analyticsで数値オーバーフローのエラーが発生します。

注意:

Oracle Stream Analytics JDBCデータ・カートリッジでは、Oracle Spatialデータ型はサポートされません。

詳細は、「function要素の使用方法」を参照してください。

3.2.1.3 function要素の使用方法

この項では、Oracle Stream Analytics JDBCデータ・カートリッジを使用して定義できる各種JDBCカートリッジ・コンテキスト関数の例を説明します。次の内容が含まれます。

- 複数のパラメータのあるJDBCカートリッジ・コンテキスト関数

- PL/SQL関数の呼出し

- 複雑なJDBCカートリッジ・コンテキスト関数

- JDBCカートリッジ・コンテキスト関数のオーバーロード

3.2.1.3.1 複数のパラメータのあるJDBCカートリッジ・コンテキスト関数

Oracle Stream Analytics JDBCデータ・カートリッジを使用して、複数の入力パラメータを使用するJDBCカートリッジ・コンテキスト関数を定義できます。

次の例は、2つの入力パラメータを使用するJDBCデータ・カートリッジ・コンテキスト関数を定義するOracle Stream Analytics JDBCデータ・カートリッジ・アプリケーション・コンテキストを示しています。

...
<function name="getDetailsByOrderIdName">
<param name="inpOrderId" type="int" />
<param name="inpName" type="char" />
<return-component-type>
com.oracle.cep.example.jdbc_cartridge.RetEvent
</return-component-type>
<sql><![CDATA[
SELECT
Employee.empName as employeeName,
Employee.empEmail as employeeEmail,
OrderDetails.description as description
FROM
PlacedOrders, OrderDetails , Employee
WHERE
PlacedOrders.empId = Employee.empId AND
PlacedOrders.orderId = OrderDetails.orderId AND
Employee.empName = :inpName AND
PlacedOrders.orderId = :inpOrderId
></sql>
</function>
...

3.2.1.3.2 PL/SQL関数の呼出し

Oracle Stream Analytics JDBCデータ・カートリッジを使用して、データベースが定義するPL/SQL関数を呼び出すJDBCカートリッジ・コンテキスト関数を定義できます。

次の例は、PL/SQL関数getOrderAmtを呼び出すJDBCデータ・カートリッジ・コンテキスト関数を定義するOracle Stream Analytics JDBCデータ・カートリッジ・アプリケーション・コンテキストを示しています。

...
<function name="getOrderAmount">
<param name="inpId" type="int" />
<return-component-type>
com.oracle.cep.example.jdbc_cartridge.RetEvent
</return-component-type>
<sql><![CDATA[
SELECT getOrderAmt(:inpId) as orderAmt
FROM dual
></sql>
</function>
...

3.2.1.3.3 複雑なJDBCカートリッジ・コンテキスト関数

Oracle Stream Analytics JDBCデータ・カートリッジを使用して、副問合せ、集計、GROUP BY、ORDER BYおよびHAVINGなど、任意の複雑なJDBCカートリッジ・コンテキスト関数を定義できます。

次の例は、複雑なJDBCデータ・カートリッジ・コンテキスト関数を定義するOracle Stream Analytics JDBCデータ・カートリッジ・アプリケーション・コンテキストを示しています。

...
<function name="getHighValueOrdersPerEmp">
<param name="limit" type="int"/>
<param name="inpName" type="char"/>
<return-component-type>
com.oracle.cep.example.jdbc_cartridge.RetEvent
</return-component-type>
<sql><![CDATA[
select description as description,  sum(amt) as totalamt, count(*) as numTimes
from  OrderDetails
where orderid in (
select orderid from PlacedOrders where empid in (
select empid from Employee where  empName = :inpName
)
)
group by description
having sum(amt) > :limit
></sql>
</function>
...

3.2.1.3.4 JDBCカートリッジ・コンテキスト関数のオーバーロード

Oracle Stream Analytics JDBCデータ・カートリッジを使用すると、各関数が一意のシグネチャを持つ場合に、同じアプリケーション・コンテキストで同じ名前のJDBCカートリッジ・コンテキスト関数を定義できます。

次の例は、getDetailsという名前の2つのJDBCカートリッジ・コンテキスト関数を定義するOracle Stream Analytics JDBCデータ・カートリッジ・アプリケーション・コンテキストを示しています。各関数は、一意のシグネチャで識別されます。

<jc:jdbc-ctx>
<name>JdbcCartridgeOne</name>
<data-source>StockDS</data-source>
<function name="getDetails">
<param name="inpName" type="char" />
<return-component-type>
com.oracle.cep.example.jdbc_cartridge.RetEvent
</return-component-type>
<sql><![CDATA[
SELECT
Employee.empName as employeeName,
Employee.empEmail as employeeEmail,
OrderDetails.description as description
FROM
PlacedOrders, OrderDetails , Employee
WHERE
PlacedOrders.empId = Employee.empId AND
PlacedOrders.orderId = OrderDetails.orderId AND
Employee.empName=:inpName
ORDER BY
description desc
></sql>
</function>
<function name="getDetails">
<param name="inpOrderId" type="int" />
<sql><![CDATA[ return-component-type
SELECT
Employee.empName as employeeName,
Employee.empEmail as employeeEmail,
OrderDetails.description as description
FROM
PlacedOrders, OrderDetails , Employee
WHERE
PlacedOrders.empId= Employee.empId AND
PlacedOrders.orderId = OrderDetails.orderId AND
PlacedOrders.orderId = :inpOrderId
></sql>
</function>
</jc:jdbc-ctx>

3.2.2 Oracle Stream Analytics JDBCデータ・カートリッジを使用したOracle CQL問合せの定義

この項では、Oracle Stream Analytics JDBCデータ・カートリッジを使用して、SQL文を起動するOracle CQL問合せを定義する方法を説明します。次の内容が含まれます。

- Selectリストの別名の使用

- TABLE句の使用

- return-component-typeとしてのネイティブCQLタイプの使用

3.2.2.1 Selectリストの別名の使用

Oracle Stream Analytics JDBCデータ・カートリッジ・コンテキスト関数があるとします。

<jc:jdbc-ctx>
<name>JdbcCartridgeOne</name>
<data-source>StockDS</data-source>
<function name="getDetailsByOrderIdName">
<param name="inpOrderId" type="int" />
<param name="inpName" type="char" />
<return-component-type>
com.oracle.cep.example.jdbc_cartridge.RetEvent
</return-component-type>
<sql><![CDATA[
SELECT
Employee.empName as employeeName,
Employee.empEmail as employeeEmail,
OrderDetails.description as description
FROM
PlacedOrders, OrderDetails , Employee
WHERE
PlacedOrders.empId = Employee.empId AND
PlacedOrders.orderId = OrderDetails.orderId AND
Employee.empName = :inpName AND
PlacedOrders.orderId = :inpOrderId
></sql>
</function>
</jc:jdbc-ctx>

SELECTリスト内の各列に別名を指定する必要があります。Oracle CQL問合せ内のJDBCカートリッジ・コンテキスト関数を呼び出す際、これらのSELECTリストの別名で、結果セット内の列にアクセスします。

詳細は、「TABLE句の使用方法」を参照してください。

3.2.2.2 TABLE句の使用

Oracle Stream Analytics JDBCデータ・カートリッジのSQL文を考えてみます。

...
<jc:jdbc-ctx>
<name>JdbcCartridgeOne</name>
<data-source>StockDS</data-source>
<function name="getDetailsByOrderIdName">
<param name="inpOrderId" type="int" />
<param name="inpName" type="char" />
<return-component-type>
com.oracle.cep.example.jdbc_cartridge.RetEvent
</return-component-type>
<sql><![CDATA[
SELECT
Employee.empName as employeeName,
Employee.empEmail as employeeEmail,
OrderDetails.description as description
FROM
PlacedOrders, OrderDetails , Employee
WHERE
PlacedOrders.empId = Employee.empId AND
PlacedOrders.orderId = OrderDetails.orderId AND
Employee.empName = :inpName AND
PlacedOrders.orderId = :inpOrderId
></sql>
</function>
</jc:jdbc-ctx>
...

次の例のOracle CQL問合せにより、前述の例で定義されたJDBCカートリッジ・コンテキスト関数が呼び出されます。

<processor>
<name>Proc</name>
<rules>
<query id="q1"><![CDATA[
RStream(
select
currentOrder.orderId,
details.orderInfo.employeeName,
details.orderInfo.employeeEmail,
details.orderInfo.description
details.orderInfo.getEmployeeNameLength()
from
OrderArrival[now] as currentOrder,
TABLE(getDetailsByOrderIdName@JdbcCartridgeOne(
currentOrder.orderId, currentOrder.empName
) as orderInfo
) as details
)
></query>
</rules>
</processor>

Oracle Stream Analytics JDBCデータ・カートリッジ・コンテキスト関数の呼出しは、Oracle CQL問合せのTABLE句にラップする必要があります。

次を使用して結果セットにアクセスします。

TABLE_CLAUSE_ALIAS.JDBC_CARTRIDGE_FUNCTION_ALIAS.SQL_SELECT_LIST_ALIAS
or
TABLE_CLAUSE_ALIAS.JDBC_CARTRIDGE_FUNCTION_ALIAS.METHOD_NAME

説明:

- TABLE_CLAUSE_ALIAS: TABLE句の外部のAS別名。

- JDBC_CARTRIDGE_FUNCTION_ALIAS: JDBCカートリッジ・コンテキスト関数の内部のAS別名。

- SQL_SELECT_LIST_ALIAS: JDBCカートリッジ・コンテキスト関数のSELECTリストの別名。

- METHOD_NAME: return-component-typeクラスによって指定されるメソッドの名前。

次を使用してOracle CQL問合せ内のJDBCカートリッジ・コンテキスト関数の結果セットにアクセスします。

details.orderInfo.employeeName
details.orderInfo.employeeEmail
details.orderInfo.description
details.orderInfo.getEmployeeNameLength()

JDBCデータ・カートリッジ関数によって返されるコレクション型のコンポーネント・タイプは、function要素のreturn-component-type子要素で定義されます。この関数は常にOracle CQL TABLE句内から呼び出され、常にコレクション型を返します。

return-component-typeのフィールドとメソッドは両方ともOracle CQL問合せでアクセスできます。

package com.oracle.cep.example.jdbc_cartridge;

public class RetEvent
{
String employeeName;
String employeeEmail;
String description;

/* Default constructor is mandatory */
public RetEvent1() {}

/* May contain getters and setters for the fields */

public String getEmployeeName() {
return this.employeeName;
}

public void setEmployeeName(String employeeName) {
this.employeeName = employeeName;
}

...

/* May contain other helper methods */

public int getEmployeeNameLength() {
return employeeName.length();
}
}

このクラスでは、Oracle CQL問合せ内で呼出し可能な、getEmployeeNameLengthなどのヘルパー・メソッドが指定されます。

詳細は、「return-component-type」を参照してください。

3.2.2.3 return-component-typeとしてのネイティブCQLタイプの使用

次は、ネイティブCQLタイプbigintをreturn-component-typeとして持つ関数を定義するJDBCカートリッジ・コンテキストです。

<jc:jdbc-ctx>
<name>JdbcCartridgeOne</name>
<data-source>myJdbcDataSource</data-source>
<function name="getOrderAmt">
<param name="inpId" type="int" />
<return-component-type>bigint</return-component-type> <!-- native CQL as return component type -->
<sql><![CDATA[
SELECT
getOrderAmt(:inpId) as orderAmt
FROM (select :inpId as iid from
dual)>
</sql>
</function>
</jc:jdbc-ctx>

次の例は、前述の例のgetOrderAmt関数のCQL問合せ内における使用方法を示しています。

<query id="q1"><![CDATA[
RStream(
select
currentOrder.orderId,
details.orderInfo as orderAmt
from
OrderArrival[now] as currentOrder,
TABLE(getOrderAmt@JdbcCartridgeTwo(currentOrder.orderId) as orderInfo of bigint) as details
)
></query>

別名orderInfo自体はbigint型であり、CQL問合せのselectリスト内ではdetails.orderInfo as orderAmtとしてアクセスできます。

TABLEコンストラクト内で使用される"of bigint"句はオプションです。使用された場合、指定されたタイプがreturn-component-typeに一致する必要があります。

4 Oracle Spatialデータ・カートリッジ

この章では、Oracle Continuous Query Language (Oracle CQL)を拡張して位置情報対応型のアプリケーションに高度な空間機能を提供するOracle Spatialカートリッジを使用する場合のリファレンスとガイドを提供します。

Oracle Stream Analyticsアプリケーション作成において、Oracle CQLネイティブ型と同じように、Oracle CQL問合せおよびビューでOracle Spatialの型、メソッド、フィールドおよびコンストラクタを使用できます。

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

- Oracle Spatialの理解

- Oracle Spatialの使用

4.1 Oracle Spatialの理解

Oracle Spatialは、ハイエンドな地理情報システム(GIS)と位置情報を有効化したビジネス・インテリジェンス・ソリューション(LBS)をサポートする高度な空間機能を提供するOracle Databaseオプションです。

Oracle Spatialは、Oracle Stream AnalyticsアプリケーションでOracle Spatialクラスをシームレスに操作するOracle CQL問合せおよびビューを記述できるオプションのデータ・カートリッジです。

Oracle Spatialを使用すると、空間データを索引付する機能により、空間データの保存、空間データ上の近接や重なりの比較、Oracle Stream Analyticsサーバーへの空間データの統合などの非常に重要な地理ドメイン操作を実行するOracle CQL問合せを構成できます。

Oracle Spatialを使用するには、Oracle Spatial APIに関する実用的な知識が必要です。Oracle Spatialの詳細は、次の資料を参照してください。

- 製品概要: http://www.oracle.com/in/products/database/options/spatial/index.html

- Oracle Spatialのドキュメント: http://www.oracle.com/pls/db112/portal.portal_db?selected=7&frame=#oracle_spatial_and_location_information

- Oracle Spatial Java APIリファレンス: http://download.oracle.com/docs/cd/E11882_01/appdev.112/e11829/toc.htm

この項では、次の内容について説明します。

- データ・カートリッジ名

- スコープ

- データ型マッピング

- Oracle Spatialのアプリケーション・コンテキスト

4.1.1 データ・カートリッジ名

Oracle Spatialでは、カートリッジID com.oracle.cep.cartrdiges.spatialを使用してサーバー・スコープ予約済リンク名spatialを登録します。

spatialリンク名を使用して、Oracle Spatialのメソッド呼出しとOracle Spatialのアプリケーション・コンテキストを関連付けます。

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

- Oracle Spatialのアプリケーション・コンテキスト

- ジオメトリAPI

4.1.2 スコープ

Oracle SpatialはOracle Spatial Java APIに基づいています。Oracle SpatialはOracle Spatial機能をcom.oracle.cep.cartridge.spatial.Geometryクラスに公開します。Oracle Spatial Java APIにないOracle Spatial機能に、Oracle Spatialからアクセスすることはできません。

Oracle Spatialを使用することで、Oracle CQL問合せで表4-1のOracle Spatial機能にアクセスできます。

表4-1 Oracle Spatialのスコープ

Oracle Spatialの機能

スコープ

ジオメトリ・タイプ

Oracle Spatial Java APIの次のジオメトリ・タイプ:

- 2D点

- デカルト座標系および測地(地理的)座標をサポートする2Dの円

- 2D単純ポリゴン

- 2D矩形

- 混合線ストリングと混合ポリゴンを含む混合2Dジオメトリ

- 3Dの円および混合3Dジオメトリを除く3Dジオメトリ
Geometry3D.createGeometry汎用メソッドを使用して混合3Dジオメトリを作成できます。表示される混合3Dオブジェクトに対して空間操作を行うと例外が発生する点に注意してください。

- ソリッド(塗りつぶし)3Dジオメトリ

次のジオメトリ操作:

- ジオメトリ・タイプの作成

- ジオメトリ・タイプのpublicメンバー関数およびpublicフィールドへのアクセス

- すべての2Dジオメトリジオメトリ・オブジェクトに対するinside操作およびcontain操作です。2Dジオメトリ・オブジェクトは、そのオブジェクトのすべての点が外部ジオメトリ内にあり、外部ジオメトリの境界に接していない場合に内側となります。

- 任意の2つの2Dジオメトリ間の空間操作です。2つの任意の2Dジオメトリに対して、矩形がポリゴンの内側にあるかどうかを確認するという空間操作を実行できます。円弧で構成される混合ポリゴンなどのジオメトリでは、ゼロ以外の許容範囲を使用して最初に円弧を高密度化する必要があります。

- 次の3Dジオメトリ、3D点、3D点線、3D矩形および3Dポリゴンに対する空間操作です。

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

- ジオメトリ・タイプ

- 要素情報配列

座標系

- デカルトおよびWGS84測地座標(デフォルト)

- SRIDによるデフォルト座標系の指定

- 他の測地座標の使用

詳細は、「縦座標および座標系とSDO_SRID」を参照してください。

ジオメトリ索引

- Rツリー

詳細は、「ジオメトリ索引」を参照してください。

ジオメトリ関係演算子

- ANYINTERACT

- CONTAIN

- INSIDE

- INSIDE3D

- WITHINDISTANCE

詳細は、「ジオメトリ関係演算子」を参照してください。

ジオメトリ・フィルタ演算子

- FILTER

- NN

詳細は、「ジオメトリ・フィルタ演算子」を参照してください。

ジオメトリAPI

com.oracle.cep.cartridge.spatial.Geometryが提供するメソッドの完全なリストは、「ジオメトリAPI」を参照してください。

ジオメトリ集約

- MBR(最小境界矩形)

詳細は、「ジオメトリ集約」を参照してください。

Oracle Spatialを使用してこれらのOracle Spatial機能にアクセスする方法の詳細は、「Oracle Spatialの使用」を参照してください。

4.1.2.1 ジオメトリ・タイプ

Oracle Spatialのデータ・モデルはジオメトリで構成されます。ジオメトリは、順序の付いた一連の頂点です。ジオメトリのセマンティクスは、そのタイプによって決まります。Oracle Spatialにより、Oracle CQL問合せおよびビューで次のOracle Spatialの型に直接アクセスできます。

- SDO_GTYPES: Oracle Spatialは次のジオメトリ・タイプをサポートしています。

- 2D点

- 2D単純ポリゴン

- 2D矩形

- 3D点

- 3D線

- 3D矩形

- 3Dポリゴン

表4-2は、使用可能なcom.oracle.cep.cartridge.spatial.Geometryクラスのジオメトリ・タイプを説明しています。

表4-2 Oracle Spatialジオメトリ・タイプ

ジオメトリ・タイプ

説明

GTYPE_POINT

1つの点を含む点ジオメトリ・タイプ。

GTYPE_CURVE

直線セグメントまたは円弧セグメント(あるいはその両方)を含むことができる1つの線ストリングを含む曲線ジオメトリ・タイプです。

(LINEおよびCURVEは、このコンテキストでは同義です。)

GTYPE_POLYGON

GTYPE_SURFACE

1つのポリゴンを含むポリゴン・ジオメトリ・タイプ。

穴のあるまたは穴のない1つのポリゴンまたは1つ以上のポリゴンで構成される1つの面を含むポリゴン・ジオメトリ・タイプまたは面ジオメトリ・タイプです。3次元ポリゴンでは、すべての点が同じ平面上にあることが必要です。

GTYPE_COLLECTION

異種の要素の集合であるコレクション・ジオメトリ・タイプです。

COLLECTIONは、他のすべてのタイプを含むスーパーセットです。

GTYPE_MULTIPOINT

1つ以上の点を持つマルチポイント・ジオメトリ・タイプです。(MULTIPOINTは、POINTのスーパーセットです。)

GTYPE_MULTICURVE

1つ以上の線ストリングを持つマルチライン・ジオメトリまたはマルチカーブ・ジオメトリ・タイプです。

(MULTILINEおよびMULTICURVEは、このコンテキストでは同義であり、それぞれLINEおよびCURVEのスーパーセットです。)

GTYPE_MULTIPOLYGON

GTYPE_MULTISURFACE

複数の非接続ポリゴン(複数の外側の境界)または面を持てるマルチポリゴン・ジオメトリ・タイプまたはマルチサーフェイス・ジオメトリ・タイプです。

MULTIPOLYGONはPOLYGONのサブセットで、MULTISURFACEはSURFACEのスーパーセットです。

GTYPE_SOLID

複数の面で構成され、3次元空間で完全に囲まれたソリッド・ジオメトリです。立方形や錐台があります。

GTYPE_MULTISOLID

複数の非接続のソリッド(複数の外側の境界)で構成されるマルチソリッド・ジオメトリです。

MULTISOLIDは、SOLIDのスーパーセットです。

- SDO_ELEMENT_INFO: 次の項目を使用して、要素情報配列を作成できます。

- com.oracle.cep.cartridge.spatial.Geometry.createElemInfo静的メソッド

- einfogenerator関数

詳細は、「要素情報配列」を参照してください。

- ORDINATES: Oracle Spatialのordsgenerator関数を使用して、縦座標を作成できます。
詳細は、「縦座標および座標系とSDO_SRID」を参照してください。

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

- Oracle Spatial Java APIジオメトリ・タイプへのアクセス方法

- ジオメトリの作成方法

- ジオメトリ・タイプのパブリックなメソッドおよびフィールドへのアクセス方法

4.1.2.2 要素情報配列

Element Info属性は、可変長の数値配列を使用して定義されます。この属性は、Ordinates属性に格納されている縦座標を解釈する方法を指定します。

Oracle Spatialには、Element Info属性値を生成するために、次のヘルパー関数が用意されています。

com.oracle.cep.cartridge.spatial.Geometry.createElemInfo(int SDO_STARTING_OFFSET, int SDO_ETYPE , int SDO_INTERPRETATION)

einfogenerator関数を使用することもできます。

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

- createElemInfo

- einfogenerator

4.1.2.3 縦座標および座標系とSDO_SRID

表4-3は、Oracle Spatialがデフォルトでサポートする座標系、および各座標系を識別するSDO_SRIDの一覧です。

表4-3 Oracle Spatial座標系

座標系

SDO_SRID

説明

デカルト

0

デカルト座標は、指定した基点からの点の位置を、空間の直交する軸を関連付けて測定する座標です。

測地(WGS84)

8307

測地座標(地理座標)は、角度を持つ座標(経度および緯度)で、球体の極点の座標と密接に関連しており、地球上の特定の測地データに関連付けて定義されます。

これは、Oracle Spatialのデフォルトの座標系です。

SDO_SRIDの値は、呼び出すOracle Spatialのメソッドおよびコンストラクタのそれぞれに引数として指定できます。または、SDO_SRIDをOracle Spatialのアプリケーション・コンテキストに一度だけ構成し、毎回引数としてSDO_SRIDを設定することなくcom.oracle.cep.cartridge.spatial.Geometryメソッドを使用できます。アプリケーション・コンテキストを使用する場合、Oracle Spatialでサポートされる任意の座標系も指定できます。

注意:

SDO_SRID値を使用しないcom.oracle.cep.cartridge.spatial.Geometryメソッドを使用する場合、Oracle Spatialのアプリケーション・コンテキストを使用する必要があります。たとえば、次のメソッド呼出しはランタイム例外の原因になります。

com.oracle.cep.cartridge.spatial.Geometry.createPoint(lng, lat)

かわりに、spatialリンク名を使用して、メソッド呼出しをOracle Spatialのアプリケーション・コンテキストと関連付ける必要があります。

com.oracle.cep.cartridge.spatial.Geometry.createPoint@spatial(lng, lat)

SDO_SRID値を使用するGeometryメソッドを使用する場合、spatialリンク名の使用はオプションです。たとえば、次のメソッド呼出しは両方とも有効です。

com.oracle.cep.cartridge.spatial.Geometry.createPoint(8307, lng, lat)
com.oracle.cep.cartridge.spatial.Geometry.createPoint@spatial(lng, lat)

詳細は、「Oracle Spatialアプリケーション・コンテキスト」を参照してください。

縦座標は、ダブル配列を使用してジオメトリの座標の配列を定義します。Oracle Spatialには、座標の配列を生成するためにordsgeneratorヘルパー関数が用意されています。構文は、「ordsgenerator」を参照してください。

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

- デフォルトの測地座標の使用方法

- 他の測地座標の使用方法

4.1.2.4 ジオメトリ索引

Oracle Spatialでは空間索引を使用して、1次フィルタを実装します。空間索引の目的は、データのサブセットを迅速に作成し、2次フィルタでの処理の負荷を軽減することです。

空間索引は、他の索引と同様、検索対象を限定するメカニズムを提供しますが、この場合は、交差および包含のような空間基準に基づきます。

Oracle Spatialでは、デフォルトの索引作成メカニズムにRツリー索引を使用しています。空間Rツリー索引では、最大4次元の空間データの索引を作成できます。Rツリー索引では、ジオメトリを囲む最小の矩形(最小境界矩形(MBR))によって各ジオメトリを近似させます。

詳細は、「ジオメトリ・フィルタ演算子」を参照してください。

4.1.2.5 ジオメトリ関係演算子

Oracle Spatialでは、次のOracle Spatialジオメトリ関係演算子がサポートされます。

- ANYINTERACT

- CONTAIN

- INSIDE

- INSIDE3D

- WITHINDISTANCE

これらの操作はすべて、Oracle CQL問合せのprojection句またはwhere句のいずれかに使用できます。

Oracle CQL問合せのwhere句でジオメトリ関係演算子を使用する場合、Oracle Spatialで、where句で指定された関係に対してRツリー索引を作成できます。

Oracle Spatialでは、点と他のジオメトリ・タイプ間のジオメトリ関係のみがサポートされます。

詳細は、「ジオメトリ関係演算子の使用方法」を参照してください。

4.1.2.6 ジオメトリ・フィルタ演算子

Oracle Spatialでは、次のOracle Spatialジオメトリ・フィルタ演算子がサポートされます。

- FILTER

- NN

これらのフィルタ演算子では一時フィルタが実行されるので、Oracle CQL問合せのwhere句でのみ使用されます。

これらのフィルタ演算子では空間索引を使用して、指定するオブジェクトと空間的に対話する可能性がある一連の空間オブジェクトが識別されます。

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

- ジオメトリ索引

- ジオメトリ・フィルタ演算子の使用方法

4.1.2.7 ジオメトリ集約

ジオメトリ集約演算子MBRは、Oracle CQL問合せのprojection句にのみ使用可能です。

詳細は、「ジオメトリ集約演算子の使用方法」を参照してください。

4.1.2.8 ジオメトリAPI

Oracle SpatialはOracle Spatial Java APIに基づいています。Oracle SpatialはOracle Spatial機能をcom.oracle.cep.cartridge.spatial.Geometryクラスに公開します。このGeometryクラスにより、oracle.spatial.geometry.J3D_Geometryも拡張されます。Oracle Spatialは2Dジオメトリおよび3Dジオメトリをサポートし、J3D_GeometryメソッドでZ座標を自動的にゼロ詰めします。

Geometryクラスからアクセスできない(またはOracle Spatialがサポートする有効範囲およびジオメトリ・タイプに準拠していない)Oracle Spatial機能に、Oracle Spatialからアクセスすることはできません。

この項では、次の内容について説明します。

- com.oracle.cep.cartridge.spatial.Geometryのメソッド

- oracle.spatial.geometry.JGeometryのメソッド

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

- スコープ

- ordsgenerator

注意:

Oracle Spatialの型名を単純化するには、『Oracle CQL言語リファレンス』で説明しているエイリアスを使用できます。

4.1.2.8.1 com.oracle.cep.cartridge.spatial.Geometryのメソッド

表4-4は、Geometryクラスが提供するパブリック・メソッドの一覧です。

表4-4 Oracle Spatialジオメトリ・メソッド

タイプ

メソッド

バッファ

- buffer

- bufferPolygon

円

- createCircle

変換

- convertTo2D

- convertTo3D

距離

- distance

要素情報

- createElemInfo

ジオメトリ

- createGeometry

単線または複線のストリング

- createLinearLineString

- createLinearMultiLineString

線形ポリゴン

- createLinearPolygon

最小境界矩形(MBR)

- get2dMbr

点

- createMultiPoint

- createPoint

矩形

- createRectangle

型および型変換

- createGeometry

- to_J3D_Geometry

- to_JGeometry

注意:

Geometryクラスでは大文字と小文字が区別されるため、表示されている方を使用してください。

4.1.2.8.2 oracle.spatial.geometry.JGeometryのメソッド

次のJGeometryパブリック・メソッドを、Oracle Spatialに適用できます。

- double area(double tolerance): 2Dジオメトリの平面の表面積合計を返します。

- double length(double tolerance): 2Dジオメトリの周辺の長さを返します。すべての辺の長さが加えられます。

- double[] getMBR(): このジオメトリの最小境界矩形(MBR)を返します。2DのMBRのminX、minY、maxXおよびmaxY値を含むダブル配列を返します。

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

- http://download.oracle.com/docs/cd/B28359_01/appdev.111/b28401/oracle/spatial/geometry/JGeometry.html

- http://download.oracle.com/docs/cd/B28359_01/appdev.111/b28401/oracle/spatial/geometry/J3D_Geometry.html

4.1.3 データ型マッピング

Oracle Spatialカートリッジは、1つのデータ型com.oracle.cep.cartridge.spatial.Geometryをサポートしています。

Geometryクラスはoracle.spatial.geometry.J3D_Geometryを拡張し、J3D_Geometryおよび親クラスのoracle.spatial.geometry.JGeometryが提供するすべてのパブリックなメソッド、フィールドおよびコンストラクタをサポートします。

com.oracle.cep.cartridge.spatial.Geometryが提供するメソッドの完全なリストは、「ジオメトリAPI」を参照してください。

4.1.4 Oracle Spatialのアプリケーション・コンテキスト

Oracle Spatialのインスタンスにアプリケーション・コンテキストを定義し、このアプリケーション・コンテキストをランタイム時に伝播できます。これにより、特定のOracle Spatialアプリケーション・デフォルト(SDO_SRIDなど)を特定のOracle Spatialインスタンスに関連付けることができます。

Oracle Spatialアプリケーション・コンテキストを定義する前に、Oracle Stream AnalyticsアプリケーションEPNアセンブリ・ファイルを編集して、必要なネームスペースおよびスキーマの場所のエントリを追加します。

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:osgi="http://www.springframework.org/schema/osgi"
xmlns:wlevs="http://www.bea.com/ns/wlevs/spring"
xmlns:spatial="http://www.oracle.com/ns/ocep/spatial"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/osgi
http://www.springframework.org/schema/osgi/spring-osgi.xsd
http://www.bea.com/ns/wlevs/spring
http://www.bea.com/ns/wlevs/spring/spring-wlevs-v11_1_1_6.xsd"
http://www.oracle.com/ns/ocep/spatial
http://www.oracle.com/ns/ocep/spatial/ocep-spatial.xsd">

次の例では、Geodetic Reference System 1980 (GRS80)座標系を使用して、EPNアセンブリ・ファイルにSpatialGRS80という名前の空間コンテキストを作成する方法を説明しています。

<spatial:context id="SpatialGRS80" srid="4269" sma="6378137" rof="298.25722101" />

次の例は、Oracle CQL問合せでspatial:contextを参照する方法を示しています。この場合、問合せでリンク名SpatialGRS80(前述の例で定義)が使用され、このアプリケーション・コンテキストがOracle Spatialに伝播されます。SpatialGRS80のspatial:context属性設定は、createPointメソッド・コールに適用されます。

<view  id="createPoint">
select com.oracle.cep.cartridge.spatial.Geometry.createPoint@SpatialGRS80(
lng, lat)
from CustomerPos[NOW]
</view>

4.2 Oracle Spatialの使用

この項では、Oracle Stream AnalyticsアプリケーションでのOracle Spatialの使用方法をまとめた共通のユース・ケースを説明します。次の内容が含まれます。

- Oracle Spatial Java APIジオメトリ・タイプへのアクセス方法

- ジオメトリの作成方法

- ジオメトリ・タイプのパブリックなメソッドおよびフィールドへのアクセス方法

- ジオメトリ関係演算子の使用方法

- ジオメトリ・フィルタ演算子の使用方法

- ジオメトリ集約演算子の使用方

- デフォルトの測地座標の使用方法

- 他の測地座標の使用方法

詳細は、「ジオメトリAPI」を参照してください。

4.2.1 Oracle Spatial Java APIジオメトリ・タイプへのアクセス方法

次の手順では、Oracle CQL問合せでOracle Spatialを使用してOracle Spatialジオメトリ・タイプSDO_GTYPE、SDO_ELEMENT_INFOおよびORDINATESにアクセスする方法について説明します。

Oracle Spatial Java APIでサポートされているジオメトリ・タイプにアクセスするには:

1. パッケージcom.oracle.cep.cartridge.spatialをOracle Stream AnalyticsアプリケーションのMANIFEST.MFファイルにインポートします。

2. 適切なOracle Spatialデータ型を使用して、Oracle Stream Analyticsアプリケーションのイベント・タイプを定義します。

次の例では、com.oracle.cep.cartridge.spatial.Geometry型の2つのイベント・プロパティxおよびyを持つイベント・タイプMySpatialEventを定義する方法を説明しています。

<wlevs:event-type-repository>
<wlevs:event-type type-name="MySpatialEvent">
<wlevs:properties>
<wlevs:property name="x" type="com.oracle.cep.cartridge.spatial.Geometry"/>
<wlevs:property name="y" type="com.oracle.cep.cartridge.spatial.Geometry"/>
</wlevs:properties>
</wlevs:event-type>
</wlevs:event-type-repository>

次のように、Oracle CQL問合せでこれらのイベント・プロパティを使用できます。

CONTAIN@spatial(x, y, 20.0d)

詳細は、『Oracle Stream Analyticsによるイベント処理用アプリケーションの開発』を参照してください。

3. GTYPE_POLYGONなどのSDO_GTYPEを選択します。

詳細は、「ジオメトリ・タイプ」を参照してください。

4. 縦座標に適した要素情報を選択します。

詳細は、「要素情報配列」を参照してください。

5. 座標の値を指定します。

詳細は、「縦座標および座標系とSDO_SRID」を参照してください。

6. 次の例が示すように、Oracle CQL問合せを作成します。

view id="ShopGeom">
select  com.oracle.cep.cartridge.spatial.Geometry.createGeometry@spatial(
com.oracle.cep.cartridge.spatial.Geometry.GTYPE_POLYGON,
com.oracle.cep.cartridge.spatial.Geometry.createElemInfo(1, 1003, 1),
ordsgenerator@spatial(
lng1, lat1, lng2, lat2, lng3, lat3,
lng4, lat4, lng5, lat5, lng6, lat6
)
) as geom
from ShopDesc
</view>

4.2.2 ジオメトリの作成方法

次のメソッドを呼び出すことで、Oracle Spatialを使用してOracle CQL問合せでジオメトリを作成できます。

- com.oracle.cartridge.spatial.Geometryの静的メソッド

- Oracle Spatialがサポートする有効範囲およびジオメトリ・タイプに準拠している、oracle.spatial.geometry.JGeometryのメソッド。

- oracle.spatial.geometry.J3D_Geometryのコンストラクタ・メソッド

- oracle.spatial.geometry.J3D_Geometryの静的メソッド

詳細は、「ジオメトリAPI」を参照してください。

Oracle Spatialジオメトリ・クラスでの静的メソッドの使用

次の例では、com.oracle.cartridge.spatial.Geometryの静的メソッドを使用して点ジオメトリを作成する方法を説明しています。この例では、リンク(@spatial)を使用して、このクラスを提供するデータ・カートリッジを識別する必要があります。この方法の利点は、Oracle Spatialアプリケーション・コンテキストを使用してSRIDや他のOracle Spatialオプションの設定を行えることです。これはデフォルトで実行されるか、構成するアプリケーション・コンテキストに基づいて実行されます(「Oracle Spatialアプリケーション・コンテキスト」を参照)。

<view  id="CustomerPosGeom">
select com.oracle.cep.cartridge.spatial.Geometry.createPoint@spatial(
lng, lat) as geom
from CustomerPos[NOW]
</view>

Oracle Spatial J3D_Geometryコンストラクタ

次の例では、oracle.spatial.geometry.J3D_Geometryのコンストラクタ・メソッドを使用してジオメトリを作成する方法を説明しています。この場合、J3D_GeometryはJavaクラスなので、リンク(@spatial)を使用しません。この方法の欠点は、com.oracle.cartridge.spatial.Geometryの使用とは異なり、アプリケーション・コンテキストを使用できないため、SRIDを設定する必要がある点です。

<view  id="CustomerPosGeom">
select oracle.spatial.geometry.J3D_Geometry(
oracle.spatial.geometry.GTYPE_POINT, srid, x, y, z) as geom
from CustomerPos[NOW]
</view>

Oracle Spatial J3D_Geometryの静的メソッドの使用

次の例では、oracle.spatial.geometry.J3D_Geometryの静的メソッドを使用してジオメトリを作成する方法を説明しています。

<view  id="CustomerPosGeom">
select  oracle.spatial.geometry.J3D_Geometry.createArc@spatial(
x1, y1, x2, y2, x3, y3) as geom
from CustomerPos[NOW]
</view>

詳細は、「ジオメトリ・タイプ」を参照してください。

4.2.3 ジオメトリ・タイプのpublicメソッドおよびフィールドへのアクセス方法

Oracle Spatialを使用すると、Oracle CQLでOracle Spatialクラスのpublicメンバー関数およびpublicメンバー・フィールドに直接アクセスできます。

Geometryクラスからアクセスできない(またはOracle Spatialがサポートする有効範囲およびジオメトリ・タイプに準拠していない)Oracle Spatial機能に、Oracle Spatialからアクセスすることはできません。

次の例では、ShopGeomビューはgeomという名前のOracle Spatialジオメトリを作成します。ビューshopMBRはJGeometry静的メソッドgetMBRを呼び出し、double[]がストリーム要素mbrとして返されています。問合せqshopMBRは標準Java APIを使用してこのdouble[]にアクセスしています。

<view id="ShopGeom">
select  com.oracle.cep.cartridge.spatial.Geometry.createGeometry@spatial(
com.oracle.cep.cartridge.spatial.Geometry.GTYPE_POLYGON,
com.oracle.cep.cartridge.spatial.Geometry.createElemInfo(1, 1003, 1),
ordsgenerator@spatial(
lng1, lat1, lng2, lat2, lng3, lat3,
lng4, lat4, lng5, lat5, lng6, lat6
)
) as geom
from ShopDesc
</view>
<view  id="shopMBR">
select geom.getMBR() as mbr
from ShopGeom
</view>
<query  id="qshopMBR">
select mbr[0], mbr[1], mbr[2], mbr[3]
from shopMBR
</query>

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

- ジオメトリ・タイプ

- Oracle Javaデータ・カートリッジ

4.2.4 ジオメトリ関係演算子の使用方法

Oracle Spatialを使用すると、Oracle CQL問合せのWHERE句またはSELECT句で、次のOracle Spatialジオメトリ関係演算子にアクセスできます。

- ANYINTERACT

- CONTAIN

- INSIDE

- INSIDE3D

- WITHINDISTANCE

次の例では、op_in_whereビューはWHERE句でCONTAINジオメトリ比較演算子を使用します。この場合、Oracle SpatialはRツリー索引を使用します。ビューop_in_projでは、SELECT句でCONTAINを使用しています。

<view id="op_in_where">
RStream(
select
loc.customerId,
shop.shopId
from
LocGeomStream[NOW] as loc,
ShopGeomRelation as shop
where
CONTAIN@spatial(shop.geom, loc.curLoc, 5.0d) = true
)
</view>
<view id="op_in_proj">
RStream(
select
loc.customerId,
shop.shopId,
CONTAIN@spatial(shop.geom, loc.curLoc, 5.0d)
from
LocGeomStream[NOW] as loc,
ShopGeomRelation as shop
)
</view>

詳細は、「ジオメトリ比較演算子」を参照してください。

4.2.5 ジオメトリ・フィルタ演算子の使用方法

Oracle Spatialを使用すると、Oracle CQL問合せのWHERE句で、次のOracle Spatialジオメトリ・フィルタ演算子にアクセスできます。

- FILTER

- NN

次の例では、filterビューのWHERE句でジオメトリ・フィルタ演算子FILTERを使用します。

<view id="filter">
RStream(
select loc.customerId, shop.shopId
from LocGeomStream[NOW] as loc, ShopGeomRelation as shop
where FILTER@spatial(shop.geom, loc.curLoc, 5.0d) = true
)
</view>

詳細は、「ジオメトリ・フィルタ演算子」を参照してください。

4.2.6 ジオメトリ集約演算子の使用方

Oracle Spatialデータ・カートリッジを使用して、Oracle CQL問合せのSELECT句で、次のOracle Spatial集約演算子を使用できます。

- MBR

次の例では、vaggrmbrビューはSELECT句でジオメトリ集約演算子MBRを使用します。問合せqaggrmbrは、標準のJava APIを使用して、MBRジオメトリ集約演算子が返すdouble[]値にアクセスします。

<view id="vaggrmbr">
select MBR@spatial1(shop.geom) as mbr
from ShopGeomRelation as shop
</view>
<query id="qaggrmbr">
select mbr[0], mbr[1], mbr[2], mbr[3], mbr[4], mbr[5], mbr[6]
from vaggrmbr
</query>

詳細は、「ジオメトリ・フィルタ演算子」を参照してください。

4.2.7 デフォルトの測地座標の使用方法

Oracle Spatialのデフォルトのアプリケーション・コンテキストを使用してOracle CQL問合せを作成すると、デフォルトのSRIDがCARTESIANに設定されます。

次の例では、createPointメソッド呼出しでデフォルトのリンク(@spatial)が使用されます。これにより、Oracle Spatialのデフォルトのアプリケーション・コンテキストが適用されるようになります。

<view  id="createPoint">
select com.oracle.cep.cartridge.spatial.Geometry.createPoint@spatial(
lng, lat)
from CustomerPos[NOW]
</view>

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

- Oracle Spatialのアプリケーション・コンテキスト

- 縦座標および座標系とSDO_SRID

4.2.8 他の測地座標の使用方法

次の手順では、Oracle Spatialのアプリケーション・コンテキストを使用して、デフォルトのデカルト測地座標系以外の測地座標系をOracle CQL問合せで指定する方法について説明します。

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

- Oracle Spatialのアプリケーション・コンテキスト

- 縦座標系および座標系とSDO_SRID

他の測地座標を使用するには:

1. Oracle Spatialのアプリケーション・コンテキストを作成し、使用する測地座標のsrid属性を定義します。

次の例では、Geodetic Reference System 1980 (GRS80)座標系を使用して、EPNアセンブリ・ファイルにSpatialGRS80という名前の空間コンテキストを作成する方法を説明しています。

<spatial:context id="SpatialGRS80" srid="4269" sma="6378137" rof="298.25722101" />

2. Oracle CQL問合せにおいて、リンクでこのspatial:contextのIDを使用します。

次の例は、Oracle CQL問合せでspatial:contextを参照する方法を示しています。この場合、問合せでリンク名SpatialGRS80が使用され、このアプリケーション・コンテキストがOracle Spatialに伝播されます。SpatialGRS80のspatial:context属性設定は、createPointメソッド・コールに適用されます。

<view  id="createPoint">
select com.oracle.cep.cartridge.spatial.Geometry.createPoint@SpatialGRS80(
lng, lat)
from CustomerPos[NOW]
</view>

5 Oracleビッグ・データ・カートリッジ

Oracle Stream Analyticsでは、Hadoop、NoSQLDBおよびHBaseカートリッジによりビッグ・データをサポートします。Hadoopカートリッジは、Oracle CQLプロセッサがHadoop分散ファイルシステム(HDFS)の大容量データにアクセスするための拡張です。HDFSは、非リレーショナル・データ・ストアです。NoSQLカートリッジは、Oracle CQLプロセッサがOracle NoSQL Databaseの大容量データにアクセスするための拡張です。Oracle NoSQLデータベースは、データをキーと値のペアで保管します。HBaseカートリッジは、HBaseデータベース内にある大量のデータにアクセスするOracle CQLプロセッサ用の拡張です。HBaseは、Hadoopファイル・システム上に構築される、分散型の列指向のデータベースです。

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

- ビッグ・データとは

- Hadoopデータ・カートリッジ

- NoSQLデータ・カートリッジ

- HBaseビッグ・データ・カートリッジ.

5.1 ビッグ・データとは

ビッグ・データは、従来のデータ処理アプリケーションでは不十分な場合に使用される巨大で複雑なデータ・セットです。ビッグ・データは、従来のデータと並んで、多くの新しいタイプのデータおよびデータ管理を含み、統合する、全体的な情報管理戦略を表します。

また、ビッグ・データは次のように4つのVによって定義されます。

- ボリューム(Volume): データの量です。より多くのデータがあることを意味しますが、独特なのはデータの粒度です。ビッグ・データは大量の低密度の非構造化Hadoopデータ、つまりTwitterデータ・フィード、Webページおよびモバイル・アプリケーションのクリック・ストリーム、ネットワーク・トラフィック、光速でデータを捕捉するセンサーを利用できる装置、その他多くの値が不明なデータを処理する必要があります。このようなHadoopデータを価値ある情報に変換することは、ビッグ・データの役割です。

- 速度(Velocity): データを受信し、処理する速さです。速度の速いデータは、通常はメモリーに直接ストリームされ、ディスクには書き込まれません。

- 多様性(Variety): 新しい非構造化データ型のことです。テキスト、オーディオ、ビデオなどの非構造化および半構造化データ型では、意味の解明および補助となるメタデータの両方に対する追加の処理が必要になります。解明されると、非構造化データは、サマリー、系統、監査可能性およびプライバシーなどの構造化データと共通する多くの要件を持つようになります。

- 値(Value): データには固有の値がありますが、検出する必要があります。データから値を導き出するための、様々な量的および研究的な手法があります。

5.2 Hadoopデータ・カートリッジ

Hadoopはオープンソース・テクノロジであり、これを使用してクラスタにまたがって分散された膨大なデータ・セットにアクセスできます。Hadoopソフトウェアの特徴の1つに、リレーショナル・データベースに保存されていない膨大な量のデータへのアクセスを可能にするということが挙げられます。Oracle Stream Analyticsのデータ・カートリッジは、Cloudera distribution for Hadoop (CDH)バージョン3u5に基づきます。

このマニュアルの内容は、読者がHadoopシステムにすでに精通していて、運用しているものと想定しています。Hadoopの詳細は、HadoopプロジェクトのWebサイトhttp://hadoop.apache.org/を参照してください。

注意:

HadoopをLinux環境でのみ実行している場合でも、UNIXおよびWindowsでHadoopデータ・カートリッジを使用できます。

5.2.1 Oracle Stream Analytics Hadoopデータ・カートリッジについて

Hadoop分散ファイル・システム上のファイルのデータを処理できるイベント処理ネットワークに既存のHadoopデータ・ソースを統合するには、Hadoopデータ・カートリッジを使用できます。データ・ソースを統合すると、Hadoopシステム上のファイルからデータを組み込むOracle CQL問合せコードを記述できます。

Hadoopシステムを統合する際には、次のガイドラインに留意してください。

- Hadoopクラスタは、その独自のメカニズムによって起動され、アクセス可能であることが必要です。クラスタはOracle Stream Analyticsによって直接管理されません。

- Hadoopシステムのファイルは、Oracle CQLで単一キーを使用する結合のみをサポートします。ただし、関連付けられたイベント・タイプのプロパティをキーとして使用できます。すなわち、型がバイト配列であるキーを除いて、文字列型以外の型のキーを使用できます。

- 結合には等号演算子を使用する必要があります。その他の演算子は、結合条件ではサポートされません。

- Hadoopファイルのデータを表すために定義するイベント・タイプの場合、タプルベースのイベント・タイプのみがサポートされます。

- イベント・タイプ指定でのプロパティの順序は、Hadoopファイルでのフィールドの順序と一致させる必要があります。

- NullPointerExeptionの発生を回避するため、サーバーのシャットダウンまたはアンデプロイを実行する前に、Hadoopデータ・カートリッジの処理を完了するまで待ちます。

- Oracle CQLに対応する次のHadoopのデータ型のみがサポートされます。それ以外のデータ型では、構成上の例外が発生が発生します。

表5-1 Oracle CQLとHadoop間のデータ型マッピング

Oracle CQLデータ型

Hadoopデータ型

int

int

bigint

long

float

float

double

double

char

chararray

java.lang.String

chararray

byte

bytearray

5.2.1.1 使用シナリオ: 購買奨励策を開発するための購入データの使用

Hadoopデータ・ソースがOracle Stream Analyticsアプリケーションでどのように使用されるかを理解するには、大量の顧客の購入データにリアル・タイムで迅速にアクセスする必要があるアプリケーションによるシナリオを考えてみます。

この場合、Hadoopに格納されているデータには、全店の顧客全員によるすべての購入が含まれています。データの値には、顧客ID、店舗ID、製品IDなどが含まれます。購入データには、各店舗での売れ筋製品についての情報が含まれます。データを管理可能な状態にレンダリングするには、データを調べ、上位購買者(購買奨励策の送付先)のリストを作成するために、MapReduce関数が使用されます。

このデータは、製品のお薦め情報や購買奨励策(クーポンなど)を顧客に送るために設計されたサービスの一部として、モバイル・アプリケーション・メーカーにより収集および管理されます。データは複数の小売業者から収集され、小売業者ごとに別々に管理されます。

Oracle Stream Analyticsアプリケーションは、上位購入者に購買奨励策を提供するために設計されたクライアント側のモバイル・アプリケーションに中間層ロジックを提供します。これは次のように機能します。

1. 小売業者はモバイル・アプリケーション・メーカーと、上位顧客に対する購買奨励策提供のためのプログラムの一部として、購入データを提供することを打ち合せます。店の販売データから定期的にリフレッシュされるデータは、Hadoopシステムに格納され、MapReduce関数を使用して上位購入者が特定されます。

2. モバイル・アプリケーション・メーカーは、どの小売業者がプログラムをサポートしているかを示して、ダウンロード用にアプリケーションを提供します。

3. アプリケーション・ユーザーはそれぞれユーザーIDを作成し、これをアプリケーション・メーカーが小売業者からの顧客データに相互に関連付けます。

4. モバイル・アプリケーションは、ユーザーIDとともに位置データをOracle Stream Analyticsアプリケーションに送るよう設計されています。この情報(場所の座標とユーザー)IDにより、Oracle Stream Analyticsアプリケーションで受信されるイベント・データが作成されます。

5. Oracle Stream Analyticsアプリケーションは、モバイル・アプリケーションからイベント・データを受信する際、Oracle CQL問合せを使用して次のことを実行します。

- ユーザーが参加小売業者の店の近くにいるかどうかを判断します。

- (Hadoopベースのデータから)そのユーザーがその小売業者の上位購入者であるかどうかを確認します。

- その小売業者からの購入者として、そのユーザー関連の購入情報を検索します。

- ユーザーが上位購入者の場合、アプリケーションは、以前購入された製品を現在その製品の購入者に提供されている購買奨励策と対応付けます。

6. Oracle Stream Analyticsアプリケーションは、ユーザーに購買奨励策の通知を送ります。

5.2.1.2 データ・カートリッジ名

Oracle Stream Analytics Hadoopカートリッジでは、カートリッジID com.oracle.cep.cartridge.hadoopが使用されます。

5.2.2 Oracle CQLでのHadoopデータ・ソースの使用

既存のHadoopシステムのファイルをイベント処理ネットワークに統合することにより、Oracle Stream Analyticsに含まれるHadoopサポートを使用します。ファイルを統合することにより、Oracle CQLコードからそのファイルのデータにアクセスできます。

ここでは、以下の項目について説明します。

- Oracle Stream AnalyticsとHadoopの統合の構成

- HadoopシステムのファイルのEPNへの統合

- Oracle CQLでのHadoopデータの使用

5.2.2.1 Oracle Stream AnalyticsとHadoopの統合の構成

Oracle Stream AnalyticsからHadoopを使用するには、最初にOracle Stream AnalyticsおよびHadoopサーバーの両方の構成を変更する必要があります。

- Oracle Stream Analyticsサーバーで、サーバーのbootclasspathにHadoop構成ファイル、core-site.xml、hdfs.xmlおよびmapred.xmlを追加します。

- Hadoopサーバーに対しては、Pig JARファイルをlibディレクトリにコピーし、hadoop-env.shファイルに定義されたHADOOP_CLASSPATHの一部として含めます。

注意:

カートリッジを介したHadoopデータ・ソースとの接続には、多くの入出力操作が必要になる可能性があり、アプリケーションのデプロイ解除でタイムアウトになったり、エラーが発生して、アプリケーションを再びデプロイできなくなったりします。Hadoopカートリッジを使用するアプリケーションのデプロイを解除する前には、必ずアプリケーションへのイベント・フローを中断してください。

5.2.2.2 HadoopシステムのファイルのEPNへの統合

既存のHadoopシステムからのファイルの統合は、既存のリレーショナル・データベースから表を統合する方法と似ています。Hadoopファイルの場合、Hadoopサポート用に特別に追加されたOracle Stream AnalyticsスキーマのXML要素fileを使用できます。

ファイルの要素は、http://www.oracle.com/ns/ocep/hadoopネームスペースからのものです。そのため、EPNアセンブリ・ファイルは、そのネームスペースを参照する必要があります。file要素には次の属性があります。

- id: EPN内のそのファイルを一意に識別します。この属性値を使用して、プロセッサ内のデータ・ソースを参照します。

- event-type: ファイルのデータのバインド先であるイベント・タイプの参照。イベント・タイプは、EPNで定義されている必要があります。

- path: Hadoopファイル・システム内のファイルへのパス。

- separator: オプション。Hadoopファイル内の行を別々のフィールドに分解するときに使用するキャラクタ・デリミタ。デフォルトのデリミタはカンマ( , )文字です。

- operation-timeout: オプション。操作が完了するまでの最大待機時間(ミリ秒単位)。

統合するHadoopファイルをファイル要素で指定して、表ソース要素を使用して、ファイルのデータを使用するOracle CQLプロセッサ用のデータ・ソースとしてそのファイルを追加します。

次の例では、http://www.oracle.com/ns/ocep/hadoopネームスペース(およびhadoop接頭辞)がBean要素で参照されることに注意してください。file要素では、イベント・タイプ・リポジトリで定義されたCustomerDescriptionイベント・タイプの他に、CustomerDescription.txtファイルがデータとして参照されています。

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:wlevs="http://www.bea.com/ns/wlevs/spring"
xmlns:hadoop="http://www.oracle.com/ns/ocep/hadoop"
xsi:schemaLocation="
http://www.bea.com/ns/wlevs/spring
http://www.bea.com/ns/wlevs/spring/ocep-epn.xsd
http://www.oracle.com/ns/ocep/hadoop
http://www.oracle.com/ns/ocep/hadoop/ocep-hadoop.xsd">
<!-- Some schema references omitted for brevity. -->

<!-- Event types that will be used in the query. -->
<wlevs:event-type-repository>
<wlevs:event-type type-name="SalesEvent">
<wlevs:class>com.bea.wlevs.example.SalesEvent</wlevs:class>
</wlevs:event-type>
<wlevs:event-type type-name="CustomerDescription">
<wlevs:properties>
<wlevs:property name="userId" type="char"/>
<wlevs:property name="creditScore" type="int"/>
<wlevs:property name="address" type="char"/>
<wlevs:property name="customerName" type="char"/>
</wlevs:properties>
</wlevs:event-type>
</wlevs:event-type-repository>

<!-- Input adapter omitted for brevity. -->

<!-- Channel sending SalesEvent instances to the processor. -->
<wlevs:channel id="S1" event-type="SalesEvent" >
<wlevs:listener ref="P1"/>
</wlevs:channel>

<!-- The file element to integrate CustomerDescription.txt file from
the Hadoop system into the EPN. -->
<hadoop:file id="CustomerDescription" event-type="CustomerDescription"
path="CustomerDescription.txt" />

<!-- The file from the Hadoop system tied into the query processor
with the table-source element. -->
<wlevs:processor id="P1">
<wlevs:table-source ref="CustomerDescription" />
</wlevs:processor>

<!-- Other stages omitted for brevity. -->

</beans>

5.2.2.3 Oracle CQLでのHadoopデータの使用

Hadoopファイルをイベント処理ネットワークに統合すると、Oracle CQLコードからそのファイルを問い合せることができます。

次の例は、HadoopシステムのファイルをEPNに追加する方法を示しています。ファイルがEPNに追加されると、次の例のようにOracle CQLコードからの問合せが可能です。

次の例では、プロセッサがSalesEventインスタンスをチャネルから受信しますが、HadoopシステムのファイルにもCustomerDescriptionインスタンスと同様にアクセスできます。Hadoopファイルは、基本的に顧客をリストするCSVファイルです。どちらのイベント・タイプにもuserIdプロパティがあります。

<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>P1</name>
<rules>
<query id="q1"><![CDATA[
SELECT     customerName, creditScore, price, item
FROM     S1 [Now], CustomerDescription as cust
WHERE S1.userId = cust.userId
AND S1.price > 1000
></query>
</rules>
</processor>
</n1:config>

5.3 NoSQLデータ・カートリッジ

Oracle NoSQLデータベースは、分散型のキー値データベースです。このデータベースでは、データはキー値ペアで格納されており、これらのペアは特定のストレージ・ノードに記述されています。高可用性、ノード障害時のラピッド・フェイルオーバー、問合せの最適なロード・バランシングを確保するために、ノードはレプリケートされます。

このマニュアルの内容は、読者がOracle NoSQL Databaseにすでに精通していて、運用しているものと想定しています。Oracle NoSQLの詳細は、Oracle Technology Networkページ(http://www.oracle.com/technetwork/database/database-technologies/nosqldb/documentation/index.html)を参照してください。

注意:

NoSQLデータ・カートリッジを使用するには、NoSQL Enterprise Editionのライセンスが必要です。

5.3.1 Oracle CQLプロセッサ問合せ

Oracle Stream Analytics NoSQL Databaseデータ・カートリッジを使用すると、Oracle CQL問合せの一部として、Oracle NoSQL Databaseに保存されたデータを参照できます。カートリッジにより、問合せでは、キーを指定し、そのキーに関連付けられた値のフィールドを参照することで、Oracle NoSQL Databaseストアから値を取得できます。

Oracle NoSQL Databaseを統合する際には、次のガイドラインに留意してください。

- NoSQL Databaseは、その独自のメカニズムによって起動され、アクセス可能であることが必要です。Oracle Stream Analyticsによって直接管理されてはいません。

- このリリースのカートリッジは、Oracle NoSQL Database APIリリース2.1.54を使用してデータベースへのアクセスを提供します。

- 問合せでキーとして使用されるプロパティは、String型であることが必要です。結合では単一のキーのみを使用できます。

- 結合には等号演算子を使用する必要があります。その他の演算子は、結合条件ではサポートされません。

- NoSQL Databaseを使用するランナウェイ問合せはサポートされません。ランナウェイ問合せの実行時間は、オプティマイザが予測する実行時間より長くなります。

5.3.2 データ・カートリッジ名

Oracle Stream Analytics NoSQLカートリッジはカートリッジID com.oracle.cep.cartridge.nosqldbを使用します。

5.3.3 Oracle CQLでのNoSQL Databaseの使用

CQLアプリケーションでOracle Stream Analytics NoSQL Databaseデータ・カートリッジを使用するには、1つ以上のアプリケーションの有効範囲内にあるカートリッジ・コンテキストで、そのアプリケーション用に宣言し、構成する必要があります。

5.3.3.1 NoSQL DatabaseのEPNへの統合

既存のNoSQL Databaseの統合は、リレーショナル・データベースの表を統合する方法と似ています。NoSQL Databaseの場合、EPNアセンブリ・ファイルを次の方法で更新します(手順3の例を参照)。

1. NoSQLデータ・ソースを参照するために、ネームスペース宣言を追加して、store要素をサポートします。

変更では、schemaLocation属性にネームスペース・スキーマの場所を、ネームスペースおよび接頭辞の宣言とともに追加する必要があります。

- http://www.oracle.com/ns/oep/nosqldb http://www.oracle.com/ns/oep/nosqldb/oep-nosqldb.xsd

- xmlns:nosqldb="http://www.oracle.com/ns/oep/nosqldb"

2. store要素を追加して、NoSQL Databaseをリレーション・ソースとしてイベント処理ネットワークに統合します。

ストア要素では、次の属性(すべてが必須)をサポートします。

- id: CQL問合せでキー/値ストアを参照するために使用される名前。

- store-name: キー/値ストアの名前で、ストアの作成時にKVStoreConfigクラスで指定した名前と一致させる必要があります。

- store-locations: ストア内のアクティブ・ノードの1つ以上のホスト名およびポート。属性値は、空白区切りのリストで、各エントリはhostname:portの形式です。指定したホスト名およびポートの値を持つノードは、ストアに最初に接続したときに、順番に接続されます。

- event-type: このリレーションのためにストア内の値から取得されたすべてのオブジェクトのオブジェクト型。属性値は、wlevs:event型リポジトリ・エントリで指定されたwlevs:event型エントリの名前に対応する必要があります。

3. table-source要素を追加して、NoSQL Databaseを問合せが実行されるプロセッサに接続します。

次の例は、イベント処理ネットワークをNoSQL Databaseに接続する方法を示しています。store要素は、ホストkvhost-alpha上のポート5000またはホストkvhost-beta上のポート5010を使用して最初の接続を行い、"kvstore-customers"という名前のストアへのアクセスを提供します。Oracle CQLプロセッサP1を定義し、キー/値ストアのデータを"CustomerDescription"という名前のリレーションとしてP1で使用できるようにします。

ストアは、"CustomerDescription"の名前を使用して、Oracle CQL問合せ内で参照できます。ストアから取得される値はすべて、CustomerDescriptionクラスのシリアライズ・インスタンスです。

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:osgi="http://www.springframework.org/schema/osgi"
xmlns:wlevs="http://www.bea.com/ns/wlevs/spring"
xmlns:nosqldb="http://www.oracle.com/ns/oep/nosqldb"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/osgi
http://www.springframework.org/schema/osgi/spring-osgi.xsd
http://www.bea.com/ns/wlevs/spring
http://www.bea.com/ns/wlevs/spring/ocep-epn.xsd
http://www.oracle.com/ns/oep/nosqldb
http://www.oracle.com/ns/oep/nosqldb/oep-nosqldb.xsd">

<!-- Provide access to the CustomerDescription class, which represents
the type of values in the store. -->
<wlevs:event-type-repository>
<wlevs:event-type type-name="CustomerDescription">
<wlevs:class>com.bea.wlevs.example.CustomerDescription</wlevs:class>
</wlevs:event-type>
<wlevs:event-type type-name="SalesEvent">
<wlevs:class>com.bea.wlevs.example.SalesEvent</wlevs:class>
</wlevs:event-type>
</wlevs:event-type-repository>

<!-- The store element declares the key-value store, along with the
event type to which incoming NoSQL data will be bound. -->
<nosqldb:store store-name="kvstore-customers"
store-locations="kvhost-alpha:5000 kvhost-beta:5010"
id="CustomerDescription"
event-type="CustomerDescription"/>

<wlevs:channel id="S1" event-type="SalesEvent">
<wlevs:listener ref="P1"/>
</wlevs:channel>

<!- The table-source element links the store to the CQL processor. -->
<wlevs:processor id="P1">
<wlevs:table-source ref="CustomerDescription" />
</wlevs:processor>

</beans>

Oracle CQL問合せでstore要素により指定したストア内のエントリを参照する場合、それらのエントリの値は、イベントタイプ属性で指定した型のシリアライズ・インスタンスであることが必要です。イベント・タイプ・クラスはjava.io.Serializableを実装する必要があります。

有効でないシリアライズ形式のストアから問合せで値を取得する場合、または指定されたクラスのシリアル化形式でない値の場合は、Oracle Stream Analyticsで例外が発生し、イベント処理が停止します。複数のstore要素を宣言して、同一または異なるストアから異なるデータ型の値を返すことができます。

5.3.3.2 Oracle CQLでのNoSQLデータの使用

NoSQL Databaseをイベント処理ネットワークに統合すると、Oracle CQLコードからデータにアクセスできます。問合せでは、WHERE句で等価リレーションを指定することで、ストアのエントリを検索できます。

<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>P1</name>
<rules>
<query id="q1"><![CDATA[
SELECT customerName, creditScore, price, item
FROM S1 [Now], CustomerDescription as cust
WHERE S1.userId = cust.userId
AND creditScore > 5
></query>
</rules>
</processor>
</n1:config>

この例では、S1チャネルおよびCustomerDescription NoSQLデータ・ソースのデータを表すイベント・タイプ・インスタンスがいずれもJavaBeansクラスとして実装されています。どちらのイベント・タイプもJavaBeansクラスであるため、Oracle CQL問合せでは、イベントのユーザーIDとWHERE句内の顧客の説明のIDをどちらもJavaBeansプロパティとして扱って等価とすることで、特定のイベントに関連付けられた顧客の説明にアクセスできます。

WHERE S1.userId = CustomerDescription.userId

この句では、イベントのuserIdフィールドの値で指定されたキーを持つストアからエントリを取得することを要求します。ストアからのエントリ取得では、等価リレーションのみがサポートされます。

ストアからエントリが選択されると、そのストアから取得された値のフィールドは、問合せのSELECTの部分、またはWHERE句内の追加の句で参照することができます。

SELECT句で指定したcreditScore値では、ストアから取得したCustomerDescriptionオブジェクトのcreditScoreフィールドの値が問合せの出力に含まれます。WHERE句のcreditScoreに対する参照でも、問合せはCustomerDescription creditScoreフィールドの値が5より大きいイベントにさらに制限されます。

5.3.3.2.1 NoSQLストアからのエントリ取得に使用されるキーの書式設定

ストアからのエントリ取得に使用されるキーは、値をスラッシュ(/)で始めるか、スラッシュを省略するかのいずれかの方法で書式を設定できます。

等価リレーションの左側に指定した値がスラッシュで始まる場合、キーは1つ以上の主要コンポーネントを(必要な場合はマイナー・コンポーネントも)指定するフル・キーとして扱われます。キー・パスの構文の詳細は、http://docs.oracle.com/cd/NOSQL/html/javadoc/index.htmlのOracle NoSQL Database APIドキュメントにあるoracle.kv.Keyクラスに関する情報を参照してください。

たとえば、SalesEventオブジェクトのuserIdフィールドに値"/users/user42/-/custDesc"がある場合、その値はusersを1つ目の主要コンポーネントとして、ユーザーIDのuser42を2つ目の主要コンポーネントとして、そしてcustDescというマイナー・コンポーネントを指定するフル・キー・パスとして処理されます。

便宜上、等価リレーションの左側に指定した値がスラッシュで始まっていない場合は、キー全体を構成する1つの主要コンポーネントとして処理されます。

ストアからエントリを取得するために使用されるキーは、Oracle CQL問合せでアクセスされる1つのフィールドで完全な形で指定する必要があります。特に、複数のコンポーネントを指定したキー・パスがキー/値ストア内のエントリにアクセスするために必要な場合、問合せによってアクセスされる1つのフィールドにフル・キー・パス式を格納する必要があります。

5.4 HBaseビッグ・データ・カートリッジ

HBaseビッグ・データ・カートリッジは、HBaseをOracle Stream Analyticsに統合したものです。HBaseは、分散型のバージョニングされた非リレーショナル・データベースであるNOSQLデータベースの一種です。

HBaseビッグ・データ・カートリッジでは、データにアクセスする主な手段としてのSQLはサポートされません。HBaseでは、データを受信するためのJava APIが提供されます。各行にはキーがあります。すべての列は特定の列ファミリに属します。それぞれの列ファミリは、1つまたは複数の修飾子で構成されます。従って、データの取得には行キー、列ファミリおよび列修飾子を組み合せる必要があります。HBaseはRDBMSのないビッグ・データの格納に適しています。

各表には、リレーショナル・データベースのように行キーがあります。HBaseの列修飾子は、NoSqlDBのマイナー・キーの概念に類似しています。たとえば、レコードのメジャー・キーが人物の名前で、マイナー・キーがその人物について格納する別の情報であることがあります。

5.4.1 HBaseカートリッジについて

HBaseでは、優先されるのは効率的なビッグ・データの格納であり、複雑なデータ取得操作の実行ではありません。

次のコードの抜粋は、HBaseでデータを格納して取得する方法の案です。

HBaseConfiguration config = new HBaseConfiguration();
batchUpdate.put("myColumnFamily:columnQualifier1", "columnQualifier1value".getBytes());
Cell cell = table.get("myRow", "myColumnFamily:columnQualifier1");
String valueStr = new String(cell.getValue());

HBaseは様々なアプリケーションのメタデータの格納に使用されます。たとえば、企業は様々な売上と関連付けた顧客情報をHBaseデータベースに格納できます。この場合、HBaseを外部データ・ソースとして使用してCQL問合せを作成できるHBaseビッグ・データ・カートリッジを使用できます。

HBaseデータベース・ストアのEPNコンポーネントは、データ・カートリッジとして提供されます。HBaseデータベース・カートリッジは、次のプロパティを持つ<store> EPNコンポーネントを提供します。

- id: EPNコンポーネントの名前。

- store-location: domain:client portの形式で表される、HBaseデータベース・サーバーの場所。

- event-type: CQLプロセッサにより表示される格納用のスキーマ。イベント・タイプ・クラスはjava.io.Serializableインタフェースを実装するJavaクラスである必要があります。

- table-name: HBase表の名前。

EPNコンポーネントには、CQLイベント属性からHBase列ファミリおよび修飾子へのマッピングを指定するための、関連する<column-mappings>コンポーネントがあります。このコンポーネントは、JDBCカートリッジ構成に類似したHBaseビッグ・データ・カートリッジ構成ファイルで宣言されます。このコンポーネントには次のプロパティがあります。

- name: マッピングが宣言されている<store> EPNコンポーネントのID。

- rowkey: HBase表で使用される行キーの属性。String型である必要があります。

- cql-attribute: CQL問合せで使用されるCQL属性の名前。この名前は、Javaイベント・タイプで宣言された対応するフィールドと一致する必要があります。

- hbase-family: HBase列ファミリ。

- hbase-qualifer: HBase列修飾子。

5.4.2 HBaseカートリッジの使用

HBaseカートリッジを使用するには、cql-attributeがプリミティブ・データ型の場合、hbase-familyおよびhbase-qualifierを指定する必要があります。

次の例のように、<hbase:store>コンポーネントはtable-source要素を使用してCQLプロセッサにリンクされます。

<hbase:store id="User" table-name="User" event-type="UserEvent" store-location="localhost:5000">
</hbase:store>
<wlevs:processor id="P1">
<wlevs:table-source ref="User"/>
</wlevs:processor>

次の例のように、Oracle Stream Analytics HBase構成ファイルで<hbase:store>コンポーネントの列のマッピングを指定する必要があります。

例5-1 HBaseカートリッジの列のマッピング

次の例では、CQL列addressはマップで、address列ファミリからのすべての列修飾子を持っています。CQL列firstname、lastname、emailおよびroleは、プリミティブ・データ型のデータを格納します。data列ファミリからの固有の列修飾子があります。イベント・タイプからのuserNameフィールドは行キーで、そのため、HBase列ファミリまたは修飾子へのマッピングはありません。

<hbase:column-mappings>
<name>User</name>
<rowkey>userName</rowkey>
<mapping cql-attribute="address" hbase-family="address"/>
<mapping cql-attribute="firstname" hbase-family="data"  hbase-qualifier="firstname"/>
<mapping cql-attribute="lastname" hbase-family="data"  hbase-qualifier="lastname"/>
<mapping cql-attribute="email" hbase-family="data"  hbase-qualifier="email"/>
<mapping cql-attribute="role" hbase-family="data" hbase-qualifier="role"/>
</hbase:column-mappings>

<UserEvent>クラスには次のフィールドがあります。

String userName;
java.util.Map address;
String first name;
String lastname;
String email;
String role;

HBaseスキーマの性質は動的で、HBase表が作成された後はいつでも、追加の列ファミリまたは列修飾子(あるいはその両方)を追加できます。Oracle Stream Analyticsでは、すべての動的に追加された列修飾子を含むマップとしてイベント・フィールドを取得できます。この場合、java.util.MapをJavaイベント・タイプでイベント・フィールドのひとつとして宣言する必要があります。そのため、UserEventイベント・タイプには、名前とアドレスの両方を持つjava.util.Mapフィールドが必要です。カートリッジでは、動的に追加された列ファミリはサポートされません。そのため、Oracle Stream Analyticsアプリケーションが新しく追加された列ファミリを使用する必要がある場合、イベント・タイプを変更する必要があります。

HBaseデータベースはクラスタとして実行される場合があります。マスター・ノードのhostnameおよびclient portを構成する必要があります。

サポートされている演算子

現在は、=、 !=、like、<および>演算子のみがサポートされています。問合せの最初の従属句は、行キーに基づくHBaseデータ・ソースとの等結合である必要があります。

S1.userName = user.userName
like演算子は、Java正規表現を引数として受け入れます。この演算子はString型のみに使用できます。

user.firstname like Y.*

<および>演算子は、integerおよびdoubleデータ型のみに使用できます。

5.4.3 リリース12.2.1におけるHBaseカートリッジの制限

HBaseカートリッジは、リリース12.2.1においていくつかの制限があります。

HBaseカートリッジの制限は次のとおりです。

1. HBaseサーバーのバージョン0.94.8のみがサポートされています。

2. HBaseサーバーが使用不可能な場合、HBaseカートリッジ・アプリケーションをOracle Stream Analyticsサーバーにデプロイできません。

3. HBaseアプリケーションがOracle Stream Analyticsにデプロイされた後でHBaseサーバーが停止した場合、Oracle Stream Analyticsサーバーを再起動しなければ、HBaseサーバーに再接続できません。

4. HBase表の行キーと結合する場合、イベント・プロパティのデータ型はStringである必要があります。

5. HBaseカートリッジ・アプリケーションでは、store idおよびtable-nameの名前の両方が、スプリング・ファイルのHBaseカートリッジのものと一致する必要があります。一致しない場合、表の識別は失敗します。

6. HBaseイベント・プロパティのデータ型には、ラッパー・データ型の整数または倍精度浮動小数点数を使用して、ランタイム例外を回避します。

7. HBaseカートリッジ・アプリケーションのCQL問合せで構文エラーがある場合、明確なエラー・メッセージは表示されません。

8. 値がNULLの文字列をHBase行キーに結合しようとすると、ランタイム例外が発生します。

9. CQL問合せの最初の従属句は、行キーに基づくHBaseデータ・ソースとの等結合である必要があります。

10. CQL問合せで=または!=演算子をdoubleデータ型に使用する場合、文字dをdoubleデータ型の値の後ろに付ける必要があります。

6 Oracle Javaデータ・カートリッジ

この章では、Oracle Continuous Query Language (CQL)の拡張機能であるOracle Javaデータ・カートリッジの使用方法を説明します。Oracle CQLを使用して、Oracle Stream AnalyticsアプリケーションでJavaクラスを操作するCQLコートを記述できます。

この章では、Oracle Javaデータ・カートリッジが公開する型、メソッド、フィールドおよびコンストラクタについて説明します。これらの型、メソッド、フィールドおよびコンストラクタを、Oracle CQLのネイティブ型と同様に、Oracle CQLの問合せおよびビューで使用できます。

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

- Oracle Javaデータ・カートリッジについて

- Oracle Javaデータ・カートリッジの使用

6.1 Oracle Javaデータ・カートリッジについて

Oracle Javaデータ・カートリッジは、Oracle Stream AnalyticsアプリケーションでJavaクラスを操作するOracle CQL問合せおよびビューを記述できるようにする組込みカートリッジです。

この項では、次の内容について説明します。

- データ・カートリッジ名

- クラスのロード

- メソッドの解決

- データ型マッピング

- Oracle Javaデータ・カートリッジのOracle CQL問合せサポート

6.1.1 データ・カートリッジ名

Oracle Javaデータ・カートリッジでは、カートリッジID com.oracle.cep.cartrdiges.javaを使用します。

Oracle Javaデータ・カートリッジはデフォルトのOracle Stream Analyticsデータ・カートリッジです。

デフォルトのJavaパッケージ名配下の型またはjava.langシステム・パッケージ配下の型の場合、次のように、Oracle CQL問合せでパッケージ名またはデータ・カートリッジ名で修飾せずにそのJava型を参照できます。

<query id="q1"><![CDATA[
select String(“foo") …
></query>

注意:

Oracle Javaデータ・カートリッジの型名を単純化するには、Oracle Fusion Middleware Oracle Stream Analytics Oracle CQL言語リファレンスで説明しているエイリアスを使用できます。

詳細は、「クラスのロード」を参照してください。

6.1.2 クラスのロード

Oracle Javaデータ・カートリッジでは、Oracle CQL問合せが参照するJavaクラスのロードについて、次のポリシーをサポートしています。

- アプリケーション・クラス・スペース・ポリシー

- 自動インポートなしクラス・スペース・ポリシー

- サーバー・クラス・スペース・ポリシー

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

- クラスのロード例

- メソッド解決

6.1.2.1 アプリケーション・クラス・スペース・ポリシー

これは、デフォルトのクラス・ローディング・ポリシーです。

このモードでは、Oracle Javaデータ・カートリッジはJavaクラスの検索時に、有効範囲内のアプリケーションのクラス・スペースを使用します。

これは、型がローカル名によってのみ指定されている場合、すなわち識別子が1つで、他の識別子がパッケージで使用されていない場合にのみ適用できます。つまり、次のようになります。

select String(“foo") …

次のようには指定しません。

select java.lang.String(“foo") …

この場合、手順は次のようになります。

- 通常どおりに、アプリケーションのクラス・スペースを使用して、1つの識別子(ID1と呼びます)で定義されたクラスをロードします。これに失敗した場合、

- アプリケーションで、パッケージとは関係なく、バンドルの内部クラス・パス内で名前がID1と一致するクラスが定義されているかどうかを確認します。これに失敗した場合、

- アプリケーションでImport-Package MANIFESTヘッダー文が指定されているかどうかを確認します。これとID1を使用して、Javaクラスをロードできます。

例については、「クラスのロード例」を参照してください。

6.1.2.2 自動インポートなしクラス・スペース・ポリシー

これは、オプションのクラス・ローディング・ポリシーです。このポリシーを使用するには、次のようにOracle Stream AnalyticsアプリケーションにMANIFESTヘッダー・エントリを含める必要があります。

OCEP_JAVA_CARTRIDGE_CLASS_SPACE: APPLICATION_NO_AUTO_IMPORT_CLASS_SPACE

このモードはアプリケーション・クラス領域ポリシーと似ていますが、Oracle Event ProcessingによってパッケージがID1に組み合されない点が異なります。

詳細は、「アプリケーション・クラス・スペース・ポリシー」を参照してください。

6.1.2.3 サーバー・クラス・スペース・ポリシー

これは、オプションのクラス・ローディング・ポリシーです。このポリシーを使用するには、次のようにOracle Stream AnalyticsアプリケーションにMANIFESTヘッダー・エントリを含める必要があります。

OCEP_JAVA_CARTRIDGE_CLASS_SPACE: SERVER_CLASS_SPACE

Oracle CQL問合せは、クラス・パッケージがアプリケーションまたはバンドルにインポートされているかにかかわらず、エクスポートされたあらゆるJavaクラスを参照できます。

また、問合せでは、ランタイムJDKクラスを含む、OSGiフレームワークの親クラス・ローダーに表示されるすべてのクラスにアクセスできます。

つまり、Oracle CQLアプリケーションでは、他のOracle Stream Analyticsアプリケーションで定義されたクラス(エクスポートされている場合)を参照するOracle CQL問合せを使用できます。これにより、新しいJavaライブラリを提供することが唯一の目的であるJavaベース・カートリッジの作成が容易になります。

注意:

参照できるJavaクラスはOracle Stream Analyticsアプリケーションの内部クラスパスにあるJavaクラス(エクスポートされている場合)のみであり、このアプリケーション内のプロセッサが当該Oracle CQL問合せを定義している場合でも参照可能です。

例については、「クラスのロード例」を参照してください。

6.1.2.4 クラスのロード例

図6-1の例では、B2がエクスポートするパッケージpackage2をB1がインポートしています。

図6-1 Oracle Stream Analytics Event Processingアプリケーションの例

表6-1は、アプリケーション・クラス領域またはサーバー・クラス領域で実行されているかによって、2つの異なるアプリケーションがアクセスできるクラスをまとめています。

表6-1 クラスのロード・ポリシー別のクラス・アクセシビリティ

クラス・ローディング・ポリシー

アプリケーションB1

アプリケーションB2

アプリケーション・クラス・スペース

- mypackage1.A

- myprivatepackage1.B

- package2.C

- package2.C

- privatepackage2.D

サーバー・クラス・スペース

- package2.C

- package2.C

アプリケーションB1では、Oracle CQL問合せでJavaクラスA、BおよびCのいずれも使用できます。

select A …
select B …
select C …

しかし、アプリケーションB2では、Oracle CQL問合せでJavaクラスAおよびBは使用できません。JavaクラスCおよびDのみ使用できます。

select C …
select D …

6.1.3 メソッドの解決

JavaメソッドにアクセスするOracle CQL式は、次のアルゴリズムを使用してメソッドを解決します。

1. すべてのパラメータは、「データ型マッピング」に説明されているように、Java型に変換されます。

たとえば、Oracle CQL INTEGERはJavaプリミティブintに変換されます。

2. 標準のJavaメソッド解決ルールが、Java言語仕様の第3版、15.12項「Method Invocation Expressions」に説明されているとおりに適用されます。

注意:

可変arityメソッドはサポートされていません。詳細は、Java言語仕様の第3版、12.12.2.4項を参照してください。

例として、次のOracle CQL式を考えてみます。

attribute.methodA(10)

attributeは、オーバーロードされた次のメソッドを定義する型mypackage.MyTypeです。

- methodA(int)

- methodA(Integer)

- methodA(Object)

- methodA(long)

リテラル10はプリミティブ型intであるため、優先順位は次のとおりです。

- methodA(int)

- methodA(long)

- methodA(Integer)

- methodA(Object)

詳細は、「クラスのロード」を参照してください。

6.1.4 データ型マッピング

Oracle Javaデータ・カートリッジは、Oracle CQLネイティブ・データ型とJavaデータ型間に固定算術マッピングを適用します。

- 表6-2は、Oracle CQLネイティブ・データ型とJavaデータ型間のマッピングの一覧です。

- 表6-3はJavaデータ型とOracle CQLネイティブ・データ型間のマッピングの一覧です。

表6-2 Oracle Javaデータ・カートリッジ: Oracle CQLからJavaデータ型へのマッピング

Oracle CQLネイティブ・データ型

Javaデータ型

BIGINT

long

BOOLEAN

boolean

BYTE

byte[]

CHAR

java.lang.String

DOUBLE

double

FLOAT

float

INTEGER

int

INTERVAL

long

INTERVAL_DAY

long, java.lang.String

INTERVAL_DAY_TO_SECOND

java.lang.String

INTERVAL_YEAR

long, java.lang.String

INTERVAL_MONTH

long, java.lang.String

INTERVAL_YEAR_TO_MONTH

java.lang.String

XMLTYPE

java.lang.String

表6-3 Oracle Javaデータ・カートリッジ: Javaデータ型からOracle CQLへのマッピング

Javaデータ型

Oracle CQLネイティブ・データ型

long

BIGINT

boolean

BOOLEAN

byte[]

BYTE

java.lang.String

CHAR

double

DOUBLE

float

FLOAT

int

INTEGER

java.sql.Date

java.sql.Timestamp

INTERVAL

java.sql.SQLXML

XMLTYPE

他のすべてのJavaクラスは、複合型としてマップされます。

これらのデータ型マッピングの詳細は、次の項を参照してください。

- Javaデータ型StringおよびOracle CQLデータ型CHAR

- リテラル

- 配列

- コレクション

6.1.4.1 Javaデータ型StringおよびOracle CQLデータ型CHAR

Oracle CQLデータ型のCHARはjava.lang.Stringにマップされ、java.lang.StringはOracle CQLデータ型CHARにマップされます。すなわち、Oracle CQL CHARとして定義された属性のjava.lang.Stringメンバー・フィールドおよびメソッドにアクセスできます。たとえば、a1がOracle CQL CHAR型として宣言されている場合、次のような問合せを記述できます。

<query id="q1"><![CDATA[

select a1.substring(1,2)

></query>

6.1.4.2 リテラル

Oracle CQL CHARリテラルであっても、リテラルのメンバー・フィールドおよびメソッドにはアクセスできません。たとえば、次のような問合せは使用できません。

<query id="q1-forbidden"><![CDATA[

select "hello".substring(1,2)

></query>

6.1.4.3 配列

Javaの配列はOracle CQLデータ・カートリッジの配列に変換され、Oracle CQLデータ・カートリッジの配列はJavaの配列に変換されます。これは、複合型と単純型の両方に適用されます。

データ・カートリッジのTABLE句を使用して、Oracle CQL問合せのFROM句内のデータ・カートリッジ関数から返された複数の行にアクセスできます。

詳細は、「コレクション」を参照してください。

6.1.4.4 コレクション

通常、Oracle Javaデータ・カートリッジはjava.util.Collectionインタフェースを実装するインスタンスをOracle CQL複合型に変換します。

Oracle CQL問合せは、java.util.Collectionのメンバーを介して繰り返すことができます。

データ・カートリッジのTABLE句を使用して、Oracle CQL問合せのFROM句内のデータ・カートリッジ関数から返された複数の行にアクセスできます。

詳細は、「配列」を参照してください。

6.1.5 Oracle Javaデータ・カートリッジのOracle CQL問合せサポート

Oracle Javaデータ・カートリッジ型は、SELECTおよびWHERE句内の式で使用できます。

Oracle Javaデータ・カートリッジ型は、ORDER BY句内の式では使用できません。

詳細は、「Oracle Javaデータ・カートリッジの使用」を参照してください。

6.2 Oracle Javaデータ・カートリッジの使用

この項では、Oracle Stream AnalyticsアプリケーションでのOracle Javaデータ・カートリッジの使用方法をまとめた共通のユース・ケースを説明します。次の内容が含まれます。

- Java APIを使用した問合せ方法

- エクスポートしたJavaクラスを使用した問合せ方法

詳細は、「Oracle CQL問合せでのOracle Javaデータ・カートリッジのサポート」を参照してください。

6.2.1 Java APIを使用する問合せ方法

この手順は、Javaクラス(Address.java)として定義されたイベント・プロパティ型を持つタプル(Student)として定義された1つのイベント・タイプを使用するOracle Stream Analyticsアプリケーションで、Oracle Javaデータ・カートリッジを使用する方法を説明しています。

Javaクラスを使用して問合せするには:

1. Address.javaクラスを実装します。

package test;

class Address {
String street;
String state;
String city;
String [] phones;
}

この例では、Address.javaクラスがこのアプリケーションに属すると仮定します。

Address.javaクラスが別のOracle Stream Analyticsアプリケーションに属していた場合、親アプリケーションにエクスポートする必要があります。詳細は、「エクスポートしたJavaクラスを使用する問合せ方法」を参照してください。

2. イベント・タイプ・リポジトリを定義します。

<event-type-repository>
<event-type name="Student">
<properties>
<property name="name" type="char"/>
<property name="address" type="Address"/>
</properties>
</event-type>

<event-type name="Address">
<class-name>test.Address</class-name>
</event-type>
<event-type-repository>

test.Addressクラスは、このアプリケーションに属しているため、イベント・タイプ・リポジトリで宣言できます。これにより、自動的にこのアプリケーション内でクラスに対してグローバルにアクセスできるようになります。パッケージをエクスポートする必要はありません。

3. アダプタがStudentイベントをStudentStreamチャネルに提供していると想定します。

<channel id="StudentStream" event-type="Student"/>

4. StudentStreamは、Oracle CQL問合せq1でプロセッサに接続されます。

<processor>
<rules>

<query id="q1"><![CDATA[

select
name,
address.street as street,
address.phones[0] as primary_phone
from
StudentStream

></query>

</rules>
</processor>

Oracle Javaデータ・カートリッジでは、標準のJava APIを使用してOracle CQL問合せからaddressイベント・プロパティにアクセスできます。

6.2.2 エクスポートしたJavaクラスを使用する問合せ方法

この手順は、Javaクラス(Address.java)として定義されたイベント・プロパティ型を持つタプル(Student)として定義された1つのイベント・タイプを使用するOracle Stream Analyticsアプリケーションで、Oracle Javaデータ・カートリッジを使用する方法を説明しています。この手順では、Address.javaクラスは別のOracle Stream Analyticsアプリケーションに属します。親アプリケーションでエクスポートされ、同じOracle Stream Analyticsサーバーにデプロイされた別のOracle Stream Analyticsアプリケーションにアクセス可能になります。

Javaクラスを使用して問合せするには:

1. Address.javaクラスを実装します。

package test;

class Address {
String street;
String state;
String city;
String [] phones;
}

2. Address.javaクラスを含むtestパッケージをエクスポートします。

詳細は、『Oracle Stream Analyticsによるイベント処理用アプリケーションの開発』を参照してください。

testパッケージは、このOracle Stream Analyticsアプリケーションの一部である場合も、このアプリケーションと同じOracle Stream Analyticsサーバーにデプロイされた別のOracle Stream Analyticsアプリケーションの一部である場合もあります。

3. イベント・タイプ・リポジトリを定義します。

<event-type-repository>
<event-type name="Student">
<property name="name" type="char"/>
<property name="address" type="Address"/>
</event-type>
<event-type-repository>

4. 次に示すように、アダプタがStudentイベントをStudentStreamチャネルに提供していると想定します。

<channel id="StudentStream" event-type="Student"/>

5. StudentStreamは、Oracle CQL問合せq1でプロセッサに接続されます。

<processor>
<rules>

<query id="q1"><![CDATA[

select
name,
address.street as street,
address.phones[0] as primary_phone
from
StudentStream

></query>

</rules>
</processor>

Oracle Javaデータ・カートリッジでは、標準のJava APIを使用してOracle CQL問合せからaddressイベント・プロパティにアクセスできます。

6.2.3 Javaキャスト関数

JavaカートリッジではJavaキャスト関数が使用可能で、Java拡張可能型から別のJava拡張可能型へのキャストが可能です。ただし、キャスト元からキャスト先を割り当てることができる必要があります。この関数を使用するには、Javaカートリッジがインストールされている必要があります。

構文

T cast@java(l-value, class-literal<T>)

パラメータ

l-value: キャストするデータを持つイベント属性です。l-valueをTから割り当てることができない場合、Java Cartridgeはキャスト関数呼出し時にRuntimeInvocationExceptionをスローします。

class-literal<T>: キャスト先のクラス名です。たとえば、intをlongにキャストする場合、class-literal<T>はLong.classです。

例

次のクラス階層を考慮します。

public class Parent
{
...
}

public class Child extends Parent
{
...
}

次の例では、Child型のオブジェクトがキャストされます。

cast@java(S.parent, Child.class)

7 データ・カートリッジ・フレームワーク

データ・カートリッジ・フレームワークは、ユーザーおよびベンダーがOracle CQL機能を拡張するためにカートリッジを作成できるようにするService Provider Interface (SPI)です。「Oracleビッグ・データ・カートリッジ」に説明されているHadoopカートリッジおよびNoSQLカートリッジは、データ・カートリッジ・フレームワークで作成されたカートリッジの例です。

データ・カートリッジ・フレームワークを使用すると、たとえば、Oracle CQL機能を拡張してテレマティック・アプリケーションの開発をサポートできます。テレマティック・アプリケーションには、電気通信(電気信号および電波)、自動車技術、輸送、電気工学(センサー、計装、ワイヤレスコミュニケーション)、コンピュータ・サイエンス(モノのインターネット)などが含まれます。

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

- SPIについて

- インタフェース

- カートリッジの例

- ソース・コード

7.1 SPIについて

Oracle Stream Analyticsカートリッジは、外部関数、型、索引、Javaクラスおよびデータ・ソースを定義する、単一の管理可能ユニットです。カートリッジのユーザーは、次の形式のリンクのあるOracle CQLコードから、使用可能な関数、型、索引、Javaクラスおよびデータ・ソースを参照します。

myFunction@myCartridge(arg1)

Oracle Stream Analyticsデータ・カートリッジ・フレームワークで作成されたカートリッジは、Oracle Stream Analyticsライブラリです。つまり、ライブラリのデプロイと同じ方法で、コマンドラインから、またはOracle JDeveloperでカートリッジをデプロイできます。カートリッジをデプロイすると、すべての外部関数、型、索引、Javaクラスおよびデータ・ソースをOracle CQL問合せで使用できるようになります。アプリケーションをデプロイする前にカートリッジをデプロイする必要があります。アプリケーションを更新せずにカートリッジを更新できます。

7.2 インタフェース

com.oracle.cep.cartridgeパッケージには、カートリッジ・フレームワークJavaインタフェースが含まれます。この項では、インタフェース使用時に可能な操作、および必要な操作を説明しています。インタフェースおよび例外も簡単に説明しています。

次のことが可能です。

- Oracle CQLで、表およびストリーム属性のタイプに対して任意のタイプ・システムを使用できます。

- 関数呼出しのための独自の索引データ構造を使用できます。

- Oracle CQL内で可視の新しいJavaクラスを使用できます。カートリッジをデプロイする際に、新しいJavaクラスを持つアプリケーションまたはライブラリを含めます。新しいJavaクラスにアクセスするアプリケーションは、MANIFEST.MFファイルに正しいJavaパッケージをImport-Packageヘッダー・エントリでインポートする必要があります。

次の操作が必要です。

- カートリッジがサポートするすべての関数のリストが含まれる、すべてのデプロイ済カートリッジのMBeanを用意します。カートリッジがアンデプロイされると、MBeanインスタンスは登録解除されます。

- ExternalFunctionProvider.listFunctionsメソッドを実装します。

- カートリッジ外部データ・ソースに結び付けた表ソースのビーン・ステージMBeanを用意します。このMBeanは、idやprovider名などの表ソース・カスタム・プロパティのリストを提供します。
オプションで、表ソースSpring Beanファクトリはcom.bea.wlevs.management.configuration.spring.StageFactoryAccessインタフェースを実装可能で、表ソースプロパティへのアクセス方法をカスタマイズできます。

7.2.1 インタフェースの説明

com.oracle.cep.cartridgeパッケージは次のJavaインタフェースを提供します。

CapabilityProvider: ExternalConnectionはこのインタフェースを実装可能で、<(未満)、AND、ORなど、サポートされる機能を指定できます。

ExternalConnection: ExternalDataSourceに接続します。

ExternalConstants: データ・カートリッジが使用する一般定数を定義します。このインタフェースは次の2つの定数を提供します。外部接続機能を提供するEQUALSとExternalFunctionProviderリンクidを提供するSERVER_CONTEXT_LINK_IDです。

ExternalDataSource: getConnnectionメソッドを使用してコンテキスト・データの外部ソースに接続し、Oracle CQLプロセッサ・イベントに参加します。外部データ・ソースは、そのプロパティの構成をサポートしている必要があります。たとえば、NoSQLDBデータ・ソースは、ホスト、ポートおよびストア名の構成をサポートしています。

外部データ・ソースはサポートする関数を指定します。デフォルトでは、すべての外部データ・ソースが等値比較関数をサポートしています。

SELECT * FROM S[NOW], MyExternalDataSource
WHERE S.id = MyExternalDataSource.id

データ・ソースをOracle CQLプロセッサで使用可能にするには、com.oracle.cep.cartridge.ExternalDataSourceインタフェースを実装したSpring Beanを登録し、そのSpring Beanを表ソース(wlevs:table-sourceタグ)のターゲットにします。

ExternalFunction: ExternalFunctionProviderまたは別の外部エンティティにより提供される関数。

ExternalFunctionDefinition: ExternalFunctionProviderまたは他の外部エンティティにより提供されるOracle CQL問合せおよびビューで使用する関数のメタデータを指定します。

ExternalFunctionProvider: Oracle CQL問合せおよびビューから直接アクセスできる関数のセットを定義します。getIDメソッドを使用して、外部関数プロバイダをOSGiサービスとして登録します。また、プロバイダは、ExternalContants.SERVER_CONTEXT_LINK_IDサービス・プロパティを指定し、Oracle CQL問合せおよびビューで使用するリンクIDを示してプロバイダを識別する必要があります。

ExternalPredicate: プリコンパイルされた文の述部を属性と述語句で表します。

ExternalPreparedStatement: 外部関数プロバイダのプリコンパイルされた文を表し、同一または類似した関数を効率的に繰り返し実行します。

7.2.2 例外

com.oracle.cep.cartridgeパッケージは次の例外を提供します。

AmbiguousFunctionException: 曖昧性により関数への参照をExternalFunctionProviderが判断できない場合に発生します。

CartridgeException: ルート・カートリッジの例外です。

FunctionNotFoundException: Oracle CQL文で参照された関数がExternalFunctionProviderでサポートされていない場合に発生します。

7.3 カートリッジの例

この項では、カートリッジの2つの例を説明します。算術カートリッジとデータ・ソース・カートリッジです。算術カートリッジは、Oracle Spatialデータ・カートリッジに記載されている、関数のみを含むSpatialカートリッジに類似したOracle CQL問合せで、算術関数を使用可能にします。データ・カートリッジは、「Oracleビッグ・データ・カートリッジ」に説明されているHadoopに類似したデータ・ソースを定義します。

Oracle Stream Analyticsアプリケーション内でOracle CQL問合せを使用可能にするには、各カートリッジを個別のアプリケーション・ライブラリとしてデプロイします。カートリッジをデプロイした後、Oracle Stream Analyticsアプリケーションまたはカートリッジを使用するアプリケーションをデプロイします。

7.3.1 算術カートリッジ

算術カートリッジは次の関数クラスを持ちます。

- 追加、配列および例外操作の機能を提供するJavaクラスのセット。

- Oracle CQL問合せでの配列の使用および例外のスローを可能にする配列機能および例外機能を提供するExceptionFunction.javaクラスおよびArrayFunciton.javaクラス。

- ArithmeticActivator.javaクラスは、カートリッジ・バンドルを開始または停止します。

すべての関数クラスは、com.oracle.cep.cartridge.ExternalFunctionProviderインタフェースを実装し、Oracle CQL問合せで使用する関数名を返すgetNameメソッドを持ちます。

たとえば、AddFunction.javaおよびAddLongFunction.javaのgetNameメソッドは関数名plusを返します。Oracle CQL問合せでこの関数名を使用して関数を呼び出せます。次の問合せはarithmeticカートリッジでplus関数を使用しinputChannelから2つの整数を追加します。

SELECT plus@arithmetic(typeInt, typeInt2) AS typeInt FROM inputChannel

7.3.2 データ・ソース・カートリッジ

データ・ソース・カートリッジ・ファイル

カートリッジの例ではデータ・ソースを定義するJavaクラスのセットを使用します。

MyCartridgeSource.javaクラスはcom.oracle.cep.cartridge.ExternalDataSource interfaceを実装します。このクラスはデータ・ソース接続機能を定義し、データベースでイベント・データの読込みおよび書込みを行います。

MyActivator.javaクラスはorg.osgi.framework.BundleActivatorを実装し、カートリッジ・バンドルを開始および停止するコードを提供します。

MyHandler.javaクラスはorg.springframework.beans.factory.xml.NamespaceHandlerを実装し、カートリッジ・ネームスペースを管理してUddsファクトリ・ビーンを登録するためのコードを提供します。

UddsDefinitionParser.javaクラスはorg.springframework.beans.factory.xml.AbstractSingleBeanDefinitionParserを拡張し、UddsFactoryBeanオブジェクトを解析および登録するためのコードを提供します。

UddsFactoryBean.javaクラスはorg.springframework.beans.factory.config.AbstractFactoryBeanを拡張し、イベントおよびイベント・タイプ・リポジトリを管理するためのコードを提供します。

7.4 ソース・コード

この項では、データ・ソース・アプリケーションおよびデータ・ソース・カートリッジと、算術カートリッジのソース・コードを説明します。

- 算術カートリッジ

- データ・ソース・カートリッジ

7.4.1 算術カートリッジ

- AddFunction.java

- ArithmeticActivator.java

- ArrayFunction.java

- ExceptionFunction.java

- UserDefineFunctionClass.java

AddFunction.java

package tests.functional.cartridge.userdefine.common.libs.arithmetic;

import java.util.Map;
import com.oracle.cep.cartridge.ExternalFunction;

public class AddFunction implements ExternalFunction{

@Override
public String getName() {
return "plus";
}

@Override
public Class<?>[] getParameterTypes() {
Class<?>[] parameters = new Class<?>[2];
parameters[0] = java.lang.Integer.class;
parameters[1] = java.lang.Integer.class;
return parameters;
}

@Override
public Class<?> getReturnType() {
return java.lang.Integer.class;
}

@Override
public Object execute(Object[] args, String caller, Map<String, Object> context)
throws Exception {
if(args.length != 2)
throw new IllegalArgumentException("add function need an 2 parameters");
if(!(args[0] instanceof java.lang.Integer && args[1]
instanceof java.lang.Integer)) {
throw new IllegalArgumentException("add function only
support java.lang.Integer");
}
java.lang.Integer arg1 = (Integer) args[0];
java.lang.Integer arg2 = (Integer) args[1];
return new java.lang.Integer(arg1 + arg2);
}
}

ArithmeticActivator.java

package tests.functional.cartridge.userdefine.common.libs.arithmetic;

import java.util.Hashtable;
import org.osgi.framework.BundleActivator;
import org.osgi.framework.BundleContext;
import org.osgi.framework.ServiceRegistration;
import com.oracle.cep.cartridge.ExternalFunctionProvider;

public class ArithmeticActivator  implements BundleActivator {
private ServiceRegistration reg;

@Override
public void start(BundleContext context) throws Exception {
Hashtable props = new Hashtable();
props.put("server.context.link.id", "arithmetic");

this.reg = context.registerService(ExternalFunctionProvider.class.getName(),
new UserDefineFunction(), props);
}

@Override
public void stop(BundleContext arg0) throws Exception {
this.reg.unregister();
}
}

ArrayFunction.java

package tests.functional.cartridge.userdefine.common.libs.arithmetic;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import com.oracle.cep.cartridge.ExternalFunction;

public class ArrayFunction implements ExternalFunction {

@Override
public String getName() {
return "array";
}

@Override
public Class<?>[] getParameterTypes() {
Class<?>[] parameters = new Class<?>[2];
parameters[0] = Integer.class;    parameters[1] = Integer.class;
return parameters;
}

@Override
public Class<?> getReturnType() {
return List.class;
}

@Override
public Object execute(Object[] args, String caller, Map<String, Object> context)
throws Exception {
if(args.length == 0) {
return null;
}
if(!(args[0] instanceof java.lang.Integer)) {
throw new IllegalArgumentException("median function only supports
java.lang.Integer");
}
List ret = new ArrayList();
for(Object obj:args) {
ret.add(obj);
}
return ret;
}
}

ExceptionFunction.java

package tests.functional.cartridge.userdefine.common.libs.arithmetic;

import java.util.Map;
import com.oracle.cep.cartridge.ExternalFunction;

public class ExceptionFunction implements ExternalFunction{

@Override
public String getName() {
return "exception"
}

@Override
public Class<?>[] getParameterTypes() {
return new Class<?>[]{Integer.class};
}

@Override
public Class<?> getReturnType() {
return Integer.class;
}

@Override
public Object execute(Object[] args, String caller, Map<String, Object> context)
throws Exception {
throw new NullPointerException("I am an excpetion");
}
}

UserDefineFunctionClass.java

package tests.functional.cartridge.userdefine.common.libs.arithmetic;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Set;
import com.oracle.cep.cartridge.AmbiguousFunctionException;
import com.oracle.cep.cartridge.ExternalFunction;
import com.oracle.cep.cartridge.ExternalFunctionProvider;
import com.oracle.cep.cartridge.FunctionNotFoundException;

public class UserDefineFunction implements ExternalFunctionProvider {

private ArrayList<ExternalFunction> functions = new
ArrayList<ExternalFunction>();

public UserDefineFunction() {
functions.add(new AddFunction());
functions.add(new ArrayFunction());
functions.add(new ExceptionFunction());
}

@Override
public ExternalFunction getFunction(String functionName, Class<?> []
parameterTypes, String caller, Map<String, Object> context)
throws AmbiguousFunctionException, FunctionNotFoundException {
if("plus".equalsIgnoreCase(functionName)) {
return new AddFunction();
} else if("array".equalsIgnoreCase(functionName)) {
return new ArrayFunction();
} else if("exception".equalsIgnoreCase(functionName)) {
return new ExceptionFunction();
}
throw new FunctionNotFoundException(functionName+" is not supported in
arithmetic");
}

@Override
public String getId() {
return "arithmetic";
}

@Override
public List<ExternalFunction> listFunctions(String caller,
Map<String, Object> context) {
ArrayList<ExternalFunction> functionList = new ArrayList<ExternalFunction>();
functionList.addAll(functions);
return functionList;
}
}

7.4.2 データ・ソース・カートリッジ

データ・ソース・カートリッジは次のJavaクラス・ファイルで構成されています。

- MyCartridgeSource.java

- MyActivator.java

- MyHandler.java

- UddsFactoryBean.java

MyCartridgeSource.java

package tests.functional.cartridge.userdefine.common.libs.datasource;

import java.math.BigDecimal;
import java.sql.Timestamp;
import java.util.ArrayList;
import java.util.Date;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import oracle.cep.dataStructures.external.TupleValue;
import org.springframework.osgi.extensions.annotation.ServiceReference;
import com.bea.wlevs.ede.api.EventProperty;
import com.bea.wlevs.ede.api.EventType;
import com.bea.wlevs.ede.api.EventTypeRepository;
import com.bea.wlevs.ede.api.Type;
import com.bea.wlevs.management.configuration.spring.StageFactoryAccess;
import com.oracle.cep.cartridge.ExternalConnection;
import com.oracle.cep.cartridge.ExternalDataSource;
import com.oracle.cep.cartridge.ExternalPredicate;
import com.oracle.cep.cartridge.ExternalPreparedStatement;

public class MyCartridgeSource implements StageFactoryAccess,
ExternalDataSource {
//
@Override
public Map<?, ?> getCacheDataSource() {
return null;
}

private EventTypeRepository etr;

@ServiceReference
public void setEventTypeRepository(EventTypeRepository etr) {
this.etr = etr;
}

private String eventType;

@Override
public String getEventType() {
System.out.println("event type:" + this.eventType);
return eventType;
}

public void setEventType(String eventType) {
this.eventType = eventType;
}

private long maxThreshhold = 0;

@Override
public long getExternalRowsThreshold() {
return maxThreshhold;
}

public void setExternalRowsThreshold(long maxThreshhold) {
this.maxThreshhold = maxThreshhold;
}

private String pattern;

public String getPattern() {
return pattern;
}

public void setPattern(String pattern) {
this.pattern = pattern;
}

private String singularity;

public String getSingularity() {
return singularity;
}

public void setSingularity(String singularity) {
this.singularity = singularity;
}

private String id;

@Override
public String getId() {
return id;
}

public void setId(String id) {
this.id = id;
}

@Override
public String getJDBCDataSource() {
return null;
}

private Class keyClass;

@Override
public Class getKeyClass() {
return Long.class;
}

public void setKeyClass(String className) throws ClassNotFoundException {
this.keyClass = Class.forName(className);
}

private String[] keyPropertyNames;

@Override
public String[] getKeyPropertyNames() {
return keyPropertyNames;
}

public void setKeyProperty(String names) {
keyPropertyNames = names.split(",");
}

@Override
public String getTableName() {
return null;
}

public Class getObjectType() {
return ExternalDataSource.class;
}

@Override
public ExternalConnection getConnection() throws Exception {
MyExternalConnection connection = new
MyExternalConnection(this.etr.getEventType(this.eventType));
connection.setPattern(pattern);
connection.setSingularity(singularity);
return connection;
}

public static class MyExternalConnection implements ExternalConnection {

private final EventType targetEventType;

public MyExternalConnection(EventType eventtype) {
this.targetEventType = eventtype;
}
private String pattern;

public void setPattern(String pattern) {
this.pattern = pattern;
}
private String singularity;

public void setSingularity(String singularity) {
this.singularity = singularity;
}

@Override
public void close() throws Exception {
}

@Override
public ExternalPreparedStatement prepareStatement(String relationName,
List<String> relationAttrs, ExternalPredicate predicate)
throws Exception {
return new MyExternalPreparedStatement(this.targetEventType,
predicate,this.pattern,this.singularity);
}

@Override
public boolean supportsPredicate(ExternalPredicate predicate)
throws Exception {
return true;
}
}

public static class MyExternalPreparedStatement implements
ExternalPreparedStatement {
private ExternalPredicate predicate;
private Object[] keys = new Object[10];
private final EventType targetEventType;
private  Pattern pattern;
private  Pattern singularity;

public MyExternalPreparedStatement(EventType targetEventType,
ExternalPredicate predicate,String pattern,String singularity) {
this.targetEventType = targetEventType;
this.predicate = predicate;
if (pattern == null) {
this.pattern = Pattern.compile(".*");
} else {
this.pattern = Pattern.compile(pattern);
}
if (singularity == null) {
this.singularity = Pattern.compile("$.^");
} else {
this.singularity = Pattern.compile(singularity);
}
}

@Override
public void close() throws Exception {}

@Override
public Iterator<Object> executeQuery() throws Exception {
List<Object> result = new ArrayList<Object>();
List attrs = predicate.getAttributes();
String value="";
for(int i = 0;i<attrs.size();i++) {
if(keys[i+1] ==null) {
System.out.println("empty="+keys[i+1]);
return result.iterator();
}
value = keys[i+1].toString();
Matcher m = this.pattern.matcher(value);
if(!m.matches()) {
System.out.println("empty="+value);
return result.iterator();
}
}
TupleValue event = (TupleValue) this.targetEventType.createEvent();
EventProperty[] properties = this.targetEventType.getProperties();
for (int i = 0; i < properties.length; i++) {
properties[i].setValue(event, createValue(properties[i], value));
}
System.out.println("one="+value);
result.add(event);

Matcher s = this.singularity.matcher(value);
if(s.matches()) {
System.out.println("double="+value);
result.add(event);
}
return result.iterator();
}

private Object createValue(EventProperty property, String value) {
Type propertyType = property.getType();
Object ret;
if (Type.INT == propertyType) {
ret = Integer.valueOf(value);
} else if (Type.BIGINT == propertyType) {
ret = Long.valueOf(value);
} else if (Type.FLOAT == propertyType) {
ret = Float.valueOf(value);
} else if (Type.DOUBLE == propertyType) {
ret = Double.valueOf(value);
} else if (Type.BYTE == propertyType) {
ret = value.getBytes();
} else if (Type.BOOLEAN == propertyType) {
ret = false;
} else if (Type.TIMESTAMP == propertyType) {
ret = new Date();
} else if (Type.INTERVAL == propertyType) {
ret = Long.valueOf(value);
} else {
ret = value;
}
return ret;
}

@Override
public void setBigDecimal(int paramIndex, BigDecimal x)
throws Exception {
this.keys[paramIndex] = x;
}

@Override
public void setBoolean(int paramIndex, boolean x) throws Exception {
this.keys[paramIndex] = x;
}

@Override
public void setBytes(int paramIndex, byte[] x) throws Exception {
this.keys[paramIndex] = x;
}

@Override
public void setDouble(int paramIndex, double x) throws Exception {
this.keys[paramIndex] = x;
}

@Override
public void setFloat(int paramIndex, float x) throws Exception {
this.keys[paramIndex] = x;
}

@Override
public void setInt(int paramIndex, int x) throws Exception {
this.keys[paramIndex] = x;
}

@Override
public void setLong(int paramIndex, long x) throws Exception {
this.keys[paramIndex] = x;
}

@Override
public void setNull(int paramIndex, int x) throws Exception {
this.keys[paramIndex] = x;
}

@Override
public void setString(int paramIndex, String x) throws Exception {
this.keys[paramIndex] = x;
}

@Override
public void setTimestamp(int paramIndex, Timestamp x) throws Exception {
this.keys[paramIndex] = x;
}
}

// @Override
public Class getBeanClass() {
return this.getClass();
}

// @Override
public Map getInstancePropertiesAsMap() {
return null;
}

// @Override
public String getProvider() {
return null;
}
}

MyActivator.java

package tests.functional.cartridge.userdefine.common.libs.datasource;

import org.osgi.framework.BundleActivator;
import org.osgi.framework.BundleContext;
import org.osgi.framework.ServiceRegistration;

public class MyActivator  implements BundleActivator {
private ServiceRegistration reg;

@Override
public void start(BundleContext context) throws Exception {
}

@Override
public void stop(BundleContext arg0) throws Exception {
}

}

MyHandler.java

package tests.functional.cartridge.userdefine.common.libs.datasource;

import org.springframework.beans.factory.config.BeanDefinition;
import org.springframework.beans.factory.config.BeanDefinitionHolder;
import org.springframework.beans.factory.xml.NamespaceHandler;
import org.springframework.beans.factory.xml.NamespaceHandlerSupport;
import org.springframework.beans.factory.xml.ParserContext;
import org.w3c.dom.Element;
import org.w3c.dom.Node;

import tests.functional.cartridge.externaldatasource.common.apps.cart2.spring.FileDefinitionParser;

public class MyHandler implements NamespaceHandler {
private NamespaceHandlerSupport support = new NamespaceHandlerSupport() {
public void init() {
registerBeanDefinitionParser("udds", new UddsDefinitionParser());
}
};

@Override
public BeanDefinitionHolder decorate(Node node, BeanDefinitionHolder definition,
ParserContext parserContext) {
return this.support.decorate(node, definition, parserContext);
}

@Override
public void init() {
this.support.init();
}

@Override
public BeanDefinition parse(Element element, ParserContext parserContext) {
return this.support.parse(element, parserContext);
}
}

UddsDefinitionParser.java

package tests.functional.cartridge.userdefine.common.libs.datasource;

import org.springframework.beans.factory.support.BeanDefinitionBuilder;
import org.springframework.beans.factory.xml.AbstractSingleBeanDefinitionParser;
import org.springframework.core.Conventions;
import org.w3c.dom.Attr;
import org.w3c.dom.Element;
import org.w3c.dom.NamedNodeMap;

public class UddsDefinitionParser extends AbstractSingleBeanDefinitionParser {
protected Class<?> getBeanClass(Element element) {
return UddsFactoryBean.class;
}

protected void doParse(Element element, BeanDefinitionBuilder builder) {
NamedNodeMap attributes = element.getAttributes();

for (int x = 0; x < attributes.getLength(); x++) {
Attr attribute = (Attr) attributes.item(x);
String name = attribute.getLocalName();

if ("id".equals(name))
continue;
builder.addPropertyValue(
Conventions.attributeNameToPropertyName(name),
attribute.getValue());
}
}
}

UddsFactoryBean.java

package tests.functional.cartridge.userdefine.common.libs.datasource;

import org.osgi.framework.BundleContext;
import org.springframework.beans.factory.BeanNameAware;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.beans.factory.config.AbstractFactoryBean;
import org.springframework.osgi.context.BundleContextAware;
import org.springframework.osgi.extensions.annotation.ServiceReference;
import com.bea.wlevs.ede.api.EventTypeRepository;

public class UddsFactoryBean extends AbstractFactoryBean<MyCartridgeSource>
implements InitializingBean, BeanNameAware, BundleContextAware {

private EventTypeRepository etr;
private BundleContext bundleContext;
private String beanName;
private String eventType;
private String pattern;
private String singularity;

@ServiceReference
public void setEventTypeRepository(EventTypeRepository etr) {
this.etr = etr;
}

@Override
public void setBundleContext(BundleContext context) {
this.bundleContext = context;
}

@Override
public void setBeanName(String name) {
this.beanName = name;
}

public String getEventType() {
return this.eventType;
}

public void setEventType(String eventType) {
this.eventType = eventType;
}

private String keyProperty;

public String getKeyProperty() {
return keyProperty;
}

public void setKeyProperty(String names) {
keyProperty = names;
}

@Override
protected MyCartridgeSource createInstance() throws Exception {
MyCartridgeSource ret = new MyCartridgeSource();
System.out.println("id="+this.beanName+",eventType="+this.eventType);
ret.setId(this.beanName);
ret.setEventType(this.eventType);
ret.setPattern(this.pattern);
ret.setSingularity(singularity);
ret.setKeyProperty(keyProperty);
return ret;
}

@Override
public Class<?> getObjectType() {
return MyCartridgeSource.class;
}

public void setPattern(String pattern) {
this.pattern = pattern;
}

public String getPattern() {
return pattern;
}

public void setSingularity(String singularity) {
this.singularity = singularity;
}

public String getSingularity() {
return singularity;
}
}

A Oracle SpatialコマンドおよびAPIリファレンス

このコマンドおよびAPIリファレンスは、Event Processingに適用するOracle SpatialコマンドおよびAPIの構文と例を説明しています。

- ANYINTERACT

- buffer

- bufferPolygon

- CONTAIN

- convertTo2D

- convertTo3D

- createCircle

- createElemInfo

- createGeometry

- createLinearLineString

- createLinearMultiLineString

- createLinearPolygon

- createMultiPoint

- createPoint

- createRectangle

- distance

- einfogenerator

- FILTER

- get2dMbr

- INSIDE

- INSIDE3D

- NN

- ordsgenerator

- to_Geometry

- to_J3D_Geometry

- to_JGeometry

- WITHINDISTANCE

A.1 ANYINTERACT

ANYINTERACT Oracle Spatialジオメトリ比較演算子は、キーがジオメトリ(geom)に接触する場合にtrueを返し、そうでない場合にfalseを返します。

構文

ANYINTERACT@spatial(geom, key, tol)

- geom: サポートされているジオメトリ・タイプ

- key: GTYPE_POINT、GTYPE_CURVE、GTYPE_POLYGON、GTYPE_SURFACE、GTYPE_COLLECTION、GTYPE_MULTIPOINT、GTYPE_MULTICURVE、GTYPE_MULTIPOLYGON、GTYPE_SOLIDまたはGTYPE_MULTISOLIDジオメトリ・タイプ
このジオメトリのジオメトリ・タイプはGTYPE_POINTである必要があり、それ以外の場合はRUNTIME_EXCEPTIONが発生します。

- tol: double値としての許容差。許容差の値は、境界の厚さを拡大します。

例

<view id="op_in_where">
RStream(
select
loc.customerId,
shop.shopId
from
LocGeomStream[NOW] as loc,
ShopGeomRelation as shop
where
ANYINTERACT@spatial(shop.geom, loc.curLoc, 5.0d) = true
)
</view>
<view id="op_in_proj">
RStream(
select
loc.customerId,
shop.shopId,
ANYINTERACT@spatial(shop.geom, loc.curLoc, 5.0d)
from
LocGeomStream[NOW] as loc,
ShopGeomRelation as shop
)
</view>

A.2 buffer

com.oracle.cep.cartridge.spatial.Geometry bufferメソッドは、入力ジオメトリのバッファ・バージョンであるoracle.spatial.geometry.JGeometryの新規オブジェクトを返します。

構文

- bufferWidth: このバッファに使用する距離値(double値)
この値は、予定ジオメトリの予測単位と同じ単位であると見なされます。ジオメトリが測地の場合、このバッファの幅はメーターになります。

- SMA: 長半径(double値)
ジオメトリが測地の場合に、このパラメータを設定します。

- iFlat: CSパラメータからの扁平度(double値)
ジオメトリが測地の場合に、このパラメータを設定します。

- arcT: 測地円弧を高密度化するarc_tolerance(double値)

com.oracle.cep.cartridge,spatial.geometry.buffer(bufferWidth, SMA, iFlat, actT)

例

<view id="LocGeomStream" schema="customerId curLoc">
select
customerId,
com.oracle.cep.cartridge.spatial.Geometry.buffer(13, 2, 4, 7)
from
CustomerLocStream
</view>

A.3 bufferPolygon

com.oracle.cep.cartridge.spatial.GeometryのbufferPolygonメソッドは、oracle.spatial.geometry.JGeometryポリゴン入力のバッファ・バージョンであるcom.oracle.cep.cartridge.spatial.Geometryオブジェクトを返します。このメソッドは、入力機能周辺の指定距離でバッファ・ポリゴンを作成します。

構文

com.oracle.cep.cartridge.spatial.Geometry.bufferPolygon(polygon, distance)

- polygon: oracle.spatial.geometry.JGeometryポリゴン

- distance: 入力機能周の距離を指定するdouble値
distance値は、射影されたジオメトリの射影ユニットと同じユニットにあると想定します。ジオメトリが測地の場合、distanceはメートル単位である必要があります。

例

このメソッドは、Oracle Spatialのアプリケーション・コンテキストからパラメータを取得します。spatialリンク名(@spatial)を使用してメソッド呼出しをOracle Spatialアプリケーション・コンテキストに関連付ける必要があります。「Oracle Spatialアプリケーション・コンテキスト」を参照してください。

com.oracle.cep.cartridge.spatial.Geometry.bufferPolygon@spatial(geom, 1300)

次の例では、バッファ・ポリゴンを作成します。この例はOracle Spatialアプリケーション・コンテキストに基づくため、spatialリンク名を使用します。

<view id="LocGeomStream" schema="customerId curLoc">
select
customerId,
com.oracle.cep.cartridge.spatial.Geometry.bufferPolygon@spatial(geom, 13)
from
CustomerLocStream
</view>

A.4 CONTAIN

Oracle Spatialジオメトリ比較演算子CONTAINは、ジオメトリが他のジオメトリに含まれる場合はtrueを返し、そうでない場合はfalseを返します。

構文

CONTAIN@spatial(geom, key)

- geom: サポートされているジオメトリ・タイプ

- key: GTYPE_POINT、GTYPE_CURVE、GTYPE_POLYGON、GTYPE_SURFACE、GTYPE_COLLECTION、GTYPE_MULTIPOINT、GTYPE_MULTICURVE、GTYPE_MULTIPOLYGON、GTYPE_SOLIDまたはGTYPE_MULTISOLIDジオメトリ・タイプ

例

<view id="op_in_where">
RStream(
select
loc.customerId,
shop.shopId
from
LocGeomStream[NOW] as loc,
ShopGeomRelation as shop
where
CONTAIN@spatial(shop.geom, loc.curLoc, 5.0d) = true
)
</view>
<view id="op_in_proj">
RStream(
select
loc.customerId,
shop.shopId,
CONTAIN@spatial(shop.geom, loc.curLoc, 5.0d)
from
LocGeomStream[NOW] as loc,
ShopGeomRelation as shop
)
</view>

A.5 convertTo2D

com.oracle.cep.cartridge.spatial.GeometryのconvertTo2Dメソッドは、oracle.spatial.geometry.JGeometry 3Dオブジェクトをoracle.spatial.geometry.JGeometry 2Dオブジェクトに変換します。

構文

com.oracle.cep.cartridge.spatial.Geometry.convertTo2D(geom)

geomパラメータはoracle.spatial.geometry.JGeometry 3Dオブジェクトです。

例

<view id="LocGeomStream" schema="customerId curLoc">
select
customerId,
com.oracle.cep.cartridge.spatial.Geometry.convertTo2D(geom)
from
CustomerLocStream
</view>

A.6 convertTo3D

com.oracle.cep.cartridge.spatial.GeometryのconvertTo3Dメソッドはoracle.spatial.geometry.JGeometry 2Dオブジェクトをoracle.spatial.geometry.JGeometry 3Dオブジェクトに変換します。この変換でz座標はゼロ詰めされます。

構文

com.oracle.cep.cartridge.spatial.Geometry.convertTo3D(geom)

geomパラメータはoracle.spatial.geometry.JGeometry 2Dオブジェクトです。

例

<view id="LocGeomStream" schema="customerId curLoc">
select
customerId,
com.oracle.cep.cartridge.spatial.Geometry.convertTo3D(geom)
from
CustomerLocStream
</view>

A.7 createCircle

com.oracle.cep.cartridge.spatial.GeometryのcreateCircleメソッドは、2Dまたは3Dの円であるcom.oracle.cep.cartridge.spatial.Geometryオブジェクトを返します。

2D円構文の作成

com.oracle.cep.cartridge.spatial.Geometry.createCircle(x, y, radius)
com.oracle.cep.cartridge.spatial.Geometry.createCircle(x, y, radius, srid)

- x: 円の中心のx座標(double値)

- y: 円の中心のy座標(double値)

- radius: 測地円弧を高密度化するarc_tolerance(double値)

- srid: 円のオプションのSDO_SRID (int値)。sridパラメータを省略する場合は、例が示すようにspatialリンク名を追加します。

3D円構文の作成

com.oracle.cep.cartridge.spatial.Geometry.createCircle(x1, y1, x2, y2, x3, y3)
com.oracle.cep.cartridge.spatial.Geometry.createCircle(srid, x1, y1, x2, y2, x3,
y3)

円周を構成する3座標を次の引数で指定します。

- x1: 点1のx縦座標(double値)

- y1: 点1のy縦座標(double値)

- x2: 点2のx縦座標(double値)

- y2: 点2のy縦座標(double値)

- x3: 点3のx縦座標(double値)

- y3: 点3のy縦座標(double値)

- srid: 円のオプションのSRID (int値)。sridパラメータを省略した場合は、例が示すようにspatialリンク名(@spatial)を追加します。

例

オプションのsridパラメータを省略すると、このメソッドはOracle Spatialデータ・カートリッジ・アプリケーション・コンテキストからパラメータを取得します。この場合、spatialリンク名(@spatial)を使用してメソッド呼出しをOracle Spatialデータ・カートリッジ・アプリケーション・コンテキストに関連付けます。「Oracle Spatialアプリケーション・コンテキスト」を参照してください。

com.oracle.cep.cartridge.spatial.Geometry.createCircle@spatial(x, y)

次の例では、sridパラメータを使用して2Dの円を作成します。この例ではsridパラメータを使用するため、spatialリンク名は必要ありません。

<view id="LocGeomStream" schema="customerId curLoc">
select
customerId,
com.oracle.cep.cartridge.spatial.Geometry.createCircle(x, y, 300, srid)
from
CustomerLocStream
</view>

A.8 createElemInfo

com.oracle.cep.cartridge.spatial.GeometryのcreateElemInfoメソッドは、指定された引数から、単一の要素情報値をint[]値で返します。「einfogenerator」も参照してください。

構文

com.oracle.cep.cartridge.spatial.Geometry.createElemInfo(offset, etype, interp)

- soffset: この要素の最初の縦座標が保存される縦座標配列内にあるint値のオフセット
SDO_STARTING_OFFSET値は0からではなく1から開始します。このため最初の要素の第1の縦座標はSDO_GEOMETRY.Ordinates(1)になります。2つ目の要素がある場合、その要素の第1の縦座標はSDO_GEOMETRY.Ordinates(n * 3 + 2)になり、nはSDO_ORDINATE_ARRAY定義内の位置を示します。

- etype: 要素のタイプ(int値)。
Oracle SpatialではSDO_ETYPE値の1、1003および2003をサポートしており、これらは(複合型ではなく)単純な要素と見なされます。これらは、要素情報配列の3つのエントリ1組によって定義されます。タイプは次のとおりです。

- 1: 点。

- 1003: ポリゴンの外部の輪(反時計回りで指定される必要があります)。

- 2003: ポリゴンの内部の輪(時計回りで指定される必要があります)。

これらのタイプは、SDO_INTERPRETATIONによって詳細に修飾されます。

注意:

1桁と4桁のSDO_ETYPE値を同じのジオメトリに混在させないでください。

- interp: 解釈(int値)
単純要素SDO_ETYPE(1、1003または2003)の場合、SDO_INTERPRETATION属性によってこの要素に対する座標の順序の解釈方法が決定されます。たとえば、ポリゴン境界は、連結された一連の直線セグメントで構成されます。

ジオメトリが複数の要素で構成される場合、ある要素の最後の縦座標は、常に次の要素の先頭のオフセットより1小さくなります。ジオメトリの最後の要素は、その開始オフセットから縦座標可変長配列の最後までの縦座標によって記述されます。

表A-1は、SDO_ETYPEとSDO_INTERPREATIONの関係を示しています。

表A-1 SDO_ETYPEおよびSDO_INTERPRETATION

SDO_ETYPE

SDO_INTERPRETATION

説明

0

任意の数値

Oracle Spatialによってサポートされないジオメトリ・タイプのモデル化に使用します。

1

1

点のタイプです。

1

0

方向付きの点の方向です。

1003または2003

1

頂点が直線セグメントに連結している単純なポリゴンです。各頂点について点を指定し、ポリゴンを閉じるために、終了点と開始点が一致するように指定する必要があります(許容差内で)。

たとえば、4面のポリゴンの場合は、5番目の点が1番目の点と同じになるような5つの点を指定します。

1003または2003

3

矩形タイプ(最適化された矩形)左下および右上の2点のみの境界矩形で、記述する必要があります。矩形タイプは、測地データまたは非測地データで使用できます。ただし、測地データでは、問合せウィンドウを作成するためにのみ矩形タイプを使用します(データベースにオブジェクトを格納するためには使用しないでください)。

例

<view id="ShopGeom">
select  com.oracle.cep.cartridge.spatial.Geometry.createGeometry@spatial(
com.oracle.cep.cartridge.spatial.Geometry.GTYPE_POLYGON,
com.oracle.cep.cartridge.spatial.Geometry.createElemInfo(1, 1003, 1),
ordsgenerator@spatial(
lng1, lat1, lng2, lat2, lng3, lat3,
lng4, lat4, lng5, lat5, lng6, lat6
)
) as geom
from ShopDesc
</view>

A.9 createGeometry

com.oracle.cep.cartridge.spatial.GeometryのcreateGeometryメソッドは2Dのoracle.cep.cartridge.spatial.Geometry新規オブジェクトを返します。

構文

com.oracle.cep.cartridge.spatial.Geometry(gtype, elemInfo, ordinates)
com.oracle.cep.cartridge.spatial.Geometry(gtype, srid, elemInfo, ordinates)

- gtype: ジオメトリ・タイプ(int値)
詳細は、表A-2を参照してください。

- eleminfo: ジオメトリ要素情報(int[]値)
詳細は、「createElemInfo」を参照してください。

- ordinates: ジオメトリ縦座標(double[]値)

- srid: ジオメトリのオプションのSDO_SRID (int値)。sridパラメータを省略した場合は、例が示すようにspatialリンク名(@spatial)を追加します。

例

sridパラメータを省略すると、このメソッドはOracle Spatialのアプリケーション・コンテキストからパラメータを取得します。この場合、spatialリンク名を使用してメソッド呼出しをOracle Spatialアプリケーション・コンテキストに関連付ける必要があります。詳細は、「Oracle Spatialアプリケーション・コンテキスト」を参照してください。

com.oracle.cep.cartridge.spatial.Geometry.createGeometry@spatial(gtype, eleminfo,
ordinates)

次の例では、sridパラメータを使用してジオメトリを作成します。この例ではsrid引数を使用するため、@spatialリンク名は必要ありません。

<view id="ShopGeom">
select  com.oracle.cep.cartridge.spatial.Geometry.createGeometry(
com.oracle.cep.cartridge.spatial.Geometry.GTYPE_POLYGON,
srid,
com.oracle.cep.cartridge.spatial.Geometry.createElemInfo(1, 1003, 1,
srid),
ordsgenerator@spatial(
lng1, lat1, lng2, lat2, lng3, lat3,
lng4, lat4, lng5, lat5, lng6, lat6
)
) as geom
from ShopDesc
</view>

A.10 createLinearLineString

com.oracle.cep.cartridge.spatial.GeometryのcreateLinearLineStringメソッドは、要素情報が{1, 2, 1}の直線ストリングである、3Dのcom.oracle.cep.cartridge.spatial.Geometry新規ジオメトリを返します。指定された座標のディメンションが2の場合、z座標はゼロ詰めされます。

構文

com.oracle.cep.cartridge.spatial.Geometry.createLinearLineString(coords, dim)
com.oracle.cep.cartridge.spatial.Geometry.createLinearLineString(srid, coords,
dim)

- coords: 直線ストリングの座標(double[]値)

- dim: 指定された座標のディメンション(int値)。

- srid: ジオメトリのオプションのSDO_SRID (int値)。sridパラメータを省略する場合は、例が示すようにspatialリンク名を追加します。
詳細は、「Oracle Spatialアプリケーション・コンテキスト」を参照してください。

例

sridパラメータを省略すると、このメソッドはOracle Spatialデータ・カートリッジのアプリケーション・コンテキストからパラメータを取得します。spatialリンク名(@spatial)を使用してメソッド呼出しをOracle Spatialデータ・カートリッジ・アプリケーション・コンテキストに関連付ける必要があります。「Oracle Spatialアプリケーション・コンテキスト」を参照してください。

com.oracle.cep.cartridge.spatial.Geometry.createLinearLineString@spatial(coords,
dim)

次の例では、sridパラメータを使用して直線ストリングを作成します。この例ではsridパラメータを使用するため、@spatialリンク名は使用しません。

<view id="LocGeomStream" schema="customerId curLoc">
select
customerId,
com.oracle.cep.cartridge.spatial.Geometry.createLinearLineString(coords, dim, srid)
from
CustomerLocStream
</view>

A.11 createLinearMultiLineString

com.oracle.cep.cartridge.spatial.GeometryのcreateMultiLineStringメソッドは、直線マルチライン・ストリングである、3Dのcom.oracle.cep.cartridge.spatial.Geometry新規ジオメトリを返します。指定された座標のディメンションが2の場合、z座標はゼロ詰めされます。

構文

com.oracle.oep.cartridge.spatial.Geometry.createMultiLineString(coords, dim)
com.oracle.cep.cartridge.spatial.Geometry.createMultiLineString(srid, coords, dim)

- coords: 直線ストリングの座標(double[][]値)

- dim: 指定された座標のディメンション(int値)

- srid: intとしてのジオメトリのオプションのSRID。sridパラメータを省略した場合は、例が示すようにspatialリンク名(@spatial)を追加します。

例

sridパラメータを省略すると、このメソッドはOracle Spatialデータ・カートリッジのアプリケーション・コンテキストからパラメータを取得します。spatialリンク名(@spatial)を使用してメソッド呼出しをOracle Spatialデータ・カートリッジ・アプリケーション・コンテキストに関連付ける必要があります。「Oracle Spatialアプリケーション・コンテキスト」を参照してください。

com.oracle.cep.cartridge.spatial.Geometry.createLinearMultiLineString@spatial(
coords, dim)

次の例では、直線マルチライン・ストリングを作成します。この例ではsrid引数を使用するため、spatialリンク名は使用しません。

<view id="LocGeomStream" schema="customerId curLoc">
select
customerId,
com.oracle.cep.cartridge.spatial.Geometry.createLinearMultiLineString(coords, dim,
srid)
from
CustomerLocStream
</view>

A.12 createLinearPolygon

com.oracle.cep.cartridge.spatial.GeometryのcreateLinearPolygonメソッドは、穴のない2Dの単純線ポリゴンであるcom.oracle.cep.cartridge.spatial.Geometry新規オブジェクトを返します。座標配列が閉じられていない(最後の座標が最初の座標と同じでない)場合、このメソッドは最初の座標をコピーしてその座標値を入力座標配列の最後に追加します。

構文

com.oracle.cep.cartridge.spatial.Geometry.createLinearPolygon(coords{])
com.oracle.cep.cartridge.spatial.Geometry.createLinearPolygon(srid, coords[])

- coords: double[]としての線形ポリゴンの座標。

- srid: intとしてのジオメトリのオプションのSRID。sridパラメータを省略した場合は、例が示すようにspatialリンク名(@spatial)を追加します。

例

オプションのsridパラメータを省略すると、このメソッドはOracle Spatialアプリケーション・コンテキストからパラメータを取得します。この場合、spatialリンク名(@spatial)を使用してメソッド呼出しをOracle Spatialアプリケーション・コンテキストに関連付ける必要があります。「Oracle Spatialアプリケーション・コンテキスト」を参照してください。

com.oracle.cep.cartridge.spatial.Geometry.createLinearPolygon@spatial(coords)

次の例では、sridパラメータを使用して線形ポリゴンを作成します。この例ではsrid引数を使用するため、spatialリンク名は使用しません。

<view id="LocGeomStream" schema="customerId curLoc">
select
customerId,
com.oracle.cep.cartridge.spatial.Geometry.createLinearPolygon(coords, srid)
from
CustomerLocStream
</view>

A.13 createMultiPoint

com.oracle.cep.cartridge.spatial.GeometryのcreateMultiPointメソッドは、マルチポイント・ジオメトリであるcom.oracle.cep.cartridge.spatial.Geometryオブジェクトを返します。

構文

com.oracle.cep.cartridge.spatial.Geometry.createMultiPoint(coords[][], dim)
com.oracle.cep.cartridge.spatial.Geometry.createMultiPoint(srid, coords[][], dim)

- coords: それぞれが1点を持つdouble型を格納した配列の配列

- dim: 各点のディメンション(int値)

- srid: intとしてのジオメトリのオプションのSRID。sridパラメータを省略した場合は、例が示すようにspatialリンク名(@spatial)を追加します。

例

sridパラメータを省略すると、このメソッドはOracle Spatialデータ・カートリッジのアプリケーション・コンテキストからパラメータを取得します。この場合、spatialリンク名(@spatial)を使用してメソッド呼出しをOracle Spatialデータ・カートリッジ・アプリケーション・コンテキストに関連付ける必要があります。「Oracle Spatialアプリケーション・コンテキスト」を参照してください。

com.oracle.cep.cartridge.spatial.Geometry.createMultiPoint@spatial(coords, dim)

次の例では、sridパラメータを使用してマルチポイント・ジオメトリを作成します。この例ではsridパラメータを使用するため、spatialリンク名は使用しません。

<view id="LocGeomStream" schema="customerId curLoc">
select
customerId,
com.oracle.cep.cartridge.spatial.Geometry.createMultiPoint(coords, dim, srid)
from
CustomerLocStream
</view>

A.14 createPoint

com.oracle.cep.cartridge.spatial.GeometryのcreatePointメソッドは、3Dの点であるcom.oracle.cep.cartridge.spatial.Geometry新規オブジェクトを返します。

構文

com.oracle.cep.cartridge.spatial.Geometry.createPoint(x, y)
com.oracle.cep.cartridge.spatial.Geometry.createPoint(srid, x, y)

- x: doubleとしての左下のx座標。

- y: doubleとしての左下のy座標。

- srid: intとしてのジオメトリのオプションのSRID。sridパラメータを省略した場合は、例が示すようにspatialリンク名(@spatial)を追加します。

sridパラメータを省略すると、このメソッドはOracle Spatialのアプリケーション・コンテキストからパラメータを取得します。この場合、spatialリンク名(@spatial)を使用してメソッド呼出しをOracle Spatialアプリケーション・コンテキストに関連付ける必要があります。「Oracle Spatialアプリケーション・コンテキスト」を参照してください

com.oracle.cep.cartridge.spatial.Geometry.createPoint@spatial(x, y)

次の例では、sridパラメータを使用して点を作成します。この例ではsridパラメータを使用するため、spatialリンク名は使用しません。

<view id="LocGeomStream" schema="customerId curLoc">
select
customerId,
com.oracle.cep.cartridge.spatial.Geometry.createPoint(lng, lat, srid)
from
CustomerLocStream
</view>

A.15 createRectangle

com.oracle.cep.cartridge.spatial.GeometryのcreateRectangleメソッドは、2D矩形である新規のcom.oracle.cep.cartridge.spatial.Geometryオブジェクトを返します。

構文

com.oracle.cep.cartridge.spatial.Geometry.createRectangle(x1, y1, x2, y2)
com.oracle.cep.cartridge.spatial.Geometry.createRectangle(srid, x1, y1, x2, y2)

- x1: doubleとしての左下のx座標。

- y1: doubleとしての左下のy座標。

- x2: doubleとしての右上のx座標。

- y2: doubleとしての右上のy座標。

- srid: intとしてのジオメトリのオプションのSRID。

例

sridパラメータを省略すると、このメソッドはOracle Spatialのアプリケーション・コンテキストからパラメータを取得します。この場合、spatialリンク名(@spatial)を使用してメソッド呼出しをOracle Spatialアプリケーション・コンテキストに関連付ける必要があります。「Oracle Spatialアプリケーション・コンテキスト」を参照してください。

com.oracle.cep.cartridge.spatial.Geometry.createRectangle@spatial(x1, y1, x2, y2)

次の例では、矩形を作成します。この例ではsridパラメータを使用するため、spatialリンク名は必要ありません。

<view id="LocGeomStream" schema="customerId curLoc">
select
customerId,
com.oracle.cep.cartridge.spatial.Geometry.createRectangle(x1, y1, x2, y2, srid)
from
CustomerLocStream
</view>

A.16 distance

com.oracle.cep.cartridge.spatial.Geometryのdistanceメソッドは、2つのジオメトリ間の距離(double値)を計算します。

構文

com.oracle.cep.cartridge.spatial.Geometry.distance(g1, g2)
com.oracle.cep.cartridge.spatial.Geometry.distance(geoParam, g1, g2)

異なるcom.oracle.cep.cartridge.spatial.Geometryオブジェクト間の距離を計算するには、現在のGeometryオブジェクトの静的でないdistanceメソッドを、次の引数を指定して使用します。

- g: 他のcom.oracle.cep.cartridge.spatial.Geometryオブジェクト。

2つのcom.oracle.cep.cartridge.spatial.Geometryオブジェクト間の距離を計算するには、次の引数を指定して静的なdistanceメソッドを使用します。

- g1: 1つ目のcom.oracle.cep.cartridge.spatial.Geometryオブジェクト。

- g2: 2つ目のcom.oracle.cep.cartridge.spatial.Geometryオブジェクト。

例

このメソッドは、Oracle Spatialのアプリケーション・コンテキストからパラメータを取得します。spatialリンク名を使用してメソッド呼出しをOracle Spatialアプリケーション・コンテキストに関連付ける必要があります。「Oracle Spatialアプリケーション・コンテキスト」を参照してください。

com.oracle.cep.cartridge.spatial.Geometry.distance@spatial(geom)
com.oracle.cep.cartridge.spatial.Geometry.distance@spatial(geom1, geom2)

次の例では、2つのジオメトリ間の距離を計算します。distanceメソッドはOracle Spatialのアプリケーション・コンテキストに依存するため、spatialリンク名を使用する必要があります。

<view id="LocGeomStream" schema="customerId curLoc">
select
customerId,
com.oracle.cep.cartridge.spatial.Geometry.createRectangle(x1, y1, x2, y2, srid)
from
CustomerLocStream
where
com.oracle.cep.cartridge.spatial.Geometry.distance@spatial(geom1, geom2) < 5
</view>

A.17 einfogenerator

Oracle CQL関数einfogeneratorは、指定された引数から、単一のinfo要素をint[]値で返します。com.oracle.cep.cartridge.spatial.Geometry.createElemInfoメソッドを使用する場合は、「createElemInfo」も参照してください。

構文

einfogenerator@spatial(offset, etype, interp)

- offset: この要素の第1の縦座標が格納されている縦座標配列内の、intとしてのオフセット。
SDO_STARTING_OFFSET値は0からではなく1から開始します。このため最初の要素の第1の縦座標はSDO_GEOMETRY.Ordinates(1)になります。2つ目の要素がある場合、その要素の第1の縦座標はSDO_GEOMETRY.Ordinates(n * 3 + 2)になり、nはSDO_ORDINATE_ARRAY定義内の位置を示します。

- etype: intとしての要素のタイプ。
Oracle SpatialではSDO_ETYPE値の1、1003および2003をサポートしており、これらは(複合型ではなく)単純な要素と見なされます。これらは、要素情報配列の3つのエントリ1組によって定義されます。タイプは次のとおりです。

- 1: 点

- 1003: ポリゴンの外部の輪(反時計回りで指定される必要があります)。

- 2003: ポリゴンの内部の輪(時計回りで指定される必要があります)。

これらのタイプは、SDO_INTERPRETATIONによって詳細に修飾されます。

注意:

1桁と4桁のSDO_ETYPE値を単一のジオメトリに混在させることはできません。

- interp: intとしての解釈。
SDO_ETYPEが単純な要素(1、1003または2003)である場合、SDO_INTERPRETATION属性によって、この要素の座標の順序の解釈方法が決定されます。たとえば、ポリゴン境界は、連結された一連の直線セグメントで構成されます。

ジオメトリが複数の要素で構成される場合、ある要素の最後の縦座標は、常に次の要素の先頭のオフセットより1小さくなります。ジオメトリの最後の要素は、その開始オフセットから縦座標可変長配列の最後までの縦座標によって記述されます。

表A-2は、SDO_ETYPEとSDO_INTERPREATIONの関係を示しています。

表A-2 SDO_ETYPEおよびSDO_INTERPRETATION

SDO_ETYPE

SDO_INTERPRETATION

説明

0

任意の数値

Oracle Spatialによってサポートされないジオメトリ・タイプのモデル化に使用します。

1

1

点のタイプです。

1

0

方向付きの点の方向です。

1003または2003

1

頂点が直線セグメントに連結している単純なポリゴンです。各頂点について点を指定し、ポリゴンを閉じるために、終了点と開始点が一致するように指定する必要があります(許容差内で)。

たとえば、4面のポリゴンの場合は、5番目の点が1番目の点と同じになるような5つの点を指定します。

1003または2003

3

矩形のタイプ(「最適化された矩形」ともいう)です。左下および右上の2点のみの境界矩形で、記述する必要があります。矩形タイプは、測地データまたは非測地データで使用できます。ただし、測地データでは、問合せウィンドウを作成するためにのみ矩形タイプを使用します(データベースにオブジェクトを格納するためには使用しないでください)。

例

Oracle CQL関数のため、パッケージ接頭辞を使用せず、spatialリンク名を使用して呼出します。次の例では、ジオメトリの要素情報を作成します。

view id="ShopGeom">
select  com.oracle.cep.cartridge.spatial.Geometry.createGeometry@spatial(
com.oracle.cep.cartridge.spatial.Geometry.GTYPE_POLYGON,
einfogenerator@spatial(1, 1003, 1),
ordsgenerator@spatial(
lng1, lat1, lng2, lat2, lng3, lat3,
lng4, lat4, lng5, lat5, lng6, lat6
)
) as geom
from ShopDesc
</view>

A.18 FILTER

Oracle Spatialジオメトリ・フィルタ演算子FILTERは、非接続でないオブジェクト・ペアの場合はtrueを返し、そうでない場合はfalseを返します。

FILTER@spatial(key, tol)

- key: GTYPE_POINT、GTYPE_CURVE、GTYPE_POLYGON、GTYPE_SURFACE、GTYPE_COLLECTION、GTYPE_MULTIPOINT、GTYPE_MULTICURVE、GTYPE_MULTIPOLYGON、GTYPE_SOLIDまたはGTYPE_MULTISOLIDジオメトリ・タイプ

- tol: double値としての許容範囲。

例

Oracle Spatialジオメトリ・フィルタ演算子のため、パッケージ接頭辞を使用せず、spatialリンク名を使用して呼出します。次の例では、非接続でないオブジェクト・ペアを判定します。

<view id="filter">
RStream(
select loc.customerId, shop.shopId
from LocGeomStream[NOW] as loc, ShopGeomRelation as shop
where FILTER@spatial(loc.curLoc, 5.0d) = true
)
</view>

A.19 get2dMbr

com.oracle.cep.cartridge.spatial.Geometryのget2dMbrメソッドは、指定されたGeometryの最小境界矩形(MBR)をdouble[][]値で返します。

構文

com.oracle.cep.cartridge.spatial.Geometry.get2DMbr(geom)

geomパラメータは、このメソッドが境界矩形を返す対象のcom.oracle.cep.cartridge.spatial.Geometryオブジェクトです。返された境界矩形には次の値が含まれます。

- [0][0]: minX

- [0][1]: maxX

- [1][0]: minY

- [1][1]: maxY

例

次の例では、geomの境界矩形を返します。

<view id="LocGeomStream" schema="customerId mbr">
select
customerId,
com.oracle.cep.cartridge.spatial.Geometry.get2dMbr(geom)
from
CustomerLocStream
where
com.oracle.cep.cartridge.spatial.Geometry.distance@spatial(geom1, geom2) < 5
</view>

A.20 INSIDE

Oracle Spatial比較演算子INSIDEはGTYPE_POINTがジオメトリの内側の場合はtrueを返し、そうでない場合はfalseを返します。

構文

INSIDE@spatial(geom, key)

- geom: サポートされるすべてのジオメトリ・タイプ。

- key: GTYPE_POINT、GTYPE_CURVE、GTYPE_POLYGON、GTYPE_SURFACE、GTYPE_COLLECTION、GTYPE_MULTIPOINT、GTYPE_MULTICURVE、GTYPE_MULTIPOLYGON、GTYPE_SOLIDまたはGTYPE_MULTISOLIDジオメトリ・タイプ

例

次のOracle CQL問合せは、点がジオメトリの内側にあるかを判定します。

<view id="op_in_where">
RStream(
select
loc.customerId,
shop.shopId
from
LocGeomStream[NOW] as loc,
ShopGeomRelation as shop
where
INSIDE@spatial(shop.geom, loc.curLoc, 5.0d) = true
)
</view>
<view id="op_in_proj">
RStream(
select
loc.customerId,
shop.shopId,
INSIDE@spatial(shop.geom, loc.curLoc, 5.0d)
from
LocGeomStream[NOW] as loc,
ShopGeomRelation as shop
)
</view>

A.21 INSIDE3D

Oracle Spatialジオメトリ比較演算子INSIDE3Dは、3Dジオメトリgeom1が3D空間geom2の内側にある場合はtrueを返し、そうでない場合はfalseを返します。

構文

INSIDE3D@spatial(geom1, geom2)
INSIDE3D@spatial(geom1, geom2)

- geom1: 含有されるジオメトリで、サポートされている3Dジオメトリ

- geom2: 含有するジオメトリで、サポートされている3Dジオメトリ

例

次のOracle CQL問合せは、点が3Dジオメトリの内側にあるかを判定します。

<view id="op_in_where">
RStream(
select
loc.customerId,
shop.shopId
from
LocGeomStream[NOW] as loc,
ShopGeomRelation as shop
where
INSIDE3D@spatial(shop.geom1, shop.geom2) = true
)
</view>
<view id="op_in_proj">
RStream(
select
loc.customerId,
shop.shopId,
INSIDE@spatial(shop.geom1, shop.geom2)
from
LocGeomStream[NOW] as loc,
ShopGeomRelation as shop
)
</view>

A.22 NN

Oracle Spatialジオメトリ・フィルタ演算子NNは、geomから、キーに最も近いオブジェクト(最近傍)を返します。2つのジオメトリ・オブジェクトの近さを判定するため、Oracle Event Processingは使用される各オブジェクトの面の任意の2点間の最短距離が使用されます。

構文

NN@spatial(geom, key, tol)

- geom: サポートされるすべてのジオメトリ・タイプ。

- key: GTYPE_POINT、GTYPE_CURVE、GTYPE_POLYGON、GTYPE_SURFACE、GTYPE_COLLECTION、GTYPE_MULTIPOINT、GTYPE_MULTICURVE、GTYPE_MULTIPOLYGON、GTYPE_SOLIDまたはGTYPE_MULTISOLIDジオメトリ・タイプ

- tol: double値としての許容範囲。

例

次のOracle CQL問合せは最近傍を判定します。

<view id="filter">
RStream(
select loc.customerId, shop.shopId
from LocGeomStream[NOW] as loc, ShopGeomRelation as shop
where NN@spatial(shop.geom, loc.curLoc, 5.0d) = true
)
</view>

A.23 ordsgenerator

Oracle CQL関数ordsgeneratorは、座標パラメータ値から、2D座標のdouble配列を返します。

構文

ordsgenerator@spatial(x1, y1, ..., xN, yN)

パラメータ値はカンマ区切りの座標値のリストです。この関数は、入力から、2D座標のdouble配列を返します。

例

次の例では、6つのdouble座標値からOracle Spatial double配列を作成します。

view id="ShopGeom">
select  com.oracle.cep.cartridge.spatial.Geometry.createGeometry@spatial(
com.oracle.cep.cartridge.spatial.Geometry.GTYPE_POLYGON,
com.oracle.cep.cartridge.spatial.Geometry.createElemInfo(1, 1003, 1),
ordsgenerator@spatial(
lng1, lat1, lng2, lat2, lng3, lat3,
lng4, lat4, lng5, lat5, lng6, lat6
)
) as geom
from ShopDesc
</view>

A.24 to_Geometry

com.oracle.cep.cartridge.spatial.Geometryのto_Geometryメソッドは、oracle.spatial.geometry.JGeometry型を3D com.oracle.cep.cartridge.spatial.Geometry型に変換します。

構文

com.oracle.cep.cartridge.spatial.Geometry.to_Geometry(geom)

geomパラメータは、変換するoracle.spatial.geometry.JGeometryオブジェクトです。指定されたジオメトリがすでにGeometryタイプおよび3Dジオメトリである場合、変換は行われません。指定されたジオメトリが2Dのジオメトリの場合、z座標を埋め込むことでジオメトリは3Dに変換されます。

例

次の例では、2Dジオメトリgeoを3Dジオメトリに変換します。

<view id="LocStream" schema="customerId loc">
select
customerId,
com.oracle.cep.cartridge.spatial.Geometry.to_Geometry(geom)
from
CustomerLocStream
</view>

A.25 to_J3D_Geometry

com.oracle.cep.cartridge.spatial.Geometryのto_J3D_Geometryメソッドは、com.oracle.cep.cartridge.spatial.Geometryオブジェクトをoracle.spatial.geometry.J3D_Geometryオブジェクトに変換します。

構文

com.oracle.cep.cartridge.spatial.Geometry.to_J3D_Geometry(g)

gパラメータは、変換するcom.oracle.cep.cartridge.spatial.Geometryオブジェクトです。

例

次の例は、to_J3D_Geometryメソッドの使用方法を示しています。

<view id="LocStream" schema="customerId loc">
select
customerId,
com.oracle.cep.cartridge.spatial.Geometry.to_J3D_Geometry(geom)
from
CustomerLocStream
</view>

A.26 to_JGeometry

com.oracle.cep.cartridge.spatial.Geometry.to_JGeometryメソッドはcom.oracle.cep.cartridge.spatial.Geometryオブジェクトをoracle.spatial.geometry.JGeometry 2D型に変換します。

構文

com.oracle.cep.cartridge.spatial.Geometry.to_JGeometry(g)

gパラメータは、変換するcom.oracle.cep.cartridge.spatial.Geometryオブジェクトです。

例

次の例では、2Dジオメトリ・オブジェクトgeomを2D JGeometryオブジェクトに変換します。

<view id="LocStream" schema="customerId loc">
select
customerId,
com.oracle.cep.cartridge.spatial.Geometry.to_JGeometry(geom)
from
CustomerLocStream
</view>

A.27 WITHINDISTANCE

Oracle CQL問合せWITHINDISTANCEは、GTYPE_POINTがジオメトリの指定距離内にある場合はtrueを返し、そうでない場合はfalseを返します。

構文

WITHINDISTANCE@spatial(geom, key, dist)

- geom: サポートされるすべてのジオメトリ・タイプ。

- key: GTYPE_POINT、GTYPE_CURVE、GTYPE_POLYGON、GTYPE_SURFACE、GTYPE_COLLECTION、GTYPE_MULTIPOINT、GTYPE_MULTICURVE、GTYPE_MULTIPOLYGON、GTYPE_SOLIDまたはGTYPE_MULTISOLIDジオメトリ・タイプ

- dist: double値としての距離。

例

次のOracle CQL問合せは、loc.curLocがshop.geomの5.0dの距離内にあるかを判定します。

<view id="op_in_where">
RStream(
select
loc.customerId,
shop.shopId
from
LocGeomStream[NOW] as loc,
ShopGeomRelation as shop
where
WITHINDISTANCE@spatial(shop.geom, loc.curLoc, 5.0d) = true
)
</view>
<view id="op_in_proj">
RStream(
select
loc.customerId,
shop.shopId,
WITHINDISTANCE@spatial(shop.geom, loc.curLoc, 5.0d)
from
LocGeomStream[NOW] as loc,
ShopGeomRelation as shop
)
</view>