6 Oracle Javaデータ・カートリッジ
Oracle Continuous Query Language (CQL)の拡張機能であるOracle Javaデータ・カートリッジの使用方法を説明します。Oracle CQLを使用して、Oracle Stream ExplorerアプリケーションでJavaクラスを操作するCQLコードを記述できます。
この章では、Oracle Javaデータ・カートリッジが公開する型、メソッド、フィールドおよびコンストラクタについて説明します。これらの型、メソッド、フィールドおよびコンストラクタを、Oracle CQLのネイティブ型と同様に、Oracle CQLの問合せおよびビューで使用できます。
この章の内容は次のとおりです。
6.1 Oracle Javaデータ・カートリッジについて
Oracle Javaデータ・カートリッジは、Oracle Stream ExplorerアプリケーションでJavaクラスを操作するOracle CQL問合せおよびビューを記述できるようにする組込みJavaカートリッジです。
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"><
「図6-1 Oracle Stream Analytics Event Processingアプリケーションの例」の説明
表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 …
6.1.3 メソッド解決
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)
詳細は、「クラスのロード」を参照してください。
6.1.4 データ型マッピング
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クラスは、複合型としてマップされます。
これらのデータ型マッピングの詳細は、次の項を参照してください。
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データ・カートリッジの使用方法をまとめた共通のユース・ケースを説明します。
詳細は、Oracle Javaデータ・カートリッジのOracle CQL問合せサポートを参照してください。
6.2.1 Java APIを使用する問合せ方法
この手順は、Javaクラス(Address.java
)として定義されたイベント・プロパティ型を持つタプル(Student
)として定義された1つのイベント・タイプを使用するOracle Stream Explorerアプリケーションで、Oracle Javaデータ・カートリッジを使用する方法を説明しています。
Javaクラスを使用して問合せするには:
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クラスを使用して問合せするには:
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)