Pergunta

Eu estou tentando descobrir a melhor abordagem para exibir combinado tabelas com base na lógica de correspondência de entrada e de critérios de pesquisa.

Aqui está a situação:

Temos uma tabela de clientes armazenados localmente.Os campos de interesse são ssn, primeiro nome, último nome e data de nascimento.

Também temos um serviço da web que fornece as mesmas informações.Alguns dos clientes de serviço da web são o mesmo que o local de arquivo, algumas diferentes.

SSN não é exigido em qualquer um.

Eu preciso de combinar este tipo de dados a ser visualizado em um Grails exibição.

Os critérios para a combinação de 1) correspondência SSN.2) Para os restantes registos, correspondência exata no primeiro nome, último nome e data de nascimento.

Não há necessidade, neste ponto, para soundex ou aproximado de lógica.

Parece que o que eu deveria fazer é extrair todos os registos de ambas as entradas em uma única coleção, de alguma forma, tornando-a um conjunto de SSN.Em seguida, remover o espaço em branco ssn.

Isto irá lidar com o SSN correspondência (uma vez que eu descobrir como fazer com que um conjunto).

Então, eu preciso voltar para o original de duas fontes de entrada (em cache em uma coleção para evitar uma re-leitura) e remover todos os registros que existem no SSN definir derivada anteriormente.

Em seguida, crie outra definido com base no nome, sobrenome e data de nascimento - de novo, se eu pudesse descobrir como fazer um conjunto.

Em seguida, combinar as duas derivadas coleções em uma única coleção.A coleta deve ser classificados, para fins de exibição.

Isto faz sentido?Eu acho que os critérios de pesquisa irá limitar o número de registro puxado para que eu possa fazer isso em memória.

Essencialmente, estou procurando algumas idéias sobre como o Grails código ficaria para alcançar a lógica acima (supondo que esta é uma boa aproximação).O local do cliente tabela é um objeto de domínio, enquanto que o que eu estou recebendo o WS é uma lista de matriz de objetos.

Também, eu não sou inteiramente clara sobre como o maxresults, firstResult, e a ordem para a exibição seria afetada.Eu acho que eu preciso para a leitura de todos os registros que correspondam aos critérios de procura, primeiro, fazer a combinação, e apresentar a partir da derivada da coleção.

Foi útil?

Solução

O tradicional Java maneira de fazer isso seria a cópia local e remoto objetos em TreeSet recipientes com um costume de comparação, primeiro para SSN, segundo de nome/data de nascimento.

Isso pode 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

Neste ponto, filteredCustomers tem todos os registros, exceto aqueles que são duplicatas por seus dois critérios.

Outra abordagem é a de filtrar a lista de classificação e fazendo um foldr a operação, combinando elementos adjacentes se eles correspondem.Dessa forma, você tem uma oportunidade para combinar os dados de ambas as fontes.

Por exemplo:

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 em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top