diff options
author | (quasar) nebula <qznebula@protonmail.com> | 2025-04-22 10:41:54 -0300 |
---|---|---|
committer | (quasar) nebula <qznebula@protonmail.com> | 2025-04-22 10:46:05 -0300 |
commit | d586a103e694b4cb229268410899bf0d9a227497 (patch) | |
tree | 8918bd598c1c7ac37004900206d3504696c1b572 /src/static | |
parent | 337705332f0338e1ae5ffe8084cb4eb3e74907a6 (diff) |
client: wiki-search: tidy result matching code
This is duplicated 'boilerplate' at the moment, annoyingly.
Diffstat (limited to 'src/static')
-rw-r--r-- | src/static/js/search-worker.js | 96 |
1 files changed, 50 insertions, 46 deletions
diff --git a/src/static/js/search-worker.js b/src/static/js/search-worker.js index 8c265735..1b0f26de 100644 --- a/src/static/js/search-worker.js +++ b/src/static/js/search-worker.js @@ -468,44 +468,46 @@ function queryGenericIndex(index, query, options) { ])), ])); - const results = new Set(); + let matchedResults = new Set(); for (const interestingFieldCombination of interestingFieldCombinations) { for (const query of queriesBy(interestingFieldCombination)) { - const idToMatchingFieldsMap = new Map(); - for (const {field, query: fieldQuery} of query) { - for (const id of particleResults[field][fieldQuery]) { - if (idToMatchingFieldsMap.has(id)) { - idToMatchingFieldsMap.get(id).push(field); + const commonAcrossFields = new Set(); + + for (const [index, {field, query: fieldQuery}] of query.entries()) { + const firstFieldInQuery = (index === 0); + const tossResults = new Set(commonAcrossFields); + + for (const result of particleResults[field][fieldQuery]) { + if (firstFieldInQuery) { + commonAcrossFields.add(result); } else { - idToMatchingFieldsMap.set(id, [field]); + tossResults.delete(result); } } - } - const commonAcrossFields = - Array.from(idToMatchingFieldsMap.entries()) - .filter(([id, matchingFields]) => - matchingFields.length === interestingFieldCombination.length) - .map(([id]) => id); + for (const result of tossResults) { + commonAcrossFields.delete(result); + } + } for (const result of commonAcrossFields) { - results.add(result); + matchedResults.add(result); } } } - const constituted = - boilerplate.constitute(results); + matchedResults = Array.from(matchedResults); + + const filteredResults = + (queriedKind + ? matchedResults.filter(id => id.split(':')[0] === queriedKind) + : matchedResults); - const constitutedAndFiltered = - constituted - .filter(({id}) => - (queriedKind - ? id.split(':')[0] === queriedKind - : true)); + const constitutedResults = + boilerplate.constitute(filteredResults); - return constitutedAndFiltered; + return constitutedResults; } function queryVerbatimIndex(index, query, options) { @@ -555,44 +557,46 @@ function queryVerbatimIndex(index, query, options) { ])), ])); - const results = new Set(); + let matchedResults = new Set(); for (const interestingFieldCombination of interestingFieldCombinations) { for (const query of queriesBy(interestingFieldCombination)) { - const idToMatchingFieldsMap = new Map(); - for (const {field, query: fieldQuery} of query) { - for (const id of particleResults[field][fieldQuery]) { - if (idToMatchingFieldsMap.has(id)) { - idToMatchingFieldsMap.get(id).push(field); + const commonAcrossFields = new Set(); + + for (const [index, {field, query: fieldQuery}] of query.entries()) { + const firstFieldInQuery = (index === 0); + const tossResults = new Set(commonAcrossFields); + + for (const result of particleResults[field][fieldQuery]) { + if (firstFieldInQuery) { + commonAcrossFields.add(result); } else { - idToMatchingFieldsMap.set(id, [field]); + tossResults.delete(result); } } - } - const commonAcrossFields = - Array.from(idToMatchingFieldsMap.entries()) - .filter(([id, matchingFields]) => - matchingFields.length === interestingFieldCombination.length) - .map(([id]) => id); + for (const result of tossResults) { + commonAcrossFields.delete(result); + } + } for (const result of commonAcrossFields) { - results.add(result); + matchedResults.add(result); } } } - const constituted = - boilerplate.constitute(results); + matchedResults = Array.from(matchedResults); + + const filteredResults = + (queriedKind + ? matchedResults.filter(id => id.split(':')[0] === queriedKind) + : matchedResults); - const constitutedAndFiltered = - constituted - .filter(({id}) => - (queriedKind - ? id.split(':')[0] === queriedKind - : true)); + const constitutedResults = + boilerplate.constitute(filteredResults); - return constitutedAndFiltered; + return constitutedResults; } function processTerms(query) { |