如何将某些DRL文件应用于某些事实

时间:2015-09-22 17:48:01

标签: drools rule-engine kie

让我们假设我在一家大型制造公司工作。我正在监控公司销售数据的质量。各区域经理各自对其所在地区的销售有自己的要求。 8位区域经理中的每一位都向我提供了一份DRL文件,该文件仅适用于他自己所在地区的销售,他们会经常调整DRL。

让我们假设我正在使用Sale对象,每个对象都包含一个region属性。我不得将规则应用于错误地区的销售。如果我不小心将太平洋西北地区的规则应用于俄亥俄河谷的销售,那么我将被解雇!

我可以想到三种方法:

  1. 每次提交新的区域经理时,信任(并验证)每个区域经理在其规则的LHS中包含region =“...”一词。将所有DRL文件加载到Kie会话中并运行所有Sales through。
  2. 划分我的清单<销售>到8个特定于区域的列表中,并根据相应的DRL文件运行每个列表。
  3. 制作销售摘要并实施PacificNorthwestSale,OhioRiverValleySale等,理论上给定区域的DRL文件可能不会尝试引用来自其他地区的特定区域销售。
  4. 有更好的方法吗?是否有某种方法可以为DRL中的所有规则添加另一个LHS条件(region =“...”)?或者其他一些方法我可以执行此策略而不执行:

    • 多项规则执行
    • 或手动验证所有规则是否指定了适当的区域?

1 个答案:

答案 0 :(得分:2)

#1已经出局,因为没有万无一失的方法可以确定在所有规则中包含区域约束。 (当然,这让你想知道:那些区域人员是否足够好,能够正确地编写他们的规则,超出区域约束?怎么做?这些规则中的一个会计算他们的奖金吗?)

#2安然无恙。它需要一些额外的处理,但这可以忽略不计。

#3使得Java代码库不必要地复杂化。从本质上讲,匹配一个类的不同子类,所有其他条件相同,只不过是#1的加糖版本。唯一的好处是检查更容易,例如,你可以在每个DRL上运行一个简单的grep。

如果在单个会话中全部运行比#2所需要的更方便,那么我将采用#4。为此,请以编程方式将DRL文件与一些粘合剂":

组合在一起
package what.ever;
import this.and.that.*;

agenda-group "PacificNorthwest"
// DRL from Pacific-Northwest

agenda-group "OhioRiverValley"
// DRL from Ohio River Valley

要运行,请将应用驱动程序中的焦点设置为这八个议程组中的每一个,然后插入相应的事实,确保在完成一个区域后清除WM。