gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 02:00:07 25 4
gpt4 key购买 nike

假设我们在 Java EE 应用程序中有这些类,它们也是 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 窗口,让配置者用户创建和部署 DRools 包规则,以便自定义客户所需的工作流程。这些窗口以某种方式将 Swing 组件转换为 Drool Mvel 文本,以避免配置器用户编写原始代码。然后,这些规则将被保存并部署到 BLOB 字段中的数据库表中,并在需要时执行。问题是,现在我们需要实现一个新的事实层次结构,在其上执行断言以触发规则。使用我的示例代码中的 A 类事实,此代码是从我们的 DRools 窗口生成的:

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

很明显,这个规则和事实反射(reflect)了我们的数据库结构,其中“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 这样的语法。返回 List<B>并且只能在单个 B-i 元素上评估 .steps 。我不知道为什么要使用该语法转换规则,因为在我们的核心应用程序中,有太多没有注释的 EJB 是由不再与我们合作的人编写的。但在纠正它们或为这些需求编写新的之前,我需要知道 DRools 是否可以支持事实中的 java List 的任意嵌套级别以及如何正确访问它们,因为这是我们的产品第一次必须支持这些类型规则中包含许多列表的事实。我们的 DRools 版本是 5.0.1

目前,我看到 DRL 语言中的最终字符串是通过调用方法 dump() 创建的。上课DrlDumper .

最佳答案

我认为您正在寻找的语法是:

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

希望对你有帮助

关于java - DRools:如何在事实中的任意嵌套列表上使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51707714/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com