EPL Every Limit Subexpression Lifetime

如何解决EPL Every Limit Subexpression Lifetime

我对“每个”模式有一个特殊情况,这是示例代码

SELECT * FROM PATTERN [
        every(
         e1=Event(device_ip IN ( '10.10.10.1' ) AND category IS NOT NULL ))where timer:within(1800 Sec)
        ->              
         e2=Event(device_ip IN ( '10.10.10.1' ) AND event_cat_name.toLowerCase() IN ('User')  AND log_session_id = e1.log_session_id)
        ->
         e3=Event(device_ip IN ( '10.10.10.1' ) AND result.toLowerCase() IN ('Block') AND log_session_id = e1.log_session_id )
->
         e4=Event(device_ip IN ( '10.10.10.1' ) AND category IS NOT NULL AND log_session_id != e1.log_session_id)
        ->          
         e5=Event(device_ip IN ( '10.10.10.1' ) AND event_cat_name.toLowerCase() IN ('User')  AND log_session_id = e4.log_session_id)
        ->          
         e6=Event(device_ip IN ( '10.10.10.1' ) AND result.toLowerCase() IN ('Block') AND log_session_id = e4.log_session_id )
->
         e7=Event(device_ip IN ( '10.10.10.1' ) AND category IS NOT NULL AND log_session_id != e4.log_session_id)
        ->          
         e8=Event(device_ip IN ( '10.10.10.1' ) AND event_cat_name.toLowerCase() IN ('User')  AND log_session_id = e7.log_session_id)
        ->
         e9=Event(device_ip IN ( '10.10.10.1' ) AND result.toLowerCase() IN ('Block') AND log_session_id = e7.log_session_id )
];    

让我解释一下:

我们知道“every”模式将在找到内容后重置并创建另一个“Window”寻找相同的事件,在这种情况下,我们将每个模式应用于“e1”事件。

上面的代码是针对 9 个事件,它们被 3 个事件“分组”,如您所见,从“e1”到“e3”对应于 1 个唯一事件,从“e4”到“e6”对应另一个唯一事件,依此类推上,我们知道的每 3 个事件都是相同的唯一事件,因为只有这 3 个事件在“log_session_id”中具有相同的 ID,但我们知道从“e1”到“e3”的事件与从“e4”到“e6”不同“e7”到“e9”,因为每个唯一事件在“log_session_id”中都有不同的 ID。

所以当我们有以下事件序列时:e1、e2、e3、e4、e5、e6、e7、e8、e9

当检测到“e1”到“e3”时,模式每次重置并搜索“e1”的相同事件......直到现在一切正常,但是当“e4”事件到达时,因为“e1”和“e4”几乎是相同的条件,第一个窗口匹配并且也匹配每次重新启动时创建的新窗口。我们在 "e4" 不同条件中,但在 "e1" 位置还不知道它们,所以因为 e1 一开始不知道 e4 存在,所以在新窗口中匹配并且直到现在打开了 2 个窗口: 第一个有 2 个独特的事件(e1 到 e6) 第二个有 1 个唯一窗口(e4 到 e6)。

当 "e7" 到 "e9" 到达时,会生成一个窗口,到目前为止我们总共有 3 个窗口: 第一个有 3 个独特的事件(e1 到 e9), 第二个有 2 个独特的事件(e4 到 e9) 第三个有 1 个唯一事件(e7 到 e9)。

那么,您知道如何使用 every 限制到第一个 Window 吗?我们已经尝试过 AND NOT 但我们无法做到。

解决方法

您可以通过对相同表达式过滤器使用 insert-into 使该模式更小且更易读:

// use this for all the same-expression filters
insert into FilteredStream select Event(device_ip IN ( '10.10.10.1' )); 

select * from pattern [every(
         e1=FilteredStream(category IS NOT NULL )) where timer:within(1800 Sec)
        ....)];

对于去除重叠匹配,有多种选择,例如:

  • 让重叠匹配发生并在输出事件上使用子查询来查看它是否重叠
  • 改用匹配识别,它会自动跳过过去的最后一场比赛

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?