2017-12-28 15 views
0

규칙 구성 객체를 사용하여 규칙 자체를 외부 구성 할 수있는 규칙 시스템을 설계하려고합니다. 특히, 특정 유형의 규칙에 대한 규칙 실행 사이의 최소 시간을 DRL 규칙 정의에 외부 적으로 구성하려고합니다.변수 창 앞이나 뒤에?

내 접근 방식은 지금까지 사실 ValueRuleSpec으로 규칙 구성을 삽입하는 것입니다

rule "Any value detected" 
when 
    $r : ValueRuleSpec(mode == ValueRuleSpecMode.ANY(), $devices: devices) 
    $e : SensorEvent(deviceId memberOf $devices) from entry-point FMSensorEvents 
    not Activation(ruleSpec == $r, cause == $e) 
then 
    insert(new Activation($r, $e)); 
end 

의 $ R ValueRuleSpec 개체 속성 활성화 사이의 최소 시간 (초)을 포함 triggerEvery 있습니다. 어떻게이 사용하여 구성 가능한 시간 창에이 작업을 수행 할 수

not Activation(this before[60s, 0s] $e) 

:이 같은 것을 사용하여 $ 전자 전에 특정 범위 내에 정품 인증 개체의 부재에 대한 테스트를 통해 정적으로 수행 할 수 있다는 것을 알고 $ r.triggerEvery 속성은 초 수입니까?

+1

시간적 사업자 시간 표현에서 참조 된 사건들의 시간 기록을 포함하는 어떤 조건들에 대한 통사론 적 설탕. Drools 매뉴얼에서 연산자의 정의를 찾을 수 있습니다. 세 번째 사실에서 오는 매개 변수를 포함하면서 동일한 관계를 계산하는 정적 메서드의 DRL 함수를 작성하는 것이 너무 어렵지 않아야합니다. 이벤트가 삽입 될 때 Java 코드로 설정되는 이벤트의 필드로 시간 소인을 가져야 할 수도 있습니다. – laune

답변

0

laune의 조언에 따라 내 자신의 질문에 대답합니다.

키워드의 동작은 described in the manual대로입니다 전에 : 및 $ eventB 시작 $ eventA 완료 시간과 시간 사이의 시간적 거리 인 경우에만 경우

$eventA : EventA(this before[ 3m30s, 4m ] $eventB) 

이전의 패턴이 일치합니다 (3 분 30 초)와 (4 분) 사이. 즉 :

3m30s <= $eventB.startTimestamp - $eventA.endTimeStamp <= 4m 

source code for the before evaluator을 찾고 우리는 같은를 볼 수 있습니다. 이를 바탕으로

@Override 
protected boolean evaluate(long rightTS, long leftTS) { 
    long dist = leftTS - rightTS; 
    return this.getOperator().isNegated()^(dist >= this.initRange && dist <= this.finalRange); 
} 

나는 그에 따라 내 코드를 수정 한, 제대로 지금 작동하는 것 같다 : 즉,`before`,`after` 등이며,

rule "Any value detected" 
when 
    $r : ValueRuleSpec(mode == ValueRuleSpecMode.ANY(), $devices: devices) 
    $e : SensorEvent(deviceId memberOf $devices) from entry-point FMSensorEvents 
    not Activation(ruleSpec == $r, cause == $e) 
    // no activation within past triggerEvery seconds for same device 
    not Activation(
     ruleSpec == $r, 
     deviceId == $e.deviceId, 
     start.time > ($e.start.time - ($r.triggerEvery * 1000)) 
    ) 
then 
    insert(new Activation($r, $e)); 
end