Skip to content

Commit

Permalink
Minor optimizations for dictionary import (#412)
Browse files Browse the repository at this point in the history
* minor dictionary import optimizations

* fix comment

* use regex for matching
  • Loading branch information
Casheeew authored Dec 21, 2023
1 parent f041f80 commit b83ca2f
Show file tree
Hide file tree
Showing 2 changed files with 35 additions and 15 deletions.
40 changes: 25 additions & 15 deletions ext/js/language/dictionary-importer.js
Original file line number Diff line number Diff line change
Expand Up @@ -113,11 +113,15 @@ export class DictionaryImporter {
const dataBankSchemas = this._getDataBankSchemas(version);

// Files
const termFiles = this._getArchiveFiles(fileMap, 'term_bank_?.json');
const termMetaFiles = this._getArchiveFiles(fileMap, 'term_meta_bank_?.json');
const kanjiFiles = this._getArchiveFiles(fileMap, 'kanji_bank_?.json');
const kanjiMetaFiles = this._getArchiveFiles(fileMap, 'kanji_meta_bank_?.json');
const tagFiles = this._getArchiveFiles(fileMap, 'tag_bank_?.json');
/** @type {import('dictionary-importer').QueryDetails} */
const queryDetails = new Map([
['termFiles', /^term_bank_(\d+)\.json$/],
['termMetaFiles', /^term_meta_bank_(\d+)\.json$/],
['kanjiFiles', /^kanji_bank_(\d+)\.json$/],
['kanjiMetaFiles', /^kanji_meta_bank_(\d+)\.json$/],
['tagFiles', /^tag_bank_(\d+)\.json$/]
]);
const {termFiles, termMetaFiles, kanjiFiles, kanjiMetaFiles, tagFiles} = Object.fromEntries(this._getArchiveFiles(fileMap, queryDetails));

// Load data
this._progressNextStep(termFiles.length + termMetaFiles.length + kanjiFiles.length + kanjiMetaFiles.length + tagFiles.length);
Expand Down Expand Up @@ -679,18 +683,24 @@ export class DictionaryImporter {

/**
* @param {import('dictionary-importer').ArchiveFileMap} fileMap
* @param {string} fileNameFormat
* @returns {import('@zip.js/zip.js').Entry[]}
* @param {import('dictionary-importer').QueryDetails} queryDetails
* @returns {import('dictionary-importer').QueryResult}
*/
_getArchiveFiles(fileMap, fileNameFormat) {
const indexPosition = fileNameFormat.indexOf('?');
const prefix = fileNameFormat.substring(0, indexPosition);
const suffix = fileNameFormat.substring(indexPosition + 1);
/** @type {import('@zip.js/zip.js').Entry[]} */
const results = [];
_getArchiveFiles(fileMap, queryDetails) {
/** @type {import('dictionary-importer').QueryResult} */
const results = new Map();
for (const [name, value] of fileMap.entries()) {
if (name.startsWith(prefix) && name.endsWith(suffix)) {
results.push(value);
for (const [fileType, fileNameFormat] of queryDetails.entries()) {
let entries = results.get(fileType);
if (typeof entries === 'undefined') {
entries = [];
results.set(fileType, entries);
}

if (fileNameFormat.test(name)) {
entries.push(value);
break;
}
}
}
return results;
Expand Down
10 changes: 10 additions & 0 deletions types/ext/dictionary-importer.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -98,6 +98,16 @@ export type ImportRequirementContext = {

export type ArchiveFileMap = Map<string, ZipJS.Entry>;

/**
* A map of file types inside a dictionary and its corresponding regular expressions.
*/
export type QueryDetails = Map<string, RegExp>;

/**
* A map of file types inside a dictionary and its matching entries.
*/
export type QueryResult = Map<string, ZipJS.Entry[]>;

export type CompiledSchemaNameArray = [
termBank: CompiledSchemaName,
termMetaBank: CompiledSchemaName,
Expand Down

0 comments on commit b83ca2f

Please sign in to comment.