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.cjs CHANGED
@@ -39,70 +39,73 @@ var __export = (target, all) => {
39
39
  // src/index.ts
40
40
  var exports_src = {};
41
41
  __export(exports_src, {
42
- upsertPrimaryItem: () => upsertPrimaryItemNumeric,
43
- upsertLinkedItem: () => upsertLinkedItemNumeric,
44
- updateSearchMetadataBatch: () => updateSearchMetadataBatchNumeric,
45
- updateSearchMetadata: () => updateSearchMetadataNumeric,
46
- tokens: () => tokens,
47
- tokenize: () => tokenize,
48
- syncSearchArrayMetadataWithPrevious: () => syncSearchArrayMetadataNumericWithPrevious,
49
- syncSearchArrayMetadata: () => syncSearchArrayMetadataNumeric,
50
- syncLinkedItemsForPrimary: () => syncLinkedItemsForPrimaryNumeric,
51
- searchableDataToArray: () => searchableDataToArray,
52
- searchInDataWithLimit: () => searchInDataReturnIdsWithLimitNumeric,
53
- searchInDataReturnObjects: () => searchInDataReturnObjectsNumeric,
54
- searchInDataReturnIds: () => searchInDataReturnIdsNumeric,
55
- searchInData: () => searchInDataReturnIdsNumeric,
56
- searchAndRankNumeric: () => searchAndRankNumeric,
57
- searchAndRank: () => searchAndRankNumeric,
58
- scoreOrderAndPresence: () => scoreOrderAndPresence,
59
- scoreOne: () => scoreOne,
60
- scoreBag: () => scoreBag,
61
- sanitiseString: () => sanitiseString,
62
- resolvePhoneQueryNormalizer: () => resolvePhoneQueryNormalizer,
63
- resetTokenRegistry: () => resetTokenRegistry,
64
- removePrimaryItem: () => removePrimaryItemNumeric,
65
- removeLinkedItem: () => removeLinkedItemNumeric,
66
- removeFromSearchMetadataBatch: () => removeFromSearchMetadataBatchNumeric,
67
- removeFromSearchMetadata: () => removeFromSearchMetadataNumeric,
68
- registerToken: () => registerToken,
69
- preprocessString: () => preprocessString,
70
- prepareStringForSearch: () => prepareStringForSearch,
71
- prepareQueryTokens: () => prepareQueryTokens,
72
- prepareObjectForSearch: () => prepareObjectForSearchNumeric,
73
- orderedTokenize: () => orderedTokenize,
74
- normalizeDates: () => normalizeDates,
75
- matchTokenInSortedListNumeric: () => matchTokenInSortedListNumeric,
76
- matchPreparedTokenInSortedList: () => matchPreparedTokenInSortedList,
77
- isDeletedOrBlocked: () => isDeletedOrBlocked,
78
- getTokenCount: () => getTokenCount,
79
- getTokenById: () => getTokenById,
80
- getOrCreateTokenId: () => getOrCreateTokenId,
81
- findTokenId: () => findTokenId,
82
- findInLinkedArraysSimpleNumeric: () => findInLinkedArraysSimpleNumeric,
83
- findInLinkedArraysNumeric: () => findInLinkedArraysNumeric,
84
- encodeTokenWithMode: () => encodeTokenWithMode,
85
- defaultQueryPhoneNormalizer: () => defaultQueryPhoneNormalizer,
86
- defaultPhoneNormalizer: () => defaultPhoneNormalizer,
87
- decodeTokenId: () => decodeTokenId,
88
- decodeMatchMode: () => decodeMatchMode,
89
- createTokensMap: () => createTokensMap,
90
- createSearchLinkedMetadata: () => createSearchLinkedMetadataNumeric,
91
- createSearchArrayMetadata: () => createSearchArrayMetadataNumeric,
92
- compareTokenized: () => compareTokenized,
93
- clearTokensMap: () => clearTokensMap,
94
- binarySearchUint32: () => binarySearchUint32,
95
- arrayToSearchableData: () => arrayToSearchableData,
96
- allTokensMatchNumeric: () => allTokensMatchNumeric,
97
- allPreparedTokensMatch: () => allPreparedTokensMatch,
98
- TOKEN_ID_MASK: () => TOKEN_ID_MASK,
99
- SearchUniverse: () => SearchUniverse,
100
- PREFIX_TO_MATCH_MODE: () => PREFIX_TO_MATCH_MODE,
101
- MATCH_MODE_PREFIXES: () => MATCH_MODE_PREFIXES,
102
- MATCH_MODE_BITS: () => MATCH_MODE_BITS,
103
- DEFAULT_SEARCH_OPTS: () => DEFAULT_SEARCH_OPTS,
42
+ AugmentedMetadata: () => AugmentedMetadata,
104
43
  DEFAULT_PHONE_FIELDS: () => DEFAULT_PHONE_FIELDS,
105
- AugmentedMetadata: () => AugmentedMetadata
44
+ DEFAULT_SEARCH_OPTS: () => DEFAULT_SEARCH_OPTS,
45
+ MATCH_MODE_BITS: () => MATCH_MODE_BITS,
46
+ MATCH_MODE_PREFIXES: () => MATCH_MODE_PREFIXES,
47
+ PREFIX_TO_MATCH_MODE: () => PREFIX_TO_MATCH_MODE,
48
+ SearchUniverse: () => SearchUniverse,
49
+ TOKEN_ID_MASK: () => TOKEN_ID_MASK,
50
+ allPreparedTokensMatch: () => allPreparedTokensMatch,
51
+ allTokensMatchNumeric: () => allTokensMatchNumeric,
52
+ arrayToSearchableData: () => arrayToSearchableData,
53
+ binarySearchUint32: () => binarySearchUint32,
54
+ clearTokensMap: () => clearTokensMap,
55
+ compareTokenized: () => compareTokenized,
56
+ createSearchArrayMetadata: () => createSearchArrayMetadataNumeric,
57
+ createSearchLinkedMetadata: () => createSearchLinkedMetadataNumeric,
58
+ createTokensMap: () => createTokensMap,
59
+ decodeMatchMode: () => decodeMatchMode,
60
+ decodeTokenId: () => decodeTokenId,
61
+ defaultPhoneNormalizer: () => defaultPhoneNormalizer,
62
+ defaultQueryPhoneNormalizer: () => defaultQueryPhoneNormalizer,
63
+ encodeTokenWithMode: () => encodeTokenWithMode,
64
+ findInLinkedArraysNumeric: () => findInLinkedArraysNumeric,
65
+ findInLinkedArraysSimpleNumeric: () => findInLinkedArraysSimpleNumeric,
66
+ findTokenId: () => findTokenId,
67
+ getOrCreateTokenId: () => getOrCreateTokenId,
68
+ getTokenById: () => getTokenById,
69
+ getTokenCount: () => getTokenCount,
70
+ isDeletedOrBlocked: () => isDeletedOrBlocked,
71
+ itemClasses: () => itemClasses,
72
+ matchMany: () => matchMany,
73
+ matchPreparedTokenInSortedList: () => matchPreparedTokenInSortedList,
74
+ matchTokenInSortedListNumeric: () => matchTokenInSortedListNumeric,
75
+ normalizeDates: () => normalizeDates,
76
+ normalizeQueryWithOpts: () => normalizeQueryWithOpts,
77
+ orderedTokenize: () => orderedTokenize,
78
+ prepareObjectForSearch: () => prepareObjectForSearchNumeric,
79
+ prepareQueryTokens: () => prepareQueryTokens,
80
+ prepareStringForSearch: () => prepareStringForSearch,
81
+ preprocessString: () => preprocessString,
82
+ registerToken: () => registerToken,
83
+ removeFromSearchMetadata: () => removeFromSearchMetadataNumeric,
84
+ removeFromSearchMetadataBatch: () => removeFromSearchMetadataBatchNumeric,
85
+ removeLinkedItem: () => removeLinkedItemNumeric,
86
+ removePrimaryItem: () => removePrimaryItemNumeric,
87
+ resetTokenRegistry: () => resetTokenRegistry,
88
+ resolvePhoneQueryNormalizer: () => resolvePhoneQueryNormalizer,
89
+ sanitiseString: () => sanitiseString,
90
+ scoreBag: () => scoreBag,
91
+ scoreOne: () => scoreOne,
92
+ scoreOrderAndPresence: () => scoreOrderAndPresence,
93
+ searchAndRank: () => searchAndRankNumeric,
94
+ searchAndRankNumeric: () => searchAndRankNumeric,
95
+ searchInData: () => searchInDataReturnIdsNumeric,
96
+ searchInDataReturnIds: () => searchInDataReturnIdsNumeric,
97
+ searchInDataReturnObjects: () => searchInDataReturnObjectsNumeric,
98
+ searchInDataWithLimit: () => searchInDataReturnIdsWithLimitNumeric,
99
+ searchableDataToArray: () => searchableDataToArray,
100
+ syncLinkedItemsForPrimary: () => syncLinkedItemsForPrimaryNumeric,
101
+ syncSearchArrayMetadata: () => syncSearchArrayMetadataNumeric,
102
+ syncSearchArrayMetadataWithPrevious: () => syncSearchArrayMetadataNumericWithPrevious,
103
+ tokenize: () => tokenize,
104
+ tokens: () => tokens,
105
+ updateSearchMetadata: () => updateSearchMetadataNumeric,
106
+ updateSearchMetadataBatch: () => updateSearchMetadataBatchNumeric,
107
+ upsertLinkedItem: () => upsertLinkedItemNumeric,
108
+ upsertPrimaryItem: () => upsertPrimaryItemNumeric
106
109
  });
107
110
  module.exports = __toCommonJS(exports_src);
108
111
 
@@ -534,6 +537,38 @@ function extractStringsFromValue(value, results) {
534
537
  }
535
538
  }
536
539
  }
540
+ function applyValueNormalizers(value, field, normalizers) {
541
+ let text = value;
542
+ const classes = {};
543
+ if (!normalizers?.length)
544
+ return { text, classes };
545
+ for (const normalizer of normalizers) {
546
+ if (normalizer.fields && !normalizer.fields.includes(field))
547
+ continue;
548
+ const izhod = normalizer.fn(text, field);
549
+ if (izhod === undefined)
550
+ continue;
551
+ if (typeof izhod === "string") {
552
+ text = izhod;
553
+ continue;
554
+ }
555
+ text = izhod.text;
556
+ for (const [kljuc, vrednost] of Object.entries(izhod.classes ?? {})) {
557
+ const seznam = Array.isArray(vrednost) ? vrednost : [vrednost];
558
+ const obstojeci = classes[kljuc] ?? [];
559
+ for (const v of seznam) {
560
+ if (v != null && v !== "" && !obstojeci.includes(String(v)))
561
+ obstojeci.push(String(v));
562
+ }
563
+ classes[kljuc] = obstojeci;
564
+ }
565
+ }
566
+ return { text, classes };
567
+ }
568
+ function itemClasses(metadata, id) {
569
+ const zapis = metadata.classes?.get(id);
570
+ return zapis && Object.keys(zapis).length ? zapis : undefined;
571
+ }
537
572
  function prepareObjectForSearchNumeric(obj, spec, tokensMap) {
538
573
  if (isDeletedOrBlocked(obj)) {
539
574
  return;
@@ -541,11 +576,12 @@ function prepareObjectForSearchNumeric(obj, spec, tokensMap) {
541
576
  if (spec?.enrichSearchObjectFn) {
542
577
  spec.enrichSearchObjectFn(obj, spec.searchContext);
543
578
  }
544
- const sorted = spec?.extractSearchableStringFn ? buildSortedFromExtractFn(obj, spec.extractSearchableStringFn, tokensMap) : buildSortedFromFields(obj, spec, tokensMap);
579
+ const classes = {};
580
+ const sorted = spec?.extractSearchableStringFn ? buildSortedFromExtractFn(obj, spec.extractSearchableStringFn, tokensMap) : buildSortedFromFields(obj, spec, tokensMap, classes);
545
581
  if (sorted === undefined)
546
582
  return;
547
- 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;
548
- return { sorted, firstN };
583
+ 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;
584
+ return Object.keys(classes).length ? { sorted, firstN, classes } : { sorted, firstN };
549
585
  }
550
586
  function buildSortedFromExtractFn(obj, extractFn, tokensMap) {
551
587
  const str = extractFn(obj);
@@ -553,7 +589,7 @@ function buildSortedFromExtractFn(obj, extractFn, tokensMap) {
553
589
  return;
554
590
  return prepareStringForSearchNumeric(str, tokensMap).sorted;
555
591
  }
556
- function buildSortedFromFields(obj, spec, tokensMap) {
592
+ function buildSortedFromFields(obj, spec, tokensMap, classesOut = {}) {
557
593
  const allTokens = [];
558
594
  const fieldMatchModes = spec?.fieldMatchModes;
559
595
  const fieldsToSearch = spec?.searchInFields ?? Object.keys(obj);
@@ -586,7 +622,19 @@ function buildSortedFromFields(obj, spec, tokensMap) {
586
622
  }
587
623
  if (fieldStrings.length === 0)
588
624
  continue;
589
- const fieldText = fieldStrings.join(" ");
625
+ const normalizirane = spec?.valueNormalizers?.length ? fieldStrings.map((s) => applyValueNormalizers(s, keyStr, spec.valueNormalizers)) : undefined;
626
+ const fieldText = normalizirane ? normalizirane.map((n) => n.text).join(" ") : fieldStrings.join(" ");
627
+ if (normalizirane) {
628
+ for (const n of normalizirane) {
629
+ for (const [kljuc, vrednosti] of Object.entries(n.classes)) {
630
+ const obstojeci = classesOut[kljuc] ?? [];
631
+ for (const v of vrednosti)
632
+ if (!obstojeci.includes(v))
633
+ obstojeci.push(v);
634
+ classesOut[kljuc] = obstojeci;
635
+ }
636
+ }
637
+ }
590
638
  const datesNormalized = normalizeDates(fieldText);
591
639
  const preprocessed = preprocessString(datesNormalized);
592
640
  const sanitised = sanitiseString(preprocessed);
@@ -604,7 +652,7 @@ function buildSortedFromFields(obj, spec, tokensMap) {
604
652
  const uniqueTokens = [...new Set(allTokens)].sort((a, b) => a - b);
605
653
  return new Uint32Array(uniqueTokens);
606
654
  }
607
- function buildFirstNFromKeyFields(obj, keyFields, n, phoneFields, tokensMap) {
655
+ function buildFirstNFromKeyFields(obj, keyFields, n, phoneFields, tokensMap, normalizers) {
608
656
  const strings = [];
609
657
  const phoneFieldPaths = new Set(phoneFields);
610
658
  for (const field of keyFields) {
@@ -614,7 +662,9 @@ function buildFirstNFromKeyFields(obj, keyFields, n, phoneFields, tokensMap) {
614
662
  const value = isDotNotation(keyStr) ? getValueByPath(obj, keyStr) : obj[field];
615
663
  if (value == null)
616
664
  continue;
617
- extractStringsFromValue(value, strings);
665
+ const zacasno = [];
666
+ extractStringsFromValue(value, zacasno);
667
+ strings.push(...normalizers?.length ? zacasno.map((s) => applyValueNormalizers(s, keyStr, normalizers).text) : zacasno);
618
668
  }
619
669
  if (strings.length === 0)
620
670
  return;
@@ -643,6 +693,9 @@ function createSearchArrayMetadataNumeric(data, spec) {
643
693
  if (result.firstN !== undefined) {
644
694
  metadata.unsorted.set(id, result.firstN);
645
695
  }
696
+ if (result.classes !== undefined) {
697
+ (metadata.classes ??= new Map).set(id, result.classes);
698
+ }
646
699
  }
647
700
  }
648
701
  return metadata;
@@ -678,6 +731,7 @@ function updateSearchMetadataNumeric(metadata, objectId, obj, spec, tokensMap) {
678
731
  if (result === undefined) {
679
732
  metadata.sorted.delete(objectId);
680
733
  metadata.unsorted.delete(objectId);
734
+ metadata.classes?.delete(objectId);
681
735
  return false;
682
736
  }
683
737
  metadata.sorted.set(objectId, result.sorted);
@@ -686,6 +740,11 @@ function updateSearchMetadataNumeric(metadata, objectId, obj, spec, tokensMap) {
686
740
  } else {
687
741
  metadata.unsorted.delete(objectId);
688
742
  }
743
+ if (result.classes !== undefined) {
744
+ (metadata.classes ??= new Map).set(objectId, result.classes);
745
+ } else {
746
+ metadata.classes?.delete(objectId);
747
+ }
689
748
  return true;
690
749
  }
691
750
  function updateSearchMetadataBatchNumeric(metadata, batch, spec) {
@@ -914,20 +973,49 @@ function allTokensMatchNumeric(searchTokenStrs, targetTokens, opts) {
914
973
  }
915
974
 
916
975
  // src/common/numeric/prepareQueryVariants.ts
976
+ function normalizeQueryWithOpts(query, opts) {
977
+ const normalizers = opts?.queryNormalizers;
978
+ if (!normalizers?.length)
979
+ return { text: query, classes: {} };
980
+ let text = query;
981
+ const classes = {};
982
+ for (const normalizer of normalizers) {
983
+ const fn = typeof normalizer === "function" ? normalizer : normalizer.fn;
984
+ const izhod = fn(text, "");
985
+ if (izhod === undefined)
986
+ continue;
987
+ if (typeof izhod === "string") {
988
+ text = izhod;
989
+ continue;
990
+ }
991
+ text = izhod.text;
992
+ for (const [kljuc, vrednost] of Object.entries(izhod.classes ?? {})) {
993
+ const seznam = Array.isArray(vrednost) ? vrednost : [vrednost];
994
+ const obstojeci = classes[kljuc] ?? [];
995
+ for (const v of seznam) {
996
+ if (v != null && v !== "" && !obstojeci.includes(String(v)))
997
+ obstojeci.push(String(v));
998
+ }
999
+ classes[kljuc] = obstojeci;
1000
+ }
1001
+ }
1002
+ return { text, classes };
1003
+ }
917
1004
  function prepareQueryVariants(query, opts) {
918
- const rawTokenStrs = prepareStringForSearch(query);
1005
+ const { text: normalizirano, classes } = normalizeQueryWithOpts(query, opts);
1006
+ const rawTokenStrs = prepareStringForSearch(normalizirano);
919
1007
  const rawTokens = prepareQueryTokens(rawTokenStrs);
920
1008
  const normalizers = opts?.phoneQueryNormalizers ?? [defaultQueryPhoneNormalizer];
921
1009
  const seenPhones = new Set;
922
1010
  const phoneTokens = [];
923
1011
  for (const normalizer of normalizers) {
924
- const normalized = validateNormalizedPhone(normalizer(query), "Phone query normalizer");
1012
+ const normalized = validateNormalizedPhone(normalizer(normalizirano), "Phone query normalizer");
925
1013
  if (normalized === undefined || seenPhones.has(normalized))
926
1014
  continue;
927
1015
  seenPhones.add(normalized);
928
1016
  phoneTokens.push(prepareQueryTokens([normalized]));
929
1017
  }
930
- return { rawTokenStrs, rawTokens, phoneTokens };
1018
+ return { rawTokenStrs, rawTokens, phoneTokens, classes };
931
1019
  }
932
1020
 
933
1021
  // src/common/numeric/scoring.ts
@@ -1046,12 +1134,13 @@ function searchInDataReturnObjectsNumeric(query, metadata, data, opts) {
1046
1134
  return results;
1047
1135
  }
1048
1136
  function searchInDataReturnIdsWithLimitNumeric(query, metadata, limit, opts) {
1049
- const { rawTokenStrs, rawTokens, phoneTokens } = prepareQueryVariants(query, opts);
1137
+ const { rawTokens, phoneTokens } = prepareQueryVariants(query, opts);
1050
1138
  const phoneCandidates = findMatchingCandidates(metadata, phoneTokens, opts);
1051
1139
  const candidates = phoneCandidates.length > 0 ? phoneCandidates : findMatchingCandidates(metadata, rawTokens.length > 0 ? [rawTokens] : [], opts);
1052
1140
  if (candidates.length === 0)
1053
1141
  return [];
1054
- const qTokens = orderedTokenize(query);
1142
+ const qText = normalizeQueryWithOpts(query, opts).text;
1143
+ const qTokens = orderedTokenize(qText);
1055
1144
  const hasUnsorted = metadata.unsorted.size > 0;
1056
1145
  if (!hasUnsorted) {
1057
1146
  if (limit === Infinity || limit >= candidates.length)
@@ -1070,7 +1159,7 @@ function searchInDataReturnIdsWithLimitNumeric(query, metadata, limit, opts) {
1070
1159
  for (let j = 0;j < unsortedIds.length; j++) {
1071
1160
  itemTokens[j] = tokens[unsortedIds[j]] ?? "";
1072
1161
  }
1073
- scored[i] = { id, score: scoreOne(query, qTokens, itemTokens), order: i };
1162
+ scored[i] = { id, score: scoreOne(qText, qTokens, itemTokens), order: i };
1074
1163
  }
1075
1164
  scored.sort((a, b) => {
1076
1165
  if (a.score !== b.score)
@@ -1522,10 +1611,16 @@ function applyPreparedTokens(metadata, id, result) {
1522
1611
  } else {
1523
1612
  metadata.unsorted.delete(id);
1524
1613
  }
1614
+ if (result.classes !== undefined) {
1615
+ (metadata.classes ??= new Map).set(id, result.classes);
1616
+ } else {
1617
+ metadata.classes?.delete(id);
1618
+ }
1525
1619
  }
1526
1620
  function deletePreparedTokens(metadata, id) {
1527
1621
  metadata.sorted.delete(id);
1528
1622
  metadata.unsorted.delete(id);
1623
+ metadata.classes?.delete(id);
1529
1624
  }
1530
1625
  function syncSearchArrayMetadataNumeric(metadata, newData, spec) {
1531
1626
  const result = {
@@ -1615,6 +1710,135 @@ function syncSearchArrayMetadataNumericWithPrevious(metadata, previousData, newD
1615
1710
  clearTokensMap(tokensMap);
1616
1711
  return result;
1617
1712
  }
1713
+ // src/common/numeric/searchAndRank.ts
1714
+ function tokenIdsToStrings(tokenIds) {
1715
+ if (tokenIds === undefined)
1716
+ return;
1717
+ const out = new Array(tokenIds.length);
1718
+ for (let i = 0;i < tokenIds.length; i++) {
1719
+ out[i] = tokens[tokenIds[i]] ?? "";
1720
+ }
1721
+ return out;
1722
+ }
1723
+ function searchAndRankNumeric(query, data, metadata, options) {
1724
+ const { primaryTextFn, exactKeysFn, limit, opts } = options;
1725
+ const ids = searchInDataReturnIdsNumeric(query, metadata, opts);
1726
+ if (ids.length === 0)
1727
+ return [];
1728
+ const qText = normalizeQueryWithOpts(query, opts).text;
1729
+ const qTokens = orderedTokenize(qText);
1730
+ const scored = [];
1731
+ for (const id of ids) {
1732
+ const item = data.get(id);
1733
+ if (!item)
1734
+ continue;
1735
+ const itemTokens = tokenIdsToStrings(metadata.unsorted.get(id)) ?? orderedTokenize(primaryTextFn(item) || "");
1736
+ const exactKeys = exactKeysFn?.(item);
1737
+ const score = scoreOne(qText, qTokens, itemTokens, exactKeys);
1738
+ scored.push({ id, item, score });
1739
+ }
1740
+ scored.sort((x, y) => {
1741
+ if (y.score !== x.score)
1742
+ return y.score - x.score;
1743
+ const xText = primaryTextFn(x.item) || "";
1744
+ const yText = primaryTextFn(y.item) || "";
1745
+ return xText.localeCompare(yText);
1746
+ });
1747
+ if (limit === undefined || limit === Infinity || limit >= scored.length)
1748
+ return scored;
1749
+ return scored.slice(0, limit);
1750
+ }
1751
+
1752
+ // src/common/numeric/matchMany.ts
1753
+ function naSezname(classes) {
1754
+ if (!classes)
1755
+ return;
1756
+ const out = {};
1757
+ for (const [kljuc, vrednost] of Object.entries(classes)) {
1758
+ const seznam = Array.isArray(vrednost) ? vrednost.map(String) : [String(vrednost)];
1759
+ if (seznam.length)
1760
+ out[kljuc] = seznam;
1761
+ }
1762
+ return Object.keys(out).length ? out : undefined;
1763
+ }
1764
+ async function* matchMany(prepared, queries, options) {
1765
+ const { queryOf, idOf, limit = 3, minScore = 0, kos = 50, samoEnolicno, rank, accept, opts } = options;
1766
+ const retrievalLimit = options.retrievalLimit ?? Math.max(20, limit * 4);
1767
+ const primaryTextOf = options.primaryTextOf ?? ((item) => item["naziv"]);
1768
+ const porabljeni = samoEnolicno ? new Set : undefined;
1769
+ let kosZbirka = [];
1770
+ for (let indeks = 0;indeks < queries.length; indeks++) {
1771
+ const query = queries[indeks];
1772
+ const vhod = queryOf(query);
1773
+ const text = typeof vhod === "string" ? vhod : vhod.text;
1774
+ const queryClasses = typeof vhod === "string" ? undefined : naSezname(vhod.classes);
1775
+ const id = idOf ? idOf(query, indeks) : String(query["_id"] ?? query["id"] ?? indeks);
1776
+ const poisciKandidate = (besedilo, razredi) => {
1777
+ if (!besedilo.trim())
1778
+ return { kandidati: [], zadetkov: 0 };
1779
+ const zadetki = searchAndRankNumeric(besedilo, prepared.data, prepared.metadata, {
1780
+ primaryTextFn: primaryTextOf,
1781
+ ...options.exactKeysOf ? { exactKeysFn: options.exactKeysOf } : {},
1782
+ ...opts ? { opts } : {},
1783
+ limit: retrievalLimit
1784
+ });
1785
+ const poizvedbaZaDomeno = { text: besedilo, ...razredi ? { classes: razredi } : {} };
1786
+ const najdeni = [];
1787
+ for (const zadetek of zadetki) {
1788
+ const classes = itemClasses(prepared.metadata, zadetek.id);
1789
+ const kandidat = {
1790
+ id: zadetek.id,
1791
+ item: zadetek.item,
1792
+ ...classes ? { classes } : {}
1793
+ };
1794
+ if (accept && !accept(kandidat, poizvedbaZaDomeno))
1795
+ continue;
1796
+ const ocena = rank ? rank(kandidat, poizvedbaZaDomeno) : zadetek.score;
1797
+ if (ocena < minScore)
1798
+ continue;
1799
+ if (porabljeni?.has(zadetek.id))
1800
+ continue;
1801
+ najdeni.push({ id: zadetek.id, item: zadetek.item, score: ocena, ...classes ? { classes } : {} });
1802
+ }
1803
+ najdeni.sort((a, b) => {
1804
+ if (b.score !== a.score)
1805
+ return b.score - a.score;
1806
+ return (primaryTextOf(a.item) ?? "").localeCompare(primaryTextOf(b.item) ?? "");
1807
+ });
1808
+ if (najdeni.length > limit)
1809
+ najdeni.length = limit;
1810
+ return { kandidati: najdeni, zadetkov: zadetki.length };
1811
+ };
1812
+ let { kandidati, zadetkov } = poisciKandidate(text, queryClasses);
1813
+ const poskusiAlternative = kandidati.length === 0 && (options.alternativneLeCeNiZadetkov ? zadetkov === 0 : true);
1814
+ if (poskusiAlternative && options.alternativnePoizvedbe) {
1815
+ for (const alternativa of options.alternativnePoizvedbe(query)) {
1816
+ const altBesedilo = typeof alternativa === "string" ? alternativa : alternativa.text;
1817
+ if (!altBesedilo?.trim() || altBesedilo === text)
1818
+ continue;
1819
+ const altRazredi = typeof alternativa === "string" ? undefined : naSezname(alternativa.classes);
1820
+ ({ kandidati } = poisciKandidate(altBesedilo, altRazredi));
1821
+ if (kandidati.length)
1822
+ break;
1823
+ }
1824
+ }
1825
+ if (porabljeni) {
1826
+ for (const kandidat of kandidati)
1827
+ porabljeni.add(kandidat.id);
1828
+ }
1829
+ kosZbirka.push({
1830
+ id,
1831
+ ...queryClasses ? { queryClasses } : {},
1832
+ kandidati
1833
+ });
1834
+ if (kosZbirka.length >= kos) {
1835
+ yield kosZbirka;
1836
+ kosZbirka = [];
1837
+ }
1838
+ }
1839
+ if (kosZbirka.length)
1840
+ yield kosZbirka;
1841
+ }
1618
1842
  // src/common/numeric/updateSearchLinkedMetadata.ts
1619
1843
  function tokensEqual2(a, b) {
1620
1844
  if (a.length !== b.length)
@@ -1767,43 +1991,6 @@ function syncLinkedItemsForPrimaryNumeric(linked, primaryId, newLinkedItems, for
1767
1991
  clearTokensMap(tokensMap);
1768
1992
  return result;
1769
1993
  }
1770
- // src/common/numeric/searchAndRank.ts
1771
- function tokenIdsToStrings(tokenIds) {
1772
- if (tokenIds === undefined)
1773
- return;
1774
- const out = new Array(tokenIds.length);
1775
- for (let i = 0;i < tokenIds.length; i++) {
1776
- out[i] = tokens[tokenIds[i]] ?? "";
1777
- }
1778
- return out;
1779
- }
1780
- function searchAndRankNumeric(query, data, metadata, options) {
1781
- const { primaryTextFn, exactKeysFn, limit, opts } = options;
1782
- const ids = searchInDataReturnIdsNumeric(query, metadata, opts);
1783
- if (ids.length === 0)
1784
- return [];
1785
- const qTokens = orderedTokenize(query);
1786
- const scored = [];
1787
- for (const id of ids) {
1788
- const item = data.get(id);
1789
- if (!item)
1790
- continue;
1791
- const itemTokens = tokenIdsToStrings(metadata.unsorted.get(id)) ?? orderedTokenize(primaryTextFn(item) || "");
1792
- const exactKeys = exactKeysFn?.(item);
1793
- const score = scoreOne(query, qTokens, itemTokens, exactKeys);
1794
- scored.push({ id, item, score });
1795
- }
1796
- scored.sort((x, y) => {
1797
- if (y.score !== x.score)
1798
- return y.score - x.score;
1799
- const xText = primaryTextFn(x.item) || "";
1800
- const yText = primaryTextFn(y.item) || "";
1801
- return xText.localeCompare(yText);
1802
- });
1803
- if (limit === undefined || limit === Infinity || limit >= scored.length)
1804
- return scored;
1805
- return scored.slice(0, limit);
1806
- }
1807
1994
  // src/common/SearchUniverse.ts
1808
1995
  function tokensEqual3(a, b) {
1809
1996
  if (a.length !== b.length)
package/dist/index.d.cts CHANGED
@@ -14,13 +14,17 @@ export { normalizeDates } from './utils/normalizeDates';
14
14
  export { compareTokenized } from './utils/compareTokenized';
15
15
  export { defaultPhoneNormalizer, defaultQueryPhoneNormalizer, resolvePhoneQueryNormalizer, } from './utils/phoneNormalization';
16
16
  export { tokens, getTokenCount, getTokenById, findTokenId, registerToken, getOrCreateTokenId, createTokensMap, clearTokensMap, resetTokenRegistry, } from './utils/tokenRegistry';
17
- export { createSearchArrayMetadataNumeric as createSearchArrayMetadata, prepareObjectForSearchNumeric as prepareObjectForSearch, encodeTokenWithMode, decodeTokenId, decodeMatchMode, TOKEN_ID_MASK, MATCH_MODE_BITS, MATCH_MODE_PREFIXES, PREFIX_TO_MATCH_MODE, isDeletedOrBlocked, } from './common/numeric/createSearchArrayMetadata';
17
+ export { createSearchArrayMetadataNumeric as createSearchArrayMetadata, prepareObjectForSearchNumeric as prepareObjectForSearch, encodeTokenWithMode, decodeTokenId, decodeMatchMode, TOKEN_ID_MASK, MATCH_MODE_BITS, MATCH_MODE_PREFIXES, PREFIX_TO_MATCH_MODE, isDeletedOrBlocked,
18
+ /** Domenski razredi elementa (`spec.valueNormalizers`). */
19
+ itemClasses, } from './common/numeric/createSearchArrayMetadata';
18
20
  export { createSearchLinkedMetadataNumeric as createSearchLinkedMetadata, type NumericLinkedSearchMetadataWithData, } from './common/numeric/createSearchLinkedMetadata';
19
21
  export { updateSearchMetadataNumeric as updateSearchMetadata, updateSearchMetadataBatchNumeric as updateSearchMetadataBatch, removeFromSearchMetadataNumeric as removeFromSearchMetadata, removeFromSearchMetadataBatchNumeric as removeFromSearchMetadataBatch, } from './common/numeric/updateSearchMetadata';
20
22
  export { searchInDataReturnIdsNumeric as searchInData, searchInDataReturnIdsNumeric as searchInDataReturnIds, searchInDataReturnObjectsNumeric as searchInDataReturnObjects, searchInDataReturnIdsWithLimitNumeric as searchInDataWithLimit, } from './common/numeric/searchInData';
21
23
  export { findInLinkedArraysNumeric, findInLinkedArraysSimpleNumeric, } from './common/numeric/findInLinkedArrays';
22
24
  export { AugmentedMetadata } from './common/numeric/AugmentedMetadata';
23
25
  export { syncSearchArrayMetadataNumeric as syncSearchArrayMetadata, syncSearchArrayMetadataNumericWithPrevious as syncSearchArrayMetadataWithPrevious, } from './common/numeric/syncSearchArrayMetadata';
26
+ export { normalizeQueryWithOpts } from './common/numeric/prepareQueryVariants';
27
+ export { matchMany, type MatchManyKandidat, type MatchManyOptions, type MatchManyRezultat, type PreparedCollection, } from './common/numeric/matchMany';
24
28
  export { upsertPrimaryItemNumeric as upsertPrimaryItem, removePrimaryItemNumeric as removePrimaryItem, upsertLinkedItemNumeric as upsertLinkedItem, removeLinkedItemNumeric as removeLinkedItem, syncLinkedItemsForPrimaryNumeric as syncLinkedItemsForPrimary, } from './common/numeric/updateSearchLinkedMetadata';
25
29
  export { matchTokenInSortedListNumeric, allTokensMatchNumeric, binarySearchUint32, prepareQueryTokens, matchPreparedTokenInSortedList, allPreparedTokensMatch, type PreparedQueryToken, } from './utils/matchTokenNumeric';
26
30
  export { searchAndRankNumeric as searchAndRank, searchAndRankNumeric, scoreOne, scoreOrderAndPresence, scoreBag, orderedTokenize, type ScoredResult, type SearchAndRankOptions, type OrderAndPresenceWeights, } from './common/numeric/searchAndRank';
package/dist/index.d.ts CHANGED
@@ -14,13 +14,17 @@ export { normalizeDates } from './utils/normalizeDates';
14
14
  export { compareTokenized } from './utils/compareTokenized';
15
15
  export { defaultPhoneNormalizer, defaultQueryPhoneNormalizer, resolvePhoneQueryNormalizer, } from './utils/phoneNormalization';
16
16
  export { tokens, getTokenCount, getTokenById, findTokenId, registerToken, getOrCreateTokenId, createTokensMap, clearTokensMap, resetTokenRegistry, } from './utils/tokenRegistry';
17
- export { createSearchArrayMetadataNumeric as createSearchArrayMetadata, prepareObjectForSearchNumeric as prepareObjectForSearch, encodeTokenWithMode, decodeTokenId, decodeMatchMode, TOKEN_ID_MASK, MATCH_MODE_BITS, MATCH_MODE_PREFIXES, PREFIX_TO_MATCH_MODE, isDeletedOrBlocked, } from './common/numeric/createSearchArrayMetadata';
17
+ export { createSearchArrayMetadataNumeric as createSearchArrayMetadata, prepareObjectForSearchNumeric as prepareObjectForSearch, encodeTokenWithMode, decodeTokenId, decodeMatchMode, TOKEN_ID_MASK, MATCH_MODE_BITS, MATCH_MODE_PREFIXES, PREFIX_TO_MATCH_MODE, isDeletedOrBlocked,
18
+ /** Domenski razredi elementa (`spec.valueNormalizers`). */
19
+ itemClasses, } from './common/numeric/createSearchArrayMetadata';
18
20
  export { createSearchLinkedMetadataNumeric as createSearchLinkedMetadata, type NumericLinkedSearchMetadataWithData, } from './common/numeric/createSearchLinkedMetadata';
19
21
  export { updateSearchMetadataNumeric as updateSearchMetadata, updateSearchMetadataBatchNumeric as updateSearchMetadataBatch, removeFromSearchMetadataNumeric as removeFromSearchMetadata, removeFromSearchMetadataBatchNumeric as removeFromSearchMetadataBatch, } from './common/numeric/updateSearchMetadata';
20
22
  export { searchInDataReturnIdsNumeric as searchInData, searchInDataReturnIdsNumeric as searchInDataReturnIds, searchInDataReturnObjectsNumeric as searchInDataReturnObjects, searchInDataReturnIdsWithLimitNumeric as searchInDataWithLimit, } from './common/numeric/searchInData';
21
23
  export { findInLinkedArraysNumeric, findInLinkedArraysSimpleNumeric, } from './common/numeric/findInLinkedArrays';
22
24
  export { AugmentedMetadata } from './common/numeric/AugmentedMetadata';
23
25
  export { syncSearchArrayMetadataNumeric as syncSearchArrayMetadata, syncSearchArrayMetadataNumericWithPrevious as syncSearchArrayMetadataWithPrevious, } from './common/numeric/syncSearchArrayMetadata';
26
+ export { normalizeQueryWithOpts } from './common/numeric/prepareQueryVariants';
27
+ export { matchMany, type MatchManyKandidat, type MatchManyOptions, type MatchManyRezultat, type PreparedCollection, } from './common/numeric/matchMany';
24
28
  export { upsertPrimaryItemNumeric as upsertPrimaryItem, removePrimaryItemNumeric as removePrimaryItem, upsertLinkedItemNumeric as upsertLinkedItem, removeLinkedItemNumeric as removeLinkedItem, syncLinkedItemsForPrimaryNumeric as syncLinkedItemsForPrimary, } from './common/numeric/updateSearchLinkedMetadata';
25
29
  export { matchTokenInSortedListNumeric, allTokensMatchNumeric, binarySearchUint32, prepareQueryTokens, matchPreparedTokenInSortedList, allPreparedTokensMatch, type PreparedQueryToken, } from './utils/matchTokenNumeric';
26
30
  export { searchAndRankNumeric as searchAndRank, searchAndRankNumeric, scoreOne, scoreOrderAndPresence, scoreBag, orderedTokenize, type ScoredResult, type SearchAndRankOptions, type OrderAndPresenceWeights, } from './common/numeric/searchAndRank';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}