Работа над поиском по дате поступления и оценке

This commit is contained in:
Book Pauk
2022-10-28 19:47:00 +07:00
parent 52ed97c8de
commit fee3231d10
4 changed files with 161 additions and 6 deletions

View File

@@ -60,6 +60,10 @@ class DbCreator {
let langArr = [];
let delMap = new Map();//удаленные
let delArr = [];
let dateMap = new Map();//дата поступления
let dateArr = [];
let librateMap = new Map();//оценка
let librateArr = [];
//stats
let authorCount = 0;
@@ -393,6 +397,12 @@ class DbCreator {
//удаленные
parseField(rec.del, delMap, delArr, authorIds);
//дата поступления
parseField(rec.date, dateMap, dateArr, authorIds);
//оценка
parseField(rec.librate, librateMap, librateArr, authorIds);
};
callback({job: 'search tables create', jobMessage: 'Создание поисковых таблиц', jobStep: 4, progress: 0});
@@ -448,6 +458,8 @@ class DbCreator {
genreMap = null;
langMap = null;
delMap = null;
dateMap = null;
librateMap = null;
utils.freeMemory();
@@ -553,13 +565,19 @@ class DbCreator {
callback({job: 'genre save', jobMessage: 'Сохранение индекса жанров', jobStep: 9, progress: 0});
await saveTable('genre', genreArr, () => {genreArr = null}, true);
callback({job: 'others save', jobMessage: 'Сохранение остальных индексов', jobStep: 10, progress: 0});
//lang
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');
//date
await saveTable('date', dateArr, () => {dateArr = null}, true);
//librate
await saveTable('librate', librateArr, () => {librateArr = null}, true, false, 'number');
//кэш-таблицы запросов
await db.create({table: 'query_cache'});
await db.create({table: 'query_time'});

View File

@@ -25,7 +25,7 @@ class DbSearcher {
}
queryKey(q) {
return JSON.stringify([q.author, q.series, q.title, q.genre, q.lang, q.del]);
return JSON.stringify([q.author, q.series, q.title, q.genre, q.lang, q.del, q.date, q.librate]);
}
getWhere(a) {
@@ -259,6 +259,74 @@ class DbSearcher {
idsArr.push(delIds);
}
//дата поступления
if (query.date) {
const dateKey = `author-ids-date-${query.date}`;
let dateIds = await this.getCached(dateKey);
if (dateIds === null) {
let [from = '', to = ''] = query.date.split(',');
const dateRows = await db.select({
table: 'date',
rawResult: true,
where: `
const ids = @indexLR('value', ${db.esc(from)} || undefined, ${db.esc(to)} || undefined);
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);
`
});
dateIds = dateRows[0].rawResult;
await this.putCached(dateKey, dateIds);
}
idsArr.push(dateIds);
}
//оценка
if (query.librate) {
const librateKey = `author-ids-librate-${query.librate}`;
let librateIds = await this.getCached(librateKey);
if (librateIds === null) {
const dateRows = await db.select({
table: 'librate',
rawResult: true,
where: `
const rates = ${db.esc(query.librate.split(',').map(n => parseInt(n, 10)).filter(n => !isNaN(n)))};
const ids = new Set();
for (const rate of rates) {
for (const id of @indexLR('value', rate, rate))
ids.add(id);
}
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);
`
});
librateIds = dateRows[0].rawResult;
await this.putCached(librateKey, librateIds);
}
idsArr.push(librateIds);
}
/*
//ищем пересечение множеств
idsArr.push(authorIds);
@@ -341,6 +409,26 @@ class DbSearcher {
`;
}
//дата поступления
if (query.date) {
let [from = '0000-00-00', to = '9999-99-99'] = query.date.split(',');
filter += `
if (!(book.date >= ${db.esc(from)} && book.date <= ${db.esc(to)}))
return false;
`;
}
//оценка
if (query.librate) {
closures += `
const searchLibrate = new Set(${db.esc(query.librate.split(',').map(n => parseInt(n, 10)).filter(n => !isNaN(n)))});
`;
filter += `
if (!searchLibrate.has(book.librate))
return false;
`;
}
//серии
if (exclude !== 'series' && query.series && query.series !== '*') {
closures += `