Правит слюни, чтобы фильтровать элемент с числовым свойством ниже процента от общего числа из списка - PullRequest
2 голосов
/ 10 января 2011

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

Я применяю это правило к списку объектов одного типа (в этом классе есть поле с именем numberOfExecutions ). Для каждого элемента из списка мне нужно выбрать те, которые имеют numberOfExecutions выше 5% из total_OfExecutions (сумма numberOfExecutions всех элементов в списке).

Я пока не мог придумать хороший способ реализовать это в слюнях, есть у кого-нибудь предложение?

EDIT1: Лучшее, что я мог себе представить, - это предварительно вычислить сумму numberOfExecutions, прежде чем применять правила и сделать это значение каким-то образом доступным для правил drools.

Ответы [ 2 ]

1 голос
/ 11 января 2011

Решение зависит от вашей способности изменять или создавать новые классы объектов. Вот что я бы сделал в вашем случае:

rule "Rule 1"
when
  $m : MyObject(counted == false)
  $c : Calculator
then
  modify($m) { setCounted(true); }
  $c.count($m);
end

rule "Rule 2"
when
  not  MyObject(counted == false)
  $m : MyObject(numberOfExecutions > ($c.totalExecutions * 0.05))
  $c : Calculator
then
  $m.markBiggerThan5();
end

Я ввел новый класс Calculator, который считает неисчисляемые объекты (Rule 1). Как видите, Rule 2 (тот, который вы запрашиваете) будет срабатывать только тогда, когда все объекты помечены как подсчитанные и итоговые значения сохранены в Calculator.

0 голосов
/ 11 января 2011

Вы можете использовать "Java" Rule Dialect.Сделайте функцию, которая выполняет вашу логику для numberOfExecutions и установите соответствующий флаг.Вы можете передать список объектов или один объект один за другим для проверки критериев numberOfExecutions.Этот метод будет работать как любой обычный метод Java.Ниже приведен небольшой пример вызова функции.Это может помочь.

rule "numberOfExecutions "
    dialect "java"
    salience -1

    when

        $obj : yourObject()     
        eval(if not counted)

    then        
        checkNumberOfExecution($obj);

end

function void checkNumberOfExecution(com.test.YourObject obj) {

        //Your logic
}

Это просто подсказка.Вы можете использовать его как хотите.

Спасибо.

...