cry-search 2.0.3 → 2.1.1

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