2013-05-24 4 views
8

Мне нужна небольшая помощь с назначением Drools и переменной.Drools получает информацию из базы данных во время выполнения

rule "check that no previously submitted requests exist" 
when 
    $user : UserFormField(name == 'employeeId', value != null) 
    $repository : Repository() 
    $activeRequests : List() from $repository.findActiveRequestsByEmployee($user.getValue()) # call to repository 
    eval($activeRequests.size() > 0) 
then 
    System.err.println(' You have active requests: ' + ((Request)$activeRequests.get(0)).getTitle); 
    insert(Boolean.TRUE); 
end 

В этом правиле я пытаюсь получить доступ к репозиторию и получать активные запросы для текущего пользователя. Правило компилируется и выполняется без каких-либо исключений или предупреждений. В режиме отладки видно, что репозиторий возвращает не пустой список, и я ожидаю увидеть сообщение консоли «У вас активные запросы», но этого не происходит. Я думаю, что проблема в этой строке

$activeRequests : List() from $repository.findActiveRequestsByEmployee($user.getValue()) 

потому, что это правило работает отлично

rule "check that no previously submitted requests exist" 
when 
    $user : UserFormField(name == 'employeeId', value != null) 
    $repository : Repository() 
    eval($repository.findActiveRequestsByEmployee($user.getValue()).size() > 0) 
then 
    System.err.println(' You have active requests !'); 
    insert(Boolean.TRUE); 
end 

Так может кто-то момент мне, как решить эту проблему?

Спасибо!

ответ

4

Мне помогли найти решение. Я должен использовать from collect выражения вместо простого from связывать факты в коллекцию:

$activeRequests : ArrayList() from collect (Request() from $repository.findActiveRequestsByEmployee($user.getValue())) 
2

Вы должны различать (т.е. читать мелкий шрифт в документации ) между «от» и «от Collect». Если вы хотите, чтобы правило запускалось индивидуально для каждого элемента коллекции, созданного выражением после «from», затем используйте «from». Если, однако, вы хотите, чтобы все было в комплекте, вы должны использовать «from collect».

$activeRequests : ArrayList() from collect (Request() from 
$repository.findActiveRequestsByEmployee($user.getValue())) 

Обратите внимание, что отдельная оценка не требуется. Вы можете поместить это ограничение в шаблон ArrayList:

ArrayList(size > 0) 
Смежные вопросы