Frage

Ich versuche, den besten Ansatz zu finden, um kombinierte Tabellen basierend auf der passenden Logik- und Eingabe -Suchkriterien anzuzeigen.

Hier ist die Situation:

Wir haben einen Tisch mit Kunden vor Ort. Die Interessenfelder sind SSN, Vorname, Nachname und Geburtsdatum.

Wir haben auch einen Webdienst, der die gleichen Informationen liefert. Einige der Kunden aus dem Webdienst sind die gleichen wie die lokale Datei, andere unterschiedlich.

SSN ist auch nicht erforderlich.

Ich muss diese Daten kombinieren, um sie auf einer Gral -Anzeige zu sehen.

Die Kriterien für die Kombination sind 1) Übereinstimmung mit SSN. 2) Für verbleibende Datensätze übereinstimmen genaue Übereinstimmung mit Vorname, Nachname und Geburtsdatum.

Zu diesem Zeitpunkt ist an dieser Stelle keine Notwendigkeit für SoundEx oder ungefähre Logik erforderlich.

Es sieht so aus, als ob ich alle Datensätze aus beiden Eingängen in eine einzelne Sammlung extrahieren sollte, was sie irgendwie zu einem SSN -Set macht. Entfernen Sie dann die leere SSN.

Dies wird mit dem SSN -Matching umgehen (sobald ich herausgefunden habe, wie ich das zu einem Satz machen kann).

Dann muss ich zu den ursprünglichen zwei Eingangsquellen zurückkehren (zwischengespeichert in einer Sammlung, um eine erneute Lesung zu verhindern) und alle Datensätze entfernen, die im SSN-Set vorhanden sind, das zuvor abgeleitet wurde.

Erstellen Sie dann einen anderen Satz basierend auf Vorname, Nachname und Geburtsdatum - erneut, wenn ich herausfinden kann, wie man einen Satz erstellt.

Kombinieren Sie dann die beiden abgeleiteten Sammlungen zu einer einzigen Sammlung. Die Sammlung sollte für Anzeigezwecke sortiert werden.

Macht das Sinn? Ich denke, die Suchkriterien begrenzen die Anzahl der eingenommenen Aufzeichnungen, damit ich dies im Speicher tun kann.

Im Wesentlichen suche ich nach Ideen, wie der Gralscode für die Erreichung der oben genannten Logik suchen würde (vorausgesetzt, dies ist ein guter Ansatz). Die lokale Kundentabelle ist ein Domain -Objekt, während das, was ich aus dem WS bekomme, eine Array -Liste von Objekten ist.

Ich bin mir auch nicht ganz klar, wie die MaxResults, Firstresult und Reihenfolge für das Display beeinflusst würden. Ich denke, ich muss in allen Datensätzen lesen, die zuerst mit den Suchkriterien übereinstimmen, das Kombinieren durchführen und aus der abgeleiteten Sammlung angezeigt werden.

War es hilfreich?

Lösung

Die traditionelle Java -Art, dies zu tun, besteht darin, sowohl die lokalen als auch die entfernten Objekte in Treeset Container mit einem benutzerdefinierten Komparator zu kopieren, zuerst für SSN, zweitens für Name/Geburtsdatum.

Dies könnte ungefähr aussehen wie:

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

Zu diesem Zeitpunkt hat FilteredCustomers alle Aufzeichnungen, mit Ausnahme derjenigen, die nach Ihren beiden Kriterien Duplikate sind.

Ein anderer Ansatz besteht darin, die Listen durch Sortieren und Durchführen eines A -Ansatzes zu filtern ordr Betrieb, kombiniert benachbarte Elemente, wenn sie übereinstimmen. Auf diese Weise haben Sie die Möglichkeit, die Daten aus beiden Quellen zu kombinieren.

Zum Beispiel:

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
        }
    }
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top