NEsper用的波类来讲述事件之类型信息。你的下在启动时可能先布置定义事件类,或者当运行时经过API或EPL语法动态的充实事件类。

EPL中的create schema 的语法允许以运行时用EPL申明一个事件类。

2.1事变目标

事件是病故生的动作要状态变化的一个不行改变的笔录。事件性质捕捉事件之状态信息。

当ESPER中,事件是得于叙成以下任何一样种CLR对象:

图片 1

NEsper为声明一个事变提供了强底抉择,没有断的消用户失去创造一个CLR对象来表示一个轩然大波。事件发表出以下共性:


所有的轩然大波代表支持嵌套,索引和照耀属性(亦如属性表达),在下面详细分解前。嵌套级别没有范围。

• 所有的事件表示提供事件类元数据。这包嵌套属性之种类元数据。


所有事件代表同意调换事件本身和有属性图到新的轩然大波。条件调换是指选择那些自己是嵌套的属性图的风波我或事件性质,然后查询事件的性能要嵌套属性图。Apache的Axiom事件代表是一个差,目前不允许调换的风波性质,但允许调换的波本身。

• CLR对象与Map描述允许超类型。

富有事件代表的API的行事是同样的,在当下同样章中指出的个别不等。多单事件陈述的便宜来:

• 对于早已支持的陈事件之应用程序,没有必要作事件到CLR对象的变换处理。

• 事件陈述是互的,当事件陈述有反时,需要减少或者消除变更声明。


事件陈述是只是共同以的,允许持有的轩然大波代表以同等或者不同报表被的一块儿利用。

• 选择让其或自愿地权衡性能,易于使。

2.2波性质

事件性质捕捉事件之状态信息。事件性质的简便的目录,映射和嵌套的风波性质。下表列出了不同品种的性质与它们的语法在事变表达着。该语法允许告诉句子来询问深CLR
对象图,XML结构及MAP事件。 如下图:

图片 2

合为有或。例如,一个行之有效之组合,可以的Person.Address(”home”).street[0]。

2.2.1转义字符

只要您的应用程序使用System.Collection.Generic.IDictionary或者XML描述事件,事件性质名称会连一个点号(“.”)字符。反斜杠(“\”)可以就此来转换点号,允许事件名称被连点号。

select part1\.part2 from MyEvent

偶然,你的轩然大波性质可能会见重叠EPL语言关键字。在这种情况下,你可以使用于后撇号’字符转义属性的名目。

下例假定一个Quote事件,有一个order的性能,而order也是一个封存重要字:

select `order` from Quote

2.3动态性

动态(未当选)属性是无待在谈的编译时了解之风波性质。这些性是于运行过程中分析。

动态性背后的想法是,对于一个加以的黑事件,我们并无总是先知道的具有属性。一个密的风波可能于讲话的编译时未附加属性,而我辈若询问。尤其是丰富的,面向对象的域模型的事件表示十分实用之概念。

动态性之语法包含属性之称谓以及一个问号。索引,映射和嵌套的习性也得以动态特性。

动态性总是回到System.Object的类别。此外,如果当运行时动态性不在,动态性返回一个空值。

譬如说,考虑一个OrderEvent事件提供了一个“item”属性。
“item”属性是项目对象都具服务还是产品的一个实例的援。

苟服务以及产品类提供了一个称作吧“price”的特性。通过一个动态的属性,我们得以指定一个查询,以博得从任一对象​​(服务或制品)的price属性:

select item.price? from OrderEvent

旁一个例证,假而Server类包含一个serviceName属性,而Product类不持有,下面的询问返回Server对象的serviceName属性。对于从未serviceName属性的Product对象,将回到一个空值:

select item.serviceName? from OrderEvent

设想OrderEvent有差不多只落实类似,其中起局部timestamp属性的情况。下一个询问返回的这些实现OrderEvent接口功能的实例的timestamp属性:

select timestamp? from OrderEvent

上面的询问返回路事件的么列名timestamp?

当为嵌套的动态性,动态性之所有属性也设想动态特性。在底下的例证中之询问要求direction属性对象回来的detail的动态性:

select detail?.direction from OrderEvent

面的EPL等同于如下:

select detail?.direction? from OrderEvent

同动态性协同提供的中之函数如下:

• CAST函数动态性(或表达式的值)转换成为加的型。


exists函数检查是不是存在一个动态的特性。如果事件有该名的性能,返回true,否则回false。

• instanceof函数检查动态性的价值(或表达式的价)是否是其它给定的品种。

• typeof函数返回字符串类型的动态性名称。

动态事件性质与具CLR对象,基于Map和XML基于DOM的波联合工作。

2.4 Fragment and Fragment 类型

突发性一个轩然大波的属于性能是事件我。ESPER使用条款碎片以及零散类型来表示这种事件。最好之例子是一个模式相兼容的点滴独或有限个以上之轩然大波都输出事件涵盖匹配的事件作片。换句话说,输出事件由再多的波,碎片组成的复合事件。

片断具有同样的头条数据作为该卷入的复合事件。封装的复合事件的第一数据包含属性是有些的音讯,或生一个属于性值能表示片断或者波我。

有些及项目的冠数据,可以于你的应用程序导航的复合事件,而不待采取CLR反射API和压缩耦合底层的事件表示。

2.5普通的原CLR对象事件

普普通通的旧式CLR对象的风波是经过CLR
风格的getter方法​​,暴露事件性质的靶子实例。事件类还是接口不完全符合CLR
规范的;但是Esper引擎来博取事件性质,所急需的Get属性,​必须是当前之或一个得经配备中定义的访问器方法。

NEsper支持CLR
风格的轩然大波类扩展的超类或促成一个还是多单接口。此外,NEsper事件模式与EPL申明可以参考CLR
接口类和抽象类。

代表事件之类应是稳步的。由于事件是记录状态改变或过去时有发生的履,有关事件性质不应当变更之。然而,这是免是一个硬性的渴求,NEsper引擎接受事件要可变的。

尚未必要实现GetHashCode和Equals方法。这些主意的履是CLR事件类,不影响引擎的旁方式的一言一行。

2.5.1 CLR对象事件

如前所述,不同之习性类型且支持标准的CLR规范,且有些具NEsper的特殊支持:

Simple- 属性可以寻找单个值。相关的习性类型或者是原始CLR
语言(如INT,一个简短的靶子(如System.String),或更扑朔迷离的目标,复杂对象是由CLR语言的应用程序定的,或一个类库包含的应用程序。

Indexed
-索引属性存储,可以独立由一个整数价值,非负指数(或下标)来走访的目标(同一型的保有)的平稳聚集。

Mapped -NEsper接受字符键值对投属性之任何性质。

Nested -嵌套属性是一个性质所属之CLR对象自我便是其他一个风波的性能。

一般来说图所示,假设有NewEmployeeEvent事件类。在这事例中回到CLR对象的炫耀和索引属性,但为恐怕回CLR
语言中的原始类型(如int或String)。Address对象以及Employee有嵌套属性,如Address对象的街道名称或Employee对象的雇员名称。

public class NewEmployeeEvent {
      public String FirstName { get; }
      public Address GetAddress(String type);
      public Employee GetSubordinate(int index);
      public Employee[] AllSubordinates { get; }
}

Simple事件性质需要回到属性值的getter属性。在是事例中,FirstName
属性​​返回String型的firstName属性。

Indexed事件性质要求另外一个之下的getter方法。一凡运用一个整数列作key值,并返该属性的价值的艺术,如GetSubordinate,或一个回数组类型,或促成迭代的接近的方式。例如getSubordinates
方法,返回一个Employee 数组,但为或回一个而迭代的。
EPL或事件模式之言语,索引属性通过[index]语法访问。

Mapped事件性质需要一个getter方法,该办法通过键值对连回该属性的价,如GetAddress方法。
EPL或事件模式声明,映射属性通过性能(“key”)语法访问。

Nested事件性质需要一个getter方法返回嵌套对象。 GetAddress和
GetSubordinate方法映射和目录返回一个嵌套对象的性质。
EPL或事件模式声明,嵌套的习性是经过property.nestedProperty语法访问。.

持有事件的模式及EPL表达式允许行使索引,映射和嵌套属性(或这些的联合)。下面的例子显示事件模式表达式的过滤器(每行是一个独立的EPL表达式)的目,映射和嵌套属性的不同组合:

every NewEmployeeEvent(firstName=’myName’)

every NewEmployeeEvent(address(‘home’).streetName=’ Park Avenue’)

every NewEmployeeEvent(subordinate[0].name=’anotherName’)

every NewEmployeeEvent(allSubordinates[1].name=’thatName’)

every
NewEmployeeEvent(subordinate[0].address(‘home’).streetName=’Water
Street’)

一如既往,语法可用于在EPL表达式在装有可以预计的事件性质名称的状态下,如以select列表,where条件或在正规。

select firstName, address(‘work’), subordinate[0].name,
subordinate[1].name from NewEmployeeEvent where
address(‘work’).streetName = ‘Park Ave’

2.5.2特性名称

NEsper配置提供了一个关区分轻重缓急写的习性名称的标志。下图是getter方法​​和性能名称的演示列表:

图片 3

2.5.3常量和枚举

常量是于CLR 类中之所以public static
const声明的成员,也不过与各种表现形式,如这个事例所示:

select * from MyEvent where property=MyConstantClass.FIELD_VALUE

事件性质是枚举值可以比较他们的枚举值:

select * from MyEvent where enumProp=EnumClass.ENUM_VALUE_1

除此以外,类中可望静态的方法,如枚举类EnumClass如下:

select * from MyEvent where
enumProp=EnumClass.valueOf(‘ENUM_VALUE_1’)

倘若你的应用程序不引入,通过部署枚举类的管,它必须借助定类的包名。枚举类是内类必须遵守CLR约定用”+”。

如:枚举类Color是MyEvent的其中类,在org.myorg包被可引用如下所示:

select * from
MyEvent(enumProp=org.myorg.MyEvent+Color.GREEN).std:firstevent()

实例方法呢说不定吃调用事件实例指定一个流名称,如下所示:

select myevent.computeSomething() as result from MyEvent as myevent

链接的实例方法是永葆的,如之事例说明:

select myevent.GetComputerFor(‘books’, ‘movies’).Calculate() as result
from MyEvent as myevent

2.5.4参数化的花色

当您的getter方法​​或访问器成员返回一个类型,例如索引属性IEnumerable<MyEventData>或者映射属性IDictionary<String,
MyEventData>,于是性质表达式可能由此参数类型引用性

一个参数化类型的波之性例子是:

public class NewEmployeeEvent {
     public String Name { get; }
     public IEnumerable<EducationHistory> Education { get; }
     public IDictionary<String, Address> Addresses { get; }
}

这个事件的得力属性表达式的以身作则如下所示:

select Name, Education, Education[0].Date, Addresses(‘home’).Street  
from NewEmployeeEvent

2.6.1概述

事件呢堪给实现了System.Collection.IDictionary<String,Object>
接口的靶子表示。Map事件的性质是map值,通过了System.Collection.IDictionary<String,Object>接口暴露的get方法访问。

Map事件类型是一个综合型的网,它可排需要采取CLR类的事件类,从而又易于当运行时转之品类或者打另外来源有的类型信息.

一个加的Map事件类型可以出一个要么多个也是map类型的超类,它可用到在其他Map超类型上可用之持有属性类型。此外,在EPL内之另地方,使用一个map超类的事件类名称,任何map子型及她的子型都相当表达式。

您的应用程序在运作时经安排操作UpdateMapEventType,可以补加属性到存活的Map事件类型中。map属性不会见为更新或删除
,只能上加属性,嵌套的属性也得长。运行时布置为允许删除map事件类型以及添加新的种的音信。

当公的应用程序配置map事件类型通过提供一个类型名称,类型名称可用来更的map事件类型定义,去指定属性类型或者一个数组属性类型的品类名称。

一律针对几近涉及在Map事件类型中凡通过数组表示,一个在Map事件类型中之性可能是一个简单的一再组,一个CLR
对象组或者一个map组。

发动机在EPRuntime接口中经过SendEvent(DataMap map, String
eventTypeName)方法来执行Map事件。实例在map中表现为事件性质。Key值必须是字符串,引擎才能够找到Pattern或者EPL指定的风波属于性名。

招擎不会见证明事件类名称或者值。你的应用程序应确保通过之目标作为事件属于性匹配create
schema 属性名和种,或者在运转时安排事件类型信息或静态配置。

2.6.2 MAP属性

Map事件属性可以是外类型。Map属性是CLR应用程序提供靶:


如前所述,属性是CLR应用程序对象可以透过嵌套,索引,映射和动态性的语法查询。


Map类型的性质可以嵌套任意深度,因此得以于用来表示复杂的处信息。嵌套,索引,映射和动态性的语法,可以用来当Map或数组内查询。

为了使Map事件,事件类名称和属性名称与花色必须经过部署为引擎知道。请参见13.4.2节之例证,“System.Collection.Generic.IDictionary的代表事件”。

下面的代码片断创建同拍卖Map事件。它首先定义了一个CarLocationUpdateEvent事件类:

var mapEvent = new Dictionary<string,object>();
mapEvent[“carId”] = carId;
mapEvent[“direction”] = direction;
epRuntime.SendEvent(mapEvent, “CarLocUpdateEvent”);

CarLocUpdateEvent现在能够因此在EPL表达式中

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

该引擎还足以经过嵌套属性的语法,查询CLR
对象在Map事件中之价值。因此,Map事件,可用来汇多个数据结构到一个简单易行事件,时行方便的综合信息查询。下面的例子演示Map事件与account
对象。

var mapEvent = new Dictionary<string,object>();
mapEvent[“txn”] = txn;
mapEvent[“account”] = account;
epRuntime.SendEvent(mapEvent, “TxnEvent”);

2.6.3 MAP父类

你的Map事件类型可以声明一个要多单超类型,在发动机初始化时还是运行时,通过管理界面配置。

Map事件类型的超类,也非得是Map事件类型。父类所有属性名称以及类别也可每当子类中重载。此外,在EPL中,一个Map超类的风波类名称用让运用,任何子类表达式也竞相匹配(类似于CLR
接口的定义)。

夫例子假定BaseUpdate事件类已宣称,且当一个AccountUpdate事件类的超类(两单还是Map事件类型):

epService.EPAdministrator.GetConfiguration().
AddEventType(“AccountUpdate”, accountUpdateDef,new String[]
{“BaseUpdate”});

你的应用程序EPL表达式中恐怕会见选BaseUpdate事件,会接受BaseUpdate和

AccountUpdate事件,以及BaseUpdate的另外其它子类。

select * from BaseUpdate

卿的应用程序Map事件类型或者出多单超类。多双重继承层次结构之间的MAP可以任意深度,但是循环依赖是未允的。如果利用运行时布置,增加子类时,必须父类先有。

2.6.4 MAP高级属性类型

嵌套属性:

强健的种嵌套的map事件可以为用来确立长,类型安全之轩然大波类。使用AddEventType方法配置于初始化时或者运行时定义之档次。值得注意的地方:

• CLR 的对象(POCO),可以看作性能出现于MAP嵌套中。

• 一个Map中便用的风波类名称或者代表一个Map嵌套,或者Map嵌套数组.

• 嵌套的级别没有限制

• 动态属性,可以据此来询问Map内可能无法先行了解之key.

• 在嵌套结构的拜访路径后不可知映照不设有的实体,该引擎返回的习性也null。

平针对几近涉及:

对以map内模型重复的性,你可以使用Map的性质数组。你得应用原始类型的数组或CLR
对象的数组或一个原先定义的Map事件类型的屡屡组.

当用以前发布的Map事件类型作为一个数组属性,literal[]总得多在事变类名称后。.

下的事例定义了一个称号Sale的Map事件类型,拥有各类型的数组属性。它一旦SalesPerson
的CLR 类存在和OrderItem的吃声称也一个Map事件类型:

Map<String, Object> sale = new HashMap<String, Object>();
sale[“userids”] = typeof(int[]);
sale[“salesPersons”] = typeof(SalesPerson[]);
sale[“items”] = “OrderItem[]”; // The property type is the name
itself appended by []
epService.EPAdministrator.GetConfiguration().
AddEventType(“SaleEvent”, sale);

 

点的例证中声明的老三种植属性:

• 整数路数组userid

• 对象往往组 SalesPerson

• Map类型数组 orderitems.

下来的EPL声明对数组属性值查询的演示:

select userids[0], salesPersons[1].name,items[1],
items[1].price.amount from SaleEvent

相关文章

网站地图xml地图