处理重复文件名逻辑问题
来源:5-6 实现高并发幂等用户注册接口-唯一索引(五)

qq_穹_0
2023-06-13
private void handleDuplicateFilename(RPanUserFile entity) {
String filename = entity.getFilename(),
newFilenameWithoutSuffix,
newFilenameSuffix;
int newFilenamePointPosition = filename.lastIndexOf(RPanConstants.POINT_STR);
if(newFilenamePointPosition == RPanConstants.MINUS_ONE_INT) {
newFilenameWithoutSuffix = filename;
newFilenameSuffix = StringUtils.EMPTY;
} else {
newFilenameWithoutSuffix = filename.substring(RPanConstants.ZERO_INT, newFilenamePointPosition);
newFilenameSuffix = filename.replace(newFilenameWithoutSuffix, StringUtils.EMPTY);
}
int count = getDuplicateFilename(entity, newFilenameWithoutSuffix);
if(count == 0){
return;
}
String newFilename = assembleNewFilename(newFilenameWithoutSuffix, count, newFilenameSuffix);
entity.setFilename(newFilename);
}
/**
* 查找同一文件夹下面的同名文件数量
*/
private int getDuplicateFilename(RPanUserFile entity, String newFilenameWithoutSuffix) {
QueryWrapper<RPanUserFile> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("parent_id", entity.getParentId());
queryWrapper.eq("folder_flag", entity.getFolderFlag());
queryWrapper.eq("user_id", entity.getUserId());
queryWrapper.eq("del_flag", DelFlagEnum.NO.getCode());
queryWrapper.likeLeft("filename", newFilenameWithoutSuffix);
return count(queryWrapper);
}
老师,我总觉得处理重复文件名这里逻辑有问题,因为传入的文件名应该是带后缀的,只要后缀不一样哪怕文件名字一样也可以啊。还有在查找同一文件夹下的同名文件数量的函数里QueryWrapper里的条件 queryWrapper.likeLeft(“filename”, newFilenameWithoutSuffix) 这是左模糊匹配,这样查到的应该是以%newFilenameWithoutSuffix结尾的文件名,有可能出现多个文件名有相同的后半部分情况(我不知道数据库表中存的文件名带后缀没,如果带后缀那这样永远不会匹配到带后缀的文件名啊),而且%xx这种左模糊查询还会造成索引失效问题。
写回答
1回答
-
RubinChu
2023-06-13
这里确实有问题,同学很细心哈。
关于左半模糊匹配的问题:修改为 likeRight
修正思路:根据条件模糊查询处理所有的匹配记录,遍历记录去匹配,从没有括号后缀的全文件名去比对,查询记录中有的话,开始加后缀,并从 1 开始继续匹配,一直匹配到没有对应重复名称的情况为止,此时的文件名称就是新文件名称。
这个问题老师会在我们后期迭代的版本中提 issue 哈。
课程后面的搜索语法左半模糊匹配也使用 likeRight。
这两个问题都会作为 issue 在迭代版本中更正哈。
00
相似问题