2012-02-24 18 views
10

Ho appena iniziato a utilizzare Drools (versione 5.1.0) quindi ti prego di avere pazienza con me nel caso in cui questa domanda avesse già una risposta.Cerca elementi specifici in un elenco in Drools

Ho un oggetto java.util.List che contiene oggetti di tipo complesso A, con A come:

class A { 
    String name; 
    String Value;} 

La lista così come i suoi elementi sono nella memoria di lavoro del motore Drools. C'è un modo semplice per attivare una regola solo se il nome e il valore di un elemento nell'elenco corrispondono a valori specifici?

Attualmente, sto usando una funzione auto-definita all'interno della regola Drools, che scorre sull'elenco e restituisce true se c'è un elemento che corrisponde alla specifica, tuttavia mi chiedo se questo è l'uso più efficiente e semplice.

risposta

14

Se le istanze di A sono nella memoria di lavoro come dici tu (scenario ideale), basta scrivere la regola di usarlo:

rule X 
when 
    A(name == "bob", value == 10) 
... 

collezioni Inserimento (liste, alberi, ecc) nella memoria di lavoro direttamente è sconsigliato, perché sono strutture di dati astratte senza alcuna semantica intrinseca allegata. Ma diciamo che hai una classe Person, che contiene un elenco di indirizzi e che vuoi eseguire la regola per ogni indirizzo a Montreal, in Canada, senza inserire gli indirizzi come facs. È possibile scrivere:

rule X 
when 
    Person($addresses : addresses) 
    Address(city == "Montreal", country == "CA") from $addresses 
... 

Infine, se davvero si vuole utilizzare l'elenco stesso come un dato di fatto (di nuovo, cattiva pratica), è possibile effettuare le seguenti operazioni, ma nota che corrisponderà tutte le liste nella memoria di lavoro :

rule X 
when 
    $list : List() 
    A(name == "bob", value == 10) from $list 
... 
+1

+1 per picchiarmi al punzone con essenzialmente la stessa risposta ero nel mezzo della scrittura. – mike9322

+0

Grazie per la risposta – serena

+0

@Edson Tirelli Come faccio a uscire da un ciclo. Per ogni indirizzo, ho una funzione che mi restituisce booleana; quindi faccio 'Persona ($ indirizzi: indirizzi); $ a: Indirizzo() da $ indirizzi; eval ($ e.returnBoolean()); ' ' then // fa qualcosa; ' Ora se dopo aver ottenuto la valutazione; se è vero; 'fa qualcosa' e poi voglio uscire dal ciclo. Come faccio a farlo? – Kraken