文档章节

Esper事件处理引擎_14_EPL 语法_7_Patterns_1_模式匹配

开源中国首席二弟子
 开源中国首席二弟子
发布于 2014/09/06 23:30
字数 1587
阅读 69
收藏 0

官方地址:http://www.espertech.com


Esper 事件引擎栏目:http://blog.csdn.net/xiaohulunb/article/category/2436609


EPL 语法代码见-GitHub代码地址:点击打开链接


涉及 Javabean,Listener,main 以 GitHub 包下为最新更,注释解释排版有问题可参考源码


EPL_7_Patterns_1语法


package com.framework_technology.esper.epl;

import com.framework_technology.esper.javabean.Apple;
import com.framework_technology.esper.javabean.Banana;
import com.java.annotation.document.Faulty;
import com.java.annotation.document.Unfinished;

/**
 * api - Chapter 6. EPL Reference: Patterns
 * <p>
 * 模式表现形式包括原子模式和运算模式:
 * <p>
 * 1.原子模式的模式的基本构建块。原子是过滤表达式,观察员基于时间的事件和插件定制观察家认为没有观察引擎的控制下,外部事件。
 * Pattern Atom            Example
 * ====================================================================================================================
 * 过滤器表达式              StockTick(symbol='ABC', price > 100)
 * 基于时间的间隔或者安排      timer:interval(10 seconds) timer:at(*, 16, *, *, *)
 * 自定义插件                myapplication:myobserver("http://someResource")
 * <p>
 * 2.运算模式控制表达的生命周期,并结合原子逻辑或时间
 * <p>
 *   有4种模式操作符:
 * <p>
 * 1.运算模式控制子表达式重复: every, every-distinct, [num] and until
 * 2.逻辑运算符: and, or, not
 * 3.时态操作,操作事件顺序: -> (followed-by)
 * 4.守护where-conditions控制子表达式的生命周期。例子是 timer:within, timer:withinmax and while-expression.自定义插件也可以使用。
 *
 * @author wei.Li by 14-8-13.
 */
public class EPL_7_Patterns_1 {


    /**
     * simple example
     *
     * @return epl1
     */
    protected static String inEPL() {

        //每进入一个Banana事件则输出跟随前面的Apple 事件
        String epl1 = "select a.*  from pattern[every a=" + Apple.CLASSNAME + " -> b=" + Banana.CLASSNAME + "]";

        //查询 (每进入一个Banana事件则输出跟随的Apple 事件1分钟内id相等的数据)在过去的5分钟内id在 ('0' , '1' , '2')中
        String epl2 = "select a.*  from " +
                "pattern[every a=" + Apple.CLASSNAME + " -> b=" + Banana.CLASSNAME + "(a.id=b.id) where timer:within(1 min)]"
                + ".win:time(5 min) where a.id in ('0' , '1' , '2')";

        @Unfinished(Description = "语句解析错误")
        String epl3 = "select * from pattern [every (" + Apple.CLASSNAME + " or " + Banana.CLASSNAME + ").win:length(10)]";

        return epl2;
    }


    /**
     * 抑制相同的事件 API - 6.2.6. Suppressing Same-Event Matches
     * <p>
     * Patterns:[every a=A -> B]
     * <p>
     * 事件进入顺序 A1   A2   B1  :
     * 当事件B1到达模式为两者的组合{ A1,B1 }和组合{ A2,B1 }匹配。
     * <p>
     * 使用@SuppressOverlappingMatches格局级别标注,指示引擎匹配到第一个后放弃后面所有。
     * <p>
     * 该引擎只考虑用于检测重叠标记的事件。
     * 禁止以多个同时发生的事件中发生的单一事件或抵达时间推进的结果。
     * 部分完成的模式不会受到影响和现有模式状态不会改变,因为抑制的结果。
     * 限制:注释不能用有模式的加入​​。
     *
     * @return epl1
     */
    @Faulty(Description = "注解解析错误,API 6.2.6. Suppressing Same-Event Matches")
    protected static String SuppressingSame_EventMatches() {
        String epl1 = " select * from " +
                "pattern @SuppressOverlappingMatches [every a=" + Apple.CLASSNAME + " -> b=" + Banana.CLASSNAME + "]";
        return epl1;
    }


    /**
     * 丢弃部分的匹配 API - 6.2.7. Discarding Partially Completed Patterns
     * <p>
     * Patterns:[every a=A -> B and C(id=a.id)]
     * <p>
     * 事件进入顺序 A1{id='id1'}   A2{id='id2'}   B1
     * <p>
     * 根据上面的序列没有匹配。C模式部分完成等待事件。
     * 正在等待一个C { id ="id1"}事件之后的模式匹配完成组合{ A1,B1 }。
     * 正在等待一个C { id ="id2"}事件之后的模式匹配完成组合{ A2,B1 }。
     * <p>
     * 假设事件C1 { id ="id1")到达模式输出组合{ A1、B1、C1 }。
     * 假设事件C2 { id ="id2")到达模式输出组合{ A2、B1、C2 }。
     * 请注意,事件B1 partially-completed模式的一部分。
     * <p>
     * 使用@DiscardPartialsOnMatch pattern-level注释指示引擎,当任何匹配发生后丢弃部分完成模式的重叠事件的匹配(或匹配如果有多个匹配)。
     *
     * @return epl
     */
    protected static String discardingPartiallyCompletedPatterns() {
        /**
         * 当事件C1 { id =“id1”)到达模式输出匹配组合{ A1、B1、C1 }。
         * 匹配引擎丢弃所有的指示partially-completed模式指的A1,B1和C1事件。
         * 由于事件B1 partially-completed模式的一部分,等待C { id =“id2”},引擎丢弃partially-completed模式。
         * 因此,当C2 { id =“id2”}到引擎输出不匹配。
         */
        String epl1 = "select * from pattern @DiscardPartialsOnMatch [every a=A -> B and C(id=a.id)]";
        return epl1;
    }


    /**
     * 当指定@DiscardPartialsOnMatch和@SuppressOverlappingMatches引擎丢弃partially-completed重叠所有匹配包括抑制匹配的模式。
     * @see #SuppressingSame_EventMatches()   抑制匹配
     * @see #discardingPartiallyCompletedPatterns() 丢弃部分的匹配
     */


    /**
     * 匹配操作的优先级
     * API - 6.3. Operator Precedence
     * 见图片
     * 图1 有优先级的模式匹配
     * 图2 级别相等的模式匹配
     * 查考文档的 table
     */


    /**
     * 模式条件中的过滤操作
     *
     * @return epl
     */
    protected static String filterExpressions() {
        /**
         * 每进入一个Banana事件则输出跟随前面的Apple 事件
         * 多个 and 条件可以用,隔开
         * 静态方法的调用
         */

        String epl1 = "select a.*  from " +
                "pattern[every a=" + Apple.CLASSNAME + "(a.price > 5 , id in ('0','1','2'),a.getPriceByDiscount(price,discount) > 3) -> " +
                "b=com.framework_technology.esper.javabean.Banana(" + Banana.CLASSNAME + ".getPriceByDiscount2StaticMethod(price,discount) > 3)]";
        return epl1;
    }


    /**
     * 控制事件的消耗匹配 API - 6.4.1. Controlling Event Consumption
     * <p>
     * Patterns:[ a=RfidEvent(zone='Z1') and b=RfidEvent(assetId='0001')]
     * 在这种模式,一个RfidEvent事件到达具有区"Z1"和assetId “0001” 。
     * 模式也匹配,当两个RfidEvent事件到达,以任何顺序,其中,一个具有带"Z1" ,而另一个具有assetId “0001” 。
     * <p>
     * 用@consume过滤器表达式来表示,如果一个到达的事件相匹配的引擎,匹配明显的过滤器表达式,不匹配任何其他过滤器表达式多重过滤表达式。
     * 该@consume包括括号中的级别数。默认级别数是与同级别的数字1。多个过滤表达式@consume匹配所有的事件。
     * <p>
     * Patterns修改为:[ a=RfidEvent(zone='Z1')@consume and b=RfidEvent(assetId='0001')]
     * 这种模式当单个RfidEvent到来,带Z1,assetId‘0001’,因为当第一个过滤器表达式匹配模式引擎使用事件。
     * 在任何顺序模式只匹配两个RfidEvent事件到达时。一个事件必须带Z1,然后其他事件必须有一个带“Z1”和一个assetId‘0001’。
     *
     * @return epl
     */
    protected static String ControllingEventConsumption() {

        /**
         * 当RfidEvent zone="Z1"模式到达 。
         * 在这种情况下,输出事件填充属性' A' ,但不是'B '和' C'内容 。
         * 当RfidEvent zone="Z1"和“0001”=assetId的模式到达。
         * 在这种情况下,输出事件填充属性' B' ,但不是'a'和'C'内容 。
         * 当RfidEvent zone="Z1"和assetId=“0001”和类=“perishable”的模式到达。
         * 在这种情况下,输出事件填充属性' C' ,但不是'A'和'B' 。
         */
        String epl1 = "a=RfidEvent(zone='Z1')@consume(2)" +
                "  or b=RfidEvent(assetId='0001')@consume(1)" +
                "  or c=RfidEvent(category='perishable'))";
        return epl1;
    }


    /**
     * Use With Named Windows
     * API - 6.4.2. Use With Named Windows
     */
    @Unfinished
    protected static String namedWindows() {
        /**
         * @see com.framework_technology.esper.epl.EPL_8_NamedWindow
         */
        return null;
    }
}



图1 有优先级的模式匹配


图2 级别相等的模式匹配




© 著作权归作者所有

共有 人打赏支持
开源中国首席二弟子
粉丝 2
博文 20
码字总数 33047
作品 0
朝阳
程序员
私信 提问
Esper学习笔记二:进程模型

1.UpdateListener UpdaterListener是Esper提供的一个接口,用于监听某个EPL在引擎中的运行情况,即事件进入并产生结果后会通知UpdateListener。 接口如下: 接口中就包含一个update方法,该方...

贾峰uk
2018/08/30
0
0
Esper学习笔记三:EPL语法(1)

1.EPL语法简介 EPL全称Event Processing Language,是一种类似SQL的语言,包含了SELECT, FROM, WHERE, GROUP BY, HAVING 和 ORDER BY子句,同时用事件流代替了table作为数据源,并且能像SQL...

贾峰uk
2018/08/30
0
0
Esper学习笔记四:EPL语法(2)

1.select 查询所有属性或特定属性 EPL的select和SQL的select很相近,SQL用表示查询表的所有字段,而EPL用表示查询事件流的所有属性值。SQL查询某个字段名,直接在select后跟字段名就ok,EPL...

贾峰uk
2018/08/31
0
0
Esper学习笔记五:EPL语法(3)

1.Aggregation 类似于SQL中的聚合函数,EPL中聚合函数格式如下: aggregate_function就是聚合函数的名字,比如avg,sum等。expression通常是事件流的某个属性,也可以是不同事件流的多个属性...

贾峰uk
2018/09/03
0
0
如何利用Flink实现超大规模用户行为分析

各位晚上好,首先感谢大家参与我的这次主题分享,同时也感谢 InfoQ AI 前线组织这次瀚思科技主题月! 瀚思科技成立于 2014 年,按行业划分我们是一家安全公司。但和大家熟知的卖杀毒软件或者...

吴昊
2017/12/14
0
0

没有更多内容

加载失败,请刷新页面

加载更多

nginx反向代理配置去除前缀

使用nginx做反向代理的时候,可以简单的直接把请求原封不动的转发给下一个服务。设置proxy_pass请求只会替换域名,如果要根据不同的url后缀来访问不同的服务,则需要通过如下方法: 方法一:...

架构师springboot
17分钟前
1
0
QianBill API 开发笔记

JWT

BeanHo
28分钟前
2
0
Elasticsearch实战篇——Spring Boot整合ElasticSearch

当前Spring Boot很是流行,包括我自己,也是在用Spring Boot集成其他框架进行项目开发,所以这一节,我们一起来探讨Spring Boot整合ElasticSearch的问题。 本文主要讲以下内容: 第一部分,通...

JAVA_冯文议
37分钟前
3
0
不错的linux下通用的java程序启动脚本

#!/bin/sh#该脚本为Linux下启动java程序的通用脚本。即可以作为开机自启动service脚本被调用,#也可以作为启动java程序的独立脚本来使用。##Author: tudaxia.com, Date: 2011/6/7...

sprouting
今天
3
0
Linux manjaro系统安装后无法连接wifi,解决方案

笔记本为联想 thinkpad E480 首先通过命令lspci -k看一下原因是否为缺少wifi驱动,如下,如果没有Kernel driver in use,说明缺少驱动。 05:00.0 Network controller: Realtek Semiconducto...

bluecoffee
今天
7
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部