为什么 Drools 在使用议程过滤器触发特定规则时验证所有其他规则?

Why does Drools validate all other rules when using an Agenda Filter to fire a specifc rule?

我有一大堆规则,我正在尝试为它们编写一些单元测试。在我的测试中,我使用这个:

int rulesFired = kSession.fireAllRules(new RuleNameEqualsAgendaFilter("rule name 1"));

我注意到的是,虽然返回的触发规则数量为 1,但 Drools 仍会尝试根据满足条件的任何其他规则进行验证。我有时会收到来自其他规则的错误消息,这些规则未在我的规则名称等于议程过滤器中定义,因为条件匹配基于我在 kSession 中为单元测试插入的内容。

例如我有:

rule "test1"
    when
        $var : Map(this["key"] == "gold")
    then
        do something
    end

rule "test2"
    when
        $var : Map(this["key"] == "gold" && this["other"] == "silver")
    then
        do something
    end

在我对规则 1 的测试中,我有一张只有 "key" 的地图。当我 运行 使用 "test1" 的过滤器进行测试时,我将收到一个空指针,因为我的地图中没有 "other" 的值,即使我正在过滤的规则也是如此不关心"other"

为什么会这样?我在任何地方都找不到关于它的任何文档。就好像 Drools 在过滤之前必须验证我的 DRL 文件中的所有规则和语法。

用于评估规则条件的代码来自所有规则的组合,可能以减少整体工作量的方式组合相同条件或部分条件(例如模式或约束)。因此,无法在运行时抑制单个规则条件的评估

可以将规则放在不同的包中,然后通过不同的KieSession加载。