This chapter describes how to use the Oracle Java Data Cartridge, an extension of Oracle Continuous Query Language (Oracle CQL). You can use Oracle CQL to write CQL code that interacts with Java classes in your Oracle Stream Analytics application.
This chapter describes the types, methods, fields, and constructors that the Oracle Java data cartridge exposes. You can use these types, methods, fields, and constructors in Oracle CQL queries and views as you would Oracle CQL native types.
This chapter includes the following sections:
The Oracle Java data cartridge is a built-in Java cartridge that enables you to write Oracle CQL queries and views that interact with the Java classes in your Oracle Stream Analytics application.
This section describes:
The Oracle Java data cartridge uses the cartridge ID com.oracle.cep.cartrdiges.java
.
The Oracle Java data cartridge is the default Oracle Stream Analytics data cartridge.
For types under the default Java package name or types under the system package of java.lang
, you can reference the Java type in an Oracle CQL query unqualified by package or data cartridge name:
<query id="q1"><![CDATA[ select String(“foo") … ></query>
Note:
To simplify Oracle Java data cartridge type names, you can use aliases as described in Oracle Fusion Middleware Oracle CQL Language Reference for Oracle Stream Analytics.
For more information, see: Class Loading.
The Oracle Java data cartridge supports the following policies for loading the Java classes that your Oracle CQL queries reference:
For more information, see:
This is the default class loading policy.
In this mode, the Oracle Java data cartridge uses the class-space of the application in scope when searching for a Java class.
This is only applicable when a type is specified only by its local name, that is, there is a single identifier, and no other identifiers are being used for its package. That is:
select String(“foo") …
And not:
select java.lang.String(“foo") …
In this case the procedure is as follows:
Attempt to load the class defined by the single identifier (call it ID1
) using the application's class-space as usual; if this fails then:
Verify if the application defines any class within its bundle's internal class-path whose name matches ID1
, independent of the package; if this fails then:
Verify if application specifies an Import-Package
MANIFEST
header statement which in conjunction with ID1
can be used to load a Java class.
For an example, see Class Loading Example.
This is an optional class loading policy. To use this policy, you must include the following MANIFEST
header entry in your Oracle Stream Analytics application:
OCEP_JAVA_CARTRIDGE_CLASS_SPACE: APPLICATION_NO_AUTO_IMPORT_CLASS_SPACE
This mode is similar to the application class space policy except that Oracle Event Processing does not attempt to combine the package with ID1
.
For more information, see Application Class Space Policy.
This is an optional class loading policy. To use this policy, you must include the following MANIFEST
header entry in your Oracle Stream Analytics application:
OCEP_JAVA_CARTRIDGE_CLASS_SPACE: SERVER_CLASS_SPACE
An Oracle CQL query can reference any exported Java class, regardless of whether or not the class package is imported into the application or bundle
The query can also access all classes visible to the OSGi framework's parent class-loader, which includes the runtime JDK classes.
This means that an Oracle CQL application may contain an Oracle CQL query that references classes defined by other Oracle Stream Analytics applications, as long as they are exported. This behavior facilitates the creation of Java-based cartridges whose sole purpose is to provide new Java libraries.
Note:
You can only reference a Java class that is part of the internal class path of an Oracle Stream Analytics application if it is exported, even when a processor within this application defines the Oracle CQL query.
For an example, see Class Loading Example.
Consider the example that Figure 6-1 shows: application B1
imports package package2
that application B2
exports.
Figure 6-1 Example Oracle Stream Analytics Event Processing Applications
Table 6-1 summarizes which classes these two different applications can access depending on whether they are running in the application class space or server class space.
Table 6-1 Class Accessibility by Class Loading Policy
Class Loading Policy | Application B1 | Application B2 |
---|---|---|
Application Class Space |
|
|
Server Class Space |
|
|
In application B1, you can use any of the Java classes A, B, and C in your Oracle CQL queries:
select A … select B … select C …
However, in application B2, you cannot use Java classes A and B in your Oracle CQL queries. You can only use Java classes C and D:
select C … select D …
An Oracle CQL expression that accesses a Java method uses the following algorithm to resolve the method:
Note:
Variable arity methods are not supported. For more information, see the Java Language Specification, Third Edition, Section 12.12.2.4.
As an example, consider the following Oracle CQL expression:
attribute.methodA(10)
Where attribute
is of type mypackage.MyType
which defines the following overloaded methods:
methodA(int)
methodA(Integer)
methodA(Object)
methodA(long)
As the literal 10 is of the primitive type int
, the order of precedence is:
methodA(int)
methodA(long)
methodA(Integer)
methodA(Object)
For more information, see Class Loading.
The Oracle Java data cartridge applies a fixed, asymmetrical mapping between Oracle CQL native data types and Java data types.
Table 6-2 Oracle Java Data Cartridge: Oracle CQL to Java Data Type Mapping
Oracle CQL Native Data Type | Java Data Type |
---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Table 6-3 Oracle Java Data Cartridge: Java Data Type to Oracle CQL Mapping
Java Datatype | Oracle CQL Native Data Type |
---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
All other Java classes are mapped as a complex type.
For more information on these datatype mappings:
Oracle CQL data type CHAR
is mapped to java.lang.String
and java.lang.String
is mapped to Oracle CQL data type CHAR
. This means you can access java.lang.String
member fields and methods for an attribute defined as Oracle CQL CHAR
. For example, if a1
is declared as type Oracle CQL CHAR
, then you can write a query like this:
<query id="q1"><![CDATA[
select a1.substring(1,2)
></query>
You cannot access member fields and methods on literals, even Oracle CQL CHAR
literals. For example, the following query is not allowed:
<query id="q1-forbidden"><![CDATA[
select "hello".substring(1,2)
></query>
Java arrays are converted to Oracle CQL data cartridge arrays, and Oracle CQL data cartridge arrays are converted to Java arrays. This applies to both complex types and simple types.
You can use the data cartridge TABLE
clause to access the multiple rows returned by a data cartridge function in the FROM
clause of an Oracle CQL query.
For more information, see Collections.
Typically, the Oracle Java data cartridge converts an instance that implements the java.util.Collection
interface to an Oracle CQL complex type.
An Oracle CQL query can iterate through the members of the java.util.Collection
.
You can use the data cartridge TABLE
clause to access the multiple rows returned by a data cartridge function in the FROM
clause of an Oracle CQL query.
For more information, see Arrays.
You may use Oracle Java data cartridge types in expressions within a SELECT
clause and WHERE
clause.
You may not use Oracle Java data cartridge types in expressions within an ORDER BY
clause.
For more information, see Using the Oracle Java Data Cartridge.
This section describes common use-cases that highlight how you can use the Oracle Java data cartridge in your Oracle Stream Analytics applications, including:
For more information, see Oracle CQL Query Support for the Oracle Java Data Cartridge.
This procedure describes how to use the Oracle Java data cartridge in an Oracle Stream Analytics application that uses one event type defined as a tuple (Student
) that has an event property type defined as a Java class (Address.java
).
To query with Java classes:
This procedure describes how to use the Oracle Java data cartridge in an Oracle Stream Analytics application that uses one event type defined as a tuple (Student
) that has an event property type defined as a Java class (Address.java
). In this procedure, the Address.java class belongs to a separate Oracle Stream Analytics application. It is exported in its parent application to make it accessible to other Oracle Stream Analytics applications deployed to the same Oracle Stream Analytics server.
To query with Java classes:
The Java cartridge provides the Java Cast function that enables a Java extensible type to be cast to another Java extensible type, providing the latter can be assigned from the former. To use this function, you must have the Java cartridge installed.
Syntax
T cast@java(l-value, class-literal<T>)
Parameters
l-value
: A event attribute that contains the data that you want to cast. If l-value
cannot be assigned from T
, then Java Cartridge raises a RuntimeInvocationException
during the invocation of the cast function
class-literal<T>
: The name of the class to which you want to cast. For example, if you want to cast an int
to long
, then class-literal<T>
is Long.class
.
Example
Consider the following class hierarchy:
public class Parent { ... } public class Child extends Parent { ... }
The following example casts an object of type Child
.
cast@java(S.parent, Child.class)