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
이 솔루션의 문제점은 필자가 필요로하는 조건이 일치하지 않는 라인을 잃게된다는 것입니다. 나는이 점에 관해서 질문을 편집한다. LEFT OUTER JOIN 및 창에 관해서는 현재 예상대로 작동하기 때문에 당신이 말한 것을 이해하지 못합니다. – Astrorvald
이를 위해 부정확성을 검사하고 업데이트 된 답변에 표시된대로 다른 스트림으로 방출 할 수 있습니다. – Grainier
흠,하지만 아무 조건이 없으면 부정은 모든 생성 된 행을 결합합니다. 아니요? 창에 관해서는 첫 번째로 제공되는 질문에서 무언가를 잊어 버렸습니다. # window.length (1); – Astrorvald