cry-search 2.0.3 → 2.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (38) hide show
  1. package/CLAUDE.md +8 -2
  2. package/README.md +53 -0
  3. package/UNIVERSE.md +12 -0
  4. package/dist/common/numeric/createSearchArrayMetadata.d.ts +10 -0
  5. package/dist/common/numeric/createSearchArrayMetadata.d.ts.map +1 -1
  6. package/dist/common/numeric/matchMany.d.ts +111 -0
  7. package/dist/common/numeric/matchMany.d.ts.map +1 -0
  8. package/dist/common/numeric/prepareQueryVariants.d.ts +24 -0
  9. package/dist/common/numeric/prepareQueryVariants.d.ts.map +1 -1
  10. package/dist/common/numeric/searchAndRank.d.ts.map +1 -1
  11. package/dist/common/numeric/searchInData.d.ts.map +1 -1
  12. package/dist/common/numeric/syncSearchArrayMetadata.d.ts.map +1 -1
  13. package/dist/common/numeric/updateSearchMetadata.d.ts.map +1 -1
  14. package/dist/index.cjs +300 -113
  15. package/dist/index.d.cts +5 -1
  16. package/dist/index.d.ts +5 -1
  17. package/dist/index.d.ts.map +1 -1
  18. package/dist/index.js +300 -113
  19. package/dist/types/index.d.ts +65 -0
  20. package/dist/types/index.d.ts.map +1 -1
  21. package/dist/vet/data/enote.d.ts +40 -0
  22. package/dist/vet/data/enote.d.ts.map +1 -0
  23. package/dist/vet/data/znamke.gen.d.ts +41 -0
  24. package/dist/vet/data/znamke.gen.d.ts.map +1 -0
  25. package/dist/vet/index.cjs +2468 -0
  26. package/dist/vet/index.d.cts +24 -0
  27. package/dist/vet/index.d.ts +24 -0
  28. package/dist/vet/index.d.ts.map +1 -0
  29. package/dist/vet/index.js +2426 -0
  30. package/dist/vet/normalizatorji.d.ts +104 -0
  31. package/dist/vet/normalizatorji.d.ts.map +1 -0
  32. package/dist/vet/ocena.d.ts +46 -0
  33. package/dist/vet/ocena.d.ts.map +1 -0
  34. package/dist/vet/spec.d.ts +35 -0
  35. package/dist/vet/spec.d.ts.map +1 -0
  36. package/dist/vet/uparjanje.d.ts +72 -0
  37. package/dist/vet/uparjanje.d.ts.map +1 -0
  38. package/package.json +29 -11
package/dist/index.js CHANGED
@@ -426,6 +426,38 @@ function extractStringsFromValue(value, results) {
426
426
  }
427
427
  }
428
428
  }
429
+ function applyValueNormalizers(value, field, normalizers) {
430
+ let text = value;
431
+ const classes = {};
432
+ if (!normalizers?.length)
433
+ return { text, classes };
434
+ for (const normalizer of normalizers) {
435
+ if (normalizer.fields && !normalizer.fields.includes(field))
436
+ continue;
437
+ const izhod = normalizer.fn(text, field);
438
+ if (izhod === undefined)
439
+ continue;
440
+ if (typeof izhod === "string") {
441
+ text = izhod;
442
+ continue;
443
+ }
444
+ text = izhod.text;
445
+ for (const [kljuc, vrednost] of Object.entries(izhod.classes ?? {})) {
446
+ const seznam = Array.isArray(vrednost) ? vrednost : [vrednost];
447
+ const obstojeci = classes[kljuc] ?? [];
448
+ for (const v of seznam) {
449
+ if (v != null && v !== "" && !obstojeci.includes(String(v)))
450
+ obstojeci.push(String(v));
451
+ }
452
+ classes[kljuc] = obstojeci;
453
+ }
454
+ }
455
+ return { text, classes };
456
+ }
457
+ function itemClasses(metadata, id) {
458
+ const zapis = metadata.classes?.get(id);
459
+ return zapis && Object.keys(zapis).length ? zapis : undefined;
460
+ }
429
461
  function prepareObjectForSearchNumeric(obj, spec, tokensMap) {
430
462
  if (isDeletedOrBlocked(obj)) {
431
463
  return;
@@ -433,11 +465,12 @@ function prepareObjectForSearchNumeric(obj, spec, tokensMap) {
433
465
  if (spec?.enrichSearchObjectFn) {
434
466
  spec.enrichSearchObjectFn(obj, spec.searchContext);
435
467
  }
436
- const sorted = spec?.extractSearchableStringFn ? buildSortedFromExtractFn(obj, spec.extractSearchableStringFn, tokensMap) : buildSortedFromFields(obj, spec, tokensMap);
468
+ const classes = {};
469
+ const sorted = spec?.extractSearchableStringFn ? buildSortedFromExtractFn(obj, spec.extractSearchableStringFn, tokensMap) : buildSortedFromFields(obj, spec, tokensMap, classes);
437
470
  if (sorted === undefined)
438
471
  return;
439
- const firstN = spec?.keyFields && spec.keyFields.length > 0 ? buildFirstNFromKeyFields(obj, spec.keyFields, spec.firstTokensN ?? DEFAULT_FIRST_TOKENS_N, spec.phoneFields ?? DEFAULT_PHONE_FIELDS, tokensMap) : undefined;
440
- return { sorted, firstN };
472
+ const firstN = spec?.keyFields && spec.keyFields.length > 0 ? buildFirstNFromKeyFields(obj, spec.keyFields, spec.firstTokensN ?? DEFAULT_FIRST_TOKENS_N, spec.phoneFields ?? DEFAULT_PHONE_FIELDS, tokensMap, spec.valueNormalizers) : undefined;
473
+ return Object.keys(classes).length ? { sorted, firstN, classes } : { sorted, firstN };
441
474
  }
442
475
  function buildSortedFromExtractFn(obj, extractFn, tokensMap) {
443
476
  const str = extractFn(obj);
@@ -445,7 +478,7 @@ function buildSortedFromExtractFn(obj, extractFn, tokensMap) {
445
478
  return;
446
479
  return prepareStringForSearchNumeric(str, tokensMap).sorted;
447
480
  }
448
- function buildSortedFromFields(obj, spec, tokensMap) {
481
+ function buildSortedFromFields(obj, spec, tokensMap, classesOut = {}) {
449
482
  const allTokens = [];
450
483
  const fieldMatchModes = spec?.fieldMatchModes;
451
484
  const fieldsToSearch = spec?.searchInFields ?? Object.keys(obj);
@@ -478,7 +511,19 @@ function buildSortedFromFields(obj, spec, tokensMap) {
478
511
  }
479
512
  if (fieldStrings.length === 0)
480
513
  continue;
481
- const fieldText = fieldStrings.join(" ");
514
+ const normalizirane = spec?.valueNormalizers?.length ? fieldStrings.map((s) => applyValueNormalizers(s, keyStr, spec.valueNormalizers)) : undefined;
515
+ const fieldText = normalizirane ? normalizirane.map((n) => n.text).join(" ") : fieldStrings.join(" ");
516
+ if (normalizirane) {
517
+ for (const n of normalizirane) {
518
+ for (const [kljuc, vrednosti] of Object.entries(n.classes)) {
519
+ const obstojeci = classesOut[kljuc] ?? [];
520
+ for (const v of vrednosti)
521
+ if (!obstojeci.includes(v))
522
+ obstojeci.push(v);
523
+ classesOut[kljuc] = obstojeci;
524
+ }
525
+ }
526
+ }
482
527
  const datesNormalized = normalizeDates(fieldText);
483
528
  const preprocessed = preprocessString(datesNormalized);
484
529
  const sanitised = sanitiseString(preprocessed);
@@ -496,7 +541,7 @@ function buildSortedFromFields(obj, spec, tokensMap) {
496
541
  const uniqueTokens = [...new Set(allTokens)].sort((a, b) => a - b);
497
542
  return new Uint32Array(uniqueTokens);
498
543
  }
499
- function buildFirstNFromKeyFields(obj, keyFields, n, phoneFields, tokensMap) {
544
+ function buildFirstNFromKeyFields(obj, keyFields, n, phoneFields, tokensMap, normalizers) {
500
545
  const strings = [];
501
546
  const phoneFieldPaths = new Set(phoneFields);
502
547
  for (const field of keyFields) {
@@ -506,7 +551,9 @@ function buildFirstNFromKeyFields(obj, keyFields, n, phoneFields, tokensMap) {
506
551
  const value = isDotNotation(keyStr) ? getValueByPath(obj, keyStr) : obj[field];
507
552
  if (value == null)
508
553
  continue;
509
- extractStringsFromValue(value, strings);
554
+ const zacasno = [];
555
+ extractStringsFromValue(value, zacasno);
556
+ strings.push(...normalizers?.length ? zacasno.map((s) => applyValueNormalizers(s, keyStr, normalizers).text) : zacasno);
510
557
  }
511
558
  if (strings.length === 0)
512
559
  return;
@@ -535,6 +582,9 @@ function createSearchArrayMetadataNumeric(data, spec) {
535
582
  if (result.firstN !== undefined) {
536
583
  metadata.unsorted.set(id, result.firstN);
537
584
  }
585
+ if (result.classes !== undefined) {
586
+ (metadata.classes ??= new Map).set(id, result.classes);
587
+ }
538
588
  }
539
589
  }
540
590
  return metadata;
@@ -570,6 +620,7 @@ function updateSearchMetadataNumeric(metadata, objectId, obj, spec, tokensMap) {
570
620
  if (result === undefined) {
571
621
  metadata.sorted.delete(objectId);
572
622
  metadata.unsorted.delete(objectId);
623
+ metadata.classes?.delete(objectId);
573
624
  return false;
574
625
  }
575
626
  metadata.sorted.set(objectId, result.sorted);
@@ -578,6 +629,11 @@ function updateSearchMetadataNumeric(metadata, objectId, obj, spec, tokensMap) {
578
629
  } else {
579
630
  metadata.unsorted.delete(objectId);
580
631
  }
632
+ if (result.classes !== undefined) {
633
+ (metadata.classes ??= new Map).set(objectId, result.classes);
634
+ } else {
635
+ metadata.classes?.delete(objectId);
636
+ }
581
637
  return true;
582
638
  }
583
639
  function updateSearchMetadataBatchNumeric(metadata, batch, spec) {
@@ -806,20 +862,49 @@ function allTokensMatchNumeric(searchTokenStrs, targetTokens, opts) {
806
862
  }
807
863
 
808
864
  // src/common/numeric/prepareQueryVariants.ts
865
+ function normalizeQueryWithOpts(query, opts) {
866
+ const normalizers = opts?.queryNormalizers;
867
+ if (!normalizers?.length)
868
+ return { text: query, classes: {} };
869
+ let text = query;
870
+ const classes = {};
871
+ for (const normalizer of normalizers) {
872
+ const fn = typeof normalizer === "function" ? normalizer : normalizer.fn;
873
+ const izhod = fn(text, "");
874
+ if (izhod === undefined)
875
+ continue;
876
+ if (typeof izhod === "string") {
877
+ text = izhod;
878
+ continue;
879
+ }
880
+ text = izhod.text;
881
+ for (const [kljuc, vrednost] of Object.entries(izhod.classes ?? {})) {
882
+ const seznam = Array.isArray(vrednost) ? vrednost : [vrednost];
883
+ const obstojeci = classes[kljuc] ?? [];
884
+ for (const v of seznam) {
885
+ if (v != null && v !== "" && !obstojeci.includes(String(v)))
886
+ obstojeci.push(String(v));
887
+ }
888
+ classes[kljuc] = obstojeci;
889
+ }
890
+ }
891
+ return { text, classes };
892
+ }
809
893
  function prepareQueryVariants(query, opts) {
810
- const rawTokenStrs = prepareStringForSearch(query);
894
+ const { text: normalizirano, classes } = normalizeQueryWithOpts(query, opts);
895
+ const rawTokenStrs = prepareStringForSearch(normalizirano);
811
896
  const rawTokens = prepareQueryTokens(rawTokenStrs);
812
897
  const normalizers = opts?.phoneQueryNormalizers ?? [defaultQueryPhoneNormalizer];
813
898
  const seenPhones = new Set;
814
899
  const phoneTokens = [];
815
900
  for (const normalizer of normalizers) {
816
- const normalized = validateNormalizedPhone(normalizer(query), "Phone query normalizer");
901
+ const normalized = validateNormalizedPhone(normalizer(normalizirano), "Phone query normalizer");
817
902
  if (normalized === undefined || seenPhones.has(normalized))
818
903
  continue;
819
904
  seenPhones.add(normalized);
820
905
  phoneTokens.push(prepareQueryTokens([normalized]));
821
906
  }
822
- return { rawTokenStrs, rawTokens, phoneTokens };
907
+ return { rawTokenStrs, rawTokens, phoneTokens, classes };
823
908
  }
824
909
 
825
910
  // src/common/numeric/scoring.ts
@@ -938,12 +1023,13 @@ function searchInDataReturnObjectsNumeric(query, metadata, data, opts) {
938
1023
  return results;
939
1024
  }
940
1025
  function searchInDataReturnIdsWithLimitNumeric(query, metadata, limit, opts) {
941
- const { rawTokenStrs, rawTokens, phoneTokens } = prepareQueryVariants(query, opts);
1026
+ const { rawTokens, phoneTokens } = prepareQueryVariants(query, opts);
942
1027
  const phoneCandidates = findMatchingCandidates(metadata, phoneTokens, opts);
943
1028
  const candidates = phoneCandidates.length > 0 ? phoneCandidates : findMatchingCandidates(metadata, rawTokens.length > 0 ? [rawTokens] : [], opts);
944
1029
  if (candidates.length === 0)
945
1030
  return [];
946
- const qTokens = orderedTokenize(query);
1031
+ const qText = normalizeQueryWithOpts(query, opts).text;
1032
+ const qTokens = orderedTokenize(qText);
947
1033
  const hasUnsorted = metadata.unsorted.size > 0;
948
1034
  if (!hasUnsorted) {
949
1035
  if (limit === Infinity || limit >= candidates.length)
@@ -962,7 +1048,7 @@ function searchInDataReturnIdsWithLimitNumeric(query, metadata, limit, opts) {
962
1048
  for (let j = 0;j < unsortedIds.length; j++) {
963
1049
  itemTokens[j] = tokens[unsortedIds[j]] ?? "";
964
1050
  }
965
- scored[i] = { id, score: scoreOne(query, qTokens, itemTokens), order: i };
1051
+ scored[i] = { id, score: scoreOne(qText, qTokens, itemTokens), order: i };
966
1052
  }
967
1053
  scored.sort((a, b) => {
968
1054
  if (a.score !== b.score)
@@ -1414,10 +1500,16 @@ function applyPreparedTokens(metadata, id, result) {
1414
1500
  } else {
1415
1501
  metadata.unsorted.delete(id);
1416
1502
  }
1503
+ if (result.classes !== undefined) {
1504
+ (metadata.classes ??= new Map).set(id, result.classes);
1505
+ } else {
1506
+ metadata.classes?.delete(id);
1507
+ }
1417
1508
  }
1418
1509
  function deletePreparedTokens(metadata, id) {
1419
1510
  metadata.sorted.delete(id);
1420
1511
  metadata.unsorted.delete(id);
1512
+ metadata.classes?.delete(id);
1421
1513
  }
1422
1514
  function syncSearchArrayMetadataNumeric(metadata, newData, spec) {
1423
1515
  const result = {
@@ -1507,6 +1599,135 @@ function syncSearchArrayMetadataNumericWithPrevious(metadata, previousData, newD
1507
1599
  clearTokensMap(tokensMap);
1508
1600
  return result;
1509
1601
  }
1602
+ // src/common/numeric/searchAndRank.ts
1603
+ function tokenIdsToStrings(tokenIds) {
1604
+ if (tokenIds === undefined)
1605
+ return;
1606
+ const out = new Array(tokenIds.length);
1607
+ for (let i = 0;i < tokenIds.length; i++) {
1608
+ out[i] = tokens[tokenIds[i]] ?? "";
1609
+ }
1610
+ return out;
1611
+ }
1612
+ function searchAndRankNumeric(query, data, metadata, options) {
1613
+ const { primaryTextFn, exactKeysFn, limit, opts } = options;
1614
+ const ids = searchInDataReturnIdsNumeric(query, metadata, opts);
1615
+ if (ids.length === 0)
1616
+ return [];
1617
+ const qText = normalizeQueryWithOpts(query, opts).text;
1618
+ const qTokens = orderedTokenize(qText);
1619
+ const scored = [];
1620
+ for (const id of ids) {
1621
+ const item = data.get(id);
1622
+ if (!item)
1623
+ continue;
1624
+ const itemTokens = tokenIdsToStrings(metadata.unsorted.get(id)) ?? orderedTokenize(primaryTextFn(item) || "");
1625
+ const exactKeys = exactKeysFn?.(item);
1626
+ const score = scoreOne(qText, qTokens, itemTokens, exactKeys);
1627
+ scored.push({ id, item, score });
1628
+ }
1629
+ scored.sort((x, y) => {
1630
+ if (y.score !== x.score)
1631
+ return y.score - x.score;
1632
+ const xText = primaryTextFn(x.item) || "";
1633
+ const yText = primaryTextFn(y.item) || "";
1634
+ return xText.localeCompare(yText);
1635
+ });
1636
+ if (limit === undefined || limit === Infinity || limit >= scored.length)
1637
+ return scored;
1638
+ return scored.slice(0, limit);
1639
+ }
1640
+
1641
+ // src/common/numeric/matchMany.ts
1642
+ function naSezname(classes) {
1643
+ if (!classes)
1644
+ return;
1645
+ const out = {};
1646
+ for (const [kljuc, vrednost] of Object.entries(classes)) {
1647
+ const seznam = Array.isArray(vrednost) ? vrednost.map(String) : [String(vrednost)];
1648
+ if (seznam.length)
1649
+ out[kljuc] = seznam;
1650
+ }
1651
+ return Object.keys(out).length ? out : undefined;
1652
+ }
1653
+ async function* matchMany(prepared, queries, options) {
1654
+ const { queryOf, idOf, limit = 3, minScore = 0, kos = 50, samoEnolicno, rank, accept, opts } = options;
1655
+ const retrievalLimit = options.retrievalLimit ?? Math.max(20, limit * 4);
1656
+ const primaryTextOf = options.primaryTextOf ?? ((item) => item["naziv"]);
1657
+ const porabljeni = samoEnolicno ? new Set : undefined;
1658
+ let kosZbirka = [];
1659
+ for (let indeks = 0;indeks < queries.length; indeks++) {
1660
+ const query = queries[indeks];
1661
+ const vhod = queryOf(query);
1662
+ const text = typeof vhod === "string" ? vhod : vhod.text;
1663
+ const queryClasses = typeof vhod === "string" ? undefined : naSezname(vhod.classes);
1664
+ const id = idOf ? idOf(query, indeks) : String(query["_id"] ?? query["id"] ?? indeks);
1665
+ const poisciKandidate = (besedilo, razredi) => {
1666
+ if (!besedilo.trim())
1667
+ return { kandidati: [], zadetkov: 0 };
1668
+ const zadetki = searchAndRankNumeric(besedilo, prepared.data, prepared.metadata, {
1669
+ primaryTextFn: primaryTextOf,
1670
+ ...options.exactKeysOf ? { exactKeysFn: options.exactKeysOf } : {},
1671
+ ...opts ? { opts } : {},
1672
+ limit: retrievalLimit
1673
+ });
1674
+ const poizvedbaZaDomeno = { text: besedilo, ...razredi ? { classes: razredi } : {} };
1675
+ const najdeni = [];
1676
+ for (const zadetek of zadetki) {
1677
+ const classes = itemClasses(prepared.metadata, zadetek.id);
1678
+ const kandidat = {
1679
+ id: zadetek.id,
1680
+ item: zadetek.item,
1681
+ ...classes ? { classes } : {}
1682
+ };
1683
+ if (accept && !accept(kandidat, poizvedbaZaDomeno))
1684
+ continue;
1685
+ const ocena = rank ? rank(kandidat, poizvedbaZaDomeno) : zadetek.score;
1686
+ if (ocena < minScore)
1687
+ continue;
1688
+ if (porabljeni?.has(zadetek.id))
1689
+ continue;
1690
+ najdeni.push({ id: zadetek.id, item: zadetek.item, score: ocena, ...classes ? { classes } : {} });
1691
+ }
1692
+ najdeni.sort((a, b) => {
1693
+ if (b.score !== a.score)
1694
+ return b.score - a.score;
1695
+ return (primaryTextOf(a.item) ?? "").localeCompare(primaryTextOf(b.item) ?? "");
1696
+ });
1697
+ if (najdeni.length > limit)
1698
+ najdeni.length = limit;
1699
+ return { kandidati: najdeni, zadetkov: zadetki.length };
1700
+ };
1701
+ let { kandidati, zadetkov } = poisciKandidate(text, queryClasses);
1702
+ const poskusiAlternative = kandidati.length === 0 && (options.alternativneLeCeNiZadetkov ? zadetkov === 0 : true);
1703
+ if (poskusiAlternative && options.alternativnePoizvedbe) {
1704
+ for (const alternativa of options.alternativnePoizvedbe(query)) {
1705
+ const altBesedilo = typeof alternativa === "string" ? alternativa : alternativa.text;
1706
+ if (!altBesedilo?.trim() || altBesedilo === text)
1707
+ continue;
1708
+ const altRazredi = typeof alternativa === "string" ? undefined : naSezname(alternativa.classes);
1709
+ ({ kandidati } = poisciKandidate(altBesedilo, altRazredi));
1710
+ if (kandidati.length)
1711
+ break;
1712
+ }
1713
+ }
1714
+ if (porabljeni) {
1715
+ for (const kandidat of kandidati)
1716
+ porabljeni.add(kandidat.id);
1717
+ }
1718
+ kosZbirka.push({
1719
+ id,
1720
+ ...queryClasses ? { queryClasses } : {},
1721
+ kandidati
1722
+ });
1723
+ if (kosZbirka.length >= kos) {
1724
+ yield kosZbirka;
1725
+ kosZbirka = [];
1726
+ }
1727
+ }
1728
+ if (kosZbirka.length)
1729
+ yield kosZbirka;
1730
+ }
1510
1731
  // src/common/numeric/updateSearchLinkedMetadata.ts
1511
1732
  function tokensEqual2(a, b) {
1512
1733
  if (a.length !== b.length)
@@ -1659,43 +1880,6 @@ function syncLinkedItemsForPrimaryNumeric(linked, primaryId, newLinkedItems, for
1659
1880
  clearTokensMap(tokensMap);
1660
1881
  return result;
1661
1882
  }
1662
- // src/common/numeric/searchAndRank.ts
1663
- function tokenIdsToStrings(tokenIds) {
1664
- if (tokenIds === undefined)
1665
- return;
1666
- const out = new Array(tokenIds.length);
1667
- for (let i = 0;i < tokenIds.length; i++) {
1668
- out[i] = tokens[tokenIds[i]] ?? "";
1669
- }
1670
- return out;
1671
- }
1672
- function searchAndRankNumeric(query, data, metadata, options) {
1673
- const { primaryTextFn, exactKeysFn, limit, opts } = options;
1674
- const ids = searchInDataReturnIdsNumeric(query, metadata, opts);
1675
- if (ids.length === 0)
1676
- return [];
1677
- const qTokens = orderedTokenize(query);
1678
- const scored = [];
1679
- for (const id of ids) {
1680
- const item = data.get(id);
1681
- if (!item)
1682
- continue;
1683
- const itemTokens = tokenIdsToStrings(metadata.unsorted.get(id)) ?? orderedTokenize(primaryTextFn(item) || "");
1684
- const exactKeys = exactKeysFn?.(item);
1685
- const score = scoreOne(query, qTokens, itemTokens, exactKeys);
1686
- scored.push({ id, item, score });
1687
- }
1688
- scored.sort((x, y) => {
1689
- if (y.score !== x.score)
1690
- return y.score - x.score;
1691
- const xText = primaryTextFn(x.item) || "";
1692
- const yText = primaryTextFn(y.item) || "";
1693
- return xText.localeCompare(yText);
1694
- });
1695
- if (limit === undefined || limit === Infinity || limit >= scored.length)
1696
- return scored;
1697
- return scored.slice(0, limit);
1698
- }
1699
1883
  // src/common/SearchUniverse.ts
1700
1884
  function tokensEqual3(a, b) {
1701
1885
  if (a.length !== b.length)
@@ -2137,68 +2321,71 @@ class SearchUniverse {
2137
2321
  }
2138
2322
  }
2139
2323
  export {
2140
- upsertPrimaryItemNumeric as upsertPrimaryItem,
2141
- upsertLinkedItemNumeric as upsertLinkedItem,
2142
- updateSearchMetadataBatchNumeric as updateSearchMetadataBatch,
2143
- updateSearchMetadataNumeric as updateSearchMetadata,
2144
- tokens,
2145
- tokenize,
2146
- syncSearchArrayMetadataNumericWithPrevious as syncSearchArrayMetadataWithPrevious,
2147
- syncSearchArrayMetadataNumeric as syncSearchArrayMetadata,
2148
- syncLinkedItemsForPrimaryNumeric as syncLinkedItemsForPrimary,
2149
- searchableDataToArray,
2150
- searchInDataReturnIdsWithLimitNumeric as searchInDataWithLimit,
2151
- searchInDataReturnObjectsNumeric as searchInDataReturnObjects,
2152
- searchInDataReturnIdsNumeric as searchInDataReturnIds,
2153
- searchInDataReturnIdsNumeric as searchInData,
2154
- searchAndRankNumeric,
2155
- searchAndRankNumeric as searchAndRank,
2156
- scoreOrderAndPresence,
2157
- scoreOne,
2158
- scoreBag,
2159
- sanitiseString,
2160
- resolvePhoneQueryNormalizer,
2161
- resetTokenRegistry,
2162
- removePrimaryItemNumeric as removePrimaryItem,
2163
- removeLinkedItemNumeric as removeLinkedItem,
2164
- removeFromSearchMetadataBatchNumeric as removeFromSearchMetadataBatch,
2165
- removeFromSearchMetadataNumeric as removeFromSearchMetadata,
2166
- registerToken,
2167
- preprocessString,
2168
- prepareStringForSearch,
2169
- prepareQueryTokens,
2170
- prepareObjectForSearchNumeric as prepareObjectForSearch,
2171
- orderedTokenize,
2172
- normalizeDates,
2173
- matchTokenInSortedListNumeric,
2174
- matchPreparedTokenInSortedList,
2175
- isDeletedOrBlocked,
2176
- getTokenCount,
2177
- getTokenById,
2178
- getOrCreateTokenId,
2179
- findTokenId,
2180
- findInLinkedArraysSimpleNumeric,
2181
- findInLinkedArraysNumeric,
2182
- encodeTokenWithMode,
2183
- defaultQueryPhoneNormalizer,
2184
- defaultPhoneNormalizer,
2185
- decodeTokenId,
2186
- decodeMatchMode,
2187
- createTokensMap,
2188
- createSearchLinkedMetadataNumeric as createSearchLinkedMetadata,
2189
- createSearchArrayMetadataNumeric as createSearchArrayMetadata,
2190
- compareTokenized,
2191
- clearTokensMap,
2192
- binarySearchUint32,
2193
- arrayToSearchableData,
2194
- allTokensMatchNumeric,
2195
- allPreparedTokensMatch,
2196
- TOKEN_ID_MASK,
2197
- SearchUniverse,
2198
- PREFIX_TO_MATCH_MODE,
2199
- MATCH_MODE_PREFIXES,
2200
- MATCH_MODE_BITS,
2201
- DEFAULT_SEARCH_OPTS,
2324
+ AugmentedMetadata,
2202
2325
  DEFAULT_PHONE_FIELDS,
2203
- AugmentedMetadata
2326
+ DEFAULT_SEARCH_OPTS,
2327
+ MATCH_MODE_BITS,
2328
+ MATCH_MODE_PREFIXES,
2329
+ PREFIX_TO_MATCH_MODE,
2330
+ SearchUniverse,
2331
+ TOKEN_ID_MASK,
2332
+ allPreparedTokensMatch,
2333
+ allTokensMatchNumeric,
2334
+ arrayToSearchableData,
2335
+ binarySearchUint32,
2336
+ clearTokensMap,
2337
+ compareTokenized,
2338
+ createSearchArrayMetadataNumeric as createSearchArrayMetadata,
2339
+ createSearchLinkedMetadataNumeric as createSearchLinkedMetadata,
2340
+ createTokensMap,
2341
+ decodeMatchMode,
2342
+ decodeTokenId,
2343
+ defaultPhoneNormalizer,
2344
+ defaultQueryPhoneNormalizer,
2345
+ encodeTokenWithMode,
2346
+ findInLinkedArraysNumeric,
2347
+ findInLinkedArraysSimpleNumeric,
2348
+ findTokenId,
2349
+ getOrCreateTokenId,
2350
+ getTokenById,
2351
+ getTokenCount,
2352
+ isDeletedOrBlocked,
2353
+ itemClasses,
2354
+ matchMany,
2355
+ matchPreparedTokenInSortedList,
2356
+ matchTokenInSortedListNumeric,
2357
+ normalizeDates,
2358
+ normalizeQueryWithOpts,
2359
+ orderedTokenize,
2360
+ prepareObjectForSearchNumeric as prepareObjectForSearch,
2361
+ prepareQueryTokens,
2362
+ prepareStringForSearch,
2363
+ preprocessString,
2364
+ registerToken,
2365
+ removeFromSearchMetadataNumeric as removeFromSearchMetadata,
2366
+ removeFromSearchMetadataBatchNumeric as removeFromSearchMetadataBatch,
2367
+ removeLinkedItemNumeric as removeLinkedItem,
2368
+ removePrimaryItemNumeric as removePrimaryItem,
2369
+ resetTokenRegistry,
2370
+ resolvePhoneQueryNormalizer,
2371
+ sanitiseString,
2372
+ scoreBag,
2373
+ scoreOne,
2374
+ scoreOrderAndPresence,
2375
+ searchAndRankNumeric as searchAndRank,
2376
+ searchAndRankNumeric,
2377
+ searchInDataReturnIdsNumeric as searchInData,
2378
+ searchInDataReturnIdsNumeric as searchInDataReturnIds,
2379
+ searchInDataReturnObjectsNumeric as searchInDataReturnObjects,
2380
+ searchInDataReturnIdsWithLimitNumeric as searchInDataWithLimit,
2381
+ searchableDataToArray,
2382
+ syncLinkedItemsForPrimaryNumeric as syncLinkedItemsForPrimary,
2383
+ syncSearchArrayMetadataNumeric as syncSearchArrayMetadata,
2384
+ syncSearchArrayMetadataNumericWithPrevious as syncSearchArrayMetadataWithPrevious,
2385
+ tokenize,
2386
+ tokens,
2387
+ updateSearchMetadataNumeric as updateSearchMetadata,
2388
+ updateSearchMetadataBatchNumeric as updateSearchMetadataBatch,
2389
+ upsertLinkedItemNumeric as upsertLinkedItem,
2390
+ upsertPrimaryItemNumeric as upsertPrimaryItem
2204
2391
  };
@@ -27,6 +27,17 @@ export interface NumericSearchMetadata {
27
27
  sorted: Map<Id, NumericTokenSortedList>;
28
28
  /** First-N token IDs in SOURCE order per item — used for positional ranking. */
29
29
  unsorted: Map<Id, NumericTokenUnsortedList>;
30
+ /**
31
+ * Domain classes per item, produced by `SearchableObjectSpec.valueNormalizers`
32
+ * (e.g. `{ razpon: ['15-30'], enota: ['tbl'] }`).
33
+ *
34
+ * Classes are **not tokens**: they never take part in retrieval, so a candidate
35
+ * missing a class is never excluded. They exist so a domain scorer can reward
36
+ * equal class values and penalize conflicting ones (soft semantics).
37
+ *
38
+ * Absent when no normalizer produced classes.
39
+ */
40
+ classes?: Map<Id, Record<string, string[]>>;
30
41
  }
31
42
  /** Map of objects by their ID for efficient lookup */
32
43
  export type SearchableData<T extends SearchableObject> = Map<Id, T>;
@@ -97,7 +108,55 @@ export interface SearchableObjectSpec<T extends SearchableObject, C = unknown> {
97
108
  * @default 8
98
109
  */
99
110
  firstTokensN?: number;
111
+ /**
112
+ * Domain normalizers applied to FIELD VALUES at index time, before the standard
113
+ * pipeline (dates → preprocess → sanitise → tokenize) and before `fieldMatchModes`.
114
+ *
115
+ * A normalizer either returns a replacement string (canonical units, brand aliases)
116
+ * or a {@link NormalizedValue} carrying extra **domain classes** (a range, a pack
117
+ * size, an animal species). Classes are stored in `metadata.classes` and are never
118
+ * required for a match — see {@link NumericSearchMetadata.classes}.
119
+ *
120
+ * @example
121
+ * ```typescript
122
+ * valueNormalizers: [{ fn: (v) => v.replace(/\btablete?\b/gi, 'tbl') }]
123
+ * ```
124
+ */
125
+ valueNormalizers?: readonly ValueNormalizer[];
100
126
  }
127
+ /**
128
+ * Result of a domain normalizer: canonical text plus optional domain classes.
129
+ *
130
+ * @example
131
+ * ```typescript
132
+ * { text: '15 30 KG', classes: { razpon: '15-30' } }
133
+ * ```
134
+ */
135
+ export interface NormalizedValue {
136
+ /** Canonical (replacement) text that continues through the normal pipeline. */
137
+ text: string;
138
+ /** Domain classes; a single value or a list (both become a list in metadata). */
139
+ classes?: Record<string, string | string[]>;
140
+ }
141
+ /**
142
+ * Index-time normalizer for a field value (domain extension seam).
143
+ *
144
+ * Returning `undefined` keeps the previous text; normalizers run in order, so a
145
+ * later one sees the previous one's replacement (but not its classes).
146
+ */
147
+ export interface ValueNormalizer {
148
+ /** Fields this normalizer applies to. Default: every searched field. */
149
+ fields?: readonly string[];
150
+ fn: (value: string, field: string) => string | NormalizedValue | undefined;
151
+ }
152
+ /**
153
+ * Query-time normalizer (domain extension seam). Must be the same mapping as the
154
+ * index-time one, otherwise query tokens and stored tokens drift apart.
155
+ *
156
+ * Accepts either a plain function or the same `{ fn }` shape as
157
+ * {@link ValueNormalizer}, so one definition can be reused on both sides.
158
+ */
159
+ export type QueryNormalizer = ((query: string) => string | NormalizedValue | undefined) | ValueNormalizer;
101
160
  /** Default cap on `metadata.unsorted` length. */
102
161
  export declare const DEFAULT_FIRST_TOKENS_N = 8;
103
162
  /**
@@ -134,6 +193,12 @@ export interface SearchOpts {
134
193
  * When a phone variant finds candidates, it takes precedence over raw tokens.
135
194
  */
136
195
  phoneQueryNormalizers?: readonly PhoneQueryNormalizer[];
196
+ /**
197
+ * Domain normalizers applied to the QUERY before tokenization; the same mapping
198
+ * must be configured as `SearchableObjectSpec.valueNormalizers` at index time.
199
+ * Query classes are available to the caller through {@link normalizeQueryWithOpts}.
200
+ */
201
+ queryNormalizers?: readonly QueryNormalizer[];
137
202
  }
138
203
  /** Default match-mode options. Phone query normalizers are resolved per search. */
139
204
  export declare const DEFAULT_SEARCH_OPTS: Required<Pick<SearchOpts, 'matchWords' | 'matchNumbers' | 'matchNumbersShort' | 'matchNumbersThreshold'>>;
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"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"}