この章では、Oracle Continuous Query Language (CQL)の拡張機能であるOracle Javaデータ・カートリッジの使用方法を説明します。Oracle CQLを使用して、Oracle Event ProcessingアプリケーションでJavaクラスを操作するCQLコードを記述できます。
この章では、Oracle Javaデータ・カートリッジが公開する型、メソッド、フィールドおよびコンストラクタについて説明します。これらの型、メソッド、フィールドおよびコンストラクタを、Oracle CQLのネイティブ型と同様に、Oracle CQLの問合せおよびビューで使用できます。
この章の内容は次のとおりです。
Oracle Javaデータ・カートリッジは、Oracle Event ProcessingアプリケーションでJavaクラスを操作するOracle CQL問合せおよびビューを記述できるようにする組込みJavaカートリッジです。
この項では、次の内容について説明します。
Oracle Javaデータ・カートリッジでは、カートリッジID com.oracle.cep.cartrdiges.java
を使用します。
Oracle Javaデータ・カートリッジはデフォルトのOracle Event Processingデータ・カートリッジです。
デフォルトのJavaパッケージ名配下の型またはjava.lang
システム・パッケージ配下の型の場合、次のように、Oracle CQL問合せでパッケージ名またはデータ・カートリッジ名で修飾せずにそのJava型を参照できます。
<query id="q1"><![CDATA[ select String(“foo") … ></query>
注意:
Oracle Javaデータ・カートリッジの型名を単純化するには、『Oracle Fusion Middleware Oracle Event Processing Oracle CQL言語リファレンス』で説明しているエイリアスを使用できます。
詳細は、クラスのロードを参照してください。
Oracle Javaデータ・カートリッジでは、Oracle CQL問合せが参照するJavaクラスのロードについて、次のポリシーをサポートしています。
詳細は、次を参照してください。
これは、デフォルトのクラス・ローディング・ポリシーです。
このモードでは、Oracle Javaデータ・カートリッジはJavaクラスの検索時に、有効範囲内のアプリケーションのクラス・スペースを使用します。
これは、型がローカル名によってのみ指定されている場合、すなわち識別子が1つで、他の識別子がパッケージで使用されていない場合にのみ適用できます。つまり、次のようになります。
select String(“foo") …
次のようには指定しません。
select java.lang.String(“foo") …
この場合、手順は次のようになります。
通常どおりに、アプリケーションのクラス・スペースを使用して、1つの識別子(ID1
と呼びます)で定義されたクラスをロードします。これに失敗した場合、
アプリケーションで、パッケージとは関係なく、バンドルの内部クラス・パス内で名前がID1
と一致するクラスが定義されているかどうかを確認します。これに失敗した場合、
アプリケーションでImport-Package
MANIFEST
ヘッダー文が指定されているかどうかを確認します。これとID1
を使用して、Javaクラスをロードできます。
例については、「クラスのロード例」を参照してください。
これは、オプションのクラス・ローディング・ポリシーです。このポリシーを使用するには、Oracle Event Processingアプリケーションに次のMANIFEST
ヘッダー・エントリを含める必要があります。
OCEP_JAVA_CARTRIDGE_CLASS_SPACE: APPLICATION_NO_AUTO_IMPORT_CLASS_SPACE
このモードはアプリケーション・クラス領域ポリシーと似ていますが、Oracle Event ProcessingによってパッケージがID1
に組み合されない点が異なります。
詳細は、「アプリケーション・クラス・スペース・ポリシー」を参照してください。
これは、オプションのクラス・ローディング・ポリシーです。このポリシーを使用するには、Oracle Event Processingアプリケーションに次のMANIFEST
ヘッダー・エントリを含める必要があります。
OCEP_JAVA_CARTRIDGE_CLASS_SPACE: SERVER_CLASS_SPACE
Oracle CQL問合せは、クラス・パッケージがアプリケーションまたはバンドルにインポートされているかにかかわらず、エクスポートされたあらゆるJavaクラスを参照できます。
また、問合せでは、ランタイムJDKクラスを含む、OSGiフレームワークの親クラス・ローダーに表示されるすべてのクラスにアクセスできます。
つまり、Oracle CQLアプリケーションでは、他のOracle Event Processingアプリケーションで定義されたクラス(エクスポートされている場合)を参照するOracle CQL問合せを使用できます。これにより、新しいJavaライブラリを提供することが唯一の目的であるJavaベース・カートリッジの作成が容易になります。
注意:
参照できるJavaクラスはOracle Event Processingアプリケーションの内部クラス・パスにあるJavaクラス(エクスポートされている場合)のみであり、このアプリケーション内のプロセッサが当該Oracle CQL問合せを定義している場合でも参照可能です。
例については、「クラスのロード例」を参照してください。
図6-1の例では、B2
がエクスポートするパッケージpackage2
をB1
がインポートしています。
表6-1は、アプリケーション・クラス領域またはサーバー・クラス領域で実行されているかによって、2つの異なるアプリケーションがアクセスできるクラスをまとめています。
表6-1 クラスのロード・ポリシー別のクラス・アクセシビリティ
クラス・ローディング・ポリシー | アプリケーションB1 | アプリケーションB2 |
---|---|---|
アプリケーション・クラス・スペース |
|
|
サーバー・クラス・スペース |
|
|
アプリケーション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 …
JavaメソッドにアクセスするOracle CQL式は、次のアルゴリズムを使用してメソッドを解決します。
注意:
可変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)
詳細は、「クラスのロード」を参照してください。
Oracle Javaデータ・カートリッジは、Oracle CQLネイティブ・データ型とJavaデータ型間に固定算術マッピングを適用します。
表6-2 Oracle Javaデータ・カートリッジ: Oracle CQLからJavaデータ型へのマッピング
Oracle CQLネイティブ・データ型 | Javaデータ型 |
---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
表6-3 Oracle Javaデータ・カートリッジ: Javaデータ型からOracle CQLへのマッピング
Javaデータ型 | Oracle CQLネイティブ・データ型 |
---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
他のすべてのJavaクラスは、複合型としてマップされます。
これらのデータ型マッピングの詳細は、次の項を参照してください。
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>
Oracle CQL CHAR
リテラルであっても、リテラルのメンバー・フィールドおよびメソッドにはアクセスできません。たとえば、次のような問合せは使用できません。
<query id="q1-forbidden"><![CDATA[
select "hello".substring(1,2)
></query>
Javaの配列はOracle CQLデータ・カートリッジの配列に変換され、Oracle CQLデータ・カートリッジの配列はJavaの配列に変換されます。これは、複合型と単純型の両方に適用されます。
データ・カートリッジのTABLE
句を使用して、Oracle CQL問合せのFROM
句内のデータ・カートリッジ関数から返された複数の行にアクセスできます。
詳細は、コレクションを参照してください。
通常、Oracle Javaデータ・カートリッジはjava.util.Collection
インタフェースを実装するインスタンスをOracle CQL複合型に変換します。
Oracle CQL問合せは、java.util.Collection
のメンバーを介して繰り返すことができます。
データ・カートリッジのTABLE
句を使用して、Oracle CQL問合せのFROM
句内のデータ・カートリッジ関数から返された複数の行にアクセスできます。
詳細は、配列を参照してください。
Oracle Javaデータ・カートリッジ型は、SELECT
およびWHERE
句内の式で使用できます。
Oracle Javaデータ・カートリッジ型は、ORDER BY
句内の式では使用できません。
詳細は、Oracle Javaデータ・カートリッジの使用を参照してください。
この項では、Oracle Event ProcessingアプリケーションでOracle Javaデータ・カートリッジをどのように使用できるかを中心に、次のような一般的な使用例を説明します。
詳細は、Oracle Javaデータ・カートリッジのOracle CQL問合せサポートを参照してください。
この手順は、Javaクラス(Address.java
)として定義されたイベント・プロパティ型を持つタプル(Student
)として定義された1つのイベント・タイプを使用するOracle Event Processingアプリケーションで、Oracle Javaデータ・カートリッジを使用する方法を説明しています。
Javaクラスを使用して問合せするには:
この手順は、Javaクラス(Address.java
)として定義されたイベント・プロパティ型を持つタプル(Student
)として定義された1つのイベント・タイプを使用するOracle Event Processingアプリケーションで、Oracle Javaデータ・カートリッジを使用する方法を説明しています。この手順では、Address.javaクラスが個別のOracle Event Processingアプリケーションに属していると想定します。同じOracle Event Processingサーバーにデプロイされた他のOracle Event Processingアプリケーションからアクセスできるように、親アプリケーションにエクスポートされます。
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)