2013-05-24 13 views
8

Potrzebuję niewielkiej pomocy przy przypisywaniu Drools i zmiennych.Drools uzyskują fakty z bazy danych w środowisku wykonawczym

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 

W tej regule próbuję uzyskać dostęp do repozytorium i otrzymywać aktywne żądania dla bieżącego użytkownika. Reguła kompiluje i wykonuje bez żadnych wyjątków ani ostrzeżeń. W trybie debugowania można zauważyć, że repozytorium zwraca niepustą listę i oczekuję komunikatu konsoli "Masz aktywne żądania", ale tak się nie stanie. Myślę, że problem jest w tym wierszu

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

ponieważ zasada ta działa dobrze

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 

Więc może ktoś wskazać mi, jak rozwiązać ten problem?

Dzięki!

Odpowiedz

4

Pomógł mi znaleźć rozwiązanie. należy używać from collect wyraz zamiast prostego from do bundle fakty w kolekcji:

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

Trzeba odróżnić (tj przeczytać drobnym drukiem w dokumentacji ) pomiędzy „z” i „z zbierać”. Jeśli chcesz, aby reguła uruchamiała się osobno dla każdego elementu kolekcji utworzonego przez wyrażenie po "od", użyj "od". Jeśli jednak chcesz, aby było dołączone do kolekcji, musisz użyć "z kolekcji".

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

Należy pamiętać, że oddzielna ocena nie jest konieczna. Możesz umieścić to ograniczenie w wzorze ArrayList:

ArrayList(size > 0) 
Powiązane problemy