سؤال

أحاول معرفة أفضل طريقة لعرض الجداول المدمجة بناءً على مطابقة معايير البحث والبحث عن الإدخال.

هذا هو الوضع:

لدينا جدول من العملاء مخزنة محليا. مجالات الاهتمام هي SSN ، الاسم الأول ، الاسم الأخير وتاريخ الميلاد.

لدينا أيضًا خدمة ويب توفر نفس المعلومات. بعض العملاء من خدمة الويب هم نفس الملف المحلي ، بعضهم مختلف.

SSN غير مطلوب في أي منهما.

أحتاج إلى الجمع بين هذه البيانات ليتم عرضها على شاشة Grails.

معايير الجمع هي 1) تطابق على SSN. 2) لأي سجلات متبقية ، تطابق بالضبط الاسم الأول والاسم الأخير وتاريخ الميلاد.

ليست هناك حاجة في هذه المرحلة لـ Soundex أو المنطق التقريبي.

يبدو أن ما يجب أن أفعله هو استخراج جميع السجلات من كلا المدخلات إلى مجموعة واحدة ، مما يجعلها مجموعة على SSN بطريقة أو بأخرى. ثم إزالة SSN فارغة.

سيتعامل هذا مع مطابقة SSN (بمجرد معرفة كيفية جعل هذه المجموعة).

بعد ذلك ، أحتاج إلى العودة إلى مصدر الإدخال الأصليين (المخبأة في مجموعة لمنع إعادة قراءة) وإزالة أي سجلات موجودة في مجموعة SSN المستمدة مسبقًا.

بعد ذلك ، قم بإنشاء مجموعة أخرى بناءً على الاسم الأول والاسم الأخير وتاريخ الميلاد - مرة أخرى إذا كان بإمكاني معرفة كيفية إنشاء مجموعة.

ثم الجمع بين المجموعتين المشتقتين في مجموعة واحدة. يجب فرز المجموعة لأغراض العرض.

هل لهذا معنى؟ أعتقد أن معايير البحث ستحد من عدد السجلات التي يتم سحبها حتى أتمكن من القيام بذلك في الذاكرة.

في الأساس ، أنا أبحث عن بعض الأفكار حول كيفية البحث عن رمز Grails عن تحقيق المنطق أعلاه (على افتراض أن هذا نهج جيد). جدول العملاء المحلي هو كائن مجال ، في حين أن ما أحصل عليه من WS هو قائمة صفيف للكائنات.

أيضًا ، لست واضحًا تمامًا حول كيفية تأثر MaxResults و Firstresult و Order للعرض. أعتقد أنني بحاجة إلى قراءة جميع السجلات التي تتطابق مع معايير البحث أولاً ، والقيام بالجمع والعرض من المجموعة المشتقة.

هل كانت مفيدة؟

المحلول

تتمثل طريقة 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 على جميع السجلات ، باستثناء تلك التي تتكرر وفقًا لمعاييرك.

نهج آخر هو تصفية القوائم عن طريق الفرز والقيام أضعاف العملية ، الجمع بين العناصر المجاورة إذا كانت متطابقة. بهذه الطريقة ، لديك فرصة للجمع بين البيانات من كلا المصدرين.

فمثلا:

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