Domanda

Sto cercando di capire il miglior approccio per visualizzare le tabelle sono combinate in base alla corrispondenza logica e inserire i criteri di ricerca.

Ecco la situazione:

Abbiamo una tabella di clienti memorizzati localmente.I campi di interesse sono: codice fiscale, nome, cognome e data di nascita.

Abbiamo anche un servizio web che fornisce le stesse informazioni.Alcuni clienti per il servizio web sono le stesse del file locale, diverse.

SSN non è richiesto in entrambi.

Ho bisogno di combinare questo tipo di dati da visualizzare su un Grails display.

I criteri per combinazione sono: 1) il match sul SSN.2) Per ogni record rimanenti, esatta corrispondenza con nome, cognome e data di nascita.

Non c'è bisogno, a questo punto, per soundex o approssimativo di logica.

Sembra che quello che dovrei fare è estrarre tutti i record da entrambi gli ingressi in un unico insieme, in qualche modo, il che rende un set sul SSN.Quindi rimuovere la protezione ssn.

Questo consentirà di gestire il SSN corrispondenza (una volta ho capire come fare in modo che un insieme).

Allora, ho bisogno di tornare all'originale due sorgenti di ingresso (nella cache in una raccolta per evitare di ri-leggere) e rimuovere tutti i record presenti nel SSN set derivati in precedenza.

Quindi, creare un altro set in base a nome, cognome e data di nascita, di nuovo se riesco a capire come fare un set.

Unire quindi i due derivati raccolte in un'unica raccolta.La raccolta deve essere ordinato per scopi di visualizzazione.

Questo ha senso?Penso che i criteri di ricerca consente di limitare il numero di record tirato in modo che io possa fare questo in memoria.

In sostanza, sto cercando alcune idee su come il Graal di codice per realizzare la logica precedente (supponendo che questo è un buon approccio).Il locale tabella clienti è un oggetto di dominio, mentre quello che sto ricevendo dalla WS è una matrice elenco di oggetti.

Inoltre, io non sono del tutto chiaro su come la maxresults, firstResult, e l'ordine utilizzato per il display potrebbe essere interessato.Penso che ho bisogno di leggere tutti i record che corrispondono ai criteri di ricerca prima di fare la combinazione, e il display da derivati di raccolta.

È stato utile?

Soluzione

Il tradizionale Java modo per farlo sarebbe quello di copiare entrambi i locali e remoti oggetti in TreeSet contenitori personalizzati comparatore, prima per il SSN, il secondo il nome/data di nascita.

Questo potrebbe essere qualcosa del genere:

def localCustomers = Customer.list()
def remoteCustomers = RemoteService.get()
TreeSet ssnFilter = new TreeSet(new ClosureComparator({c1, c2 -> c1.ssn <=> c2.ssn}))
ssnFilter.addAll(localCustomers)
ssnFilter.addAll(remoteCustomers)
TreeSet nameDobFilter = new TreeSet(new ClosureComparator({c1, c2 -> c1.firstName + c1.lastName + c1.dob <=> c2.firstName + c2.lastName + c2.dob}))
nameDobFilter.addAll(ssnFilter)
def filteredCustomers = nameDobFilter as List

A questo punto, filteredCustomers ha tutti i record, ad eccezione di quelli che sono i doppioni dai vostri due criteri.

Un altro approccio è quello di filtrare gli elenchi di ordinamento e di fare un foldr l'operazione, che unisce elementi adiacenti se corrispondono.In questo modo, si ha l'opportunità di combinare i dati provenienti da entrambe le fonti.

Per esempio:

def combineByNameAndDob(customers) {
    customers.sort() { 
        c1, c2 -> (c1.firstName + c1.lastName + c1.dob) <=> 
                  (c2.firstName + c2.lastName + c2.dob)
    }.inject([]) { cs, c -> 
        if (cs && c.equalsByNameAndDob(cs[-1])) {
            cs[-1].combine(c)  //combine the attributes of both records
            cs
        } else {
            cs << c
        }
    }
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top