Обнаружение синтаксической ошибки в Drools - PullRequest
0 голосов
/ 05 января 2012

У меня есть файл drool, в котором правило 2 всегда принимает значение true.

rule "R2"
salience 1000

when

((residence status = "US Citizen") || ((residence status = "Lawfully-entered Alien") and (residence duration >= 5))) and (fpl <= 133)
then

Add to Programs List "3"
end

значение

residence status is US Citizen
residence status is null 
residence duration is 0
fpl is 278.77

Почему оно входит в него всегда, хотя для указанного значенияусловие ложно.

Пожалуйста, найдите все файлы.

package com.eligibility.service;  


import com.platform.enrollment.domain.BasicInfo;
import com.platform.enrollment.domain.FamilyMember;
global java.util.List prog_id_list; 
global java.lang.Double fpl;

[condition][] and=and 
[condition][] or=or

[condition][]residence status \= "{value}"=FamilyMember(basicInfo.citizenshipStatus == "{value}")
[condition][]residence duration >\= {value}=FamilyMember(basicInfo.permanentResidenceDuration >= {value})
[condition][]job status \= "{value}"=FamilyMember(basicInfo.jobStatus == "{value}")
[condition][]large business status \= "{value}"=FamilyMember(basicInfo.largeBusinessStatus == "{value}")
[condition][]false=eval(false)
[condition][]true=eval(true)
[condition][]age \= {value}=FamilyMember(basicInfo.getAge=={value})
[condition][]age < {value}=FamilyMember(basicInfo.getAge<{value})
[condition][]age > {value}=FamilyMember(basicInfo.getAge>{value})
[condition][]age <\= {value}=FamilyMember(basicInfo.getAge<={value})
[condition][]age >\= {value}=FamilyMember(basicInfo.getAge>={value})

[condition][]fpl \= {value}=eval(fpl=={value})
[condition][]fpl < {value}=eval(fpl<{value})
[condition][]fpl > {value}=eval(fpl>{value})
[condition][]fpl <\= {value}=eval(fpl<={value})
[condition][]fpl >\= {value}=eval(fpl>={value})

[condition][]gender \= "{value}"=FamilyMember(basicInfo.gender == "{value}")

[condition][]pregnant \= true=Applicant(eval(pregnant))
[condition][]pregnant \= false=Applicant(eval(!pregnant))

[condition][]Family member age greater than or equal to 60 \= true=eval(any_member_greater_than_equal_to_60)
[condition][]Family member age greater than or equal to 60 \= false=eval(!any_member_greater_than_equal_to_60)

[condition][]job status \= "{value}"=Applicant(eval(job_status.contains("{value}")))

[condition][]large business status \= "{value}"=Applicant(eval(large_business_status.contains("{value}")))
[condition][]employer benefits \= "{value}"=Applicant(eval(large_business_status.contains("{value}")))

[condition][]spouse \= true=eval(spouse)
[condition][]spouse \= false=eval(!spouse)

[condition][]total assets \= {value}=eval(total_assets=={value})
[condition][]total assets < {value}=eval(total_assets<{value})
[condition][]total assets > {value}=eval(total_assets>{value})
[condition][]total assets <\= {value}=eval(total_assets<={value})
[condition][]total assets >\= {value}=eval(total_assets>={value})

[condition][] Question with code "{code}" has answer "{answer}"=Question(code=="{code}"&& eval(answer.contains("{answer}")))

[consequence][]Add to Programs List {id}=prog_id_list.add({id});    

rule "R0"
salience 1000

when

(age <= 0) and ((residence status = "US Citizen") || (residence status = "Lawfully-entered Alien")) and (fpl <= 200)
then

Add to Programs List "1"
end

rule "R1"
salience 1000

when

((residence status = "US Citizen") || (residence status = "Lawfully-entered Alien")) and (fpl >= 400)
then

Add to Programs List "2"
end

rule "R2"
salience 1000

when

((residence status = "US Citizen") || ((residence status = "Lawfully-entered Alien") and (residence duration >= 5))) and (fpl <= 133)
then

Add to Programs List "3"
end

rule "R3"
salience 1000

when

((residence status = "US Citizen") || (residence status = "Lawfully-entered Alien")) and (fpl > 133) and (fpl < 400)
then

Add to Programs List "4"
end

Кто-нибудь может мне помочь, почему это enetring, это list3, хотя данные, как указано выше, не делают его действительным

Ответы [ 2 ]

0 голосов
/ 05 февраля 2013

Также может быть полезно взглянуть на сгенерированный класс Java для вашего правила и посмотреть, в чем может быть проблема.Используйте: -Ddrools.dump.dir = для установки пути для сгенерированного кода.

Также может быть полезно установить прослушиватель правил и посмотреть обновления вставок фактов и последовательность запуска правил.

Также вы можете попытаться разбить проблемное правило на два правила без DSL следующим образом для целей отладки:

when
FamilyMember(basicInfo.citizenshipStatus == "US Citizen")
Fact(eval(fpl <= 133))

when
FamilyMember(basicInfo.citizenshipStatus == "Lawfully-entered Alien")
FamilyMember(basicInfo.permanentResidenceDuration >= 5)
Fact(eval(fpl <= 133))

Надеюсь, это поможет.

0 голосов
/ 05 января 2012

Можете ли вы поделиться, как выглядит DRL-версия правила?мы не можем помочь многим, если у нас нет всех отображений.Обычно для разработки правил вы начинаете с DRL, и когда ваши правила работают должным образом, вы создаете соответствующие отображения.Похоже, вы делаете противоположное.Приветствия

...