« get me outta code hell

search: verbatim and fuzz - hsmusic-wiki - HSMusic - static wiki software cataloguing collaborative creation
about summary refs log tree commit diff
path: root/src/common-util
diff options
context:
space:
mode:
author(quasar) nebula <qznebula@protonmail.com>2025-04-18 21:19:07 -0300
committer(quasar) nebula <qznebula@protonmail.com>2025-04-20 12:34:29 -0300
commitd947ed6fda656dc45aef36238c8e2fe4d35348a0 (patch)
tree365b6c91e69c093497f8818e886e0037061c4595 /src/common-util
parentb59b62bf161728145b97fc0b49a10e3f98b0db50 (diff)
search: verbatim and fuzz
Diffstat (limited to 'src/common-util')
-rw-r--r--src/common-util/search-spec.js214
1 files changed, 119 insertions, 95 deletions
diff --git a/src/common-util/search-spec.js b/src/common-util/search-spec.js
index 43d27846..af5ec201 100644
--- a/src/common-util/search-spec.js
+++ b/src/common-util/search-spec.js
@@ -85,104 +85,116 @@ function prepareArtwork(thing, {
   return serializeSrc;
 }
 
-export const searchSpec = {
-  generic: {
-    query: ({
-      albumData,
-      artTagData,
-      artistData,
-      flashData,
-      groupData,
-      trackData,
-    }) => [
-      albumData,
-
-      artTagData,
-
-      artistData
-        .filter(artist => !artist.isAlias),
-
-      flashData,
-
-      groupData,
-
-      trackData
-        // Exclude rereleases - there's no reasonable way to differentiate
-        // them from the main release as part of this query.
-        .filter(track => !track.mainReleaseTrack),
-    ].flat(),
-
-    process(thing, opts) {
-      const fields = {};
-
-      fields.primaryName =
-        thing.name;
-
-      const kind =
-        thing.constructor[Symbol.for('Thing.referenceType')];
-
-      fields.parentName =
-        (kind === 'track'
-          ? thing.album.name
-       : kind === 'group'
-          ? thing.category.name
-       : kind === 'flash'
-          ? thing.act.name
-          : null);
-
-      fields.color =
-        thing.color;
-
-      fields.artTags =
-        (thing.constructor.hasPropertyDescriptor('artTags')
-          ? thing.artTags.map(artTag => artTag.nameShort)
-          : []);
-
-      fields.additionalNames =
-        (thing.constructor.hasPropertyDescriptor('additionalNames')
-          ? thing.additionalNames.map(entry => entry.name)
-       : thing.constructor.hasPropertyDescriptor('aliasNames')
-          ? thing.aliasNames
-          : []);
-
-      const contribKeys = [
-        'artistContribs',
-        'contributorContribs',
-      ];
+function baselineProcess(thing, opts) {
+  const fields = {};
+
+  fields.primaryName =
+    thing.name;
 
-      const contributions =
-        contribKeys
-          .filter(key => Object.hasOwn(thing, key))
-          .flatMap(key => thing[key]);
+  fields.artwork =
+    prepareArtwork(thing, opts);
+
+  fields.color =
+    thing.color;
+
+  return fields;
+}
 
-      fields.contributors =
-        contributions
-          .flatMap(({artist}) => [
-            artist.name,
-            ...artist.aliasNames,
-          ]);
+const baselineStore = [
+  'primaryName',
+  'artwork',
+  'color',
+];
 
-      const groups =
-         (Object.hasOwn(thing, 'groups')
-           ? thing.groups
-        : Object.hasOwn(thing, 'album')
-           ? thing.album.groups
-           : []);
+function genericQuery(wikiData) {
+  return [
+    wikiData.albumData,
 
-      const mainContributorNames =
-        contributions
-          .map(({artist}) => artist.name);
+    wikiData.artTagData,
 
-      fields.groups =
-        groups
-          .filter(group => !mainContributorNames.includes(group.name))
-          .map(group => group.name);
+    wikiData.artistData
+      .filter(artist => !artist.isAlias),
+
+    wikiData.flashData,
+
+    wikiData.groupData,
+
+    wikiData.trackData
+      // Exclude rereleases - there's no reasonable way to differentiate
+      // them from the main release as part of this query.
+      .filter(track => !track.mainReleaseTrack),
+  ].flat();
+}
+
+function genericProcess(thing, opts) {
+  const fields = baselineProcess(thing, opts);
+
+  const kind =
+    thing.constructor[Symbol.for('Thing.referenceType')];
+
+  fields.parentName =
+    (kind === 'track'
+      ? thing.album.name
+   : kind === 'group'
+      ? thing.category.name
+   : kind === 'flash'
+      ? thing.act.name
+      : null);
+
+  fields.artTags =
+    (thing.constructor.hasPropertyDescriptor('artTags')
+      ? thing.artTags.map(artTag => artTag.nameShort)
+      : []);
+
+  fields.additionalNames =
+    (thing.constructor.hasPropertyDescriptor('additionalNames')
+      ? thing.additionalNames.map(entry => entry.name)
+   : thing.constructor.hasPropertyDescriptor('aliasNames')
+      ? thing.aliasNames
+      : []);
+
+  const contribKeys = [
+    'artistContribs',
+    'contributorContribs',
+  ];
+
+  const contributions =
+    contribKeys
+      .filter(key => Object.hasOwn(thing, key))
+      .flatMap(key => thing[key]);
+
+  fields.contributors =
+    contributions
+      .flatMap(({artist}) => [
+        artist.name,
+        ...artist.aliasNames,
+      ]);
+
+  const groups =
+     (Object.hasOwn(thing, 'groups')
+       ? thing.groups
+    : Object.hasOwn(thing, 'album')
+       ? thing.album.groups
+       : []);
+
+  const mainContributorNames =
+    contributions
+      .map(({artist}) => artist.name);
+
+  fields.groups =
+    groups
+      .filter(group => !mainContributorNames.includes(group.name))
+      .map(group => group.name);
+
+  return fields;
+}
 
-      fields.artwork =
-        prepareArtwork(thing, opts);
+const genericStore = baselineStore;
 
-      return fields;
-    },
+export const searchSpec = {
+  generic: {
+    query: genericQuery,
+    process: genericProcess,
 
     index: [
       'primaryName',
@@ -191,13 +203,25 @@ export const searchSpec = {
       'additionalNames',
       'contributors',
       'groups',
-    ],
+    ].map(field => ({field, tokenize: 'forward'})),
 
-    store: [
+    store: genericStore,
+  },
+
+  verbatim: {
+    query: genericQuery,
+    process: genericProcess,
+
+    index: [
       'primaryName',
-      'artwork',
-      'color',
+      'parentName',
+      'artTags',
+      'additionalNames',
+      'contributors',
+      'groups',
     ],
+
+    store: genericStore,
   },
 };