将表格,Grails中的Web服务数据组合
-
24-09-2019 - |
题
我试图找出基于匹配逻辑和输入搜索标准显示组合表的最佳方法。
这是情况:
我们有一张本地存储的客户表。感兴趣的领域是SSN,名字,姓氏和出生日期。
我们还拥有一个提供相同信息的Web服务。 Web服务中的一些客户与本地文件相同,有些不同。
两者中都不需要SSN。
我需要将这些数据组合在一起,以在Grails显示屏上查看。
组合的标准为1)SSN上的匹配。 2)对于任何剩余的记录,请与名字,姓氏和出生日期完全匹配。
在这一点上,Soundex或近似逻辑无需。
看来我应该做的是将两个输入中的所有记录提取到一个集合中,以某种方式使其在SSN上设置。然后卸下空白的SSN。
这将处理SSN匹配(一旦我弄清楚如何制作该集合)。
然后,我需要返回到原始的两个输入源(在集合中缓存以防止重新阅读),然后删除先前派生的SSN集中存在的任何记录。
然后,根据名字,姓氏和出生日期创建另一个集合 - 如果我能弄清楚如何制作一组。
然后将两个派生的集合组合到一个集合中。该集合应为显示目的进行排序。
这有意义吗?我认为搜索条件将限制所吸引的记录数,因此我可以在内存中执行此操作。
从本质上讲,我正在寻找一些有关Grails代码如何寻求实现上述逻辑的想法(假设这是一种很好的方法)。本地客户表是一个域对象,而我从WS获得的是对象的数组列表。
另外,我还不清楚如何影响显示显示器的最大值,FIRSTRESULT和订单。我想我需要阅读所有首先匹配搜索条件的记录,进行组合并从派生集合中显示。
解决方案
传统的Java做到这一点的方法是将本地对象和远程对象同时使用自定义比较器(首先适用于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
在这一点上,过滤custemers具有所有记录,除了您的两个标准重复的记录。
另一种方法是通过排序和进行一个 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
}
}
}