bmrlab / gendam

A privacy-first generative DAM
6 stars 1 forks source link

素材库文件夹 CRUD 和文件 CRUD #15

Closed web3nomad closed 2 months ago

web3nomad commented 2 months ago

重命名文件夹的算法是一次性更新 materializedPath 的前缀。是可行的。

UPDATE "FilePath"
SET "materializedPath" = REPLACE("materializedPath", "/a/aa/", "/a/ab/")
WHERE "materializedPath" LIKE "/a/ab/%";

关于 REPLACE 函数的说明: 对于 /a/aa/a/aa/ 这种路径,如果是把 /a/aa/ 修改成 /a/ab/, 下面的 SQL 只会把 /a/aa/a/aa/ 变成 /a/ab/a/aa/ 而不会变成 /a/ab/a/ab/,因为 REPLACE 只替换第一个找到的字符串 另外,也不会把 /xxx/a/aa/ 替换成 /xxx/a/ab/,因为 LIKE 语句确保选择的 file_path 的前缀都是 /a/aa/,所以 /xxx/a/aa/ 不会被更新

web3nomad commented 2 months ago

注意: 对于 /a/aa/a/aa/ 这种路径,如果是把 /a/aa/ 修改成 /a/ab/, 下面的 SQL 只会把 /a/aa/a/aa/ 变成 /a/ab/a/aa/ 而不会变成 /a/ab/a/ab/,因为 REPLACE 只替换第一个找到的字符串 另外,也不会把 /xxx/a/aa/ 替换成 /xxx/a/ab/,因为 LIKE 语句确保选择的 file_path 的前缀都是 /a/aa/,所以 /xxx/a/aa/ 不会被更新

事实证明这样不对,/a/aa/a/aa/ 不是一个好的例子因为 /a/aa/ 是一个 occurrence,剩下的部分只有 a/aa/,确实是匹配不到的。如果例子是这样 /a/aa/x/a/aa/x/,重命名 /a/aa/ 成 /a/ab/ 的时候,最终会导致 /a/ab/x/a/ab/x/。

所以,不能用 REPLACE,而改用 前缀拼接是靠谱的。

UPDATE FilePath
SET materializedPath = "/a/ab/" || SUBSTR(materializedPath, LENGTH("/a/aa/") + 1)
WHERE materializedPath LIKE "/a/aa/%"
web3nomad commented 2 months ago

删除 file_path 以后要检查一下 assetobject 是否还有其他引用,如果没有的话,要删除 assetobject,进一步的,删除 filehandlertask