2016-06-15 1 views
0

中の繰り返しイベントをカウント:エスパーは、私はこのように書き一連のイベントを持っているパターン

  1. イベントAは、シーケンス
  2. 複数のイベントBが起こる
  3. イベントCは、シーケンス
を停止して開始します

私はパターン(すべてA - >(BまでC))でそれを行いました、それは正しいようです(あなたはどう思いますか?)。しかし、私はシーケンスで発生したBイベントから情報を取得し、集約するのに苦労しています。私は単純に数といくつかのavgsを持っていますが、何も動作していないようです(example1は1を返します。例2は0を返し、example 3はnullを返します。

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"); 

、2つのネストされたコンテキストを使用していますので、それはすでに、より複雑な状況です。それをストリームする

EventCreatedに基づいて:Cumulocityドキュメント(http://cumulocity.com/guides/event-language/advanced/#contexts)でのコンテキストのいくつかの基本的な報道であるが、この高度な使用法のために私は、この文脈でこれを行い要約すると、より詳細なエスパーのドキュメントhttp://www.espertech.com/esper/release-5.3.0/esper-reference/html/context.html

をお勧めします最初にソースデバイスでイベントを分割します。 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内の「speed」フラグメントの平均値を出力します。

ソースがEventCreatedのイベントをソースですでに分割しているため、ここでソースによるフィルタリングを行う必要はありません。

+0

あなたの答えをありがとう、私はesperのドキュメントを読んでいると私は文脈を書こうとしていますが、私はすでに私のパターンを翻訳するのに苦労しています。イベントBとCはAと同じソースを持っていなければならないと言って私の例を単純化しましたが、実際には私が元の投稿を編集したプロパティが多くあり、今はgetString/getNumberを複製できません私の文脈では機能します。 –

+0

また、条件付きカウントはどうですか?何か "e.countOf(イベント - > getNumber(イベント、" c8y_HarshBehavior.speed ")> 100)のようなものですが、これは動作しません。 –

+0

私はgetNumber(イベント、 "c8y_HarshBehavior.speed")> 100をwhere節に入れようとしています – TyrManuZ

0

私は専門家ではありませんが、 "count()"は "null"を返しません。その点であなたの観察はおそらく間違っています。 "count()"は、from-clause内にあるものの出現回数を数える集計関数です。パターンの場合、パターンマッチの数をカウントします。

「count(B)」は、式docのnull以外の値の数をカウントします。それも "null"を返しません。

"example3"は、テストデータに従って実際に複数のBイベントがCイベントより先に到着していることを確認するだけです。

+0

私はあなたが間違っています。例1(count(*))は、パターン全体が一度一致したため、論理的に1をretrurnsします。イベントBが作成されなかったのと同じように、例2(count(B))は0を返し、例3(B.countOf())はnullを返します。しかし、それは事実ではない、イベントBがあった。 –

+0

ステートメントを簡略化し、ここでEPLツールを使用する例を投稿する。 EPLツールのリンクはhttp://esper-epl-tryout.appspot.com/epltryout/mainform.htmlです – user3613754

関連する問題