Есть ли какой-либо способ использовать ключевое слово ‘in’ в функции ‘eval’ в файле drl drools

#drools

#drools

Вопрос:

Я хочу использовать ключевое слово ‘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
 

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

Отредактировано

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

Снимок 1: таблица решений без eval ()

Снимок 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:

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

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

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

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

Комментарии:

1. Да, пожалуйста, не используйте eval. Вы не должны использовать eval.

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