diff --git a/client/components/Search/Search.vue b/client/components/Search/Search.vue index 2e2c1b3..5974d06 100644 --- a/client/components/Search/Search.vue +++ b/client/components/Search/Search.vue @@ -4,7 +4,7 @@
- Коллекция: + Коллекция
{{ collection }} @@ -45,8 +45,8 @@
-
- Показаны {{ queryFound }} из {{ totalFound }} +
+ Показаны {{ queryFound }} из {{ totalFound }} найденных авторов
@@ -62,7 +62,9 @@
-
{{ item.value }}
+
+ {{ item.value }} +
@@ -165,9 +167,8 @@ class Search { async updateTableData() { let result = []; - let id = 0; for (const rec of this.searchResult.author) { - result.push({key: id++, value: rec.author}); + result.push({key: rec.id, value: `${rec.id} ${rec.author.replace(/,/g, ', ')}`}); } this.tableData = result; diff --git a/server/core/DbCreator.js b/server/core/DbCreator.js index 70e0c77..9aace2b 100644 --- a/server/core/DbCreator.js +++ b/server/core/DbCreator.js @@ -375,8 +375,9 @@ class DbCreator { await db.close({table: 'lang'}); utils.freeMemory(); - //кэш-таблицы - + //кэш-таблицы запросов + await db.create({table: 'query_cache'}); + await db.create({table: 'query_time'}); callback({job: 'done', jobMessage: ''}); } diff --git a/server/core/DbSearcher.js b/server/core/DbSearcher.js index 91d4804..e243a04 100644 --- a/server/core/DbSearcher.js +++ b/server/core/DbSearcher.js @@ -11,20 +11,35 @@ class DbSearcher { const db = this.db; let authorRows; + let authorIds = new Set(); //сначала выберем все id авторов по фильтру //порядок id соответсвует ASC-сортировке по author if (query.author) { - // - } else { authorRows = await db.select({ table: 'author', map: `(r) => ({id: r.id})`, }); - } - let authorIds = new Set(); - for (const row of authorRows) - authorIds.add(row.id); + for (const row of authorRows) + authorIds.add(row.id); + } else {//все авторы + if (!db.searchCache.authorIdsAll) { + authorRows = await db.select({ + table: 'author', + map: `(r) => ({id: r.id})`, + }); + + db.searchCache.authorIdsAll = []; + for (const row of authorRows) { + authorIds.add(row.id); + db.searchCache.authorIdsAll.push(row.id); + } + } else {//оптимизация + for (const id of db.searchCache.authorIdsAll) { + authorIds.add(id); + } + } + } const idsArr = []; idsArr.push(authorIds); @@ -39,7 +54,8 @@ class DbSearcher { //сортировка authorIds = Array.from(authorIds); - authorIds.sort(); + + authorIds.sort((a, b) => a > b); return authorIds; } @@ -50,13 +66,48 @@ class DbSearcher { if (!db.searchCache) db.searchCache = {}; - /*const q = query; - const key = JSON.stringify([q.author, ]); - query); - delete q.limit; + let result; - q = */ - return await this.selectAuthorIds(query); + //сначала попробуем найти в кеше + const q = query; + const keyArr = [q.author, q.series, q.title, q.genre, q.lang]; + const keyStr = keyArr.join(''); + + if (!keyStr) {//пустой запрос + if (db.searchCache.authorIdsAll) + result = db.searchCache.authorIdsAll; + else + result = await this.selectAuthorIds(query); + + } else {//непустой запрос + const key = JSON.stringify(keyArr); + + const rows = await db.select({table: 'query_cache', where: `@@id(${db.esc(key)})`}); + if (rows.length) {//нашли в кеше + await db.insert({ + table: 'query_time', + replace: true, + rows: [{id: key, time: Date.now()}], + }); + + result = rows[0].value; + } else {//не нашли в кеше, ищем в поисковых таблицах + result = await this.selectAuthorIds(query); + + await db.insert({ + table: 'query_cache', + replace: true, + rows: [{id: key, value: result}], + }); + await db.insert({ + table: 'query_time', + replace: true, + rows: [{id: key, time: Date.now()}], + }); + } + } + + return result; } async search(query) { @@ -71,11 +122,19 @@ class DbSearcher { let result = await db.select({ table: 'author', map: `(r) => ({id: r.id, author: r.author})`, - where: `@@id(${db.esc(authorIds)})` + where: ` + const all = @all(); + const ids = new Set(); + let n = 0; + for (const id of all) { + if (++n > ${db.esc(limit)}) + break; + ids.add(id); + } + return ids; + ` }); - result = result.slice(0, limit); - return {result, totalFound}; } } diff --git a/server/core/WebWorker.js b/server/core/WebWorker.js index b0301cc..bc950cd 100644 --- a/server/core/WebWorker.js +++ b/server/core/WebWorker.js @@ -121,11 +121,12 @@ class WebWorker { if (!await fs.pathExists(dbPath)) { await this.createDb(dbPath); + await utils.freeMemory(); } //загружаем БД this.setMyState(ssDbLoading); - log('Searcher DB open'); + log('Searcher DB loading'); const db = new JembaDbThread(); await db.lock({