テーブルの組み合わせ、GrailsのWebサービスデータ
-
24-09-2019 - |
質問
一致するロジックと入力検索基準に基づいて、組み合わせテーブルを表示するための最良のアプローチを把握しようとしています。
これが状況です:
地元に保管されている顧客のテーブルがあります。関心のある分野は、SSN、名、姓、生年月日です。
また、同じ情報を提供するWebサービスもあります。 Webサービスの顧客の一部は、ローカルファイルと同じであり、いくつかは異なります。
SSNも必要ありません。
このデータを組み合わせて、Grailsディスプレイで表示する必要があります。
組み合わせの基準は1)SSNの一致です。 2)残りの記録については、名、姓、生年月日の正確な一致。
この時点で、Soundexまたは近似ロジックについては必要ありません。
私がすべきことは、両方の入力からすべてのレコードを単一のコレクションに抽出し、どういうわけかSSNのセットにすることです。次に、空白のSSNを削除します。
これにより、SSNマッチングが処理されます(そのセットを作成する方法がわかります)。
次に、元の2つの入力ソース(再読み取りを防ぐためにコレクションにキャッシュされた)に戻り、以前に派生したSSNセットに存在するレコードを削除する必要があります。
次に、名、姓、生年月日に基づいて別のセットを作成します。セットの作成方法を見つけ出すことができれば。
次に、2つの派生コレクションを単一のコレクションに組み合わせます。コレクションは、ディスプレイの目的でソートする必要があります。
これは理にかなっていますか?検索条件により、記録の数が制限されるため、メモリでこれを行うことができると思います。
基本的に、私はGrailsコードが上記のロジックを達成するためにどのように探しているかについてのいくつかのアイデアを探しています(これが良いアプローチであると仮定します)。ローカルの顧客テーブルはドメインオブジェクトですが、WSから取得しているものはオブジェクトの配列リストです。
また、ディスプレイに使用される最大、firstresult、および順序がどのように影響を受けるかについては、私は完全に明確ではありません。最初に検索基準に一致するすべてのレコードを読み、結合を行い、派生コレクションから表示する必要があると思います。
解決
これを行う従来のJavaの方法は、ローカルオブジェクトとリモートオブジェクトの両方をカスタムコンパレータを使用してツリーセットコンテナにコピーすることです。
これは次のように見えるかもしれません:
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
この時点で、FilteredCustomersには、2つの基準によって重複しているレコードを除き、すべてのレコードがあります。
別のアプローチは、並べ替えて行うことによってリストをフィルタリングすることです foldr 操作、隣接する要素が一致する場合は組み合わせます。これにより、両方のソースからのデータを組み合わせる機会があります。
例えば:
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
}
}
}