Drool неправильно сортирует числа

Я новичок в Drools и пытаюсь заставить пример программы работать. Этот пример приведен в документации по слюням http://docs.jboss.org/drools/release/5.5.0.Final/drools-expert-docs/html_single/index.html#d0e9542. Ожидается, что это правило слюни будет сортировать целые числа. Я просто изменил числа из приведенных в образце, и они не сортируются должным образом. Пытался использовать слюни версий 5.5.0, 5.5.1 и master 6.0.0, но получил те же неверные результаты.

Ниже приведен основной код:

    package com.sample;

    public class Example2 {
      public static void main(String[] args) throws Exception {
        Number[] numbers = new Number[] { wrap(5), wrap(6), wrap(4), wrap(1), wrap(2) };
        new RuleRunner().runRules(new String[] { "Example3.drl" }, numbers);
      }

      private static Integer wrap(int i) {
        return new Integer(i);
      }
    }

Класс RuleRunner такой же, как приведенный в примере, и я не думаю, что должен приводить его здесь, поскольку это загромождает вопрос. Он просто создает базу знаний, сеанс с отслеживанием состояния, вставляет факты, указанные в приведенном выше массиве «числа», а затем вызывает метод fireAllRules в сеансе.

Файл правил (Example3.drl):


правило "Правило 04"
диалект "mvel"
когда
$ number: Number ()
не Number (intValue ‹$ number.intValue)
затем
System.out.println ("Число найдено со значением:" + $ number.intValue ());
retract ($ number);
конец

Я получаю следующий результат:

Loading file: Example3.drl
Inserting fact: 5
Inserting fact: 6
Inserting fact: 4
Inserting fact: 1
Inserting fact: 2
Number found with value: 1
Number found with value: 4
Number found with value: 2
Number found with value: 5
Number found with value: 6

Неправильный ожидаемый порядок сортировки по возрастанию.

Что я делаю не так? Я не могу себе представить, что на этом базовом уровне механизм правил слюни сломается.


person John    schedule 17.01.2013    source источник


Ответы (1)


Похоже, это ошибка, появившаяся в версии 5.5.0 и более поздняя, ​​но существующая до сих пор.
Этот код сортировки отлично работает с 5.4.0.

Обходной путь:


Вместо:
"not Number (intValue‹ $ number.intValue) "
Если вы используете:
" not Number (intValue () ‹$ number.intValue)" < br /> Тогда это работает.



Кажется, что метод без получения, не сообщающий, что это функция, создает проблему.

Изнурительная проблема, которая снижает доверие к продукту на этапе оценки.

person John    schedule 18.01.2013
comment
Скорее всего, это проблема с mvel. Вы можете столкнуться с аналогичными проблемами, если правило выполняется более 20 раз и срабатывает JIT-компилятор. - person ali köksal; 18.01.2013
comment
Ошибка связана с ограничениями «не» и «существует» в сочетании с ‹,‹ =, ›,› =. По словам парней из списка рассылки, теперь это исправлено в версиях 5.6 и 6.0, а для 5.5 создан бэкпорт. - person Steve; 21.01.2013