2016-06-30 43 views
0

我有一個非常簡單的問題來建模,我沒有Esper的經驗,所以我可能會錯誤的方式,所以我想一些見解。Esper非常簡單的上下文和彙總

這裏是場景:我有一個事件流「ParkingEvent」,有兩種類型的事件「SpotTaken」和「SpotFree」。因此,我有一個Esper 上下文,它們都是由id分隔的,並以「SpotTaken」類型的開始事件和「SpotFree」類型的結束事件爲邊界。這個想法是用一個傳感器監測一個停車位,然後彙總數據來計算該點已經被佔用的次數以及佔用的時間。

就是這樣,沒有時間窗口或任何東西,所以它看起來很簡單,但我拼湊數據。下面是我到目前爲止的代碼:

create context ParkingSpotOccupation 
    context PartionBySource 
    partition by source from SmartParkingEvent, 

    context ContextBorders 
    initiated by SmartParkingEvent(
     type = "SpotTaken") as startEvent 

    terminated by SmartParkingEvent(
     type = "SpotFree") as endEvent; 

@Name("measurement_occupation") 
context ParkingSpotOccupation 
insert into CreateMeasurement 
select 
    e.source as source, 
    "ParkingSpotOccupation" as type, 
    { 
    "startDate", min(e.time), 
    "endDate", max(e.time), 
    "duration", dateDifferenceInSec(max(e.time), min(e.time)) 
    } as fragments 
from 
    SmartParkingEvent e 
output 
    snapshot when terminated; 

我得到了相同的數據,最小值和最大值,所以我猜我做財產以後是錯誤的。

當我使用context.ContextBorders.startEvent.time和context.ContextBorders.endEvent.time而不是min和max時,不會觸發measurement_occupation語句。

+0

如何創建許多SmartParkindEvents而上下文是開放的?如果只有一個你的結果是有道理的。你可以刪除輸出的最後一行,然後創建幾個SmartParkingEvents?它應該每次輸出。 – TyrManuZ

回答

0

由於測量已經由您提供的EPL計算,這個計算的時代現貨的情況下(和釋放)的數量和總計達時間:

select source, count(*), sum(duration) from CreateMeasurement group by source