我有一套规则,根据对象的对象数量
,它们的行为会有所不同我希望为每个传递的Product类对象执行2条规则。
当我传递产品2的单个对象时,执行规则(很好)
Product product5= new Product();
product5.setType("gold");
product5.setBuyer("platinum");
product5.setEvent("sale");
product5.setName("product5");
ksession.insert(product5);
当我传递Product类的两个对象时,执行的规则数是6(我无法理解)。
Product product5= new Product();
Product product3= new Product();
//setting all fields in both objects
ksession.insert(product5);
ksession.insert(product3);
我试图通过添加控制台打印来调试这个,这是我的结果
为每个对象执行一次Gold(预期)。
每个对象执行两次节日金奖(应该是两次)。
未调用钻石(预期)
当我传递Product类的三个对象时,执行的规则数是12(我无法理解)。 我尝试通过添加控制台打印来调试这个,这是我的结果
为每个对象执行一次Gold(预期)。
每个对象执行三次节日金奖(应该是两个)。
未调用钻石(预期)
以下是我的DRL文件
rule "Offer for Diamond"
when
$productObject: Product(type == "diamond")
then
$productObject.setDiscount(15);
end
rule "Offer for Gold"
salience 1
when
$productObject: Product(type == "gold")
then
$productObject.setDiscount(25);
end
rule "Offer for Gold on Festival"
when
$productObject: Product(type == "gold") && Product(event == "sale")
then
$productObject.setDiscount($productObject.getDiscount() + 5);
end
答案 0 :(得分:1)
假设您的2个对象具有相同的属性,这些是执行的规则(和事实):
正如您所看到的,当您在模式之间使用&& 时,您正在创建所有可能组合的笛卡尔积。
在“节日金奖”中,如果您希望每个对象执行一次规则,那么您必须明确告诉Drools这2个模式正在讨论同一个对象:
rule "Offer for Gold on Festival"
when
$productObject: Product(type == "gold") &&
Product(this == $productObject, event == "sale")
then
$productObject.setDiscount($productObject.getDiscount() + 5);
end
现在,如果您的规则与上面的规则完全相同,只需执行以下操作即可简化:
rule "Offer for Gold on Festival"
when
$productObject: Product(type == "gold", event == "sale")
then
$productObject.setDiscount($productObject.getDiscount() + 5);
end
在这种情况下,由于您没有2个模式,因此每个Product
仅对该规则进行一次评估。
希望它有所帮助,