Переход на Uint32Array
This commit is contained in:
@@ -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,12 +378,14 @@ 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) {
|
||||||
|
if (!filter || filter.has(tableId))
|
||||||
tableIdsSet.add(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) {
|
||||||
|
if (!filter || filter.has(tableId))
|
||||||
tableIdsSet.add(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);
|
||||||
|
|||||||
Reference in New Issue
Block a user