2015-11-11 19 views
5

Dodałem obiekt z klasy zdefiniowanej przez użytkownika do HashMap. Po wprowadzeniu do kodu Drools, mogę wykonać iterację poprzez HashMap i uzyskać parę klucz i wartość. Ale nie mam dostępu do atrybutów wewnątrz klasy użytkownika, która jest sekcją wartości w HashMap.Obiekt dostępu do obiektów Drools wewnątrz HashMap podczas iterowania

To jest plik POJO służący do przechowywania danych. To POJO zostanie wstawione do LinkedHashMap za pomocą oddzielnego klucza. Obecnie ten klucz jest właśnie generowany za pomocą prostej pętli for.

package com.sample.pojos; 

import java.util.Date; 

public class DateSet { 

public DateSet() { 
    // TODO Auto-generated constructor stub 
    super(); 
} 

public DateSet(String trainingType, Date completedDate, Date expirationDate) { 
    super(); 
    this.trainingType = trainingType; 
    this.completedDate = completedDate; 
    this.expirationDate = expirationDate; 
} 

private String trainingType; 
private Date completedDate; 
private Date expirationDate; 



public String getTrainingType() { 
    return trainingType; 
} 
public void setTrainingType(String trainingType) { 
    this.trainingType = trainingType; 
} 
public Date getCompletedDate() { 
    return completedDate; 
} 
public void setCompletedDate(Date completedDate) { 
    this.completedDate = completedDate; 
} 
public Date getExpirationDate() { 
    return expirationDate; 
} 
public void setExpirationDate(Date expirationDate) { 
    this.expirationDate = expirationDate; 
} 




} 

To jest kod Java używany do dodawania wartości do LinkedHashMap. Użyłem LinkedHashMap, ponieważ muszę uzyskać dostęp do elementów we właściwej kolejności. Kluczem HashMap jest int, natomiast wartością będzie obiekt DateSet.

outHash.put(incrementedId, new DateSet(training.getTrainingType(), training.getCompletionDate(), 
        training.getExpirationDate())); 

To jest zasada Drools, której używam do obsługi HashMap. Skomentowaną częścią kodu jest to, jak chciałbym użyć obiektu wewnątrz Drools. "entry.getValue()" drukuje obiekt DateSet, ale nie mogę uzyskać dostępu do jego atrybutów.

rule "Validate test" 
agenda-group "validate_init" 
    when 
     someClass: SomeClass($tMap : outHash)      
     entry : Entry($valueV : value) from $tMap.entrySet() 

     //Boolean(booleanValue == true) from ($valueV.getTrainingType() == "NEW")  

    then 
    //System.out.println($valueV.getTrainingType()); 
    System.out.println(entry.getKey() + "-" + entry.getValue()); 
end 
+0

Jestem w stanie wydrukować obiekt DateSet również za pomocą wartości $ valueV. Ale nie mogę uzyskać dostępu do atrybutów nadal ... –

Odpowiedz

2

Zasada ta robi to, co myślę, że chcesz (wersja 6.3.0):

rule "Validate test" 
when 
    SomeClass($tMap : outHash)      
    e: Map.Entry(k:key, v:value) from $tMap.entrySet() 
    DateSet(tt: trainingType == "NEW") from v 
then 
    System.out.println(e.getKey() + "-" + tt); 
end 

Jednakże, można się zastanawiać, dlaczego nie wstawić obiekt DATESET jako pojedynczych faktów, co sprawia, dostępu i filtrowanie dość łatwe. Sztuczna numeracja (incremented) nie jest częścią danych, więc jaki jest jej cel?

Edit Jeśli trzeba porównać jeden obiekt DATESET z następnym (w porządku sortowania według daty), należy dodać atrybut porządkowej do DATESET i wstawić obiekty DATESET. Następnie:

rule "check for overdue training" 
when 
    $ds1: DateSet($ord1: ordinal, $exp: expirationDate) 
    $ds2: DateSet(ordinal == $ord1+1, completedDate > $exp) 
then 
    // ds2 is too late 
end 

Sztuką niej jest to, że atrybut ordinal umożliwia wybranie kolejnymi parami obiektów DATESET (jak zostały one stworzone i ponumerowane są uporządkowane według dat): porównuje pierwszy z drugim, drugi z po trzecie i tak dalej. - Możesz dodać trainingType == "NEW" lub coś podobnego do dalszego wyboru.

+0

Nie muszę porównywać daty wygaśnięcia pary klucz-wartość z zakończoną datą następnej pary podczas iteracji. Sądziłem, że łatwo będzie sobie z tym poradzić, jeśli jest w obiekcie. Wszelkie przemyślenia na temat sposobu porównania? Bardzo doceniane @laune –

+0

Przykładowe porównanie byłoby jak "czy różnica między datą wygaśnięcia tej pary wartości klucza a datą ukończenia następnej pary wynosi więcej niż 2 lata?" @laune –

+0

Więc oryginalne obiekty szkoleniowe są w porządku rosnącym, co powoduje również umieszczenie obiektów DateSet w tej samej kolejności? - Dodano sposób obliczania (co rozumiem), co chcesz zrobić. – laune