Drools - 如何检查决策中是否存在事实 table

Drools - How to check if a fact exists in a decision table

我正在使用 Drools 5.5.0,我有一个决定table,如下所示:

当我 运行 规则引擎时,我一次只插入一个 SecurityContext 和一次 JSONWrapper

仅基于这个 table,我的 none 条规则曾经被触发(但它们都得到了评估)。我相信这是因为对于第二种情况,每个 role/rule.

的单元格都是空白的

这就是我在 DRL 中的目标:

package com.acme.security.rules.widget;

import com.acme.test.RuleTableTest.SecurityContext; 
import com.acme.test.RuleTableTest.JSONWrapper;

rule "widget_accessibility_store_manager"
  when
    $sc : SecurityContext()
    $output : JSONWrapper()
    eval($sc.hasRole("Store Manager"))
  then
    $output.setFeatureVisibility("feature1", "yes");
    $output.setFeatureVisibility("feature2", "yes");
    $output.setFeatureVisibility("feature3", "yes");
    $output.setFeatureVisibility("feature4", "yes");
    $output.setFeatureVisibility("feature5", "yes");
end

这条规则触发得很好。

如何在我的决定 table 中设置一个条件,该条件仅检查对象是否存在,而没有任何其他限制? (就像在我的 DRL 中一样) 我需要这个对象,所以我可以将它用作操作语句中的输出。为了简单起见,我还尝试将列中每个规则的单元格留空。

在右侧和侧面创建"output object"会更方便,您可以将其插入或将其传递到全局集合。

包含仅存在事实的条件的有点人为的解决方法如下所示:

CONDITION
$output : JSONWrapper
/*$param*/
mark below to force inclusion
x

请注意,您可以垂直连接单元格。

我知道此时对于原始发布者来说为时已晚,但遇到类似的问题我的解决方案是在该对象中寻找一个肯定不会为空的值。例如:

rule "widget_accessibility_store_manager"
when
    $sc : SecurityContext(role != null)
    $output : JSONWrapper(featureVisibility!=null)
    eval($sc.hasRole("Store Manager"))

then
    $output.setFeatureVisibility("feature1", "yes");
    $output.setFeatureVisibility("feature2", "yes");
    $output.setFeatureVisibility("feature3", "yes");
    $output.setFeatureVisibility("feature4", "yes");
    $output.setFeatureVisibility("feature5", "yes");
end

然后您的 excel 文件看起来像这样:

如果这些对象没有强制参数,您甚至可以跳过内部参数并检查 SecurityContext 及其本身是否为 null。或者,您可以检查 "exists SecurityContext".