我是Jboss Rule的新手。我已经阅读了文档,但是我没有找到开始为下面的代码示例编写规则的方法。
For each User code in the list
{
If User code = ‘11’
{
If User code ‘17’ present in the group
{
Add letter id 1
}
Else If User code ‘18’ present in the group
{
Add letter id 2
}
}
Else
{
Add letter id 3 which is the letter need to be sent for code 11
}
}
如果有人能给我一个提示/想法如何去做,我真的很感激?
修改
您好,
到目前为止,这是我为上述用户案例开发的内容。
UserDetailVo
列表)到drools会话。UserDetailVo
)包含(UserInfoVo
列表)。每个UserInfoVo
都包含一个代码。现在我想迭代(UserInfoVo
列表)并更新(letterId
)到每个(UserDetailVo
),正如我在下面尝试的那样。
案例1:当codeList有110,121
时rule "USER LETTER GROUPING 110,121"
salience 300
no-loop true
when
userDetailVo : UserDetailVo ()
UserInfoVo(code=="110") from userDetailVo.codeList
UserInfoVo(code=="121") from userDetailVo.codeList
then
userDetailVo.addLetterId(1);
//modify(trrDetailRequestVo)
end
案例2:当codeList有110,127
时rule "USER LETTER GROUPING 110,127"
salience 300
no-loop true
when
userDetailVo : UserDetailVo ()
UserInfoVo(code=="110") from userDetailVo.codeList
UserInfoVo(code=="127") from userDetailVo.codeList
then
userDetailVo.addLetterId(2);
//modify(trrDetailRequestVo)
end
案例3:当codeList只有110
时rule "USER LETTER GROUPING 110"
salience 300
no-loop true
when
userDetailVo : UserDetailVo (this.letterID.size() == 0) // Checking size of the list
UserInfoVo(code=="110") from userDetailVo.codeList
then
userDetailVo.addLetterId(3);
//modify(trrDetailRequestVo)
end
我面临的问题是我是否在规则结束时进行修改/更新。它进入了一个无限循环。如果我删除修改/更新,在案例3中虽然列表大小如果大于0仍然触发了规则。
答案 0 :(得分:6)
“else”的概念并不真正直接转换为声明性语言。相反,您必须明确定义“else”在数据方面的真正含义,并根据该条件编写规则(或规则)。例如,请考虑以下条件:
If Order Total >= 1000
Discount = 15%
Else If Order Total >= 500
Discount = 10%
Else If Order Total >= 250
Discount = 5%
Else
Discount = 0%
对这些条件的规则的自然首次尝试可能是:
rule "15% discount"
when
$o : Order( total >= 1000 )
then
modify($o) { setDiscount(.15); }
end
rule "10% discount"
when
$o : Order( total >= 500 )
then
modify($o) { setDiscount(.10); }
end
etc...
这种方法的问题在于10%和15%的规则都匹配总数为1200的订单。这是因为“else if”的“else”部分固有地包括订单总额为不大于1000.所以我们写这样的规则:
rule "15% discount"
when
$o : Order( total >= 1000, discount == null )
then
modify($o) { setDiscount(.15); }
end
rule "10% discount"
when
$o : Order( total >= 500, total < 1000, discount == null )
then
modify($o) { setDiscount(.10); }
end
rule "5% discount"
when
$o : Order( total >= 250, total < 500, discount == null )
then
modify($o) { setDiscount(.05); }
end
rule "no discount"
when
$o : Order( total < 250, discount == null )
then
modify($o) { setDiscount(0); }
end
(您会注意到我还添加了discount == null
条件。这是为了防止规则在订单事实更新时重新激活。)
我一直专注于一个简单的例子,而不是你的特定用例,以展示写一个模仿“其他”的条件的概念。我仍然不确定我完全理解你的用例,但希望我已经回答了你问题的关键概念部分。
答案 1 :(得分:0)
您可以实现嵌套ifs,如下所示:
rule "nested if else"
when
o: Order(total >= 1000)
then
o.setDiscount("15%");
if(o.total>=500)
o.setDiscount("10%");
else if(o.total>=250)
o.setDiscount("5%");
else
o.setDiscount("0%");
end
您可以在下面编写任何Java代码,例如-循环,迭代,声明等。