Pregunta

Estoy tratando de descubrir el mejor enfoque para mostrar tablas combinadas basadas en los criterios de búsqueda de lógica y entrada coincidente.

Aquí está la situación:

Tenemos una tabla de clientes almacenados localmente. Los campos de interés son SSN, primer nombre, apellido y fecha de nacimiento.

También tenemos un servicio web que proporciona la misma información. Algunos de los clientes del servicio web son los mismos que el archivo local, algunos diferentes.

SSN tampoco es necesario en tampoco.

Necesito combinar estos datos para que se vean en una pantalla Grails.

Los criterios para la combinación son 1) coinciden en SSN. 2) Para cualquier registro restante, coincida exacta con el nombre, apellido y fecha de nacimiento.

No hay necesidad en este punto para SoundEx o lógica aproximada.

Parece que lo que debo hacer es extraer todos los registros de ambas entradas en una sola colección, lo que de alguna manera lo convierte en un conjunto en SSN. Luego retire el SSN en blanco.

Esto manejará la coincidencia de SSN (una vez que descubra cómo hacer de eso un conjunto).

Luego, necesito volver a las dos fuentes de entrada originales (almacenados en caché en una colección para evitar una releer) y eliminar cualquier registro que existan en el conjunto SSN derivado anteriormente.

Luego, cree otro conjunto basado en el nombre, el apellido y la fecha de nacimiento, nuevamente si puedo descubrir cómo hacer un conjunto.

Luego combine las dos colecciones derivadas en una sola colección. La colección debe ordenarse para fines de pantalla.

¿Esto tiene sentido? Creo que los criterios de búsqueda limitarán el número de registros extraídos para que pueda hacerlo en la memoria.

Esencialmente, estoy buscando algunas ideas sobre cómo buscaría el código de los Grials para lograr la lógica anterior (suponiendo que este sea un buen enfoque). La tabla local del cliente es un objeto de dominio, mientras que lo que obtengo del WS es una lista de objetos.

Además, no estoy del todo claro sobre cómo se verían afectados los MaxResults, Firstresult y el orden utilizado para la pantalla. Creo que necesito leer en todos los registros que coinciden primero con los criterios de búsqueda, hacer la combinación y mostrar de la colección derivada.

¿Fue útil?

Solución

La forma tradicional de Java de hacer esto sería copiar los objetos locales y remotos en contenedores de árboles de árboles con un comparador personalizado, primero para SSN, segundo para el nombre/fecha de nacimiento.

Esto podría parecer algo como:

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

En este punto, FilteredCustomers tiene todos los registros, excepto los que son duplicados por sus dos criterios.

Otro enfoque es filtrar las listas clasificando y haciendo un plegable operación, combinando elementos adyacentes si coinciden. De esta manera, tiene la oportunidad de combinar los datos de ambas fuentes.

Por ejemplo:

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
        }
    }
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top