Для операции сравнения Drools требуются совместимые типы (обновление с 5.1.1 -> 5.5.0)

У меня есть некоторые правила Drools, которые отлично работают в Drools 5.1.1, но ломаются при обновлении до 5.5.0. Вот пример:

when
    Map( $limit: this["FailureLimit"] ) 
    activity: LimitExceededActivity( failureRate > $limit)
then
    ...

Я получаю эту ошибку:

[Error: Comparison operation requires compatible types. Found float and class java.lang.Object]
[Near : {... failureRate > $limit ....}]

Карта в данном случае представляет собой HashMap‹String, Number›. Я понимаю, что Drools не обязательно знает об этом из-за стирания, но как я могу убедить его, что $limit — это число?


person rjsang    schedule 03.10.2013    source источник


Ответы (2)


Не слишком причудливо, но вот решение:

when
    $m: Map(this["FailureLimit"] != null) 
    LimitExceededActivity( $f: failureRate)
    $limit: Number(floatValue < $f) from $m["FailureLimit"]
then

В зависимости от вашего варианта использования 'this["FailureLimit"] != null' в первом шаблоне можно удалить.

Идея этого решения состоит в том, чтобы позволить шаблону «от» сделать приведение за вас.

Надеюсь, поможет,

person Esteban Aliverti    schedule 03.10.2013

Оказалось, что ответ был просто в сравнении.

Map( $limit: this["FailureLimit"] ) 
activity: LimitExceededActivity( failureRate > (Float) $limit)
person rjsang    schedule 09.10.2013