DRools:如何在事实中的任意嵌套列表上使用 when

DRools: how to use when on arbitrary nested lists in facts

假设我们在 Java EE 应用程序中有这些 classes,它们也是 Hibernate 实体:

public class A {
    private String code;

    private List<B> tests;
}

public class B {
    private String code;

    private List<C> steps;
}

public class C {
    private String code;

    private List<D> subSteps;
} 

在过去的几年里,一些 Swing windows 被创建来让配置器用户创建和部署 DRools 包规则,以便定制我们的客户所需的工作流程。这些 windows 以某种方式将 Swing 组件转换为 Drool Mvel 文本,以避免配置器用户编写原始代码。然后将这些规则保存并部署到 BLOB 字段中的数据库表中,并在需要时执行。 问题是现在我们需要实现一个新的事实层次结构,在该层次结构上执行断言以触发规则。 使用我的示例代码中 class A 的事实,此代码是从我们的 DRools windows:

生成的
rule "RULE_TRY" 
 dialect "mvel"
 salience 10
 enabled true
 no-loop false
 when
    $a : A(  )
    $b : B( code == "testCode" ) from $a.tests
    $c : C( code== "stepCode" ) from $a.tests.steps

 then
end

很明显,这个规则和事实反映了我们的数据库结构,其中"code"是相应相关表中的PK或FK。
但是此代码会导致在编译和部署包时引发 DRools 错误:

Unable to build expression for 'from' : Failed to compile: 1 compilation error(s): - (1,26) unqualified type in strict mode for: steps'$a.tests.steps' : [Rule name='RULE_TRY']

也许,这是正确的语法吗:

when
    $a : A(  )
    $b : B( code == "testCode" ) from $a
    $c : C( code== "stepCode" ) from $b

? 因为,将 Mvel 代码视为一种 getter/setter,我希望像 from $a.tests returns 和 List<B> 这样的语法,并且我只能在单个 B-ith 元素上评估.steps。 我不知道为什么使用该语法转换规则,因为在我们的核心应用程序中有太多没有注释的 EJB,由不再与我们合作的人编写。但是在更正它们或为这些要求编写新的之前,我需要知道 DRools 是否可以支持具有 java List in fact 的任意嵌套级别以及如何正确访问它们,因为这是我们的产品第一次必须用规则中的许多列表来支持这些类型的事实。 我们的 DRools 版本是 5.0.1

目前,我看到 DRL 语言中的最终字符串是通过在 class DrlDumper.

上调用方法 dump() 创建的

我认为您要查找的语法是:

rule "RULE_TRY" 
dialect "mvel"
salience 10
enabled true
no-loop false
when
  $a : A(  )
  $b : B( code == "testCode" ) from $a.tests
  $c : C( code== "stepCode" ) from $b.steps
then
  //...
end

希望对您有所帮助,