Вопрос

Я пытаюсь выяснить лучший подход к отображению комбинированных таблиц на основе соответствующих критериев логики и входных поисков.

Вот ситуация:

У нас есть таблица клиентов, хранящихся на месте. Сервисты, представляющие интерес SSN, имя, фамилия и дата рождения.

У нас также есть веб-сервис, который обеспечивает ту же информацию. Некоторые из клиентов из веб-сервиса такие же, как локальный файл, некоторые разные.

SSN также не требуется.

Мне нужно объединить эти данные, которые нужно просмотреть на дисплее Grails.

Критерии для комбинации 1) совпадают на SSN. 2) Для любых оставшихся записей точное совпадение на имя, фамилия и дата рождения.

На данный момент нет необходимости для Soundex или приблизительной логики.

Похоже, что я должен сделать, это извлекать все записи с обоих входов в одну коллекцию, как-то делает его на SSN. Затем удалите пустой SSN.

Это будет обрабатывать сопоставление SSN (после того, как я выясню, как сделать это набор).

Затем мне нужно вернуться к исходным двум входным источникам (кэшировано в коллекции, чтобы предотвратить перечень) и удалить любые записи, которые существуют в SSN, полученном ранее.

Затем создайте еще один набор на основе имени, фамилии и даты рождения - снова, если я смогу выяснить, как сделать набор.

Затем комбинируйте две полученные коллекции в единую коллекцию. Коллекция должна быть отсортирована для целей отображения.

Имеет ли это смысл? Я думаю, что критерии поиска ограничивают количество рекордов, чтобы я мог сделать это в памяти.

По сути, я ищу некоторые идеи о том, как код Grails будет искать для достижения вышеуказанной логики (предполагая, что это хороший подход). Местный стол клиента - это объект домена, в то время как то, что я получаю от WS, - это список объектов массива.

Кроме того, я не совсем понятен о том, как затронут MaxResults, Firstresult, и заказ, используемый для дисплея. Я думаю, что мне нужно прочитать во всех записях, которые сначала соответствуют критериям поиска, делают объединение и отображение из производной коллекции.

Это было полезно?

Решение

Традиционный вид Java это будет скопировать как локальные, так и удаленные объекты в контейнеры TreeSt с пользовательским компаратором, сначала для SSN, второй для имени / рождения.

Это может выглядеть что-то вроде:

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

На данный момент фильтрацияCustomers имеет все записи, кроме тех, которые дублируется по двум критериям.

Другой подход - отфильтровывать списки, сортировка и выполняя папка Работа, сочетание соседних элементов, если они совпадают. Таким образом, у вас есть возможность объединить данные из обоих источников.

Например:

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
        }
    }
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top