文档章节

Esper事件处理引擎_9_EPL 语法_2_Context 上下文_3_过滤条件

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

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


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


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


涉及 Javabean,Listener,main 以 GitHub 包下为最新更新


EPL_2_Context_3

package com.framework_technology.esper.epl_context;


/**
 * Created by IntelliJ IDEA.
 * User: wei.Li
 * Date: 14-8-7
 * <p>
 * Context 过滤条件   {@link #contextFilterCondition()}
 * <p>
 * 模式过滤             {@link #contextPatternCondition()}
 * 定时任务过滤           {@link #contextCrontabCondition()}
 * 时间段条件过滤          {@link #contextTimePeriodCondition()}
 * 嵌套的context过滤         {@link #contextNesting()}
 * 查看 context 的内容       {@link #ContextEndsOutPut()}
 */
public class EPL_2_Context_3 {


    /**
     * Context 过滤条件
     * <p>
     * event_stream_name [(filter_criteria)] [as stream_name]
     * <p>
     * event_stream_name是事件类型的名称或名称的事件流填充一个插入语句。
     * filter_criteria是可选的,由一系列事件流的表达式过滤事件,事件流后括号内的名字。
     *
     * @return epl[]
     */
    protected static String[] contextFilterCondition() {

        // 不重叠的情况下,当MyStartEvent到达时开始,MyEndEvent到达结尾的
        String epl1 = "create context MyContext start MyStartEvent end MyEndEvent";

        // 重叠情况下,当进入的MyEvent事件的 level>0 则新建一个 context ,10秒后停止
        String epl2 = "create context MyContext initiated MyEvent(level > 0) terminated after 10 seconds";

        //不重叠情况下,当MyEvent到达开始,到某个MyEvent的 id 与新建 context 时相等则结束
        String epl3 = "create context MyContext " +
                "start MyEvent as myevent" +
                "end MyEvent(id=myevent.id)";

        // 重叠情况下,MyInitEvent进入则新建 context, 进入的MyTermEvent的id=e1.id且level 不等于 e1.level则结束这个 context
        String epl4 = "create context MyContext " +
                "initiated by MyInitEvent as e1 " +
                "terminated by MyTermEvent(id=e1.id, level <> e1.level)";
        return new String[]{epl1};
    }


    /**
     * 模式条件过滤
     * <p>
     * pattern [pattern_expression] [@inclusive]
     * <p>
     * 指定后@inclusive模式有相同的事件,构成了模式匹配也计入任何语句相关联的上下文。您还必须提供一个标签为每个事件的模式应包括在内。
     *
     * @return epl
     */
    protected static String[] contextPatternCondition() {

        //非重叠的背景下,当StartEventOne或StartEventTwo到达启动
        //并且在5秒后结束。
        //这里StartEventOne或StartEventTwo没有计入任何语句
        //指的是上下文。
        String epl1 = "create context MyContext " +
                "  start pattern [StartEventOne or StartEventTwo] " +
                "  end after 5 seconds";

        //这里StartEventOne或StartEventTwo计入任何语句
        String epl2 = "create context MyContext " +
                "  start pattern [a=StartEventOne or b=StartEventTwo] @inclusive " +
                "  end after 5 seconds";

        //重叠的情况下,每个不同的MyInitEvent启动一个新的上下文
        //20秒后,每个上下文分区终止

        String epl3 = "create context MyContext" +
                "  initiated by pattern [every-distinct(a.id, 20 sec) a=MyInitEvent]@inclusive" +
                "  terminated after 20 sec";


        //一个重叠的上下文,每个模式匹配发起一个新的上下文
        //所有上下文分区MyTermEvent到来时终止。
        // MyInitEvent和MyOtherEvent触发模式本身不包括在内
        //在任何语句相关联的上下文。
        String epl4 = "create context MyContext" +
                "  initiated by pattern [every MyInitEvent -> MyOtherEvent where timer:within(5)]" +
                "  terminated by MyTermEvent";

        //非重叠的背景下,当任StartEventOne或StartEventTwo到达启动
        //而当任何一个匹配EndEventOne或EndEventTwo到达结束
        String epl5 = "create context MyContext " +
                "  start pattern [a=StartEventOne or b=StartEventTwo]@inclusive" +
                "  end pattern [EndEventOne(id=a.id) or EndEventTwo(id=b.id)]";
        return null;
    }


    /**
     * 定时任务条件过滤
     *
     * @return epl[]
     */
    protected static String[] contextCrontabCondition() {

        //非重叠的情况下开始每天上午9时至下午5时
        String epl1 = "create context NineToFive start (0, 9, *, *, *) end (0, 17, *, *, *)";

        //重叠的背景下的crontab启动一个新的上下文每1分钟
        //和10秒后的每个上下文分区终止:
        String epl2 = "create context MyContext initiated (*, *, *, *, *) terminated after 10 seconds";
        return null;
    }

    /**
     * 时间段条件过滤
     * <p>
     * after time_period_expression
     * <p>
     * -------------指定时间段-----------------
     * time-period : [year-part] [month-part] [week-part] [day-part] [hour-part] [minute-part] [seconds-part] [milliseconds-part]
     * year-part :      (number|variable_name) ("years" | "year")
     * month-part :     (number|variable_name) ("months" | "month")
     * week-part :      (number|variable_name) ("weeks" | "week")
     * day-part :       (number|variable_name) ("days" | "day")
     * hour-part :      (number|variable_name) ("hours" | "hour")
     * minute-part :    (number|variable_name) ("minutes" | "minute" | "min")
     * seconds-part :   (number|variable_name) ("seconds" | "second" | "sec")
     * milliseconds-part : (number|variable_name) ("milliseconds" | "millisecond" | "msec")
     * ---------------一些事例---------------------
     * 10 seconds
     * 10 minutes 30 seconds
     * 20 sec 100 msec
     * 1 day 2 hours 20 minutes 15 seconds 110 milliseconds
     * 0.5 minutes
     * 1 year
     * 1 year 1 month
     *
     * @return elp[]
     */
    protected static String[] contextTimePeriodCondition() {

        //非重叠上下文10秒后开始
        //开始1分钟结束,之后10秒又开始启动。
        String epl1 = "create context NonOverlap10SecFor1Min start after 10 seconds end after 1 minute";

        //重叠的情况下,每5秒启动一个新的上下文分区
        //每个分区持续1分钟
        String epl2 = "create context Overlap5SecFor1Min initiated after 5 seconds terminated after 1 minute";

        return null;
    }


    /**
     * 嵌套的context过滤
     * <p>
     * create context context_name
     * context nested_context_name [as] nested_context_definition ,
     * context nested_context_name [as] nested_context_definition [, ...]
     * <p>
     * 注意语境顺序,减少资源消耗
     * 例如将下方法中EPL1 的SegmentedByCustomer放于NineToFive前面
     *
     * @return epl[]
     */
    protected static String[] contextNesting() {

        //在嵌套的上下文来计算每个账户共提款金额为每一个客户,但只在上午9点到下午5点:
        String epl1 = "create context NineToFiveSegmented" +
                "  context NineToFive start (0, 9, *, *, *) end (0, 17, *, *, *)," +
                "  context SegmentedByCustomer partition by custId from BankTxn";

        //属性获取
        String elp2 = "context NineToFiveSegmented" +
                "select context.NineToFive.startTime, context.SegmentedByCustomer.key1 from BankTxn";


        //TODO unsolved
        String epl3 = "create context CtxNestedTrainEnter" +
                "  context InitCtx initiated by TrainEnterEvent as te terminated after 5 minutes," +
                "  context HashCtx coalesce by consistent_hash_crc32(tagId) from PassengerScanEvent" +
                "    granularity 16 preallocate";
        //属性获取
        String epl4 = "context CtxNestedTrainEnter" +
                "select context.InitCtx.te.trainId, context.HashCtx.id," +
                "  tagId, count(*) from PassengerScanEvent group by tagId";
        return null;
    }

    /**
     * 查看Context的内容
     * Output When Context Partition Ends
     * context 的内容输出参考 {@link EPL_3_Output}
     *
     * @return epl[]
     */
    protected static String[] ContextEndsOutPut() {
        String epl1 = " create context OverLapping initiated InitialEvent terminated TerminateEvent";
        String epl2 = "context OverLapping select * from User output snapshot when terminated";

        // 每两分钟输出OverLapping的事件
        String epl3 = "context OverLapping select * from User output snapshot every 2 minute";
        return null;
    }

}


© 著作权归作者所有

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

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

贾峰uk
2018/08/30
68
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
50
0
Esper学习笔记四:EPL语法(2)

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

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

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

贾峰uk
2018/09/03
72
0
大数据:美团酒旅实时数据规则引擎应用实践

背景 美团点评酒旅运营需求在离线场景下,已经得到了较为系统化的支持,通过对离线数据收集、挖掘,可对目标用户进行T+1触达,通过向目标用户发送Push等多种方式,在一定程度上提高转化率。但...

meituantech
2018/04/19
0
0

没有更多内容

加载失败,请刷新页面

加载更多

PostgreSQL 11.3 locking

rudi
今天
5
0
Mybatis Plus sql注入器

一、继承AbstractMethod /** * @author beth * @data 2019-10-23 20:39 */public class DeleteAllMethod extends AbstractMethod { @Override public MappedStatement injectMap......

一个yuanbeth
今天
10
1
一次写shell脚本的经历记录——特殊字符惹的祸

本文首发于微信公众号“我的小碗汤”,扫码文末二维码即可关注,欢迎一起交流! redis在容器化的过程中,涉及到纵向扩pod实例cpu、内存以及redis实例的maxmemory值,statefulset管理的pod需要...

码农实战
今天
4
0
为什么阿里巴巴Java开发手册中不建议在循环体中使用+进行字符串拼接?

之前在阅读《阿里巴巴Java开发手册》时,发现有一条是关于循环体中字符串拼接的建议,具体内容如下: 那么我们首先来用例子来看看在循环体中用 + 或者用 StringBuilder 进行字符串拼接的效率...

武培轩
今天
8
0
队列-链式(c/c++实现)

队列是在线性表功能稍作修改形成的,在生活中排队是不能插队的吧,先排队先得到对待,慢来得排在最后面,这样来就形成了”先进先出“的队列。作用就是通过伟大的程序员来实现算法解决现实生活...

白客C
今天
81
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部