程序员的量化交易之路(5)--Esper之Map事件(4)

2.6 java.util.Map事件

2.6.1 概述

实现事件的类可以是一个实现java.util.Map接口的类。映射事件的事件属性是其通过get方法能够获得的值。

 

和数组对象事件类型一样,映射事件类型考虑了系统中的综合类型,是的不需要使用Java类来描述事件类型,这是的更容易在运行时更改事件,或者从其他类型生成类型信息。

 

一个给定的Map事件类型可以有一个或者多个超类型,这些超类型也必须是map 事件类型。所以在超类中可以获取的属性在该映射事件中也可以获得。此外,在EPL中任何一个Map超类被使用,那么其子类都可以匹配该表达式。

 

应用可以通过configurationoperation(配置操作)updateMapEventType在运行时为一个已经存在的映射事件类型添加属性。属性只能增加,不能更新或者删除。运行时配置允许删除一个映射事件类型并修改后再添加回系统中。

 

通过数组可以在映射事件类型中表示一对多的关系。映射事件类型中的一个属性可以是一个内置类型的数组,java对象的数组,Map的数组以及数组的数组,都是可以的。

 

引擎通过EPRuntime接口中的sendEvent(Map map,String eventTypeName)方法处理java.util.Map事件。映射中的条目代表这属性。关键字必须是java.util.String类型,为了使引擎能够通过匹配名字取查找事件属性。

 

引擎并不验证映射事件属性名和值。应用必须保证事件属性匹配create schema属性名和类型。

2.6.2 映射属性

映射事件属性可以是任意类型。它可以是Java应用对象、java.util.Map类型、Object[]数组类型等。这些复杂的类型可以提供一下更强的功能:

1)  使用java application object的属性可以嵌套、索引、映射以及使用动态属性等。

2)  使用Map作为事件属性可以表达更为复杂的事件,并且该属性可以被嵌套、索引、动态属性等。

3)  使用数组对象作为事件属性也是如此。。。。

为了使用映射事件类型,事件类型名称和属性名以及属性类型等必须让引擎知道,可以通过Configuration或者create schema EPL语法实现。具体例子参见5.15节“Declaring anEventType:Create Schema”和第16.4.2节“Eventsrepresed by java.util.Map”

下面的代码定义了一个映射事件类型,穿件一个映射事件并将该事件发送到引擎中。示例中通过运行时配置接口(create schema 和静态配置也可以)。

 

// Define CarLocUpdateEvent event type(example for runtime-configuration interface)

Map<String, Object> def = newHashMap<String, Object>;

def.put("carId", String.class);

def.put("direction", int.class);

 

epService.getEPAdministrator().getConfiguration().

 addEventType("CarLocUpdateEvent", def);

 

CarLocUpdateEvent事件类型可以在如下语句中使用:

 

select carId fromCarLocUpdateEvent.win:time(1 min) where direction = 1

 

创建一个CarLocUpdateEvent事件并将它发送到引擎中:

 

// Create a CarLocUpdateEvent event andsend it into the engine for processing

Map<String, Object> event = newHashMap<String, Object>();

event.put("carId", carId);

event.put("direction",direction);

 

epRuntime.sendEvent(event,"CarLocUpdateEvent");

 

通过嵌套属性,引擎允许把一个对象当做映射事件中的属性值来查询。这样Map就可以用来聚合多个数据结构到单个事件中。下面是这样的一个例子。

 

Map event = new HashMap();

event.put("txn", txn);

event.put("account", account);

epRuntime.sendEvent(event,"TxnEvent");

 

一个示例语句可以如下:

 

select account.id, account.rate *txn.amount

from TxnEvent.win:time(60 sec)

group by account.id

 

2.6.3 映射超类(Map Supertypes)

你的映射事件类型可以声明一个或者多个超类。

映射事件的超类也必须是映射事件类型。超类的所有属性名和类型在子类中都可以获取,并且是同名覆盖。此外,在EPL中使用超类的地方,子类的对象也可以匹配该表达式。

 

下面AccountUpdate有一个BaseUpdate超类。

epService.getEPAdministrator().getConfiguration().

   addEventType("AccountUpdate", accountUpdateDef,

   new String[] {"BaseUpdate"});

下面是EPL语句,子类对象都可以匹配:

 

// Receive BaseUpdate and any subtypesincluding subtypes of subtypes

select * from BaseUpdate

 

2.6.4 映射属性类型的高级用法

2.6.4.1 嵌套属性

 

下面通过一个示例说明映射事件的嵌套属性。

 

事件类型的定义:

 

Map<String, Object> updatedFieldDef =new HashMap<String, Object>();

updatedFieldDef.put("name",String.class);

updatedFieldDef.put("addressLine1",String.class);

updatedFieldDef.put("history",UpdateHistory.class);

epService.getEPAdministrator().getConfiguration().

   addEventType("UpdatedFieldType", updatedFieldDef);

 

Map<String, Object> accountUpdateDef= new HashMap<String, Object>();

accountUpdateDef.put("accountId",long.class);

accountUpdateDef.put("fields","UpdatedFieldType");

// the latter can also be:  accountUpdateDef.put("fields",updatedFieldDef);

 

epService.getEPAdministrator().getConfiguration().

addEventType("AccountUpdate",accountUpdateDef);

 

 

定义和发送事件:

 

Map<String, Object> updatedField =new HashMap<String, Object>();

updatedField.put("name","Joe Doe");

updatedField.put("addressLine1","40 Popular Street");

updatedField.put("history", newUpdateHistory());

 

Map<String, Object> accountUpdate =new HashMap<String, Object>();

accountUpdate.put("accountId",10009901);

accountUpdate.put("fields",updatedField);

 

epService.getEPRuntime().sendEvent(accountUpdate,"AccountUpdate");

 

 

最后查询事件:

 

select accountId, fields.name, fields.addressLine1,fields.history.lastUpdate

from AccountUpdate

 

2.6.4.2 一对多模型

使用数组作为属性。

 

Map<String, Object> sale = newHashMap<String, Object>();

sale.put("userids", int[].class);

sale.put("salesPersons",SalesPerson[].class);

sale.put("items","OrderItem[]");  // Theproperty type is the name itself appended by []

 

epService.getEPAdministrator().getConfiguration().

   addEventType("SaleEvent", sale);

 

select userids[0], salesPersons[1].name,

   items[1], items[1].price.amount from SaleEvent

 

 

时间: 2024-09-01 08:01:08

程序员的量化交易之路(5)--Esper之Map事件(4)的相关文章

程序员的量化交易之路(2)----Esper文档学习之技术概览(1)

转载请注明出处:http://blog.csdn.net/minimicall/ 在接下来的20个工作日中,我将坚持翻译或者略翻译Esper的官方文档. 为什么需要学习Esper,因为我们需要理解复合事件处理 Complex Event Processing (CEP).在量化交易系统中,CEP是必不可少的.它负责处理海量的实时事件. 关于CEP更多知识,大家可以翻阅网络相关资料.我这里集中在学习开源的CEP系统,Esper.. 今天开始第一篇:技术概览. 1. CEP和事件序列分析 Esper

程序员的量化交易之路(1)----规划开篇

其实,一直对量化交易有一定的理解和情节.早在中大读研究生的时候实验室师兄,已经去了中国平安核心投资团队,做高频交易研究的国源师兄的影响,就开始对金融世界产生了浓厚的兴趣.看了丁磊编著的<量化投资--策略与技术>和艾琳.奥尔德里奇的<高频交易>,反复的看,但是都入不了味,现在回过头来想,一个连股都不炒的人怎么可能入味呢.对一些金融的基本概念都不懂. 2013年7月出社会工作后,在10月份确立目标.需要炒股,而且需要一个深入的理解金融的世界.所以确定去考一个证券从业考试,选了证券基础和

程序员的量化交易之路(3)--Esper事件Event(2)

第二章 EventPresentation 事件描述 欢迎转载学习,但转载须注明出处:http://blog.csdn.net/minimicall,尊重劳动成果,版权归我. 这一章用于说明事件描述和建模的方法.   Esper 使用event type(事件类型)来描述事件的类型信息. 你的应用可以在Esper启动时或者在运行时通过API或者EPL语法来添加事件类型.具体参见16.4节"条目配置",关于启动时配置,15.3.8"运行时配置",关于运行时配置API.

程序员的量化交易之路(11)--命令参数解析库JCommonder学习

转载须注明出处:http://blog.csdn.net/minimicall?viewmode=contents,http://cloudtrade.top 在学习量化交易平台的过程中,接触到一个参数解析的库,JCommander.今天把它记录一下. 它的官网为:http://www.jcommander.org/ 1. 概述 Jcommander是一个非常小的框架,用于解析命令行参数. 可以通过注解来描述你的参数选项: import com.beust.jcommander.Paramete

程序员的量化交易之路(13)--Cointrader类图(1)

转载须注明出处:http://blog.csdn.net/minimicall?viewmode=contents, htpp://cloudtrader.top 今天开始正式切入到Cointrader的源码分析学习中,其主页为:https://github.com/timolson/cointrader. 它是基于Esper的一个比特币云交易托管平台.和我想做的事情比较相近.而且虽然现在没什么功能,但代码量相对少,对于学习非常好. 下面是它的一个类图.: 后面我们会根据这个类图一步步的剖析整个

程序员的量化交易之路(38)--Lean之实时事件处理接口IRealTimeHandler和RealTimeEvent6

转载需注明出处:http://blog.csdn.net/minimicall?viewmode=contents,http://cloudtrade.top/ 这节开始我们要开始说明另外一个模块:实时事件处理模块. 这个模块的工作是什么呢.它就是用来设置一些在特定时间需要执行的任务.比如,每天开盘的时候,你可以做一个什么动作,比如每天收盘的时候你也可以做一个动作.当然还有更为广泛的运用. 在Lean中,是开启一个单独的线程来处理这种定时任务的. 实时事件:RealTimeEvent 实时事件处

程序员的量化交易之路(36)--Lean之数据读取SubscriptionDataReader4

转载需注明出处:http://blog.csdn.net/minimicall?viewmode=contents,http://cloudtrade.top 数据读取需要定义一个读者.直接见下面代码: namespace QuantConnect.Lean.Engine.DataFeeds { /******************************************************** * CLASS DEFINITIONS ***********************

程序员的量化交易之路(35)--Lean之DataFeed数据槽3

转载需注明出处:http://blog.csdn.net/minimicall,http://cloudtrade.top/ Lean引擎的模块划分非常的规范.其中DataFeed是数据槽,就是供应数据的模块. 1. IDataFeed 接口 模块的接口为: namespace QuantConnect.Lean.Engine.DataFeeds { /// <summary> /// Datafeed interface for creating custom datafeed source

程序员的量化交易之路(29)--Cointrader之Tick实体(16)

转载需注明出处:http://blog.csdn.net/minimicall,http://cloudtrade.top Tick:什么是Tick,在交易平台中非常常见,其实就 单笔交易时某只证券的基本数据. 我们通过代码来学习吧: package org.cryptocoinpartners.schema; import javax.annotation.Nullable; import javax.persistence.Entity; import javax.persistence.M

程序员的量化交易之路(30)--Cointrader之ConfigUtil(17)

转载须注明出处:http://blog.csdn.net/minimicall?viewmode=contents,http://cloudtrade.top/ 一个完整的系统,必然会涉及到配置文件.配置文件可以是xml.属性文件等形式.大多数而言我们并不需要重写配置读取解析模块,只需要使用开源的即可,这里使用的是apapche.commons.configuration的. 我们这里要说的是Cointrader的ConfigUtil类,它涉及到配置和注解成员之间的赋值等问题. 下面通过代码学习