diff --git a/client/components/Search/AuthorList/AuthorList.vue b/client/components/Search/AuthorList/AuthorList.vue
index 227b2e5..0ca25cc 100644
--- a/client/components/Search/AuthorList/AuthorList.vue
+++ b/client/components/Search/AuthorList/AuthorList.vue
@@ -126,12 +126,6 @@
Поиск не дал результатов
-
-
+
{
let addBookId = bookId;
- if (!fieldValue) {
- fieldValue = emptyFieldValue;
- addBookId = 0;//!!!
- }
+ let value = fieldValue;
- const value = fieldValue.toLowerCase();
+ if (typeof(fieldValue) == 'string') {
+ if (!fieldValue) {
+ fieldValue = emptyFieldValue;
+ addBookId = 0;//!!!
+ }
+
+ value = fieldValue.toLowerCase();
+ }
let fieldRec;
if (fieldMap.has(value)) {
@@ -384,6 +390,9 @@ class DbCreator {
//языки
parseField(rec.lang, langMap, langArr, authorIds);
+
+ //удаленные
+ parseField(rec.del, delMap, delArr, authorIds);
};
callback({job: 'search tables create', jobMessage: 'Создание поисковых таблиц', jobStep: 4, progress: 0});
@@ -437,6 +446,8 @@ class DbCreator {
seriesMap = null;
titleMap = null;
genreMap = null;
+ langMap = null;
+ delMap = null;
utils.freeMemory();
@@ -484,13 +495,16 @@ class DbCreator {
//сохраним поисковые таблицы
const chunkSize = 10000;
- const saveTable = async(table, arr, nullArr, authorIdToArray = false, bookIdToArray = false) => {
+ const saveTable = async(table, arr, nullArr, authorIdToArray = false, bookIdToArray = false, indexType = 'string') => {
- arr.sort((a, b) => a.value.localeCompare(b.value));
+ if (indexType == 'string')
+ arr.sort((a, b) => a.value.localeCompare(b.value));
+ else
+ arr.sort((a, b) => a.value - b.value);
await db.create({
table,
- index: {field: 'value', unique: true, depth: 1000000},
+ index: {field: 'value', unique: true, type: indexType, depth: 1000000},
});
//вставка в БД по кусочкам, экономим память
@@ -543,6 +557,9 @@ class DbCreator {
callback({job: 'lang save', jobMessage: 'Сохранение индекса языков', jobStep: 10, progress: 0});
await saveTable('lang', langArr, () => {langArr = null}, true);
+ //del
+ await saveTable('del', delArr, () => {delArr = null}, true, false, 'number');
+
//кэш-таблицы запросов
await db.create({table: 'query_cache'});
await db.create({table: 'query_time'});
diff --git a/server/core/DbSearcher.js b/server/core/DbSearcher.js
index 12f4a9a..1995cc7 100644
--- a/server/core/DbSearcher.js
+++ b/server/core/DbSearcher.js
@@ -24,6 +24,10 @@ class DbSearcher {
this.periodicCleanCache();//no await
}
+ queryKey(q) {
+ return JSON.stringify([q.author, q.series, q.title, q.genre, q.lang, q.del]);
+ }
+
getWhere(a) {
const db = this.db;
@@ -226,6 +230,35 @@ class DbSearcher {
idsArr.push(langIds);
}
+ //удаленные
+ if (query.del !== undefined) {
+ const delKey = `author-ids-del-${query.del}`;
+ let delIds = await this.getCached(delKey);
+
+ if (delIds === null) {
+ const delRows = await db.select({
+ table: 'del',
+ rawResult: true,
+ where: `
+ const ids = @indexLR('value', ${db.esc(query.del)}, ${db.esc(query.del)});
+
+ const result = new Set();
+ for (const id of ids) {
+ const row = @unsafeRow(id);
+ for (const authorId of row.authorId)
+ result.add(authorId);
+ }
+
+ return Array.from(result);
+ `
+ });
+
+ delIds = delRows[0].rawResult;
+ await this.putCached(delKey, delIds);
+ }
+
+ idsArr.push(delIds);
+ }
/*
//ищем пересечение множеств
idsArr.push(authorIds);
@@ -300,6 +333,14 @@ class DbSearcher {
//порядок важен, более простые проверки вперед
+ //удаленные
+ if (query.del !== undefined) {
+ filter += `
+ if (book.del !== ${db.esc(query.del)})
+ return false;
+ `;
+ }
+
//серии
if (exclude !== 'series' && query.series && query.series !== '*') {
closures += `
@@ -569,10 +610,6 @@ class DbSearcher {
return titleIds;
}
- queryKey(q) {
- return JSON.stringify([q.author, q.series, q.title, q.genre, q.lang]);
- }
-
async getCached(key) {
if (!this.config.queryCacheEnabled)
return null;