2016-08-17 6 views
0

임시 연산자를 기반으로 값을 수집/누적하는 규칙을 작성하려고합니다.임시 연산자를 기반으로 누적/수집

rule "Zone6 Overlap" 
when 
    $i1 : Instance ($e1 : event == " Vel : 20.99-23.98 km/h : " && $name1 : name) from entry-point "Stream" 
    $i2 : Instance ($e2 : event && $name2 : name && $e2 == $e1 && $name2 != $name1 
    && this overlaps $i1) from entry-point "Stream" 
then 
    System.out.println("** Overlap Event: Velocity Zone 6 ** \nPlayer1: " + $i1.getName() + "\nPlayer2: " 
    + $i2.getName() + "\nEvent: " + $i1.getEvent() + "\n" + "Start Time (P1): " 
    + $i1.getStart() + " - End Time: " + $i1.getEnd() + "\nStart Time (P2): " 
    + $i2.getStart() + " - End Time: " + $i2.getEnd() + "\n"); 
end 

이것은 두 기간의 중복을 관리하는 원래의 규칙입니다.

내가 만들고자하는 규칙의 아이디어는 축구 경기에서 플레이어의 지속 시간이 겹치는 지 확인하는 것입니다. 필드의 9 명까지의 플레이어가 모두 이벤트 변수의 문자열로 지정된 속도 범위로 이동하고 있는지, 한 번에 모두 겹쳐 지는지 확인하고 싶습니다.

누적 및 수집과 관련된 몇 가지 사항을 시도했지만 이러한 이벤트가 발생했을 때 이러한 이벤트를 수집하여 규칙의 오른쪽으로 돌아가서 표준 출력으로 인쇄 할 수있는 방법에 어려움을 겪었습니다.

도와주세요.

감사합니다.

답변

0

당신의 요구 사항을 충족하는 규칙을 만들 수 있어야하지만 난 당신이 의 정확한 정의를 알고 있어야합니다 생각은 Drools가에 키워드를 중복 :

오버랩 평가자는 두 이벤트의 상관 관계 상관 이벤트가 시작되기 전에 현재 이벤트가 시작될 때 일치하고 상관 이벤트가 시작된 후, 상관 이벤트가 완료되기 전에 완료됩니다. 즉 두 이벤트 모두 겹치는 기간이 있습니다.

즉, 하나의 이벤트가 다른 이벤트가 시작되기 전에 시작되고 해당 이벤트가 끝나기 전에 끝나는 경우에만 해당됩니다. 다음의 3 가지 이벤트가 있다고 가정 해 봅시다 :

A [11:19:00-11:19:30] 
B [11:19:15-11:19:45] 
C [11:19:20-11:19:40] 

이 경우, A는 B와 C보다 먼저 시작하고 둘 다 전에 끝납니다. 그것은 A가 B와 C를 중첩한다는 것을 의미합니다. 그러나 B는 C보다 먼저 겹치지 않으므로 C와 겹치지 않습니다. 그러나 C에서 끝납니다. 사용 가능한 각 연산자의 전체 정의는 Drools fusion documentation을 참조하십시오.

그 사용 사례와 일치하는 경우, 다음과 같은 규칙은 지정된 이벤트 중복 모든 이벤트를 수집합니다 : 당신이 볼 수 있듯이

rule "Overlap" 
when 
    $i1 : Instance ($e1 : event == "some event") 
    $instances : List(size > 0) from collect (Instance (event == $e1, this != $i1, 
     this overlappedby $i1)) 
then 
    System.out.println("** Overlap Event for: " + $i1.getName()); 
    for (int i = 0; i < $instances.size(); i++) { 
     System.out.println("Overlaps: " + ((Instance)$instances.get(i)).getName()); 
    } 
end 

, 그것은이 overlappedby 키워드를 사용, 의 역입니다 겹치다..

+0

아하나. 그렇습니다. 기본적으로 시간 연산자 (overlaps)는 틀린 방식으로 라운드되었습니다 (overlappedby 여야합니다). 그리고 수집 기능 대신 누적 기능을 사용해야합니다. Drools 문서 (packt에 의해 쓰여진 책 포함)는 누적 기능을 많이 추진하고있는 것 같습니다. 그래서 왜 내가 그것을 사용할지 여부를 혼란 스러웠습니다. 어쨌든, 도와 줘서 고마워. – Stu

+0

반갑습니다. 괜찮으 시다면 제 대답을 받아 들일 수 있습니까? –

+0

완료. 그냥 나를 위해 빠른 질문에 대답 할 수 있을지 궁금해 : Ive는 목록이며 특정 개체로 채워진 전역 변수를 선언했습니다. 조건이 충족 된 후 RHS에서 전역 배열 내의 해당 객체에 대한 메소드를 호출하는 방법을 알고 있습니까? 감사. – Stu

관련 문제