Question

Je suis en train de trouver la meilleure approche pour afficher les tables combinées basées sur la logique correspondant et entrée critères de recherche.

Voici la situation:

Nous avons une table de clients stockés localement. Les domaines d'intérêt sont ssn, le prénom, le nom et la date de naissance.

Nous avons aussi un service Web qui fournit les mêmes informations. Certains des clients du service Web sont les mêmes que le fichier local, une autre.

est SSN pas nécessaire dans les deux.

Je dois combiner ces données à visualiser sur un écran Grails.

Les critères de combinaison sont 1) match sur SSN. 2) Pour les autres enregistrements, correspondance exacte sur le prénom, le nom et la date de naissance.

Il n'y a pas besoin à ce moment pour la logique soundex ou approximative.

Il ressemble à ce que je dois faire est d'extraire tous les enregistrements des deux entrées en une seule collection, faisant en quelque sorte un ensemble sur SSN. Retirez ensuite le ssn vide.

se chargera de la mise en correspondance de SSN (une fois que je figure sur la façon de faire qu'un ensemble).

, Il me faut ensuite revenir aux deux sources d'entrée d'origine (mises en cache dans une collection pour éviter une nouvelle lecture) et supprimer tous les enregistrements qui existent dans l'ensemble des dérivés précédemment SSN.

Ensuite, créez un autre jeu basé sur le prénom, le nom et la date de naissance -. Si je peux comprendre comment faire un ensemble

Ensuite, combiner les deux collections dérivées en une seule collection. La collection doit être triée à des fins d'affichage.

Est-ce que ce sens? Je pense que les critères de recherche limiteront le nombre d'enregistrement tiré dans donc je peux le faire en mémoire.

Pour l'essentiel, je suis à la recherche de quelques idées sur la façon dont le code Grails regarderait pour réaliser la logique ci-dessus (en supposant que c'est une bonne approche). Le tableau de la clientèle locale est un objet de domaine, alors ce que je reçois de la WS est une liste de tableau d'objets.

En outre, je ne suis pas tout à fait clair sur la façon dont les maxresults, firstResult et ordre utilisé pour l'affichage seraient affectés. Je pense que je dois lire dans tous les dossiers qui correspondent aux critères de recherche d'abord, faire la combinaison et l'affichage de la collection dérivée.

Était-ce utile?

La solution

La façon traditionnelle de Java de le faire serait de copier les objets locaux et distants dans des conteneurs TreeSet avec un comparateur personnalisé, d'abord pour SSN, deuxième pour le nom / date de naissance.

Cela pourrait ressembler à:

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

À ce stade, filteredCustomers a tous les dossiers, sauf ceux qui sont des doublons de vos deux critères.

Une autre approche consiste à filtrer les listes par le tri et faire un foldr opération, en combinant des éléments adjacents si elles correspondent. De cette façon, vous avez la possibilité de combiner les données des deux sources.

Par exemple:

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
        }
    }
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top