2016-09-08 4 views
0

WSO2 CEP 4.1.0을 사용하는 이벤트에 필터링 기능을 구현해야합니다. 내 필터는 PostgreSQL 데이터베이스에 저장됩니다.WSO2 CEP에서 event_table에 복잡한 결합 조건

이렇게하려면 event_table 구성을 만들고이 event_table 스트림에서 내 이벤트에 가입하십시오. 내 필터는 기본 값을 가질 수 있습니다, 그래서 나는 복잡한 가입 조건이 필요합니다

from my_stream#window.length(1) left outer join my_event_table as filter 
    on (filter.field1 == '' OR stream.field1 == filter.field1) 
    AND (filter.field2 == '' OR stream.field2 == filter.field2) 

(내가 다른 프로세스가 있어야하기 때문에 필터가 발견되거나되지 않은 경우 LEFT OUTER JOIN을 수행하십시오 : 나는 필터를 찾을 경우 , my_stream에 정보를 입력하고 이벤트를 데이터베이스 테이블에 저장하고, 그렇지 않은 경우 다른 데이터베이스 테이블에 이벤트를 저장합니다.

on filter.field1 == '' OR stream.field1 == filter.field1 
AND filter.field2 == '' OR stream.field2 == filter.field2 

기능의이 종류를 구현하는 방법은 생성 플러그인없이, 거기 : 시스템 추출 할 때 부울 해석이 잘못 있도록

문제는,이 괄호를 제거 조건을 해석하는 조인 ?

감사합니다.

편집 : 이것은 내가 찾은 현재의 솔루션입니다,하지만 난 성능과 복잡성에 대해 두려워, 그래서 다른 일을 찾아 :

#first, I left join on my event_table 
from my_stream#window.length(1) left outer join my_event_table as filter 
     on (filter.field1 == '' OR stream.field1 == filter.field1) 
select stream.field1, stream.field2, stream.field3, filter.field1 as filter_field1, filter.field2 as filter_field2, filter.field3 as filter_field3, filter.info1 
insert into tempStreamJoinProblemCount 

#if the join return nothing, then no filter for my line 
from tempStreamJoinProblemCount[filter_field1 IS NULL] 
insert into filter_not_found 

#if the join return some lines, maybe 1 of these lines can match, I continue to check 
from tempStreamJoinProblemCount[NOT filter_field1 IS NULL] 
select field1, field2, field3, info1 
#I check my complex joining condition and store it in a boolean for later: 1 then my filter match, 0 then no match 
convert(
(filter_field2=='' OR field2 == filter_field2) 
AND(filter_field3=='' OR field3 == filter_field3),'int') as filterMatch 
insert into filterCheck 

#if filterMatch is 1, I extract the filter information (info1), else I put a default value (minimal value); custom:ternaryInt is just the ternary function: boolean_condition?value_if_true:value_if_false 
from computeFilterMatchInformation 
select field1, custom:ternaryInt(filterMatch==1, info1, 0) as info1, filterMatch 
insert into filterCheck 

#As we did not join on all fields, 1 line has been expanded into several lines, so we group the lines, to remove these generated lines and keep only 1 initial line; 
from filterMatchGroupBy#window.time(10 sec) 
#max(info1) return only the filter value (because the value 0 from previous stream is the minimal value); 
#sum(filterMatch) return 0 if there is no match, and 1+ if there is a match 
select field1, max(info1) as info1, sum(filterMatch) as filter_match 
group by field1, field2, field3 
insert into filterCheck 

#we found no match 
from filterCheck[filter_match == 0] 
select field1, field2, field3 
insert into filter_not_found 

#we found a match, so we extract filter information (info1) 
from filterCheck[filter_match > 0] 
select field1, field2, field3, info1 
insert into filter_found 

답변

0

기본적으로 left outer join 이벤트 테이블과 작동하지 않을 수 있습니다. 이벤트 테이블이 활성 구성 (스트림과 같음)이 아니기 때문입니다. 따라서 우리는 이벤트 테이블에 창을 할당 할 수 없습니다. 그러나 조인하려면 (외부 조인) 각 스트림을 창과 연관시켜야합니다. 우리가 이벤트 테이블을 가지고 그렇게 할 수 없으므로 어쨌든 외부 조인은 작동하지 않습니다.

그러나 시나리오를 해결하려면 을 조건없이 my_event_table에 참여시키고 결과 이벤트를 중간 스트림으로 내보내고 해당 중간 스트림의 조건을 확인할 수 있습니다. 이와 비슷한 것을 시도해보십시오.

from my_stream join my_event_table 
select 
    my_stream.field1 as streamField1, 
    my_event_table.field1 as tableField1, 
    my_stream.field1 as streamField2, 
    my_event_table.field1 as tableField2, 
insert into intermediateStream; 

from intermediateStream[((tableField1 == '' OR streamField1 == tableField1) AND (tableField2 == '' OR streamField2 == tableField2))] 
select * 
insert into filtereMatchedStream; 

from intermediateStream[not ((tableField1 == '' OR streamField1 == tableField1) AND (tableField2 == '' OR streamField2 == tableField2))] 
select * 
insert into filtereUnMatchedStream; 
+0

이 솔루션의 문제점은 필자가 필요로하는 조건이 일치하지 않는 라인을 잃게된다는 것입니다. 나는이 점에 관해서 질문을 편집한다. LEFT OUTER JOIN 및 창에 관해서는 현재 예상대로 작동하기 때문에 당신이 말한 것을 이해하지 못합니다. – Astrorvald

+0

이를 위해 부정확성을 검사하고 업데이트 된 답변에 표시된대로 다른 스트림으로 방출 할 수 있습니다. – Grainier

+0

흠,하지만 아무 조건이 없으면 부정은 모든 생성 된 행을 결합합니다. 아니요? 창에 관해서는 첫 번째로 제공되는 질문에서 무언가를 잊어 버렸습니다. # window.length (1); – Astrorvald