我是个流口水的新手。想问一个关于所有条件元素的问题。I有一些类,下面的UML图显示了这些对象之间的关系: UML图
一个订单有一个客户,有一个订单线列表。每个订单线都链接到一个项目。坦率地说,它是一本关于Drools的书的示例代码。
I如果订单的客户是银级客户,并且订单中的所有项目都在高范围内(成本高),则希望触发以下规则,以便设置订单的折扣。规则如下:
rule "Silver Customers + High Range Order - 10% Discount -1"
when
$o: Order( $lines : orderLines.size >= 2, $customer: customer, discount == null )
$c: Customer( category == Category.SILVER, this == $customer )
forall( OrderLine( this memberOf $lines, $item : item)
Item(this == $item, category == Item.Category.HIGH_RANGE)
)
then
$o.setDiscount(new Discount(10.0));
update($o);
end
问题是规则总是会触发,即使我尝试插入一个订单,其中有5个项目处于低范围。
在调试信息中,我发现第一个项目的类别LOW_RANGE但规则仍然被触发:
==>[BeforeActivationFiredEvent: getActivation()=[[ Silver Customers + High Range Order - 10% Discount active=false ] [ null
[fact 0:1:1561745898:141057847:1:DEFAULT:NON_TRAIT:org.drools.devguide.eshop.model.Customer:Customer [id = null, age=null, email=null, name=null, category = SILVER]]
[fact 0:12:1971991758:-345298280:12:DEFAULT:NON_TRAIT:org.drools.devguide.eshop.model.Order:Order [ id = null, customer=Customer [id = null, age=null, email=null, name=null, category = SILVER], date=Fri Oct 21 11:11:38 CST 2016, lines=[OrderLine [item=Item{id=1, name=A, cost=80.0, salePrice=800.0, category=LOW_RANGE}, quantity=1], OrderLine [item=Item{id=1, name=B, cost=800.0, salePrice=850.0, category=HIGH_RANGE}, quantity=2], OrderLine [item=Item{id=1, name=C, cost=800.0, salePrice=850.0, category=HIGH_RANGE}, quantity=3], OrderLine [item=Item{id=1, name=D, cost=800.0, salePrice=850.0, category=HIGH_RANGE}, quantity=4], OrderLine [item=Item{id=1, name=E, cost=800.0, salePrice=850.0, category=HIGH_RANGE}, quantity=5]], state=PENDING, discount=null]] ] ], getKnowledgeRuntime()=KieSession[0]]
-------------------
rule triggered:Silver Customers + High Range Order - 10% Discount
==>[AfterActivationFiredEvent: getActivation()=[[ Silver Customers + High Range Order - 10% Discount active=false ] [ null
[fact 0:1:1561745898:141057847:1:DEFAULT:NON_TRAIT:org.drools.devguide.eshop.model.Customer:Customer [id = null, age=null, email=null, name=null, category = SILVER]]
[fact 0:12:1971991758:-345298280:18:DEFAULT:NON_TRAIT:org.drools.devguide.eshop.model.Order:Order [ id = null, customer=Customer [id = null, age=null, email=null, name=null, category = SILVER], date=Fri Oct 21 11:11:38 CST 2016, lines=[OrderLine [item=Item{id=1, name=A, cost=80.0, salePrice=800.0, category=LOW_RANGE}, quantity=1], OrderLine [item=Item{id=1, name=B, cost=800.0, salePrice=850.0, category=HIGH_RANGE}, quantity=2], OrderLine [item=Item{id=1, name=C, cost=800.0, salePrice=850.0, category=HIGH_RANGE}, quantity=3], OrderLine [item=Item{id=1, name=D, cost=800.0, salePrice=850.0, category=HIGH_RANGE}, quantity=4], OrderLine [item=Item{id=1, name=E, cost=800.0, salePrice=850.0, category=HIGH_RANGE}, quantity=5]], state=PENDING, discount=10.0 % ]] ] ], getKnowledgeRuntime()=KieSession[0]]
我已经阅读了这个问题的答案:因为所有的评价都是真的。我尝试了该解决方案,但我得到了另一个错误的结果,即使我对所有高档商品使用订单,以下规则也不会触发:
rule "Silver Customers + High Range Order - 10% Discount"
when
$o: Order( $lines : orderLines.size >= 2, discount == null )
$c: Customer( category == Category.SILVER ) from $o.customer
forall( OrderLine() from $o.orderLines
OrderLine( item.category == Item.Category.HIGH_RANGE)
)
then
$o.setDiscount(new Discount(10.0));
update($o);
end
unittest代码如下:
@Test
public void highRangeOrderDiscountTest() {
KieSession kSession = createDefaultSession();
Order o = ModelFactory.getOrderWithFiveHighRangeItems();
kSession.insert(o.getCustomer());
kSession.insert(o.getOrderLines().get(0));
kSession.insert(o.getOrderLines().get(1));
kSession.insert(o.getOrderLines().get(2));
kSession.insert(o.getOrderLines().get(3));
kSession.insert(o.getOrderLines().get(4));
kSession.insert(o.getOrderLines().get(0).getItem());
kSession.insert(o.getOrderLines().get(1).getItem());
kSession.insert(o.getOrderLines().get(2).getItem());
kSession.insert(o.getOrderLines().get(3).getItem());
kSession.insert(o.getOrderLines().get(4).getItem());
kSession.insert(o);
int fired = kSession.fireAllRules();
// We have 5 Items that are categorized -> 5 rules were fired
// We have 1 Customer that needs to be categorized -> 1 rule fired
// We have just one order with all HIGH RAnge items -> 1 rule fired
// One Coupon is created for the SILVER Customer -> 1 rule fired
assertThat(8, is(fired));
assertThat(o.getCustomer().getCategory(), is(Customer.Category.SILVER));
assertThat(o.getDiscount(), not(nullValue()));
assertThat(o.getDiscount().getPercentage(), is(10.0));
}
}
你能告诉我forall的原因或正确用法吗?谢谢。
书中有一个错误:
$o:订单($行:orderLines.size
必须是
$o:订单($lines:orderLines,orderLines.size)
这将建立OrderLine-s的集合,然后确定所有这些都与高范围项目有关。(注意:未经测试)
rule "Silver Customers + High Range Order - 10% Discount"
when
$c: Customer( category == Category.SILVER )
$o: Order( $lines : orderLines.size >= 2, customer == $c,
discount == null )
forall( OrderLine( $item : item) from $lines
Item(this == $item, category == Item.Category.HIGH_RANGE))
then
modify( $o ){ setDiscount(new Discount(10.0)) }
end
所有Client和Item对象都必须作为事实插入;对OrderLine-s也这样做是合理的。
问题内容: 我想转换成 我用了 但是我明白了 问题答案: 每月使用CAPITAL M, 另外,您首先要设置日期,然后再重置日历,我想这不是您想要的,可能是因为您需要将其更改为以下内容 看到 API文件
有人能告诉我如何打印以下课程的成绩吗:
我创建一个PHP计算器,需要使用以下类,然后打印出用户的名字和他们取得的平均分数。这是我到目前为止的代码,但是它没有正确显示,它说有丢失的参数和未定义的变量,但是我不确定我哪里出错了! 错误消息:警告:在C:\Program Files(x86)\EasyHP-DevServer-14.1VC11\data\localweb\my portable Files\练习4\average中调用的stu
问题内容: 首先,一个难题:以下代码显示什么? 回答: 0 扰流板如下。 如果您打印的规模(长),并重新定义,印刷品会那么。这意味着暂时设置为,后来又设置为。这是违反! 静态修饰符与最终修饰符结合使用,还可以定义常量。最后的修饰符指示 此字段 的值 不能更改 。 来源:https : //docs.oracle.com/javase/tutorial/java/javaOO/classvars.h
问题内容: 我的表格“订单”中有50行/条目。我有一列名为的列,该列用于保存在处的订单声明。 此字段中的日期格式如下:2011-10-03 07:07:33 格式为(yy / mm / dd time)。 我也有一个专栏,这是他们支付的金额。 我想显示每天的总数。 因此,对于2011年10月3日之后的6个订单,应采用6个订单的值,并将它们加在一起。 所以我可以显示: 我怎样才能做到这一点? 问题答
问题内容: 例如,我有一个这样的表: 当我需要所有记录时,我会这样做,并获得3个结果: 但我想获得第4行,以表示数量(50)和某物(6)。sql查询中是否可能,或者我必须循环执行查询才能在查询执行后获得总计?我想在查询中做到这一点。 问题答案: 这是工作查询。它将在结果的最后添加第四行