« get me outta code hell

client: wiki-search: factor out queryIndex - hsmusic-wiki - HSMusic - static wiki software cataloguing collaborative creation
about summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
author(quasar) nebula <qznebula@protonmail.com>2025-04-22 10:54:22 -0300
committer(quasar) nebula <qznebula@protonmail.com>2025-04-22 10:54:22 -0300
commit252c7f4613e6f954024f5c59193f5a7a342096dd (patch)
tree602a748ef8d0fa172be383445eb16b6b4a39d0be /src
parentf725dce9aa073ac130e67adcf7c5b1b49cc755ae (diff)
client: wiki-search: factor out queryIndex
Diffstat (limited to 'src')
-rw-r--r--src/static/js/search-worker.js117
1 files changed, 18 insertions, 99 deletions
diff --git a/src/static/js/search-worker.js b/src/static/js/search-worker.js
index a55c10a4..70eb447e 100644
--- a/src/static/js/search-worker.js
+++ b/src/static/js/search-worker.js
@@ -371,15 +371,9 @@ function postActionResult(id, status, value) {
 }
 
 function performSearchAction({query, options}) {
-  const {generic, verbatim} = indexes;
-
   const {queriedKind} = processTerms(query);
-
-  const genericResults =
-    queryGenericIndex(generic, query, options);
-
-  const verbatimResults =
-    queryVerbatimIndex(verbatim, query, options);
+  const genericResults = queryGenericIndex(query, options);
+  const verbatimResults = queryVerbatimIndex(query, options);
 
   const verbatimIDs =
     new Set(verbatimResults?.map(result => result.id));
@@ -421,106 +415,31 @@ const interestingFieldCombinations = [
   ['primaryName'],
 ];
 
-function queryGenericIndex(index, query, options) {
-  const interestingFields =
-    unique(interestingFieldCombinations.flat());
-
-  const {genericTerms, queriedKind} =
-    processTerms(query);
-
-  if (empty(genericTerms)) return null;
-
-  const particles =
-    particulate(genericTerms);
-
-  const groupedParticles =
-    groupArray(particles, ({length}) => length);
-
-  const queriesBy = keys =>
-    (groupedParticles.get(keys.length) ?? [])
-      .flatMap(permutations)
-      .map(values => values.map(({terms}) => terms.join(' ')))
-      .map(values =>
-        stitchArrays({
-          field: keys,
-          query: values,
-        }));
-
-  const boilerplate = queryBoilerplate(index);
-
-  const particleResults =
-    Object.fromEntries(
-      interestingFields.map(field => [
-        field,
-        Object.fromEntries(
-          particles.flat()
-            .map(({terms}) => terms.join(' '))
-            .map(query => [
-              query,
-              new Set(
-                boilerplate
-                  .query(query, {
-                    ...options,
-                    field,
-                    limit: Infinity,
-                  })
-                  .fieldResults[field]),
-            ])),
-      ]));
-
-  let matchedResults = new Set();
-
-  for (const interestingFieldCombination of interestingFieldCombinations) {
-    for (const query of queriesBy(interestingFieldCombination)) {
-      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 {
-            tossResults.delete(result);
-          }
-        }
-
-        for (const result of tossResults) {
-          commonAcrossFields.delete(result);
-        }
-      }
-
-      for (const result of commonAcrossFields) {
-        matchedResults.add(result);
-      }
-    }
-  }
-
-  matchedResults = Array.from(matchedResults);
-
-  const filteredResults =
-    (queriedKind
-      ? matchedResults.filter(id => id.split(':')[0] === queriedKind)
-      : matchedResults);
-
-  const constitutedResults =
-    boilerplate.constitute(filteredResults);
+function queryGenericIndex(query, options) {
+  return queryIndex({
+    indexKey: 'generic',
+    termsKey: 'genericTerms',
+  }, query, options);
+}
 
-  return constitutedResults;
+function queryVerbatimIndex(query, options) {
+  return queryIndex({
+    indexKey: 'verbatim',
+    termsKey: 'verbatimTerms',
+  }, query, options);
 }
 
-function queryVerbatimIndex(index, query, options) {
+function queryIndex({termsKey, indexKey}, query, options) {
   const interestingFields =
     unique(interestingFieldCombinations.flat());
 
-  const {verbatimTerms, queriedKind} =
+  const {[termsKey]: terms, queriedKind} =
     processTerms(query);
 
-  if (empty(verbatimTerms)) return null;
+  if (empty(terms)) return null;
 
   const particles =
-    particulate(verbatimTerms);
+    particulate(terms);
 
   const groupedParticles =
     groupArray(particles, ({length}) => length);
@@ -535,7 +454,7 @@ function queryVerbatimIndex(index, query, options) {
           query: values,
         }));
 
-  const boilerplate = queryBoilerplate(index);
+  const boilerplate = queryBoilerplate(indexes[indexKey]);
 
   const particleResults =
     Object.fromEntries(