From d586a103e694b4cb229268410899bf0d9a227497 Mon Sep 17 00:00:00 2001 From: "(quasar) nebula" Date: Tue, 22 Apr 2025 10:41:54 -0300 Subject: client: wiki-search: tidy result matching code This is duplicated 'boilerplate' at the moment, annoyingly. --- src/static/js/search-worker.js | 96 ++++++++++++++++++++++-------------------- 1 file changed, 50 insertions(+), 46 deletions(-) (limited to 'src/static/js') 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) { -- cgit 1.3.0-6-gf8a5