Просмотр исходного кода

Fixes #14 Optim db read with lower access

isundil 1 год назад
Родитель
Сommit
d0cc807579
3 измененных файлов с 65 добавлено и 10 удалено
  1. 62 7
      model/mediaService.js
  2. 1 1
      static/public/js/access.js
  3. 2 2
      static/public/js/uiMediaFullpage.js

+ 62 - 7
model/mediaService.js

@@ -119,7 +119,7 @@ async function buildAccessList(app, accessIds) {
         result.fromDb(data);
         return result;
     });
-    return accessList || [];
+    return (accessList || []).filter(i => i.grant !== ACCESS_GRANT.none);
 }
 
 function reduceReqToMediaStruct(acc, i) {
@@ -142,7 +142,65 @@ module.exports.fetchOne = async function(app, md5sum, accessList) {
     return result?.HaveAccess(accessList) ? result : null;
 }
 
-module.exports.fetchMedias = async function(app, startTs, count) {
+function fetchAccessSubQuery(args, access) {
+    let result = [];
+    if (access.filter(i => i.accessTo === ACCESS_TO.everything).length) return "1=1";
+    for (let i of access) {
+        if (i.accessTo === ACCESS_TO.item) {
+            result.push(`fixedSum=?`);
+            args.push(i.accessToData);
+        }
+        else if (i.accessTo === ACCESS_TO.meta && i.accessToDataDeserialized) {
+            result.push('(mediaMeta.key=? and mediaMeta.value=?)');
+            const metaKey = Object.keys(i.accessToDataDeserialized)[0];
+            args.push(metaKey);
+            args.push(i.accessToDataDeserialized[metaKey]);
+        }
+        else if (i.accessTo === ACCESS_TO.tag && i.accessToData) {
+            result.push('(mediaTag.tag=? or mediaTag.tag like ?)');
+            args.push(i.accessToData);
+            args.push(`${i.accessToData}/%`);
+        }
+    }
+    return result.join(" or ") || "1=0";
+}
+
+function fetchMediasBuildSubQuery(startTs, count, access) {
+    let query = "select distinct fixedSum from mediaFile";
+    let whereClause = ' where 1=1';
+    let accessWhere = null;
+    let args = [];
+
+    // access filter
+    if (access !== undefined) {
+        accessWhere = fetchAccessSubQuery(args, access);
+
+        // join
+        if (accessWhere)
+            query += ` left join mediaMeta on mediaMeta.md5sum=mediaFile.fixedSum` +
+                ` left join mediaTag on mediaTag.md5sum=mediaFile.fixedSum`;
+
+        if (accessWhere)
+            whereClause += ` and (${accessWhere})`;
+    }
+
+    // date filter
+    if (startTs) {
+        whereClause += ' and date <?'
+        args.push(startTs);
+    }
+
+    // order and limit
+    query += whereClause + " order by date desc limit ?";
+    args.push(count);
+    return {
+        query: query,
+        args: args
+    };
+}
+
+module.exports.fetchMedias = async function(app, startTs, count, access) {
+    let subQuery = fetchMediasBuildSubQuery(startTs, count, access);
     let result = ((await app.databaseHelper.runSql(`
         select mediaFile.path, mediaFile.md5sum, mediaFile.date, mediaFile.fixedSum,
         mediaMeta.key as metaKey, mediaMeta.value as metaValue,
@@ -150,10 +208,7 @@ module.exports.fetchMedias = async function(app, startTs, count) {
         from mediaFile
         left join mediaMeta on mediaMeta.md5sum=mediaFile.fixedSum
         left join mediaTag on mediaTag.md5sum=mediaFile.fixedSum
-        where mediaFile.fixedSum in
-            (select fixedSum from mediaFile `
-            +(startTs ? "where date <? " : "")
-            +"order by date desc limit ?)", startTs ? [startTs, count] : [count])) || [])
+        where mediaFile.fixedSum in (${subQuery.query})`, subQuery.args)) || [])
     .reduce(reduceReqToMediaStruct, {});
 
     result = Object.keys(result).map(i => result[i]).sort((a, b) => b.date-a.date);
@@ -166,7 +221,7 @@ module.exports.fetchMediasWithAccess = async function(app, startTs, count, acces
 
     access = await buildAccessList(app, access);
     while (result.length < count) {
-        let tmp = await module.exports.fetchMedias(app, lastTs, 25);
+        let tmp = await module.exports.fetchMedias(app, lastTs, 25, access);
         if (!tmp.length)
             return result;
         lastTs = tmp[tmp.length-1].date;

+ 1 - 1
static/public/js/access.js

@@ -46,7 +46,7 @@ $(() => {
                     data: { linkIds: JSON.stringify(Array.from(linkList)) },
                     success: data => {
                         for (let i in data)
-                            this.#storedAccess.add(i);
+                            this.#storedAccess.add(data[i].linkId);
                         this.#UpdateStorage();
                         window.ReloadAccessList(data);
                         MediaStorage.Instance.rebuildMetaList();

+ 2 - 2
static/public/js/uiMediaFullpage.js

@@ -255,9 +255,9 @@ $(() => {
     window.displayMediaFullPage = function(mediaItem) {
         document.getElementById("pch-fullPageMedia").classList.remove("hidden");
         if (fullPageMediaDisplayed)
-            document.Title.replaceTitle(mediaItem.fixedSum);
+            document.Title.replaceTitle(mediaItem.fileName);
         else
-            document.Title.pushTitle(mediaItem.fixedSum);
+            document.Title.pushTitle(mediaItem.fileName);
         fullPageMediaDisplayed = mediaItem ?? null;
         document.body.classList.add("overlay-visible");
         if (!mediaItem)