如何在Drools中处理具有共享条件的大量规则

时间:2015-09-09 13:56:21

标签: 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

我知道规则可以扩展其他规则,但据我所知,他们只能拥有一个父级,我可能希望将事物分成多个块;例如,有食物与非食物规则的子块。

1 个答案:

答案 0 :(得分:0)

扩展规则可以在多个级别上继续,以便您可以拥有父级规则

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

同样,您可以先选择类别来启动层次结构,但是无法从多个规则继承。 (此外,我怀疑收益是否值得这样做。)

请注意,在使用决策表时,您会遇到同样的困境。只有在生成的规则彼此相邻的情况下才能为属性添加具有相同值的单元格 - 并且您不能同时为多个属性的所有规则执行此操作时间。