首页 > 解决方案 > 如何更改事实参数的类型(字符串为双精度)以在 Drools 中进行正确比较?

问题描述

我使用 Drools 模板(.drt 文件),我想比较一个事实的某些参数是小于还是大于某个双精度值。但事实参数是一个字符串表示(该对象的参数都是字符串类型)。所以我尝试像这样将它解析成双倍:当

$pile: Resource(Double.valueOf(amount) < 30.0) //or next
//$pile: Resource(Double.parseDouble(amount) < 30.0)//both don't work in drt

然后......问题是在其他规则中这正常工作,但这里给出了例外:

java.lang.RuntimeException:错误评估约束'Double.parseDouble(名称)== Double.parseDouble(“5.0”)'在[规则“计算打桩机的机器小时数_5”在pileDriverRates.xls]

在 drl 文件中,这种比较工作正常,也许必须在 .drt 文件中使用另一种方法?我使用 intellij 想法,Ubuntu 我的 pom.xml:

<dependencies>
    <dependency>
      <groupId>org.kie</groupId>
      <artifactId>kie-api</artifactId>
      <version>${runtime.version}</version>
    </dependency>
    <dependency>
      <groupId>org.drools</groupId>
      <artifactId>drools-core</artifactId>
      <version>${runtime.version}</version>
    </dependency>
    <dependency>
      <groupId>org.drools</groupId>
      <artifactId>drools-decisiontables</artifactId>
      <version>${runtime.version}</version>
    </dependency>

<dependency>
  <groupId>org.jbpm</groupId>
  <artifactId>jbpm-test</artifactId>
  <version>${runtime.version}</version>
</dependency>

</dependencies>

模板标题

code
name
weightMin
weightMax
boom

包 rules.drivenPiles;

import com.sample.Work;
import com.sample.Resource;
import com.sample.ResourceParameter;

dialect "mvel"

模板“选择吊臂”

rule "Choose crane boom_@{row.rowNumber}"
salience -20
    activation-group "second"

when
    $pile: Resource(Double.parseDouble(amount) > @{weightMin}, Double.parseDouble(amount) < @{weightMax})
then
    String boomLength = "@{boom}";

它给出了一个错误,但是当我将 when 声明为:when

$pile: Resource(amount == "50")

它触发规则(如果数量是 50,我手动检查)。所以我的猜测是解析在 .drt 文件中不起作用,但我的朋友告诉我,他在 .drt 文件中制作了 Double.valueOf(amount) == 50.0 之类的行并且它起作用了。

标签: drools

解决方案


The problem was with rule evaluation and rule execution stages in Drools. I tried to describe it in comments but I think it has completely messed up the whole picture so I created the new question: How to control rule evaluation (or rule execution) stages in Drools? So if you meet an exception while trying to change fact's parameter from Double to String or something like that - this may be one of the reasons


推荐阅读