2013-05-24 15 views
8

Ho bisogno di un piccolo aiuto con Drools eval e assegnazione variabile.Drools recupera i dati dal database in fase di esecuzione

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 

In questa regola provo ad accedere al repository e ottenere richieste attive per l'utente corrente. La regola viene compilata ed eseguita senza eccezioni o avvisi. In modalità debug si può vedere che il repository restituisce un elenco non vuoto e mi aspetto di vedere il messaggio di console 'You have active request' ma questo non accade. Credo che il problema è in questa linea

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

perché questa regola funziona bene

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 

Così qualcuno potrebbe indicare come risolvere questo problema?

Grazie!

risposta

4

Sono stato aiutato a trovare una soluzione. Dovrei usare from collect espressione invece semplice from per impacchettare i fatti in collezione:

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

Bisogna distinguere (vale a dire, leggere la stampa fine nella documentazione ) tra "da" e "da raccogliere". Se si desidera che la regola venga attivata individualmente per ciascun elemento di raccolta prodotto dall'espressione dopo "da", utilizzare "da". Se, tuttavia, vuoi inserire in un insieme che devi utilizzare "da raccogliere".

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

Si noti che la valutazione separata non è necessaria. È possibile inserire questo vincolo nel modello ArrayList:

ArrayList(size > 0) 
Problemi correlati