У меня есть вопрос о том, как оцениваются условия для таблиц решений Drools. Я думал, что условия оцениваются слева направо, и если самый левый столбец, который он проверял на заданное правило, был ложным, он не проверял остальные условия.
Одной из причин, по которой это важно для меня, является концепция размещения условий, которые сужают область действия, как можно дальше влево. Это означало бы, что объекты будут удалены раньше, чем большинство объектов, сначала удовлетворяющих широкому условию и продолжающих проверять дополнительные условия.
Однако это не то поведение, которое я наблюдал в модульном тесте, о котором я расскажу ниже.
Этот пример прост и не предназначен для демонстрации раннего сужения области действия.
|------------------|-------------------| |Condition |Condition | |------------------|-------------------| |myObject |myObject | |------------------|-------------------| |isNameEq("$param")|isValueEq("$param")| |------------------|-------------------| |A |1 | |A |2 | |A |3 | |A |4 | |A |5 | |B |4 | |B |5 | |B |6 | |B |7 | |------------------|-------------------|
В этом примере isNameEq и isValueEq являются функциями из java-объекта myObject. Пожалуйста, игнорируйте любую небольшую ошибку Drools/отсутствие объявленного импорта, так как я знаю, что мой тест работает нормально, и эта иллюстрация является приблизительным, чтобы передать сценарий.
Две функции включают простую регистрацию, чтобы показать, когда они вызываются. Для объекта с именем = A и значением = 3 я ожидал бы, что функция isValueEq никогда не будет вызываться для правил с B в столбце имени (самый левый), потому что объект не соответствует этому условию.
Однако в журнале указано, что вызовы функций выполнялись в следующем порядке:
- isNameEq(A)
- isNameEq(B)
- isValueEq(1)
- isValueEq(2)
- isValueEq(3)
- isValueEq(4)
- isValueEq(5)
- isValueEq(6)
- isValueEq(7)
Это звучит правильно? Я просто ошибся в своем предположении? Является ли это частью алгоритма rete и кэширования оценок (узлов?), поскольку он не вызывал isValueEq для (B, 4), (B, 5)?
Спасибо всем, кто может пролить свет на это для меня!