Переход на Uint32Array

This commit is contained in:
Book Pauk
2022-11-16 20:27:53 +07:00
parent 3d1385da6e
commit d5931138e3

View File

@@ -78,7 +78,7 @@ class DbSearcher {
result.add(bookId); result.add(bookId);
} }
return Array.from(result); return new Uint32Array(result);
` `
}); });
@@ -152,7 +152,7 @@ class DbSearcher {
result.add(bookId); result.add(bookId);
} }
return Array.from(result); return new Uint32Array(result);
` `
}); });
@@ -188,7 +188,7 @@ class DbSearcher {
result.add(bookId); result.add(bookId);
} }
return Array.from(result); return new Uint32Array(result);
` `
}); });
@@ -253,7 +253,7 @@ class DbSearcher {
result.add(bookId); result.add(bookId);
} }
return Array.from(result); return new Uint32Array(result);
` `
}); });
@@ -286,7 +286,7 @@ class DbSearcher {
inter = newInter; inter = newInter;
} }
return Array.from(inter); return new Uint32Array(inter);
} else if (idsArr.length == 1) { } else if (idsArr.length == 1) {
return idsArr[0]; return idsArr[0];
} else { } else {
@@ -324,12 +324,11 @@ class DbSearcher {
} }
} }
async filterTableIds(tableIds, from, query) { async tableIdsFilter(from, query) {
let result = tableIds;
//т.к. авторы у книги идут списком (т.е. одна книга относиться сразу к нескольким авторам), //т.к. авторы у книги идут списком (т.е. одна книга относиться сразу к нескольким авторам),
//то в выборку по bookId могут попасть авторы, которые отсутствуют в критерии query.author, //то в выборку по bookId могут попасть авторы, которые отсутствуют в критерии query.author,
//поэтому дополнительно фильтруем //поэтому дополнительно фильтруем
let result = null;
if (from == 'author' && query.author && query.author !== '*') { if (from == 'author' && query.author && query.author !== '*') {
const key = `filter-ids-author-${query.author}`; const key = `filter-ids-author-${query.author}`;
let authorIds = await this.getCached(key); let authorIds = await this.getCached(key);
@@ -338,7 +337,7 @@ class DbSearcher {
const rows = await this.db.select({ const rows = await this.db.select({
table: 'author', table: 'author',
rawResult: true, rawResult: true,
where: `return Array.from(${this.getWhere(query.author)})` where: `return new Uint32Array(${this.getWhere(query.author)})`
}); });
authorIds = rows[0].rawResult; authorIds = rows[0].rawResult;
@@ -346,12 +345,7 @@ class DbSearcher {
await this.putCached(key, authorIds); await this.putCached(key, authorIds);
} }
//пересечение tableIds и authorIds result = new Set(authorIds);
result = [];
const authorIdsSet = new Set(authorIds);
for (const id of tableIds)
if (authorIdsSet.has(id))
result.push(id);
} }
return result; return result;
@@ -374,6 +368,9 @@ class DbSearcher {
//id книг (bookIds) нашли, теперь надо их смаппировать в id таблицы from (авторов, серий, названий) //id книг (bookIds) нашли, теперь надо их смаппировать в id таблицы from (авторов, серий, названий)
if (bookIds) { if (bookIds) {
//т.к. авторы у книги идут списком, то дополнительно фильтруем
const filter = await this.tableIdsFilter(from, query);
const tableIdsSet = new Set(); const tableIdsSet = new Set();
const idMap = await this.fillBookIdMap(from); const idMap = await this.fillBookIdMap(from);
let proc = 0; let proc = 0;
@@ -381,13 +378,15 @@ class DbSearcher {
for (const bookId of bookIds) { for (const bookId of bookIds) {
const tableId = idMap.arr[bookId]; const tableId = idMap.arr[bookId];
if (tableId) { if (tableId) {
tableIdsSet.add(tableId); if (!filter || filter.has(tableId))
tableIdsSet.add(tableId);
proc++; proc++;
} else { } else {
const tableIdArr = idMap.map.get(bookId); const tableIdArr = idMap.map.get(bookId);
if (tableIdArr) { if (tableIdArr) {
for (const tableId of tableIdArr) { for (const tableId of tableIdArr) {
tableIdsSet.add(tableId); if (!filter || filter.has(tableId))
tableIdsSet.add(tableId);
proc++; proc++;
} }
} }
@@ -411,9 +410,6 @@ class DbSearcher {
tableIds = rows[0].rawResult; tableIds = rows[0].rawResult;
} }
//т.к. авторы у книги идут списком, то дополнительно фильтруем
tableIds = await this.filterTableIds(tableIds, from, query);
//сортируем по id //сортируем по id
//порядок id соответствует ASC-сортировке по строковому значению из from (имя автора, назание серии, название книги) //порядок id соответствует ASC-сортировке по строковому значению из from (имя автора, назание серии, название книги)
tableIds.sort((a, b) => a - b); tableIds.sort((a, b) => a - b);