Как разобрать строку по факту Drools (двойное сравнение) - PullRequest
0 голосов
/ 14 апреля 2019

Когда кто-то вставляет новый объект в файл drl, а затем хочет сравнить его строковое представление числа с другим числом в следующих правилах, Drools дает исключение. Гораздо понятнее с примером.

rule "rule_1"
dialect "mvel"
salience -10

when

then
    Resource resource = new Resource();
    resource.setAmount("10"); //note - this accepts only Strings
    insert(resource);
end

rule "rule_2"
dialect "mvel"
salience -20

when
    $resource: Resource(Double.parseDouble(amount) > 0.0) //exception
    //$resource: Resource(amount == "10") - no error here
then
    System.out.println("$resource.value = " + $resource.amount);
end

Исключение составляет: Причина: [Ошибка: Double.parseDouble (сумма): ноль]
[Рядом: {... Double.parseDouble (количество)> 0 ....}]
-------------- ^
Интересно, что когда вы сравниваете его как строку (сумма == "10") - все работает нормально. Но когда вы пытаетесь разобрать «сумму» в Double, тогда Java не знает, что вообще существует какое-либо значение (думает, что количество == ноль и, следовательно, не может его проанализировать). Вторая интересная вещь заключается в том, что если вы создали этот объект (ресурс) в java и вставили его до того, как поле «fireAllRules ()» - «amount» станет видимым для анализатора, и он будет работать.
Но дело в том, что я не могу создать этот объект до запуска правил, потому что я не знаю, будет ли в этом необходимость. И мои поля тоже должны быть String. И я должен сравнить это как «больше» или «меньше чем», поэтому сравнение строк не применимо.
Я пытался создать функцию перед правилом, как:

function boolean isValid(String s){
    try {
        Double.valueOf(s);
        return true;
    } catch(Exception e){
        return false;
    }
}

Не работает также.

1 Ответ

0 голосов
/ 18 мая 2019

Итак, проблема была в том, что у меня был другой объект, который соответствовал данному факту, но с количеством = ноль.А потом Друлс попытался разобрать его, чтобы удвоить, что, конечно, привело к исключению.Таким образом, способ решить это проверить сумму:

Resource(amount != null, Double.parseDouble(amount) > 0)
...