2017-04-23 3 views
0

동일한 문에서 아래의 두 상황에서 지정된 시간을 선택하고 싶습니다. 그러나 출력이 없습니다. B가 활성 상태이고 C가 단일 문장에서 중첩 된 컨텍스트를 사용하여 활성 상태 일 때 어떻게 결과를 얻을 수 있습니까?왜이 컨텍스트가 작동하지 않습니까?

create context A 
    context B start (0, 12, *, *, *) end (0, 18, *, *, *), 
    context C start (0, 20, *, *, *) end (0, 23, *, *, *); 

진술 :

context A select * from MyEvent; 

답변

1

중첩 된 컨텍스트는 OR 관계되지 않기 때문입니다. OR의 경우이 예의 끝 부분에있는 패턴을 사용하십시오.

는 위의 EPL 문을 생성 한 후, 엔진 만 AStart 이벤트를 찾고 시작을 이벤트 유형 AStart, AEND, BStart, 벤드와 C

create context CtxSampleNestedContext 
    context SpanA start AStart end AEnd, 
    context SpanB start BStart end BEnd; 

context CtxSampleNestedContext select count(*) from C; 

가정 아직 AEND, BStart을 위해 보이지 않는 BEnd 또는 C 이벤트.

는 AStart 이벤트가 다음에 도착하는 것으로 가정합니다 :

  • 엔진은 AStart 이벤트를 찾고 중지합니다.
  • 엔진은 AEnd 이벤트를 찾기 시작합니다. 이는 이 현재 SpanA 수명주기의 끝을 의미하기 때문입니다.
  • 엔진이 SpanB 수명주기 시작 을 감지하기 위해 BStart 이벤트를 찾기 시작합니다.

시나리오에서 BStart 이벤트가 발생한다고 가정합니다. 이것은 논리적으로 SpanB 수명주기의 시작입니다.

  • 엔진이 더 이상 BStart 이벤트를 찾지 않습니다.
  • 엔진은 현재의 SpanB 수명주기가 인 것을 의미하므로 BEnd 이벤트를 찾기 시작합니다.
  • 엔진은 AEnd 이벤트를 찾고 있습니다. 이는 현재 SpanA 라이프 사이클이 으로 끝나기 때문입니다.
  • 엔진이 C 이벤트를 찾기 시작하고 도착한 각 C 의 수를 계산하기 시작합니다.

시나리오에서 BEnd 이벤트가 발생한다고 가정합니다. 이것은 논리적으로 SpanB 수명주기의 끝입니다.

  • 엔진이 BEnd 이벤트를 찾지 않습니다.
  • 엔진이 C 이벤트를 찾는 것을 멈추고 각각의 카운팅을 멈 춥니 다.
  • BSTart 이벤트를 찾기 시작하면 다른 SpanB 수명주기가 시작됩니다.

시나리오에서 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] 
+0

당신이 예를 제공 할 수있는 곳 타이머 : OR 연산자를 사용하여 컨텍스트에 사용되는에 ? – carva

+0

... 패턴 [매 타이머 : (0, 12, *, *, *) 또는 모든 타이머 : (0, 18, *, *, *)] .. 패턴이 작동합니다 ... 패턴 [ 모든 타이머 : at (0, [12, 18], *, *, *)] – user650839

+0

최종 조건은 어떻습니까? ___start 패턴 [매 타이머 : at (0, 12, *, *, *) 또는 모든 타이머 : at (0, 18, *, *, *)] end pattern [매 타이머마다 : *, *) 또는 모든 타이머 : at (0, 23, *, *, *)]; ___ 이 올바른지? – carva