2017-11-09 3 views
0

두 개 이상의 메모리에 BMSContract 개체 컬렉션이 있으면 BMSContract.status 필드를 사용하여 특정 패턴을 일치시켜야합니다. 그러한 컬렉션에서 정확히 하나의 BMSContract가 ACTIVE 상태 인 경우에만 내 규칙이 Success로 처리됩니다. 다른 모든 개체 및 상태 코드의 조합은 실패로 해결됩니다. 이 규칙은 2 개 이상의 개체 만 수집하고 2 개, 5 개, 10 개, 15 개 또는 그 이상이 될 수 있습니다. 단일 BMSContract 레코드를 관리하는 규칙이 약간 다릅니다. 이 규칙은 단지 이들과 같은 여러 기록 시나리오에 특정 :Drools 5에서 같은 종류의 여러 객체를 어떻게 일치시킬 수 있습니까?

Case1 - Success 
BMSContract(status=ACTIVE) 
BMSContract(status=PENDING) 
Reason: only one Active in the collection 

Case2 - Success 
BMSContract(status=ACTIVE) 
BMSContract(status=PENDING) 
BMSContract(status=HOLD) 
Reason: only one Active in the coll 

Case3 - Success 
BMSContract(status=ACTIVE) 
BMSContract(status=PENDING) 
BMSContract(status=HOLD) 
BMSContract(status=CANCEL) 
Reason: only one Active in the coll 

Case4 - Failure 
BMSContract(status=ACTIVE) 
BMSContract(status=ACTIVE) 
Reason: too many Active records in coll 

Case5 - Failure 
BMSContract(status=ACTIVE) 
BMSContract(status=ACTIVE) 
BMSContract(status=ACTIVE) 
Reason: too many Active records in coll 

Case6 - Failure 
BMSContract(status=ACTIVE) 
BMSContract(status=ACTIVE) 
BMSContract(status=ACTIVE) 
BMSContract(status=ACTIVE) 
BMSContract(status=ACTIVE) 
Reason: too many Active records in coll 

Case7 - Failure 
BMSContract(status=PENDING) 
BMSContract(status=HOLD) 
BMSContract(status=OTHER) 
Reason: No Active records in coll 

답변

0

당신이 BMSContract 사실의 번호를 가지고 있음을 감안할 때, 다음과 같은 규칙이 충분하다 :

rule OK 
when 
    $ac: BMSContract(status == "ACTIVE") 
    not BMSContract(this != $ac, status == "ACTIVE") 
then 
    // there is exactly one ACTIVE 
end 

rule not_OK_1 
when 
    not BMSContract(status == "ACTIVE") 
then 
    // there is no ACTIVE 
end 

rule not_OK_2 
when 
    $ac: BMSContract(status == "ACTIVE") 
    exists BMSContract(this != $ac, status == "ACTIVE") 
then 
    // there is more than one ACTIVE 
end 

변형이 가능하고 할 수있다

rule not_OK_2a 
when 
    $ac1: BMSContract(status == "ACTIVE") 
    $ac2: BMSContract(this != $ac, status == "ACTIVE") 
then 
    // log and retract $ac2 
end 
+0

Q1 :이 구문을 이해하지 :하지 BMSContract (이 = $ 교류, 상태 == "ACTIVE"!) Q2 :이 BMSContra을 주장해야이 문제를 일으킬 사실을 확인해야하는 경우 필요 ct 객체를 개별 객체 또는 콜렉션으로 작업 메모리에 저장합니까? – JamesD

+0

CE 'not'는 네거티브 존재 한정사 ∄에 대한 구문입니다. - 모든 BMSContract 개체를 개별 사실로 삽입하지 않으면 컨테이너에'List '이 있어야하고 각 패턴에 대한 목록을 확장하는 데 'from'을 사용해야하므로 문제가 복잡합니다. 나는 이유가 없다면 이것을하는 것을 권장하지 않습니다. – laune

+0

나는 아직도 의미를 모르겠다 : this! = $ ac. 이게 뭐야! = $ ac 의미? 이 인스턴스가 $ ac 변수에 바인드 된 것과 같지 않다는 것을 의미합니까? – JamesD

관련 문제