Работа над проектом

This commit is contained in:
Book Pauk
2022-08-19 02:27:39 +07:00
parent eaf6f5692d
commit fc38c55eb1
4 changed files with 87 additions and 25 deletions

View File

@@ -4,7 +4,7 @@
<div class="header q-mx-md q-mt-sm row justify-between items-center"> <div class="header q-mx-md q-mt-sm row justify-between items-center">
<div class="row items-center"> <div class="row items-center">
<div class="q-mr-xs"> <div class="q-mr-xs">
Коллекция: Коллекция
</div> </div>
<div class="clickable" @click="showCollectionInfo"> <div class="clickable" @click="showCollectionInfo">
{{ collection }} {{ collection }}
@@ -45,8 +45,8 @@
<q-btn round dense style="height: 20px" color="info" icon="la la-question" @click="showSearchHelp" /> <q-btn round dense style="height: 20px" color="info" icon="la la-question" @click="showSearchHelp" />
<div class="q-mx-xs" /> <div class="q-mx-xs" />
<div class="row items-center q-mt-xs" style="font-size: 120%"> <div class="row items-center q-mt-xs">
Показаны {{ queryFound }} из {{ totalFound }} Показаны {{ queryFound }} из {{ totalFound }} найденных авторов
</div> </div>
<div class="q-mx-xs" /> <div class="q-mx-xs" />
@@ -62,7 +62,9 @@
<div class="col fit column no-wrap" style="overflow: auto"> <div class="col fit column no-wrap" style="overflow: auto">
<div v-for="item in tableData" :key="item.key" style="border-bottom: 1px solid #aaaaaa"> <div v-for="item in tableData" :key="item.key" style="border-bottom: 1px solid #aaaaaa">
<div class="q-my-sm q-ml-md" style="font-size: 120%">{{ item.value }}</div> <div class="q-my-sm q-ml-md" style="font-size: 120%">
{{ item.value }}
</div>
</div> </div>
</div> </div>
</div> </div>
@@ -165,9 +167,8 @@ class Search {
async updateTableData() { async updateTableData() {
let result = []; let result = [];
let id = 0;
for (const rec of this.searchResult.author) { 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; this.tableData = result;

View File

@@ -375,8 +375,9 @@ class DbCreator {
await db.close({table: 'lang'}); await db.close({table: 'lang'});
utils.freeMemory(); utils.freeMemory();
//кэш-таблицы //кэш-таблицы запросов
await db.create({table: 'query_cache'});
await db.create({table: 'query_time'});
callback({job: 'done', jobMessage: ''}); callback({job: 'done', jobMessage: ''});
} }

View File

@@ -11,20 +11,35 @@ class DbSearcher {
const db = this.db; const db = this.db;
let authorRows; let authorRows;
let authorIds = new Set();
//сначала выберем все id авторов по фильтру //сначала выберем все id авторов по фильтру
//порядок id соответсвует ASC-сортировке по author //порядок id соответсвует ASC-сортировке по author
if (query.author) { if (query.author) {
//
} else {
authorRows = await db.select({ authorRows = await db.select({
table: 'author', table: 'author',
map: `(r) => ({id: r.id})`, map: `(r) => ({id: r.id})`,
}); });
}
let authorIds = new Set(); for (const row of authorRows)
for (const row of authorRows) authorIds.add(row.id);
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 = []; const idsArr = [];
idsArr.push(authorIds); idsArr.push(authorIds);
@@ -39,7 +54,8 @@ class DbSearcher {
//сортировка //сортировка
authorIds = Array.from(authorIds); authorIds = Array.from(authorIds);
authorIds.sort();
authorIds.sort((a, b) => a > b);
return authorIds; return authorIds;
} }
@@ -50,13 +66,48 @@ class DbSearcher {
if (!db.searchCache) if (!db.searchCache)
db.searchCache = {}; db.searchCache = {};
/*const q = query; let result;
const key = JSON.stringify([q.author, ]);
query);
delete q.limit;
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) { async search(query) {
@@ -71,11 +122,19 @@ class DbSearcher {
let result = await db.select({ let result = await db.select({
table: 'author', table: 'author',
map: `(r) => ({id: r.id, author: r.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}; return {result, totalFound};
} }
} }

View File

@@ -121,11 +121,12 @@ class WebWorker {
if (!await fs.pathExists(dbPath)) { if (!await fs.pathExists(dbPath)) {
await this.createDb(dbPath); await this.createDb(dbPath);
await utils.freeMemory();
} }
//загружаем БД //загружаем БД
this.setMyState(ssDbLoading); this.setMyState(ssDbLoading);
log('Searcher DB open'); log('Searcher DB loading');
const db = new JembaDbThread(); const db = new JembaDbThread();
await db.lock({ await db.lock({