段可以在相同的时间被应用到来自事件流的多个事件一而可以以非并行的、顺序的方式处理CEP查询的其他片段。
[0033]可以按时间对事件流中的事件排序,以使得查询处理器可以在接收事件流中最新的事件之前接收那个事件流中最旧的事件。根据本发明的实施例,CEP查询处理器可以从用户处接收指示指定的CEP查询中的没有任何部分、全部或至少一部分可以以并行的方式、或换句话说并行地被处理的指令。例如,用户可以通知CEP查询处理器指定的CEP查询是完全有序的。在这样的情况下,CEP查询处理器可以确定指定的CEP查询中没有任何部分可以以并行的方式被处理,这是因为对完全有序的CEP查询的并行处理可以使得被处理的事件丢失它们的次序。例如另一个实例,用户可以通知CEP查询处理器指定的CEP查询是无序的。如果CEP查询处理并输出来自事件流的事件所依照的次序对用户来说不重要,那么CEP查询是无序的。例如又一个实例,用户可以通知CEP查询处理指定的CEP查询是分区有序的。如果对于CEP查询的分区中的每一个分区,该分区内的事件必须相对于该分区内的其他事件按次序地被处理,但不一定相对于其它分区内的事件按次序地被处理,那么CEP查询是分区有序的。基于用户的指令,CEP查询处理器可以确定CEP查询的哪些片段(如果有的话)可以以并行的方式被处理。基于分区的处理涉及的每个分区可以包含来自不同类别的事件。例如,基于分区的处理可以涉及针对具有在相同事件流内表示的股票价格事件的每个单独公司计算单独的平均股票价格。在这样的情况下,依照股票代码对CEP查询概念地分区。CEP查询可以通过包含“分组(group by)”子句指示它涉及基于分区的处理。
[0034]在实施例中,CEP查询的并行处理不会使得事件流中的多个事件被并行地处理。反而,CEP查询的并行处理可以使得该CEP查询的多个部分或多个操作相对于事件流内的特定事件被并行地执行。对于事件流中的每个这样的特定事件,CEP查询的那些多个部分可以相对于该特定事件被并行地执行。在本发明的实施例中,CEP处理器可以通过执行多个线程以并行方式相对于事件处理CEP查询的一部分,其中每个线程可以相对于事件并行地执行CEP查询的操作。当这发生时,无法保证关于多个线程中的哪一个线程将首先完成对它的操作的执行。单个线程可以致力于从事件流中提取事件以防所述事件无意中变得无序。
[0035]在实施例中,CEP查询处理器可以接收来自用户的输入,该输入指示由那个用户的应用所具备的某些约束。例如,用户可以具有在控制面板上显示股票价格的应用。可以从事件流中读取股票价格。情况可能是用户不关心来自事件流的股票价格是否严格地按时间次序显示。在这样的情况下,用户的应用可以应对无序的事件。在其它情况下,用户的应用可以要求事件保持有序。例如,应用可以涉及响应于股票价格已经降低到特定阈值以下的确定,对股票的自动买卖。在这样的情况下,股票价格事件的次序按次序地被处理将是重要的。该应用所属于的用户可以通知CEP查询处理器在这一方面该应用所具备的排序约束(如果有的话)。
[0036]在实施例中,在接收来自用户的这样的约束信息之后,CEP查询处理器可以确定CEP查询中的哪些片段或操作可以以并行的方式被执行而仍然维持那些约束。在实施例中,CEP处理器可以应用特定的“运算(calculus)”以做出此确定。在做出此确定中,CEP处理器可以确定机器的中央处理单元、和/或系统的节点可以被最大化地利用以执行CEP查询而仍然认可约束所采用的方式。
[0037]潜在地,多个不同的CEP查询可以针对相同的事件流执行。在CEP系统中,多个不同的CEP查询可以向CEP系统注册并且然后针对事件流被连续地执行。每个这样的CEP查询可以被概念地构思为操作符的树,每个操作符都具有操作类型。在本发明的实施例中,CEP查询处理器可以概念地通过将那些CEP查询的操作符树结合在一起,将针对相同的事件流要被执行的所有CEP查询集合在一起。CEP查询处理器可以通过首先将每个CEP查询分解成为构成该CEP查询的低级别的操作符来执行此结合。以这样的方式分解CEP查询不一定在CEP查询处理系统内引发任何额外的代价,这是因为无论如何这样的CEP查询经常由于其它原因以这样的方式被分解。在本发明的实施例中,CEP查询处理器可以将CEP查询分解成的操作的种类包括(I)过滤操作、(2)选择操作、(3)投影操作、和(4)连接操作,以及潜在地其他种类的操作。这些是通常在可以针对数据库系统执行的查询中找到的相同种类的操作。CEP查询处理器然后可以基于这些低级别操作符的操作类型确定这些低级别操作符中的潜在地来自于单独的CEP查询的哪些操作符可以被共享。
[0038]例如,多个CEP查询可以执行过滤操作。过滤操作可以选择性地输出与从事件流接收到的所有事件相比较少的事件;过滤操作可以从事件流中过滤出不符合特定于操作的过滤标准的其它事件,以使得过滤操作不将那些事件传递到其它查询操作。在实施例中,如果CEP查询的集合中的多个CEP查询针对事件流执行过滤操作,那么CEP查询处理器可以确定在这些CEP查询中的所有过滤操作可以共享相同的过滤操作符,即使这些过滤操作的过滤标准不同。在实施例中,诸如分组(group-by)操作和聚集操作之类的某些其它类型的操作不被允许共享操作符,即使针对事件流执行的多个CEP查询执行那些类型的操作。因此,根据本发明的实施例,诸如过滤操作之类的仅仅某些指定类型的操作可以共享操作符。在本发明的实施例中,CEP查询处理器可以将可以由针对相同的事件流执行的多个CEP查询共享的所有操作符结合在一起,并且留下未结合的所有其它操作符。因此,来自多个CEP查询的多个过滤操作可以通过使得那些过滤操作共享单个过滤操作符而被结合在一起,而分组操作、聚集操作、和其它种类的不可共享的操作可以保留单独的操作符。在本发明的实施例中,CEP查询处理器可以试图使尽可能多的操作共享由上面讨论的操作类型考虑所限制的相同的操作符。
[0039]在本发明的实施例中,CEP查询处理器可以将以这样的方式确定和创建的操作符集合连接到一起,潜在地与一些共享一起,成为操作符的有向图。在该图中,操作符可以基于它们的输入和输出被连接到一起。输出事件到其它操作符的操作符可以具有到图中的那些其它操作符的外出链路。从其它操作符接收事件的操作符可以具有从图中的那些其它操作符的进入链路。特定的操作符可以具有来回于图中的其他操作符的多个进入和/或外出链路。如果该特定的操作符是由针对事件流执行的多个单独的CEP查询共享的操作符,这尤其可能出现。因此,来自第一 CEP查询的操作符和来自第二 CEP查询的操作符都可以将事件输出到由第一和第二 CEP查询共享的特定的过滤操作符。如此被共享的该特定的过滤操作符可以将事件从第一 CEP查询输出到另一个操作符并且从第二 CEP查询输出到另一个操作符。
[0040]总体来说,然后操作符的有向图可以具有多个根操作符(每个CEP查询具有一个)、多个中间操作符和多个叶操作符。每个根操作符可以直接从事件流接收事件作为输入并且将那些事件输出到其它操作符。叶操作符可以从其它操作符接收事件,针对那些事件执行操作,并且然后将那些事件输出到应用的事件消费者,诸如基于那些事件显示输出的应用组件。CEP查询处理器可以基于操作符的操作类型对有向图内的这些操作符彼此进行组织。因此,例如,CEP查询处理器可以保证从事件流中提取事件的操作符在过滤那些事件的过滤操作符之前到来,或将输出传递到该过滤操作符。同样,例如,CEP查询处理器可以保证这样的过滤操作符在聚集那些事件指定的数据的聚集操作符(例如,计算平均值)之前到来,或将输出传递到该聚集操作符。这种组织可以基于为了使聚集被适当地执行应当在聚集之前执行过滤的事实,但是这可以潜在地取决于CEP查询的特定语法而变化。
[0041]在本发明的实施例中,CEP查询处理器可以针对操作符的有向图中的操作符执行递归技术以确定图中操作符中的哪一个可以与那个图中的其它操作符并行地执行它的操作。更具体地,CEP处理器可以执行此技术以确定图中的每个操作符可以与那个图中的其它操作符并行地执行它的操作所到的程度。如上述讨论,操作符的有向图中的操作符中的一些操作符是图中距离事件流本身最远的叶操作符(根操作符距离事件流最近)。根据一个实施例,CEP查询处理器可以通过针对操作符的有向图中的每个叶操作符执行递归技术开始。递归技术可以涉及确定对其执行技术的特定操作符可以与其它操作符并行地被执行所到的程度。反过来,此确定可以涉及首先对所有其它操作符递归地执行相同的技术,特定操作符在操作符的有向图中具有从所述所有其它操作符的进入链路。如果对其执行递归技术的操作符是直接从事件流接收事件的根操作符,那么可以针对事件流本身递归地执行技术。事件流具有某些属性。这些属性指示事件流是否是完全有序的、无序的、或基于某种指定分区而分区有序的。在实施例中,如上所述,这些属性可以由从事件流接收事件的应用的用户指定。
[0042]根据本发明的实施例,在针对操作符的有向图中的特定操作符执行递归技术期间,指示可以与其它操作符并行地执行特定操作符所到的程度的约束可以以下面的方式针对特定的操作符确定。首先,特定操作符的“继承的”约束可以基于在有向图中的它的“父级”(它具有从其而来的进入链路或它从其中接收输入的操作符)的约束被确定。然后,另一个基于特定操作符自己的操作类型的基于类型的约束可以针对特定的操作符确定。特定操作符的最终约束可以基于它的继承的约束和它的基于类型的约束。例如,特定操作符的最终约束可以是它的继承的约束和基于类型的约束中最受限的。
[0043]为了确定特定操作符的继承的约束,首先,根据递归技术,可以确定特定操作符在图中具有从其而来的进入链路的其它操作符中的每个操作符的最终约束。特定操作符的继承的约束然后可以变为那些其它操作符中的最受限的最终约束。在实施例中,完全有序是最受限的约束。在实施例中,分区有序是与完全有序相比较少受限的约束,但与无序相比更受限。在实施例中,无序是最少受限的约束。
[0044]因此,例如,如果特定操作符具有从操作符的有向图中的三个其它操作符来的进入链路,并且如果这些其它操作符的最终约束是完全有序、分区有序、和无序,那么特定操作符的继承的约束可以变为完全有序(特定操作符具有从其而来的进入链路的其它操作符的约束中最受限的),意味着特定操作符根本不能与其它操作符并行地被执行。例如另一个实例,如果特定操作符具有从操作符的有向图中的两个其它操作符来的进入链路,并且如果这些其它操作符的最终约束两者都是无序的,那么特定操作符的继承的约束类似地可以变为无序。可以基于事件流的属性确定事件流本身的约束。
[0045]在基于特定操作符具有从其来的进入链路的其它操作符的约束确定特定操作符的继承的约束之后,特定操作符的最终约束可以变为它的继承的约束,除非特定操作符的基于类型的约束比它的继承的约束更受限。每个操作符可以具有操作类型,并且每个操作类型可以具有约束,该约束是完全有序、分区有序或无序。例如,过滤操作类型可以具有无序的约束;执行过滤所按照的次序不重要。但是,另一个实例,标准偏差操作类型可以具有完全有序的约束。因此,即使标准偏差操作符的继承的约束是无序或分区有序,标准偏差操作符的最终约束可以变为完全有序,这是因为操作符的基于类型的约束比操作符的继承的约束更受限。因此,在本发明的一个实施例中,特定操作符的最终约束可以变为以下约束中最受限的:(a)特定操作符具有在操作符的有向图中的从其来的进入链路的操作符的约束和(b)特定操作符自身的基于类型的约束。如果特定操作符具有到操作符的有向图中的其它操作符的外出链路,那么它可以是用于至少部分地确定那些其它操作符的继承的约束的特定操作符的这个