Работа над проектом
This commit is contained in:
@@ -12,10 +12,8 @@ class DbCreator {
|
||||
async run(db, callback) {
|
||||
const config = this.config;
|
||||
|
||||
callback({job: 'load inpx', jobMessage: 'Загрузка INPX'});
|
||||
const readFileCallback = async(readState) => {
|
||||
callback(readState);
|
||||
};
|
||||
callback({jobStepCount: 5});
|
||||
callback({job: 'load inpx', jobMessage: 'Загрузка INPX', jobStep: 1, progress: 0});
|
||||
|
||||
//временная таблица
|
||||
await db.create({
|
||||
@@ -43,6 +41,7 @@ class DbCreator {
|
||||
|
||||
//stuff
|
||||
let recsLoaded = 0;
|
||||
callback({recsLoaded});
|
||||
let chunkNum = 0;
|
||||
|
||||
const splitAuthor = (author) => {
|
||||
@@ -57,6 +56,17 @@ class DbCreator {
|
||||
return result;
|
||||
}
|
||||
|
||||
let totalFiles = 0;
|
||||
const readFileCallback = async(readState) => {
|
||||
callback(readState);
|
||||
|
||||
if (readState.totalFiles)
|
||||
totalFiles = readState.totalFiles;
|
||||
|
||||
if (totalFiles)
|
||||
callback({progress: (readState.current || 0)/totalFiles});
|
||||
};
|
||||
|
||||
let id = 0;
|
||||
const parsedCallback = async(chunk) => {
|
||||
for (const rec of chunk) {
|
||||
@@ -123,7 +133,8 @@ class DbCreator {
|
||||
|
||||
//отсортируем авторов и выдадим им правильные id
|
||||
//порядок id соответствует ASC-сортировке по author.toLowerCase
|
||||
callback({job: 'author sort', jobMessage: 'Сортировка'});
|
||||
callback({job: 'author sort', jobMessage: 'Сортировка авторов', jobStep: 2, progress: 0});
|
||||
await utils.sleep(100);
|
||||
authorArr.sort((a, b) => a.value.localeCompare(b.value));
|
||||
|
||||
id = 0;
|
||||
@@ -137,7 +148,9 @@ class DbCreator {
|
||||
utils.freeMemory();
|
||||
|
||||
//подготовка к сохранению author_book
|
||||
const saveBookChunk = async(authorChunk) => {
|
||||
const saveBookChunk = async(authorChunk, callback) => {
|
||||
callback(0);
|
||||
|
||||
const ids = [];
|
||||
for (const a of authorChunk) {
|
||||
for (const id of a.bookId) {
|
||||
@@ -147,7 +160,11 @@ class DbCreator {
|
||||
|
||||
ids.sort();// обязательно, иначе будет тормозить - особенности JembaDb
|
||||
|
||||
callback(0.1);
|
||||
const rows = await db.select({table: 'book', where: `@@id(${db.esc(ids)})`});
|
||||
callback(0.6);
|
||||
await utils.sleep(100);
|
||||
|
||||
const bookArr = new Map();
|
||||
for (const row of rows)
|
||||
bookArr.set(row.id, row);
|
||||
@@ -165,13 +182,15 @@ class DbCreator {
|
||||
delete a.bookId;//в дальнейшем не понадобится, authorArr сохраняем без него
|
||||
}
|
||||
|
||||
callback(0.7);
|
||||
await db.insert({
|
||||
table: 'author_book',
|
||||
rows: abRows,
|
||||
});
|
||||
callback(1);
|
||||
};
|
||||
|
||||
callback({job: 'search tables create', jobMessage: 'Создание поисковых таблиц'});
|
||||
callback({job: 'book sort', jobMessage: 'Сортировка книг', jobStep: 3, progress: 0});
|
||||
|
||||
//сохранение author_book
|
||||
await db.create({
|
||||
@@ -180,12 +199,19 @@ class DbCreator {
|
||||
|
||||
let idsLen = 0;
|
||||
let aChunk = [];
|
||||
for (const author of authorArr) {// eslint-disable-line
|
||||
let prevI = 0;
|
||||
for (let i = 0; i < authorArr.length; i++) {// eslint-disable-line
|
||||
const author = authorArr[i];
|
||||
|
||||
aChunk.push(author);
|
||||
idsLen += author.bookId.length;
|
||||
|
||||
if (idsLen > 50000) {//константа выяснена эмпирическим путем "память/скорость"
|
||||
await saveBookChunk(aChunk);
|
||||
await saveBookChunk(aChunk, (p) => {
|
||||
callback({progress: (prevI + (i - prevI)*p)/authorArr.length});
|
||||
});
|
||||
|
||||
prevI = i;
|
||||
idsLen = 0;
|
||||
aChunk = [];
|
||||
await utils.sleep(100);
|
||||
@@ -194,10 +220,12 @@ class DbCreator {
|
||||
}
|
||||
}
|
||||
if (aChunk.length) {
|
||||
await saveBookChunk(aChunk);
|
||||
await saveBookChunk(aChunk, () => {});
|
||||
aChunk = null;
|
||||
}
|
||||
|
||||
callback({progress: 1});
|
||||
|
||||
//чистка памяти, ибо жрет как не в себя
|
||||
await db.drop({table: 'book'});
|
||||
await db.freeMemory();
|
||||
@@ -267,7 +295,10 @@ class DbCreator {
|
||||
parseField(rec.lang, langMap, langArr, authorIds);
|
||||
};
|
||||
|
||||
callback({job: 'search tables create', jobMessage: 'Создание поисковых таблиц', jobStep: 4, progress: 0});
|
||||
|
||||
//парсинг 2, теперь можно создавать остальные поисковые таблицы
|
||||
let proc = 0;
|
||||
while (1) {// eslint-disable-line
|
||||
const rows = await db.select({
|
||||
table: 'author_book',
|
||||
@@ -295,6 +326,9 @@ class DbCreator {
|
||||
for (const rec of books)
|
||||
parseBookRec(rec);
|
||||
}
|
||||
|
||||
proc += rows.length;
|
||||
callback({progress: proc/authorArr.length});
|
||||
} else
|
||||
break;
|
||||
|
||||
@@ -312,7 +346,7 @@ class DbCreator {
|
||||
utils.freeMemory();
|
||||
|
||||
//config
|
||||
callback({job: 'config save', jobMessage: 'Сохранение конфигурации'});
|
||||
callback({job: 'config save', jobMessage: 'Сохранение конфигурации', jobStep: 5, progress: 0});
|
||||
await db.create({
|
||||
table: 'config'
|
||||
});
|
||||
@@ -367,6 +401,8 @@ class DbCreator {
|
||||
await db.freeMemory();
|
||||
await utils.sleep(100);
|
||||
}
|
||||
|
||||
callback({progress: i/arr.length});
|
||||
}
|
||||
|
||||
nullArr();
|
||||
@@ -375,23 +411,23 @@ class DbCreator {
|
||||
};
|
||||
|
||||
//author
|
||||
callback({job: 'author save', jobMessage: 'Сохранение индекса авторов'});
|
||||
callback({job: 'author save', jobMessage: 'Сохранение индекса авторов', jobStep: 6, progress: 0});
|
||||
await saveTable('author', authorArr, () => {authorArr = null}, false);
|
||||
|
||||
//series
|
||||
callback({job: 'series save', jobMessage: 'Сохранение индекса серий'});
|
||||
callback({job: 'series save', jobMessage: 'Сохранение индекса серий', jobStep: 7, progress: 0});
|
||||
await saveTable('series', seriesArr, () => {seriesArr = null});
|
||||
|
||||
//title
|
||||
callback({job: 'title save', jobMessage: 'Сохранение индекса названий'});
|
||||
callback({job: 'title save', jobMessage: 'Сохранение индекса названий', jobStep: 8, progress: 0});
|
||||
await saveTable('title', titleArr, () => {titleArr = null});
|
||||
|
||||
//genre
|
||||
callback({job: 'genre save', jobMessage: 'Сохранение индекса жанров'});
|
||||
callback({job: 'genre save', jobMessage: 'Сохранение индекса жанров', jobStep: 9, progress: 0});
|
||||
await saveTable('genre', genreArr, () => {genreArr = null});
|
||||
|
||||
//lang
|
||||
callback({job: 'lang save', jobMessage: 'Сохранение индекса языков'});
|
||||
callback({job: 'lang save', jobMessage: 'Сохранение индекса языков', jobStep: 10, progress: 0});
|
||||
await saveTable('lang', langArr, () => {langArr = null});
|
||||
|
||||
//кэш-таблицы запросов
|
||||
|
||||
Reference in New Issue
Block a user