如何在 Drools 中处理大量具有共享条件的规则
How to handle lots of rules with shared conditions in Drools
假设我正在开发一个销售税计算应用程序,该应用程序对每个州都有很多规则;例如,我可能
rule "Florida Food Sales Tax"
when
$item : OrderItem( state == States.FL, category == Categories.FOOD )
then
modify($item) { setSalesTax(new BigDecimal("5") }
end
rule "Florida Non-Food Sales Tax"
when
$item : OrderItem( state == States.FL, category == Categories.NONFOOD )
then
modify($item) { setSalesTax(new BigDecimal("8") }
end
在这个应用程序中,我可能有几十个,甚至数百个关于佛罗里达州销售税的规则......以及其他每个州的销售税。必须将状态条件放入每条规则中会变得乏味。有没有办法围绕规则创建某种嵌套上下文,这样我只需为整个块做一次?类似的东西(我知道这是无效的,考虑这个伪代码):
when $item : OrderItem( state == States.FL )
rule "Florida Food Sales Tax"
when
$item : OrderItem( category == Categories.FOOD )
then
modify($item) { setSalesTax(new BigDecimal("5") }
end
.
.
.
end
我知道规则可以扩展其他规则,但据我所知,它们只能有一个父规则,我可能想将它们分成多个块;例如,有食品与非食品规则的子块。
扩展规则可以在多个级别上继续,这样您就可以拥有父规则
rule "Florida Sales Tax"
when
$florida: OrderItem( state == States.FL )
then end
在下一级,食品和非食品有两条规则,其中有几条规则如下:
rule "Florida Food Sales Tax" extends "Florida Sales Tax"
when
$ffi: OrderItem( this == $florida, category == Categories.FOOD )
then end
同样,您可以通过先选择类别来启动层次结构,但无法从多个规则继承。 (此外,我怀疑这样做是否值得。)
请注意,在使用决策 table 时,您会 运行 陷入同样的困境。仅当生成的规则彼此相邻放置时,才能为 属性 加入具有相同值的单元格 - 并且您不能对 all 规则执行此操作超过同时 属性 个。
假设我正在开发一个销售税计算应用程序,该应用程序对每个州都有很多规则;例如,我可能
rule "Florida Food Sales Tax"
when
$item : OrderItem( state == States.FL, category == Categories.FOOD )
then
modify($item) { setSalesTax(new BigDecimal("5") }
end
rule "Florida Non-Food Sales Tax"
when
$item : OrderItem( state == States.FL, category == Categories.NONFOOD )
then
modify($item) { setSalesTax(new BigDecimal("8") }
end
在这个应用程序中,我可能有几十个,甚至数百个关于佛罗里达州销售税的规则......以及其他每个州的销售税。必须将状态条件放入每条规则中会变得乏味。有没有办法围绕规则创建某种嵌套上下文,这样我只需为整个块做一次?类似的东西(我知道这是无效的,考虑这个伪代码):
when $item : OrderItem( state == States.FL )
rule "Florida Food Sales Tax"
when
$item : OrderItem( category == Categories.FOOD )
then
modify($item) { setSalesTax(new BigDecimal("5") }
end
.
.
.
end
我知道规则可以扩展其他规则,但据我所知,它们只能有一个父规则,我可能想将它们分成多个块;例如,有食品与非食品规则的子块。
扩展规则可以在多个级别上继续,这样您就可以拥有父规则
rule "Florida Sales Tax"
when
$florida: OrderItem( state == States.FL )
then end
在下一级,食品和非食品有两条规则,其中有几条规则如下:
rule "Florida Food Sales Tax" extends "Florida Sales Tax"
when
$ffi: OrderItem( this == $florida, category == Categories.FOOD )
then end
同样,您可以通过先选择类别来启动层次结构,但无法从多个规则继承。 (此外,我怀疑这样做是否值得。)
请注意,在使用决策 table 时,您会 运行 陷入同样的困境。仅当生成的规则彼此相邻放置时,才能为 属性 加入具有相同值的单元格 - 并且您不能对 all 规则执行此操作超过同时 属性 个。