/*** 相似结构表数据计算写入
* 实现思路:
* 1、group by字段信息表,查询存在重复的字段及表Id、表字段数量;
* 2、查询出的一条数据代表某一字段多个表都存在;
* 3、循环所有数据找出表和表之间存在相同字段的数量累加,数据结构如下;
* -------------------------------------------------------------
* 本表 本表字段数量 -> 可能存在相似结构的表1 相同字段数量
* 可能存在相似结构的表2 相同字段数量
* 可能存在相似结构的表3 相同字段数量
* 可能存在相似结构的表4 相同字段数量
* -------------------------------------------------------------
* 4、根据阈值计算符合相似结构表之间的关系;*/@Overridepublic voidinsert() {//查询存在重复字段的表信息//--------------------------------------------------------------------------------//字段英文名、字段中文名、字段类型、bId1,bId2,bId3,bId4、bzdsl1,bzdsl2,bzdsl3,bzdsl4//--------------------------------------------------------------------------------
List xsjgbzdxxes = null;try{
xsjgbzdxxes=xsjgbDao.selectColumnGroup();
}catch(Exception e) {
log.error("查询存在重复字段的表信息出错", e);return;
}//非空效验
if(CollectionUtils.isEmpty(xsjgbzdxxes)) {
log.warn("没有查询到重复字段的表信息");return;
}//统计相似结果表数据集合
List xsjgbxxes = null;
xsjgbxxes= new ArrayList<>();//同一字段多个表都存在的表Id
List bIds = null;//同一字段多个表都存在的表字段数量
List zdsl = null;
Xsjgbxx b1, b2;//每行数据都是一个字段多个表都存在的相同字段
for(XsjgbzdxxDTO xsjgbzdxx : xsjgbzdxxes) {//非空效验
if (StringUtils.isEmpty(xsjgbzdxx.getBIds()) ||StringUtils.isEmpty(xsjgbzdxx.getZdsl())) {
log.warn("表Id为空或表字段数量为空, xsjgbzdxx[{}]", JSONObject.toJSONString(xsjgbzdxx));continue;
}//获取所有表Id
bIds = Arrays.asList(xsjgbzdxx.getBIds().split(","));//获取所有表字段数量
zdsl = Arrays.asList(xsjgbzdxx.getZdsl().split(",")).stream().map(Integer::parseInt).collect(Collectors.toList());//相同字段多个表两两配对
for (int i=0 ; i
b1 =find(xsjgbxxes, bIds.get(i), zdsl.get(i));
b2=find(xsjgbxxes, bIds.get(j), zdsl.get(j));//当前循环中的两个中互为疑似相似表//增加疑似相似表及相似字段数量
this.addColumnNum(b1, b2.getBId());this.addColumnNum(b2, b1.getBId());
}
}
}
List xsjgbs = this.filter(xsjgbxxes);//相似结构表数据入库
xsjgbDao.insertList(xsjgbs);
}/*** 根据表Id在相似表统计集合中查找对应的相似结构表信息
*@paramxsjgbxxes
*@parambId
*@return
*/
private Xsjgbxx find(Listxsjgbxxes, String bId, Integer zdsl) {
Xsjgbxx xsjgbxx= xsjgbxxes.stream().filter(item -> Objects.equals(item.getBId(), bId)).findFirst().orElse(null);if(Objects.isNull(xsjgbxx)) {
xsjgbxx= newXsjgbxx(bId, zdsl);
xsjgbxxes.add(xsjgbxx);
}returnxsjgbxx;
}/*** 增加表对应的疑似相似结构表相似字段数量
*@paramxsjgbxx
*@paramxsbId*/
private voidaddColumnNum(Xsjgbxx xsjgbxx, String xsbId) {//找到相似表信息
XsjgGxbxx xsjgGxbxx = xsjgbxx.getXsjgGxbxxes().stream().filter(item -> Objects.equals(item.getXsbId(), xsbId)).findFirst().orElse(null);//判断是否存在相似表信息
if(Objects.isNull(xsjgGxbxx)) {//记录新的相似表信息
xsjgbxx.getXsjgGxbxxes().add(newXsjgGxbxx(xsbId));
}else{//相似字段数量累加
xsjgGxbxx.increment();
}
}/*** 根据统计出来的疑似相似结构表和相似度阈值过滤出相似结构表信息
*@paramxsjgbxxes
*@return
*/
private List filter(Listxsjgbxxes) {
List xsjgbs = null;
xsjgbs= new ArrayList<>();for(Xsjgbxx xsjgbxx : xsjgbxxes) {for(XsjgGxbxx xsjgGxbxx : xsjgbxx.getXsjgGxbxxes()) {//相似表的相似字段数量除以本表的字段数量//大于相似度阈值的计入相似结构表
if (new BigDecimal(xsjgGxbxx.getXszdsl()).divide(new BigDecimal(xsjgbxx.getZdsl()), 20, BigDecimal.ROUND_HALF_UP).compareTo(XsjgbServiceImpl.DISTANCE) >= 0) {
xsjgbs.add(newXsjgb(xsjgbxx.getBId(), xsjgGxbxx.getXsbId()));
}
}
}returnxsjgbs;
}