Как оценить, находится ли значение в списке значений в DROOLS

В DROOLS, если мы смотрим, находится ли значение «foo» в списке {fu, fa, fe, fi, fo, foo, fum, doodle, dee}, когда MVEL анализирует это в DRL, мы получаем что-то вроде это:

if("foo" == "fu" || "foo" == "fa" || "foo" == "fe" || ...)

Это нормально, пока список относительно небольшой, но нам нужно увидеть, находится ли предоставленный zipCode в списке zipCode, поэтому нам нужно создать что-то вроде этого:

Установите zipCodes = getAllZipCodesInNHNYandHalfOfCA() [Итак, вы знаете, что в США около 40 тысяч почтовых индексов]

if(zipCodes.contains(customer.getZipCode()){ ... правило оценивается как истинное }

Я ищу, как научить DROOLS делать это сравнение так, как нам нужно, а не так, как оно у нас сейчас.

Мысли, комментарии, предложения?

Спасибо,

Джейсон


person JTryon    schedule 14.11.2018    source источник


Ответы (2)


Вы можете вызвать метод Java из правила Drools. Итак, вы пишете метод

boolean isZipCodeInArea(String area, String zipCode) {
  return getZipCodesOf(area).contains(zipCode);
}

И затем в правиле Drools, когда часть вы можете вызвать эту функцию:

when 
  isZipCodeInArea("area", "foo")
person Master Drools    schedule 15.11.2018

Вы можете использовать оператор in и указать значения в списке, разделенном запятыми. Если вы намерены проверить ввод, вы можете использовать «не в» и предпринимать соответствующие действия, когда введенного значения нет в списке.

e.g. when Model( fieldName in ("fu", "fa", "foo") ) then <do - something> end

person Jose    schedule 18.04.2019