Есть ли способ использовать ключевое слово «in» в функции «eval» в файле drl drools - PullRequest
0 голосов
/ 18 апреля 2019

Я хочу использовать ключевое слово «in» в функции «eval», в котором я получаю сообщение об ошибке, что «in» не распознается drools. Поэтому у меня есть несколько значений, которые я хочу проверить по атрибуту конкретного факта

when
    $person : Person(PIN in ("123","456","789"))
then
    //do something
end

// Вот так я хочу использовать его в eval

when
    $person : Person()
    eval($person.PIN in ("123","456","789"))
then
    //do something
end

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

1010 * Отредактированный *

Итак, у меня есть некоторые условия в Таблице решений, где я хочу использовать eval, потому что другие способы не помогают в моем сценарии, ниже снимок объяснит

SnapShot 1: таблица решений без eval ()

SnapShot 2: таблица решений с eval ()

  1. Ошибка в первом снимке: При компиляции электронной таблицы условие переходит ко второму объекту строк, как показано ниже: код интерпретируется следующим образом:
when
   personMap : PersonMap ()
   basicEligiblePerson : Person( personalAddress.PIN in ($param) ) from 
   personMap.AddressesList
   addresses : Address() from basicEligiblePerson.AddressesList
   personalAddress : PersonalAddress() from addresses.PersonalAddress
then
   basicEligiblePerson.setEligibility(true);
end
  1. Ошибка во втором снимке: При компиляции этой таблицы условие переходит к функции eval (), но ключевое слово «in» не работает в eval ().
when
   personMap : PersonMap ()
   basicEligiblePerson : Person( personalAddress.PIN in ($param) ) from 
   personMap.AddressesList
   addresses : Address() from basicEligiblePerson.AddressesList
   personalAddress : PersonalAddress() from addresses.PersonalAddress
   eval( personalAddress.PIN in ($param) )
then
   basicEligiblePerson.setEligibility(true);
end

что мне делать?

1 Ответ

1 голос
/ 18 апреля 2019

Первый образец, указанный в вашем вопросе, достаточен для проверки.Вам не нужно использовать eval.

when
    $person : Person(PIN in ("123","456","789"))
then
    //do something
end

Если ваше требование состоит в том, чтобы установить право на истину для данного набора ПИН-кодов, то вам на самом деле не нужна таблица решений.Я не совсем понимаю вашу структуру POJO, поэтому, если у класса Person есть переменная-член addressList, а у класса AddressList есть член personalAddress, в котором есть переменная-член pin, вы можете получить результаты, используя следующее правило.Обратите внимание, что для вложенных полей используются имена переменных-членов, а не имена классов.Кроме того, при доступе к вложенным элементам, если любой из элементов может иметь значение NULL, добавьте также проверку на NULL, чтобы избежать исключений нулевого указателя.

when
   $basicEligiblePerson : Person( addressesList.personalAddress.pin in ("1234", "4567") ) 
then
   $basicEligiblePerson.setEligibility(true);
end
...