From 69b5007842e08a8fda4016712a5046f81799e638 Mon Sep 17 00:00:00 2001 From: toasted-nutbread Date: Sat, 15 Feb 2020 17:15:24 -0500 Subject: [PATCH] Reduce number of redundant Map.get calls in dictTermsMergeByGloss --- ext/bg/js/dictionary.js | 31 ++++++++++++++++++++++++------- ext/bg/js/translator.js | 3 ++- 2 files changed, 26 insertions(+), 8 deletions(-) diff --git a/ext/bg/js/dictionary.js b/ext/bg/js/dictionary.js index 3a4a58a1..786546ea 100644 --- a/ext/bg/js/dictionary.js +++ b/ext/bg/js/dictionary.js @@ -222,17 +222,34 @@ function dictTermsMergeByGloss(result, definitions, appendTo=null, mergedIndices } if (appendTo === null) { - // result->expressions[ Expression1[ Reading1[ Tag1, Tag2 ] ], Expression2, ... ] - if (!result.expressions.has(expression)) { - result.expressions.set(expression, new Map()); + /* + Data layout: + result.expressions = new Map([ + [expression, new Map([ + [reading, new Map([ + [tagName, tagInfo], + ... + ])], + ... + ])], + ... + ]); + */ + let readingMap = result.expressions.get(expression); + if (typeof readingMap === 'undefined') { + readingMap = new Map(); + result.expressions.set(expression, readingMap); } - if (!result.expressions.get(expression).has(reading)) { - result.expressions.get(expression).set(reading, []); + + let termTagsMap = readingMap.get(reading); + if (typeof termTagsMap === 'undefined') { + termTagsMap = new Map(); + readingMap.set(reading, termTagsMap); } for (const tag of definition.termTags) { - if (!result.expressions.get(expression).get(reading).find((existingTag) => existingTag.name === tag.name)) { - result.expressions.get(expression).get(reading).push(tag); + if (!termTagsMap.has(tag.name)) { + termTagsMap.set(tag.name, tag); } } } diff --git a/ext/bg/js/translator.js b/ext/bg/js/translator.js index 9a69e30e..6cf07d93 100644 --- a/ext/bg/js/translator.js +++ b/ext/bg/js/translator.js @@ -127,7 +127,8 @@ class Translator { const expressions = []; for (const [expression, readingMap] of result.expressions.entries()) { - for (const [reading, termTags] of readingMap.entries()) { + for (const [reading, termTagsMap] of readingMap.entries()) { + const termTags = [...termTagsMap.values()]; const score = termTags.map((tag) => tag.score).reduce((p, v) => p + v, 0); expressions.push(Translator.createExpression(expression, reading, dictTagsSort(termTags), Translator.scoreToTermFrequency(score))); }