2016-06-15 25 views
0

我有事件的序列是這樣的:艾斯波計數的重複事件模式

  1. 事件A開始序列
  2. 多個事件乙發生
  3. 事件C停止序列

我用一種模式[每個A - >(B直到C)]做了它,它似乎是正確的(你怎麼看?)。但我努力從序列中出現的B事件中檢索和聚合信息。我想簡單地有一個計數,也許一些avgs,但似乎沒有工作(example1返回1,示例2返回0和示例3返回null,即使我的B事件存在)。

insert into CreateMeasurement 
select 
    C.source   as source, 
    "carDrivingAnalyse" as type, 
    C.time    as time, 
    { 
     "example1", count(*), 
     "example2", count(B), 
     "example3", B.countOf() 
    } as fragments 

from pattern [ 
    every A = EventCreated(
     type = "Ignition", 
     getString(A, "Ignition.status") = "ON") 

    -> (
     B = EventCreated(
      type = "DrivingEvent", 
      source = A.source, 
      getString(B, "DrivingEvent.prop1") = getString(A, "Ignition.prop1"), 
      getNumber(B, "DrivingEvent.prop2") = getNumber(A, "Ignition.prop2")) 

     until C = EventCreated(
      type = "Ignition", 
      getString(C, "Ignition.status") = "OFF", 
      source = A.source, 
      getString(C, "Ignition.prop1") = getString(A, "Ignition.prop1"), 
      getNumber(C, "Ignition.prop2") = getNumber(A, "Ignition.prop2")) 
    ) 
] 

回答

0

我會選擇這種使用情況採用不同的方法和使用的,而不是一個模式的上下文:

create context EventContext 
    context PartionBySource 
    partition by event.source.value from EventCreated, 
    context ContextBorders 
    initiated by EventCreated(type="EventA") as startEvent 
    terminated by EventCreated(event.type="EventC"); 

這已經是一個比較複雜的情況下,因爲它使用兩個嵌套的上下文。該是在Cumulocity文檔(http://cumulocity.com/guides/event-language/advanced/#contexts)上下文的一些基本覆蓋,但對於這種先進的用法我會推薦更詳細的超能力者文檔http://www.espertech.com/esper/release-5.3.0/esper-reference/html/context.html

總之這種情況下做到這一點:根據EventCreated

流會首先通過其源設備對事件進行分區。每次有EventA時它都會創建一個新的上下文分區(只有當此設備沒有上下文分區時)。隨着EventC的到來,此設備的上下文分區將結束。

現在您也可以例如使用此背景下的是這樣的:

context EventContext 
select 
    count(*) as count, 
    avg(getNumber(e, "speed")) as speed 
from EventCreated e 
where e.event.type = "EventB" 
output last when terminated; 

此語句使用的上下文。它將在上下文分區結束時輸出結果(所以當EventC到達時)。它只會輸出最後一個事件(在沒有最後一個關鍵字的情況下,它將輸出分區激活時收到的每個事件)。 在此示例中,它將輸出上下文分區存在期間接收的事件數量和EventB中「速度」片段的平均值。

請注意,這裏沒有必要按源執行任何過濾,因爲上下文已經按事件源按事件分割EventCreated。

+0

感謝您的回答,我正在閱讀esper文檔,並試圖編寫上下文,但我已經在努力翻譯我的模式。看,我簡化了我的例子,說事件B和C必須有相同的來源作爲A,但實際上他們有更多的屬性來檢查(我編輯了我的原始帖子),現在我無法複製getString/getNumber功能在我的上下文中。 –

+0

另外,條件計數呢?類似於「e.countOf(event - > getNumber(event,」c8y_HarshBehavior.speed「)> 100)」除非這不起作用。 –

+0

我會把getNumber(事件,「c8y_HarshBehavior.speed」)> 100到where子句 – TyrManuZ

0

我不是專家,但「count()」永遠不會返回「null」。你的觀察在這方面可能是錯誤的。 「count()」是一個聚合函數,用於統計from-clause子句中出現的次數。對於模式,它計數模式匹配的數量。

「count(B)」計算表達式中(不同的)非空值的數量請參閱doc。這也不會返回「null」。

根據您的測試數據,「example3」是您希望確保實際上有多個B事件在C事件之前到達的事件。

+0

我的不好,你是對的,例1(count(*))重新1,邏輯上,因爲整個模式匹配一​​次。例2(count(B))返回0,例3(B.countOf())返回null,就像沒有創建事件B一樣。但事實並非如此,有事件B. –

+0

簡化聲明併發佈一個在此使用EPL工具的示例。 EPL工具鏈接是http://esper-epl-tryout.appspot.com/epltryout/mainform.html – user3613754