« get me outta code hell

hsmusic-wiki - HSMusic - static wiki software cataloguing collaborative creation
about summary refs log tree commit diff
path: root/src/static/js/search-worker.js
diff options
context:
space:
mode:
Diffstat (limited to 'src/static/js/search-worker.js')
-rw-r--r--src/static/js/search-worker.js96
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) {