处理重复文件名逻辑问题

来源: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 在迭代版本中更正哈。

0
0

SpringBoot+Vue3+Element Plus打造私人分布式存储系统

SpringBoot+Vue3+Element Plus 仿百度网盘实战

274 学习 · 347 问题

查看课程