Сортировка списка объектов с помощью движка правил Drools

Я пытаюсь отсортировать список объектов, используя набор правил, определенных в движке правил слюни. Примерная структура объекта выглядит следующим образом

public class A {

   String name;
   Date createdDate;

}

Я хочу

  1. Определите набор правил для сортировки списка объектов.
    Пример: правило 1: сортировка объектов по возрастанию имени
    правило 2: сортировка объектов с использованием createdDate по убыванию

  2. Определите порядок, в котором правила должны выполняться.
    Пример: установить порядок 1 как правило 1
    установить порядок 2 как правило 2
    Таким образом, объекты будут отсортированы по имени по возрастанию и созданной дате по убыванию.

Могу ли я добиться этого с помощью движка слюни?
Я думал об использовании compareTo () для сортировки, но поскольку критерии сортировки могут быть изменены во время выполнения, логика становится сложной и трудной в обслуживании.

Спасибо,
Колита.


person kolitha    schedule 22.12.2014    source источник


Ответы (2)


Drools не сортирует объекты так, как быстрая сортировка или какой-либо подобный алгоритм сортировки переупорядочивает объекты в массиве или другом агрегате. Что вы можете сделать, так это запустить правило, многократно, один раз для каждого факта из набора фактов (например, ваших объектов класса A) и с ограничениями, гарантирующими, что это произойдет в определенном порядке. Также нужно отслеживать факты, которые уже были обработаны.

Поэтому в первую очередь нужно ответить на вопрос: зачем вам объекты в определенном порядке?

Если факты нужно обрабатывать в таком порядке, вам не нужно сортировать их в обычном смысле слова, и вышеупомянутого правила будет достаточно:

declare ListOfA
    listOfA: List
end

rule noListOfA
when
    not ListOfA()
then
    ListOfA loa = new ListOfA();
    loa.setListOfA( new ArrayList() );
    insert( loa );
end

rule sortA
when
    $a: A( $name: name, $createdDate: createdDate )
    $loa: ListOfA( $listOfA: listOfA not contains $a )
    not A( this != $a, this not memberOf $listOfA,
                       name < $name ||
                       name == $name && createdDate > $createdDate )
then
    System.out.println( $a );
    modify( $loa ){ getListOfA().add( $a ) }
end
person laune    schedule 22.12.2014

Это способ рассортировать слюни.

rule "Rule 03"
    when
        $number : Number( )
        not Number( intValue < $number.intValue )
    then
        System.out.println("Number found with value: " + $number.intValue() ); 
        retract( $number );
end
person lbolanos    schedule 30.06.2016