0

一致するロジックと入力検索条件に基づいて、結合されたテーブルを表示するための最良の方法を見つけようとしています。

状況は次のとおりです。

ローカルに保存された顧客のテーブルがあります。関心のあるフィールドは、ssn、名、姓、および生年月日です。

また、同じ情報を提供する Web サービスもあります。Web サービスの顧客の中には、ローカル ファイルと同じものもあれば、異なるものもあります。

どちらもSSNは必須ではありません。

Grails ディスプレイで表示するには、このデータを結合する必要があります。

組み合わせの基準は、1) SSN で一致することです。2) 残りの記録については、名、姓、生年月日が完全に一致していること。

この時点では、soundex や近似論理は必要ありません。

私がすべきことは、両方の入力からすべてのレコードを単一のコレクションに抽出し、どういうわけかそれを SSN のセットにすることです。次に、空白の ssn を削除します。

これにより、SSN マッチングが処理されます (それをセットにする方法がわかったら)。

次に、元の 2 つの入力ソース (再読み取りを防ぐためにコレクションにキャッシュされている) に戻り、以前に派生した SSN セットに存在するすべてのレコードを削除する必要があります。

次に、名、姓、生年月日に基づいて別のセットを作成します-セットの作成方法がわかれば、もう一度。

次に、2 つの派生コレクションを 1 つのコレクションに結合します。コレクションは、表示のためにソートする必要があります。

これは理にかなっていますか?検索条件によって取り込まれるレコードの数が制限されるため、メモリ内でこれを行うことができると思います。

基本的に、上記のロジックを実現するために Grails コードがどのように見えるかについて、いくつかのアイデアを探しています (これが適切なアプローチであると仮定します)。ローカルの顧客テーブルはドメイン オブジェクトですが、WS から取得するのはオブジェクトの配列リストです。

また、maxresults、firstResult、および表示に使用される順序がどのように影響を受けるかについては、完全にはわかりません。最初に検索条件に一致するすべてのレコードを読み込み、結合を行い、派生コレクションから表示する必要があると思います。

4

1 に答える 1

1

これを行う従来の Java の方法は、ローカル オブジェクトとリモート オブジェクトの両方をカスタム コンパレータを使用して TreeSet コンテナにコピーすることです。最初は 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

この時点で、filteredCustomers には、2 つの条件で重複しているものを除くすべてのレコードがあります。

もう 1 つの方法は、リストを並べ替えてフォルダー操作を行い、隣接する要素が一致する場合は結合することです。このようにして、両方のソースからのデータを組み合わせることができます。

例えば:

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
        }
    }
}
于 2010-03-03T17:54:06.200 に答える