2012-02-24 19 views
10

Właśnie zacząłem używać Drools (wersja 5.1.0), więc proszę o zachowanie mnie na wypadek, gdyby na to pytanie już udzielono odpowiedzi.Sprawdź konkretny element na liście w Drools

Mam obiekt java.util.List która zawiera obiekty typu złożonego A A AS

class A { 
    String name; 
    String Value;} 

Lista jak również jej elementy znajdują się w pamięci roboczej silnika Drools. Czy istnieje prosty sposób uruchomienia reguły tylko wtedy, gdy nazwa i wartość elementu na liście są zgodne z określonymi wartościami?

Obecnie używam zdefiniowanej przez siebie funkcji wewnątrz reguły Drools, która jest iterowana nad listą i zwraca wartość true, jeśli istnieje element zgodny ze specyfikacją, jednak zastanawiam się, czy jest to najbardziej wydajne i najłatwiejsze użycie.

Odpowiedz

14

Jeśli instancje A są w pamięci roboczej, jak mówisz (idealny scenariusz), wystarczy napisać regułę używając go:

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

Wstawianie zbiory (listy, drzewa, itp) do pamięci roboczej bezpośrednio jest niezalecane, ponieważ są abstrakcyjnymi strukturami danych bez żadnego wewnętrznego semantycznego połączenia. Ale powiedzmy, że masz klasę Person, która zawiera listę adresów i chcesz uruchomić regułę dla każdego adresu w Montrealu, w Kanadzie, bez umieszczania samych adresów jako facetów. Można napisać:

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

Wreszcie, jeśli naprawdę chcesz użyć samej listy jako fakt (ponownie, złe praktyki), można wykonać następujące czynności, ale należy pamiętać, że będzie on pasował do wszystkich list w pamięci roboczej :

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

+1 za pokonanie mnie za uderzenie z zasadniczo tą samą odpowiedzią, w której byłem w trakcie pisania. – mike9322

+0

Dzięki za odpowiedź – serena

+0

@Edson Tirelli Jak wyjść z pętli. Powiedz dla każdego adresu, Mam funkcję, która zwraca mi wartość boolean; stąd robię 'Osoba ($ adresy: adresy); $ a: Adres() z $ adresów; eval ($ e.returnBoolean()); ' ' następnie // zrób coś; ' Teraz, jeśli po otrzymaniu eval; Jeśli to prawda; to "zrób coś", a następnie chcę wyjść z pętli. Jak mam to załatwić? – Kraken

Powiązane problemy