【问题标题】:Drools from clause not working子句中的流口水不起作用
【发布时间】:2014-09-22 15:55:14
【问题描述】:

from 子句的最基本用法不起作用,即使我知道列表中有元素并且没有从该列表中提取元素的条件,并且我有其他规则正常工作。

这就是发生的事情,我的问题中有很多变量,但我已经简化为:

有这两个规则,第一个是用来证明fixedShipmentValueData 列表至少有一个元素。但是,第二条规则不会被触发,即使它与第一个规则的唯一不同之处是使用 from 子句并放置一个变量名。

rule "Print list value"
ruleflow-group "fixed-values"
no-loop
    when
        cParams: CustomerParameters(list: fixedShipmentValueData)
    then
        System.out.format("There are %s elements at fixedShipmentValue and fixed value is %s%n",list.size(), 
        ((ParameterValues)list.get(0)).getFixedShipmentValue());
end

rule "Do something with the list"
ruleflow-group "fixed-values"
no-loop
    when
        cParams: CustomerParameters(list: fixedShipmentValueData)
        ParameterValues($fixedShipmentValue: fixedShipmentValue) from list
    then
        System.out.format("fixed Shipment Value is %s%n", $fixedShipmentValue);
end

这看起来很简单......我已经花了足够的时间来想出主意。

【问题讨论】:

    标签: drools


    【解决方案1】:

    没有看到 CustomerParameters、ParameterValues 和创建、组合和插入事实的应用程序部分的 Java 代码,我知道只有一种场景可以重现您所说的效果。考虑一下:

    List<Base> 是类 X 中的字段 list。有子类 SubASubB 都扩展了 Base。创建X,将SubA类的对象添加到list。一条规则(如“打印列表值”)将显示列表不为空。

    但是,使用诸如

    这样的模式的规则
    X( $list: list )
    SubB() from $list
    

    永远不会触发,因为Base.list 中没有 SubB。

    【讨论】:

    • 它可能无法涵盖您的困境。但是,如果是这样,则需要更多信息。
    • 感谢@laune 的快速回答。您说得对,这是“可以重现效果”的唯一方法,可悲的是,事实并非如此。没有“ParameterValue”的子类,这使得这个问题变得如此奇怪。我确定我的方法是正确的,因为还有其他规则使用 from 子句和类型为“ParamerterValue”的列表,它们工作得很好。
    • 如果是这样,您必须提供一个完整代码集,Java 和 DRL 以重现该问题。在你的情况下应该不会太难,但没有它是没有希望的。
    • 您突出显示了 complete,这意味着没有代码片段,而是一个功能性的 Java 应用程序,对吗?如果是这样,我会尝试通过 git 分享问题的简化版本,因为实际上并不那么容易。
    • 必须可以将其简化为基本要素:具有该列表的 java 类、作为列表元素插入的类以及构建和插入它的代码。 100 行,不多了。
    猜你喜欢
    • 1970-01-01
    • 2016-06-15
    • 1970-01-01
    • 2021-09-17
    • 2023-03-19
    • 1970-01-01
    • 1970-01-01
    • 2013-03-18
    • 1970-01-01
    相关资源
    最近更新 更多