Слюни: расставьте приоритеты сопоставления фактов на основе значения поля

Рассмотрим следующий сценарий в Drools: у нас есть правило, соответствующее объектам типа A а также B друг против друга.

rule 1
    when
        $a : A()
        $b : B($a.matches($b), flagged == false)
    then
        mofidy($b) { flag($a) }
end

Тем не мение, A объекты имеют поле под названием priorityи когда B поступает в рабочую память, соответствующий A с наивысшим приоритетом должен пометить его, прежде всего другие соответствия As. Как это возможно в Drools? Как это влияет на производительность?

1 ответ

Решение

При условии, что B.flag() устанавливает его flagged атрибут true, вы можете попробовать что-то вроде этого:

rule 1
when
    $a : A()
    not A(this != $a, priority > $a.priority)
    $b : B($a.matches($b), flagged == false)
then
    mofidy($b) { flag($a) }
end

В этом примере следует обратить внимание на то, что, если вставлен объект A с высоким приоритетом, любой B, уже помеченный более низким значением A, не будет повторно помечен.

Если вам нужно пометить ваш B, то вы можете попробовать что-то вроде этого:

rule 1
when
    $a : A()
    not A(this != $a, priority > $a.priority)
    $b : B($a.matches($b), flag != $a)
then
    mofidy($b) { flag($a) }
end

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

Другие вопросы по тегам