cry-search 2.0.2 → 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 (40) 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 +316 -112
  15. package/dist/index.d.cts +6 -1
  16. package/dist/index.d.ts +6 -1
  17. package/dist/index.d.ts.map +1 -1
  18. package/dist/index.js +316 -112
  19. package/dist/types/index.d.ts +65 -0
  20. package/dist/types/index.d.ts.map +1 -1
  21. package/dist/utils/compareTokenized.d.ts +24 -0
  22. package/dist/utils/compareTokenized.d.ts.map +1 -0
  23. package/dist/vet/data/enote.d.ts +40 -0
  24. package/dist/vet/data/enote.d.ts.map +1 -0
  25. package/dist/vet/data/znamke.gen.d.ts +41 -0
  26. package/dist/vet/data/znamke.gen.d.ts.map +1 -0
  27. package/dist/vet/index.cjs +2468 -0
  28. package/dist/vet/index.d.cts +24 -0
  29. package/dist/vet/index.d.ts +24 -0
  30. package/dist/vet/index.d.ts.map +1 -0
  31. package/dist/vet/index.js +2426 -0
  32. package/dist/vet/normalizatorji.d.ts +104 -0
  33. package/dist/vet/normalizatorji.d.ts.map +1 -0
  34. package/dist/vet/ocena.d.ts +46 -0
  35. package/dist/vet/ocena.d.ts.map +1 -0
  36. package/dist/vet/spec.d.ts +35 -0
  37. package/dist/vet/spec.d.ts.map +1 -0
  38. package/dist/vet/uparjanje.d.ts +72 -0
  39. package/dist/vet/uparjanje.d.ts.map +1 -0
  40. package/package.json +29 -11
package/dist/index.cjs CHANGED
@@ -39,69 +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
- clearTokensMap: () => clearTokensMap,
93
- binarySearchUint32: () => binarySearchUint32,
94
- arrayToSearchableData: () => arrayToSearchableData,
95
- allTokensMatchNumeric: () => allTokensMatchNumeric,
96
- allPreparedTokensMatch: () => allPreparedTokensMatch,
97
- TOKEN_ID_MASK: () => TOKEN_ID_MASK,
98
- SearchUniverse: () => SearchUniverse,
99
- PREFIX_TO_MATCH_MODE: () => PREFIX_TO_MATCH_MODE,
100
- MATCH_MODE_PREFIXES: () => MATCH_MODE_PREFIXES,
101
- MATCH_MODE_BITS: () => MATCH_MODE_BITS,
102
- DEFAULT_SEARCH_OPTS: () => DEFAULT_SEARCH_OPTS,
42
+ AugmentedMetadata: () => AugmentedMetadata,
103
43
  DEFAULT_PHONE_FIELDS: () => DEFAULT_PHONE_FIELDS,
104
- 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
105
109
  });
106
110
  module.exports = __toCommonJS(exports_src);
107
111
 
@@ -319,6 +323,22 @@ function prepareStringForSearch(input) {
319
323
  const tokens = tokenize(sanitised, DEFAULT_TOKENIZE_CONFIG);
320
324
  return tokens.sort();
321
325
  }
326
+ // src/utils/compareTokenized.ts
327
+ function compareTokenized(a, b) {
328
+ const aTokens = new Set(prepareStringForSearch(a));
329
+ const bTokens = new Set(prepareStringForSearch(b));
330
+ if (aTokens.size === 0 && bTokens.size === 0)
331
+ return 1;
332
+ let intersection = 0;
333
+ for (const token of aTokens) {
334
+ if (bTokens.has(token))
335
+ intersection++;
336
+ }
337
+ const union = aTokens.size + bTokens.size - intersection;
338
+ if (union === 0)
339
+ return 0;
340
+ return intersection / union;
341
+ }
322
342
  // src/utils/phoneNormalization.ts
323
343
  var RE_ASCII_DIGITS = /^[0-9]+$/;
324
344
  var RE_PHONE_LIKE_QUERY = /^[\d+()/\-. ]+$/;
@@ -517,6 +537,38 @@ function extractStringsFromValue(value, results) {
517
537
  }
518
538
  }
519
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
+ }
520
572
  function prepareObjectForSearchNumeric(obj, spec, tokensMap) {
521
573
  if (isDeletedOrBlocked(obj)) {
522
574
  return;
@@ -524,11 +576,12 @@ function prepareObjectForSearchNumeric(obj, spec, tokensMap) {
524
576
  if (spec?.enrichSearchObjectFn) {
525
577
  spec.enrichSearchObjectFn(obj, spec.searchContext);
526
578
  }
527
- 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);
528
581
  if (sorted === undefined)
529
582
  return;
530
- 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;
531
- 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 };
532
585
  }
533
586
  function buildSortedFromExtractFn(obj, extractFn, tokensMap) {
534
587
  const str = extractFn(obj);
@@ -536,7 +589,7 @@ function buildSortedFromExtractFn(obj, extractFn, tokensMap) {
536
589
  return;
537
590
  return prepareStringForSearchNumeric(str, tokensMap).sorted;
538
591
  }
539
- function buildSortedFromFields(obj, spec, tokensMap) {
592
+ function buildSortedFromFields(obj, spec, tokensMap, classesOut = {}) {
540
593
  const allTokens = [];
541
594
  const fieldMatchModes = spec?.fieldMatchModes;
542
595
  const fieldsToSearch = spec?.searchInFields ?? Object.keys(obj);
@@ -569,7 +622,19 @@ function buildSortedFromFields(obj, spec, tokensMap) {
569
622
  }
570
623
  if (fieldStrings.length === 0)
571
624
  continue;
572
- 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
+ }
573
638
  const datesNormalized = normalizeDates(fieldText);
574
639
  const preprocessed = preprocessString(datesNormalized);
575
640
  const sanitised = sanitiseString(preprocessed);
@@ -587,7 +652,7 @@ function buildSortedFromFields(obj, spec, tokensMap) {
587
652
  const uniqueTokens = [...new Set(allTokens)].sort((a, b) => a - b);
588
653
  return new Uint32Array(uniqueTokens);
589
654
  }
590
- function buildFirstNFromKeyFields(obj, keyFields, n, phoneFields, tokensMap) {
655
+ function buildFirstNFromKeyFields(obj, keyFields, n, phoneFields, tokensMap, normalizers) {
591
656
  const strings = [];
592
657
  const phoneFieldPaths = new Set(phoneFields);
593
658
  for (const field of keyFields) {
@@ -597,7 +662,9 @@ function buildFirstNFromKeyFields(obj, keyFields, n, phoneFields, tokensMap) {
597
662
  const value = isDotNotation(keyStr) ? getValueByPath(obj, keyStr) : obj[field];
598
663
  if (value == null)
599
664
  continue;
600
- extractStringsFromValue(value, strings);
665
+ const zacasno = [];
666
+ extractStringsFromValue(value, zacasno);
667
+ strings.push(...normalizers?.length ? zacasno.map((s) => applyValueNormalizers(s, keyStr, normalizers).text) : zacasno);
601
668
  }
602
669
  if (strings.length === 0)
603
670
  return;
@@ -626,6 +693,9 @@ function createSearchArrayMetadataNumeric(data, spec) {
626
693
  if (result.firstN !== undefined) {
627
694
  metadata.unsorted.set(id, result.firstN);
628
695
  }
696
+ if (result.classes !== undefined) {
697
+ (metadata.classes ??= new Map).set(id, result.classes);
698
+ }
629
699
  }
630
700
  }
631
701
  return metadata;
@@ -661,6 +731,7 @@ function updateSearchMetadataNumeric(metadata, objectId, obj, spec, tokensMap) {
661
731
  if (result === undefined) {
662
732
  metadata.sorted.delete(objectId);
663
733
  metadata.unsorted.delete(objectId);
734
+ metadata.classes?.delete(objectId);
664
735
  return false;
665
736
  }
666
737
  metadata.sorted.set(objectId, result.sorted);
@@ -669,6 +740,11 @@ function updateSearchMetadataNumeric(metadata, objectId, obj, spec, tokensMap) {
669
740
  } else {
670
741
  metadata.unsorted.delete(objectId);
671
742
  }
743
+ if (result.classes !== undefined) {
744
+ (metadata.classes ??= new Map).set(objectId, result.classes);
745
+ } else {
746
+ metadata.classes?.delete(objectId);
747
+ }
672
748
  return true;
673
749
  }
674
750
  function updateSearchMetadataBatchNumeric(metadata, batch, spec) {
@@ -897,20 +973,49 @@ function allTokensMatchNumeric(searchTokenStrs, targetTokens, opts) {
897
973
  }
898
974
 
899
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
+ }
900
1004
  function prepareQueryVariants(query, opts) {
901
- const rawTokenStrs = prepareStringForSearch(query);
1005
+ const { text: normalizirano, classes } = normalizeQueryWithOpts(query, opts);
1006
+ const rawTokenStrs = prepareStringForSearch(normalizirano);
902
1007
  const rawTokens = prepareQueryTokens(rawTokenStrs);
903
1008
  const normalizers = opts?.phoneQueryNormalizers ?? [defaultQueryPhoneNormalizer];
904
1009
  const seenPhones = new Set;
905
1010
  const phoneTokens = [];
906
1011
  for (const normalizer of normalizers) {
907
- const normalized = validateNormalizedPhone(normalizer(query), "Phone query normalizer");
1012
+ const normalized = validateNormalizedPhone(normalizer(normalizirano), "Phone query normalizer");
908
1013
  if (normalized === undefined || seenPhones.has(normalized))
909
1014
  continue;
910
1015
  seenPhones.add(normalized);
911
1016
  phoneTokens.push(prepareQueryTokens([normalized]));
912
1017
  }
913
- return { rawTokenStrs, rawTokens, phoneTokens };
1018
+ return { rawTokenStrs, rawTokens, phoneTokens, classes };
914
1019
  }
915
1020
 
916
1021
  // src/common/numeric/scoring.ts
@@ -1029,12 +1134,13 @@ function searchInDataReturnObjectsNumeric(query, metadata, data, opts) {
1029
1134
  return results;
1030
1135
  }
1031
1136
  function searchInDataReturnIdsWithLimitNumeric(query, metadata, limit, opts) {
1032
- const { rawTokenStrs, rawTokens, phoneTokens } = prepareQueryVariants(query, opts);
1137
+ const { rawTokens, phoneTokens } = prepareQueryVariants(query, opts);
1033
1138
  const phoneCandidates = findMatchingCandidates(metadata, phoneTokens, opts);
1034
1139
  const candidates = phoneCandidates.length > 0 ? phoneCandidates : findMatchingCandidates(metadata, rawTokens.length > 0 ? [rawTokens] : [], opts);
1035
1140
  if (candidates.length === 0)
1036
1141
  return [];
1037
- const qTokens = orderedTokenize(query);
1142
+ const qText = normalizeQueryWithOpts(query, opts).text;
1143
+ const qTokens = orderedTokenize(qText);
1038
1144
  const hasUnsorted = metadata.unsorted.size > 0;
1039
1145
  if (!hasUnsorted) {
1040
1146
  if (limit === Infinity || limit >= candidates.length)
@@ -1053,7 +1159,7 @@ function searchInDataReturnIdsWithLimitNumeric(query, metadata, limit, opts) {
1053
1159
  for (let j = 0;j < unsortedIds.length; j++) {
1054
1160
  itemTokens[j] = tokens[unsortedIds[j]] ?? "";
1055
1161
  }
1056
- scored[i] = { id, score: scoreOne(query, qTokens, itemTokens), order: i };
1162
+ scored[i] = { id, score: scoreOne(qText, qTokens, itemTokens), order: i };
1057
1163
  }
1058
1164
  scored.sort((a, b) => {
1059
1165
  if (a.score !== b.score)
@@ -1505,10 +1611,16 @@ function applyPreparedTokens(metadata, id, result) {
1505
1611
  } else {
1506
1612
  metadata.unsorted.delete(id);
1507
1613
  }
1614
+ if (result.classes !== undefined) {
1615
+ (metadata.classes ??= new Map).set(id, result.classes);
1616
+ } else {
1617
+ metadata.classes?.delete(id);
1618
+ }
1508
1619
  }
1509
1620
  function deletePreparedTokens(metadata, id) {
1510
1621
  metadata.sorted.delete(id);
1511
1622
  metadata.unsorted.delete(id);
1623
+ metadata.classes?.delete(id);
1512
1624
  }
1513
1625
  function syncSearchArrayMetadataNumeric(metadata, newData, spec) {
1514
1626
  const result = {
@@ -1598,6 +1710,135 @@ function syncSearchArrayMetadataNumericWithPrevious(metadata, previousData, newD
1598
1710
  clearTokensMap(tokensMap);
1599
1711
  return result;
1600
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
+ }
1601
1842
  // src/common/numeric/updateSearchLinkedMetadata.ts
1602
1843
  function tokensEqual2(a, b) {
1603
1844
  if (a.length !== b.length)
@@ -1750,43 +1991,6 @@ function syncLinkedItemsForPrimaryNumeric(linked, primaryId, newLinkedItems, for
1750
1991
  clearTokensMap(tokensMap);
1751
1992
  return result;
1752
1993
  }
1753
- // src/common/numeric/searchAndRank.ts
1754
- function tokenIdsToStrings(tokenIds) {
1755
- if (tokenIds === undefined)
1756
- return;
1757
- const out = new Array(tokenIds.length);
1758
- for (let i = 0;i < tokenIds.length; i++) {
1759
- out[i] = tokens[tokenIds[i]] ?? "";
1760
- }
1761
- return out;
1762
- }
1763
- function searchAndRankNumeric(query, data, metadata, options) {
1764
- const { primaryTextFn, exactKeysFn, limit, opts } = options;
1765
- const ids = searchInDataReturnIdsNumeric(query, metadata, opts);
1766
- if (ids.length === 0)
1767
- return [];
1768
- const qTokens = orderedTokenize(query);
1769
- const scored = [];
1770
- for (const id of ids) {
1771
- const item = data.get(id);
1772
- if (!item)
1773
- continue;
1774
- const itemTokens = tokenIdsToStrings(metadata.unsorted.get(id)) ?? orderedTokenize(primaryTextFn(item) || "");
1775
- const exactKeys = exactKeysFn?.(item);
1776
- const score = scoreOne(query, qTokens, itemTokens, exactKeys);
1777
- scored.push({ id, item, score });
1778
- }
1779
- scored.sort((x, y) => {
1780
- if (y.score !== x.score)
1781
- return y.score - x.score;
1782
- const xText = primaryTextFn(x.item) || "";
1783
- const yText = primaryTextFn(y.item) || "";
1784
- return xText.localeCompare(yText);
1785
- });
1786
- if (limit === undefined || limit === Infinity || limit >= scored.length)
1787
- return scored;
1788
- return scored.slice(0, limit);
1789
- }
1790
1994
  // src/common/SearchUniverse.ts
1791
1995
  function tokensEqual3(a, b) {
1792
1996
  if (a.length !== b.length)
package/dist/index.d.cts CHANGED
@@ -11,15 +11,20 @@ export { preprocessString } from './utils/preprocessString';
11
11
  export { sanitiseString } from './utils/sanitiseString';
12
12
  export { tokenize } from './utils/tokenize';
13
13
  export { normalizeDates } from './utils/normalizeDates';
14
+ export { compareTokenized } from './utils/compareTokenized';
14
15
  export { defaultPhoneNormalizer, defaultQueryPhoneNormalizer, resolvePhoneQueryNormalizer, } from './utils/phoneNormalization';
15
16
  export { tokens, getTokenCount, getTokenById, findTokenId, registerToken, getOrCreateTokenId, createTokensMap, clearTokensMap, resetTokenRegistry, } from './utils/tokenRegistry';
16
- 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';
17
20
  export { createSearchLinkedMetadataNumeric as createSearchLinkedMetadata, type NumericLinkedSearchMetadataWithData, } from './common/numeric/createSearchLinkedMetadata';
18
21
  export { updateSearchMetadataNumeric as updateSearchMetadata, updateSearchMetadataBatchNumeric as updateSearchMetadataBatch, removeFromSearchMetadataNumeric as removeFromSearchMetadata, removeFromSearchMetadataBatchNumeric as removeFromSearchMetadataBatch, } from './common/numeric/updateSearchMetadata';
19
22
  export { searchInDataReturnIdsNumeric as searchInData, searchInDataReturnIdsNumeric as searchInDataReturnIds, searchInDataReturnObjectsNumeric as searchInDataReturnObjects, searchInDataReturnIdsWithLimitNumeric as searchInDataWithLimit, } from './common/numeric/searchInData';
20
23
  export { findInLinkedArraysNumeric, findInLinkedArraysSimpleNumeric, } from './common/numeric/findInLinkedArrays';
21
24
  export { AugmentedMetadata } from './common/numeric/AugmentedMetadata';
22
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';
23
28
  export { upsertPrimaryItemNumeric as upsertPrimaryItem, removePrimaryItemNumeric as removePrimaryItem, upsertLinkedItemNumeric as upsertLinkedItem, removeLinkedItemNumeric as removeLinkedItem, syncLinkedItemsForPrimaryNumeric as syncLinkedItemsForPrimary, } from './common/numeric/updateSearchLinkedMetadata';
24
29
  export { matchTokenInSortedListNumeric, allTokensMatchNumeric, binarySearchUint32, prepareQueryTokens, matchPreparedTokenInSortedList, allPreparedTokensMatch, type PreparedQueryToken, } from './utils/matchTokenNumeric';
25
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
@@ -11,15 +11,20 @@ export { preprocessString } from './utils/preprocessString';
11
11
  export { sanitiseString } from './utils/sanitiseString';
12
12
  export { tokenize } from './utils/tokenize';
13
13
  export { normalizeDates } from './utils/normalizeDates';
14
+ export { compareTokenized } from './utils/compareTokenized';
14
15
  export { defaultPhoneNormalizer, defaultQueryPhoneNormalizer, resolvePhoneQueryNormalizer, } from './utils/phoneNormalization';
15
16
  export { tokens, getTokenCount, getTokenById, findTokenId, registerToken, getOrCreateTokenId, createTokensMap, clearTokensMap, resetTokenRegistry, } from './utils/tokenRegistry';
16
- 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';
17
20
  export { createSearchLinkedMetadataNumeric as createSearchLinkedMetadata, type NumericLinkedSearchMetadataWithData, } from './common/numeric/createSearchLinkedMetadata';
18
21
  export { updateSearchMetadataNumeric as updateSearchMetadata, updateSearchMetadataBatchNumeric as updateSearchMetadataBatch, removeFromSearchMetadataNumeric as removeFromSearchMetadata, removeFromSearchMetadataBatchNumeric as removeFromSearchMetadataBatch, } from './common/numeric/updateSearchMetadata';
19
22
  export { searchInDataReturnIdsNumeric as searchInData, searchInDataReturnIdsNumeric as searchInDataReturnIds, searchInDataReturnObjectsNumeric as searchInDataReturnObjects, searchInDataReturnIdsWithLimitNumeric as searchInDataWithLimit, } from './common/numeric/searchInData';
20
23
  export { findInLinkedArraysNumeric, findInLinkedArraysSimpleNumeric, } from './common/numeric/findInLinkedArrays';
21
24
  export { AugmentedMetadata } from './common/numeric/AugmentedMetadata';
22
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';
23
28
  export { upsertPrimaryItemNumeric as upsertPrimaryItem, removePrimaryItemNumeric as removePrimaryItem, upsertLinkedItemNumeric as upsertLinkedItem, removeLinkedItemNumeric as removeLinkedItem, syncLinkedItemsForPrimaryNumeric as syncLinkedItemsForPrimary, } from './common/numeric/updateSearchLinkedMetadata';
24
29
  export { matchTokenInSortedListNumeric, allTokensMatchNumeric, binarySearchUint32, prepareQueryTokens, matchPreparedTokenInSortedList, allPreparedTokensMatch, type PreparedQueryToken, } from './utils/matchTokenNumeric';
25
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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"}