Как изменить тип параметра факта (String на double) для правильного сравнения в Drools? - PullRequest
0 голосов
/ 05 апреля 2019

Я использую шаблон Drools (файл .drt), в котором я хочу сравнить, является ли какой-либо параметр факта меньшим или большим, чем некоторое двойное значение. Но параметр fact является строковым представлением (все параметры этого объекта являются строковыми типами). Поэтому я пытаюсь разобрать его, чтобы удвоить, как это: когда

$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 (name) == Double.parseDouble ("5.0") "в [Правило "Расчет количества рабочих часов машиниста кучи_5" в кучеDriverRates.xls]

В файлах drl такое сравнение работает нормально, может быть, должен быть другой метод для использования в файлах .drt? Я использую интеллигентную идею, 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}";

выдает ошибку, но когда я делаю когда утверждение как: когда

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

Это правило срабатывает (если сумма равна 50, я проверяю это вручную). Поэтому я предположил, что синтаксический анализ не работает в файлах .drt, но мой друг говорит мне, что он сделал в файлах .drt такие строки, как Double.valueOf (amount) == 50.0, и это сработало.

1 Ответ

0 голосов
/ 07 апреля 2019

Проблема была в этапах оценки и выполнения правил в Drools. Я попытался описать это в комментариях, но я думаю, что это полностью испортило всю картину, поэтому я создал новый вопрос: Как контролировать этапы оценки (или выполнения правил) в Drools? Так что если вы встретите исключение при попытке изменить параметр факта с Double на String или что-то в этом роде - это может быть одной из причин

...