It specifies one or more event streams, named windows or tables. Each event stream, named window or table can optionally be given a name by means of the as keyword. Joins between pattern-based and filter-based event streams are also supported. Joins and the unidirectional keyword are described in more detail in Section 5.12, "Joining Event Streams". The following EPL statement shows event type, filter criteria and views combined in one statement.
It selects all event properties for the last 100 events of IBM stock ticks for volume. In the example, the event type is the fully qualified Java class name org.esper.example.StockTick. The expression filters for events where the property symbol has a value of "IBM".
The optional view specifications for deriving data from the StockTick events are a length window and a view for computing statistics on volume. For fully aggregated and un-grouped statements, output snapshot outputs a single row with current aggregation value. For aggregated ungrouped and grouped statements, as well as for unaggregated statements,output snapshot considers events held by the data window and outputs a row for each event.
If the statement specifies no data window or a join results in no rows, the output is no rows. For fully aggregated and grouped statements with a join and/or data windows the output consists of aggregation values according to events held in the data window or that are join results . When the from-clause lists only tables, use output snapshot to output table contents. Aggregate functions return a single result row based on groups of rows, rather than on single rows.
Aggregate functions can appear in select lists and in ORDER BY and HAVING clauses. They are commonly used with the GROUP BY clause in a SELECT statement, where Oracle Database divides the rows of a queried table or view into groups. In a query containing a GROUP BY clause, the elements of the select list can be aggregate functions, GROUP BY expressions, constants, or expressions involving one of these. Oracle applies the aggregate functions to each group of rows and returns a single result row for each group. The event_type is the name of the type of events that the update applies to. The optional as keyword can be used to assign a name to the event type for use with subqueries, for example.
Following the set keyword is a comma-separated list of property names and expressions that provide the event properties to change and values to set. EPL allows declaring an event type via the create schema clause and also by means of the static or runtime configuration API addEventType functions. The term schema and event type has the same meaning in EPL. Your application can declare an event type by providing the property names and types or by providing a class name. Your application may also declare a variant stream schema. When using the configuration API, the event type stays cached even if there are no statements that refer to the event type and until explicitly removed via the runtime configuration API.
Any window, such as the time window, generates insert stream events as events enter the window, and remove stream events as events leave the window. The engine executes the given SQL query for each CustomerCallEvent in both the insert stream and the remove stream. The insert into clause allows to merge multiple event streams into a event single stream. The clause names an event stream to insert into by specifing an event_stream_name . The first statement that inserts into the named stream defines the stream's event types.
Further statements that insert into the same event stream must match the type of events inserted into the stream as declared by the first statement. Esper filters events using the filter criteria for the event stream StockTickEvent. In the example above only events with symbol IBM enter the length window over the last 10 events, all other events are simply discarded.
The where clause removes any events posted by the length window that do not match the condition of volume greater then 1000. Remaining events are applied to the stddev standard deviation aggregate function for each tick data feed as specified in the group by clause. Esper applies the having clause and only lets events pass for tickDataFeed groups with a standard deviation of price greater then 0.8. You can use aggregation functions in a select clause and in a having clause. You cannot use aggregate functions in a where clause, but you can use the where clause to restrict the events to which the aggregate is applied. The next query computes the average and sum of the price of stock tick events for the symbol IBM only, for the last 10 stock tick events regardless of their symbol.
The distinct keyword in your select instructs the engine to consolidate, at time of output, the output event and remove output events with identical property values. Your subquery may select multiple columns in the select clause including multiple aggregated values from a data window or named window or table. Named windows are data windows that can be inserted-into and deleted-from by one or more statements, and that can queried by one or more statements. Named windows have a global character, being visible and shared across an engine instance beyond a single statement. Finally, the name of the named window can occur in a statement's FROM clause to query a named window or include the named window in a join or subquery.
The SQL GROUP BY statement is used along with the SQL aggregate functions like SUM to provide means of grouping the result dataset by certain database table column. SQL GROUP BY aggregates column values into a single record value. GROUP BY requires a list of table columns on which to run the calculations.
The event_type is the name of the type of events that trigger the variable assignments. It is optionally followed by filter_criteria which are filter expressions to apply to arriving events. The optional as keyword can be used to assign an stream name. Patterns and named windows can also be specified in the on clause. Your applications must ensure to configure a cache for your method invocation using Esper configuration, as such indexes are held with regular data in a cache. If you application does not enable caching of method invocation results, the engine does not build indexes on cached data.
Your applications must ensure to configure a cache for your database using Esper configuration, as such indexes are held with regular data in a cache. If you application does not enable caching of SQL query results, the engine does not build indexes on cached data. The next example adds a time window of 30 seconds to the event stream CustomerCallEvent. It also renames the selected properties to customerName and customerId to demonstrate how the naming of columns in an SQL query can be used in the select clause in the EPL query. And the example uses explicit stream names via the as keyword.
While a subquery cannot change the cardinality of the selected stream, a subquery can return multiple values from the selected data window or named window or table. This section shows examples of the window aggregation function as well as the use of enumeration methods with subselects. The event_stream_name is an identifier that names the event stream generated by the engine. The identifier can be used in further statements to filter and process events of that event stream, unless inserting into a table. The insert into clause can consist of just an event stream name, or an event stream name and one or more property names.
Event pattern expressions can also be used to specify one or more event streams in an EPL statement. For pattern-based event streams, the event stream definition stream_def consists of the keyword pattern and a pattern expression in brackets []. The syntax for an event stream definition using a pattern expression is below. As in filter-based event streams, an optional list of views that derive data from the stream can be supplied.
The select clause in an EPL query specifies the event properties or events to retrieve. The from clause in an EPL query specifies the event stream definitions and stream names to use. The where clause in an EPL query specifies search conditions that specify which event or event combination to search for.
For example, the following statement returns the average price for IBM stock ticks in the last 30 seconds. Similar to tables in a SQL statement, views define the data available for querying and filtering. Other views derive statistics from event properties, group events or handle unique event property values. Views can be staggered onto each other to build a chain of views.
The Esper engine makes sure that views are reused among EPL statements for efficiency. If you omit the GROUP BY clause, then Oracle applies aggregate functions in the select list to all the rows in the queried table or view. You can apply aggregate functions to all events in an event stream window or other view, or to one or more groups of events. From each set of events to which an aggregate function is applied, Esper generates a single value. Names of built-in functions and certain auxiliary keywords are permitted as event property names and in the rename syntax of the select clause.
This is especially useful if your queries return a large number of rows. For building the proper indexes, Esper inspects the expression found in your EPL query where clause, if present. For outer joins, Esper also inspects your EPL query on clause.
Esper analyzes the EPL on clause and where clause expressions, if present, looking for property comparison with or without logical AND-relationships between properties. When a SQL query returns rows for caching, Esper builds and caches the appropriate index and lookup strategies for fast row matching against indexes. In a join and outer join, your statement must declare a data window view or other view onto each stream. Streams that are marked as unidirectional and named windows and tables as well as database or methods in a join are an exception and do not require a view to be specified.
If you are joining an event to itself via contained-event selection, views also do not need to be specified. The reason that a data window must be declared is that a data window specifies which events are considered for the join (i.e. last event, last 10 events, all events, last 1 second of events etc.). If the event stream name has already been defined by a prior statement or configuration, and the event property names and/or event types do not match, an exception is thrown at statement creation time. The order of any output events for both insert and remove stream data is well-defined and exactly as indicated before.
For example, specifying grouping sets ((), symbol, tickDataFeed) outputs a total overall, a total by symbol and a total by feed in that order. If the statement has an order-by-clause then the ordering criteria of the order-by-clause take precedence. The optional select clause provides control over which fields are available in output events.
The expressions in the select-clause apply only to the properties available underneath the property in the from clause, and the properties of the enclosing event. Which are filter expressions to apply to arriving events. The optional as keyword can be used to assign a stream name.
The 'getAssetHistory' method returns an array of Map objects that are two rows. The parameters to the method are the assetId and assetCode properties of the AssetMoveEvent joined to the method. The engine calls this method for each insert and remove stream event in AssetMoveEvent. Certain JDBC database drivers are known to not return metadata for precompiled prepared SQL statements. Esper obtains SQL result set metadata to validate an EPL statement and to provide column types for output events.
JDBC drivers that do not provide metadata for precompiled SQL statements require a workaround. Such drivers do generally provide metadata for executed SQL statements, however do not provide the metadata for precompiled SQL statements. The statement above always generates at least one output event for each CustomerCallEvent, containing all columns selected by the SQL query, even if the SQL query does not return any rows.
The on acts as an additional filter to rows returned by the SQL query. You can use outer joins to join data obtained from an SQL query and control when an event is produced. Use a left outer join, such as in the next statement, if you need an output event for each event regardless of whether or not the SQL query returns rows. If the SQL query returns no rows, the join result populates null values into the selected properties. In order for such data sources to become accessible to Esper, some configuration is required.
The Section 16.4.9, "Relational Database Access" explains the required configuration for database access in greater detail, and includes information on configuring a query result cache. As such an application may create explicit indexes as discussed in Section 6.9, "Explicitly Indexing Named Windows and Tables". To merge event streams, simply use the same event_stream_name identifier in all EPL statements that merge their result event streams. Make sure to use the same number and names of event properties and event property types match up. At compile time as well as at run time, the engine scans new filter expressions for sub-expressions that can be indexed. The above list of operators represents the set of operators that the engine can best convert into indexes.
The use of comma or logical and in filter expressions does not impact optimizations by the engine. The istream and rstream keywords in the select clause are matched by same-name keywords available in the insert into clause. The optional istream, irstream and rstream keywords in the select clause control the event streams posted to listeners and observers to a statement. Tables are globally-visible data structures that typically have primary key columns and that can hold aggregation state. You can create tables using CREATE TABLE. An overview of named windows and tables, and a comparison between them, can be found at Section 6.1, "Overview".
The aforementioned ON SELECT/MERGE/UPDATE/INSERT/DELETE, INSERT INTO as well as joins and subqueries can be used with tables as well. Table 9.53 shows aggregate functions typically used in statistical analysis. In all cases, null is returned if the computation is meaningless, for example when N is zero. Expression_n Expressions that are not encapsulated within an aggregate function and must be included in the GROUP BY Clause at the end of the SQL statement. Aggregate_function This is an aggregate function such as the SUM, COUNT, MIN, MAX, or AVG functions. Aggregate_expression This is the column or expression that the aggregate_function will be used on.
Tables The tables that you wish to retrieve records from. There must be at least one table listed in the FROM clause. These are conditions that must be met for the records to be selected. The expression used to sort the records in the result set.