2015-11-11 18 views
5

Ho aggiunto un oggetto da una classe definita dall'utente in una HashMap. Quando inserito nel codice Drools, posso scorrere la HashMap e ottenere la coppia chiave e valore. Ma non posso accedere agli attributi all'interno della classe utente che è la sezione del valore di HashMap.Danneggia l'oggetto di accesso all'interno di HashMap durante l'iterazione

Questo è il file POJO utilizzato per contenere i dati. Questo POJO verrà inserito in LinkedHashMap con una chiave separata. Attualmente, questa chiave viene appena generata utilizzando un ciclo for semplice.

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; 
} 




} 

Questo è il codice Java utilizzato per aggiungere valori a LinkedHashMap. Ho usato LinkedHashMap perché ho bisogno di accedere agli articoli nell'ordine corretto. La chiave di HashMap è int mentre il valore sarà un oggetto DateSet.

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

Questa è la regola Drools che sto utilizzando per gestire la HashMap. La parte commentata nel codice è come vorrei utilizzare l'oggetto all'interno di Drools. "entry.getValue()" stampa l'oggetto DateSet ma non posso accedere agli attributi al suo interno.

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

Sono in grado di stampare l'oggetto DateSet utilizzando $ valueV. Ma non riesco ancora ad accedere agli attributi ... –

risposta

2

Questa regola non quello che penso che si desidera (versione 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 

Tuttavia, ci si chiede perché non è stato inserito l'oggetto DateSet come fatti individuali, il che rende l'accesso e filtraggio abbastanza facile. La numerazione artificiale (incrementedId) non fa parte dei dati, quindi qual è il suo scopo?

Modifica Se è necessario confrontare un oggetto DateSet con il (ordinanza ordina per data) accanto si dovrebbe aggiungere un attributo ordinale per DateSet e inserire gli oggetti DateSet. Poi:

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 

Il trucco di lei è che l'attributo ordinal consente di selezionare coppie successive di oggetti DateSet (come sono stati creati e numerata in ordine di data): confronta il primo con il secondo, la seconda con la terzo, e così via. - È possibile aggiungere o simile per ulteriori selezioni.

+0

No, devo confrontare la data di scadenza della coppia di valori chiave con la data completata della coppia successiva durante l'iterazione. Supponevo che sarebbe stato facile gestirlo se si trovava in un oggetto. Qualche idea su come fare il confronto? Molto apprezzato @laune –

+0

Il confronto di esempio sarebbe come "è il divario tra la data di scadenza di questa coppia di valori chiave e la data di completamento della coppia successiva, più di 2 anni?" @laune –

+0

Quindi gli oggetti di allenamento originali sono in ordine di data crescente, che colloca anche gli oggetti DateSet nello stesso ordine? - Aggiunto un modo per calcolare (quello che capisco) che vuoi fare. – laune