Добавлен фильтр по удаленным
This commit is contained in:
@@ -58,6 +58,8 @@ class DbCreator {
|
||||
let genreArr = [];
|
||||
let langMap = new Map();//языки
|
||||
let langArr = [];
|
||||
let delMap = new Map();//удаленные
|
||||
let delArr = [];
|
||||
|
||||
//stats
|
||||
let authorCount = 0;
|
||||
@@ -314,12 +316,16 @@ class DbCreator {
|
||||
//парсинг 2, подготовка
|
||||
const parseField = (fieldValue, fieldMap, fieldArr, authorIds, bookId) => {
|
||||
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'});
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user