2016-07-02 2 views
1

Есть ли разница в том, как Drools пересматривает новую партию правил, чтобы вызвать, если у меня есть один изменить заявление против нескольких операторов Modify, как показано нижеDrools Несколько операторов Modify против одного Modify Заявление

rule "Multiple Modify Statements" 
    dialect "mvel" 
    when 
     $m : Message(status == Message.HELLO) 
    then 
     modify ($m) { message = "Hope" }; 
     modify ($m) { status = Message.GOODBYE }; 
end 

rule "Single Modify Statements" 
    dialect "mvel" 
    when 
     $m : Message(status == Message.HELLO) 
    then 
     modify ($m) { message = "Never Give Up", 
         status = Message.GOODBYE }; 
end 

И есть ли какие-либо последствия для производительности.

На самом деле мы пытаемся создать таблицу решений excel с действиями для каждого столбца, поэтому несколько инструкций модификации более предпочтительны, поскольку они могут быть представлены несколькими столбцами в файле excel.

Любые идеи очень ценятся.

ответ

2

Интересный вопрос.

RHS правил в Drools скомпилированы в классы Java. Если вы посмотрите на сгенерированные классы в вашем примере, вы увидите следующее:

При использовании 2 изменяет заявления, следующий код получает генерируется:

$m.setMessage("Hope"); 
update($m); 
$m.setStatus(Message.GOODBYE); 
update($m); 

Теперь, при использовании одного изменения договора сгенерированный код выглядит следующим образом:

$m.setMessage("Hope"); 
$m.setStatus(Message.GOODBYE); 
update($m); 

разница заключается в том, сколько раз метод update будет вызван. Этот метод является тем, который инициирует оценку любого состояния, связанного с классом Message.

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

Надеется, что это помогает,

+0

Если правило образца является типичным, тем изменение 'status' вызывает изменение в сети двигателя оценок модели. + – laune

+0

@laune: На самом деле, мы хотим создать таблицу решений и иметь множество сеттеров. Мы хотим представить каждый сеттер как действие. Не могу понять, как это сделать, используя инструкцию single modify. Возможно, что мы можем сделать, это иметь нормальные сеттеры и оператор обновления в последнем столбце –

+0

Это также упростит ваши столбцы действий. - Совет: слейте «последний столбец», чтобы иметь возможность выбрать действие для всех строк одной записью. – laune