これは、ネストされたコンテキストが OR 関係ではないためです。OR の場合、この例の最後にあるようなパターンを使用します。
イベントの種類を AStart、AEnd、BStart、BEnd、および C とします。
create context CtxSampleNestedContext
context SpanA start AStart end AEnd,
context SpanB start BStart end BEnd;
context CtxSampleNestedContext select count(*) from C;
上記の EPL ステートメントを作成した後、エンジンは AStart イベントのみの検索を開始し、AEnd、BStart、BEnd、または C イベントはまだ検索しません。
次に AStart イベントが到着するとします。
- エンジンは AStart イベントの検索を停止します。
- エンジンは、現在の SpanA ライフサイクルの終了を意味するため、AEnd イベントの検索を開始します。
- エンジンは、SpanB ライフサイクルの開始を検出するために、BStart イベントの検索を開始します。
このシナリオでは、BStart イベントが到着したとします。論理的には、これが SpanB ライフサイクルの始まりです。
- エンジンは、BStart イベントの検索を停止します。
- エンジンは、現在の SpanB ライフサイクルの終了を意味するため、BEnd イベントの検索を開始します。
- エンジンは、現在の SpanA ライフサイクルの終了を意味するため、AEnd イベントを探し続けます。
- エンジンは C イベントの検索を開始し、到着する各 C のカウントを開始します。
このシナリオでは、BEnd イベントが到着したとします。これは、論理的には、SpanB ライフサイクルの終わりです。
- エンジンは BEnd イベントの検索を停止します。
- エンジンは C イベントの検索を停止し、それぞれのカウントを停止します。
- エンジンは、別の SpanB ライフサイクルの開始を意味するため、BStart イベントの検索を開始します。
このシナリオでは、AEnd イベントが到着したとします。これは、論理的には、SpanA ライフサイクルの終わりです。
- エンジンは AEnd イベントの検索を停止します。
- エンジンは BStart イベントの検索を停止します。
- エンジンは、別の SpanA ライフサイクルの開始を意味するため、AStart イベントの検索を開始します。
上記のシナリオでは、AEnd が到着した後、エンジンはステートメントが最初に作成された後のエンジンと同じ状態に戻ります。
たとえば、ユースケースで論理 OR 関係が必要な場合 (上記とは異なります):
create context CtxSampleNestedContext
start pattern[every a=AStart or every a=BStart] as mypattern
end pattern[every AEnd or every BEnd]