cry-search 2.1.0 → 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.
@@ -89,23 +89,21 @@ export interface PreparedCollection<T extends SearchableObject> {
89
89
  data: SearchableData<T>;
90
90
  metadata: NumericSearchMetadata;
91
91
  }
92
+ /**
93
+ * Masovno uparjanje v enem kosu (sinhrono, brez I/O). Enaki rezultati kot
94
+ * `matchMany`; uporabno tam, kjer klicoči API ni async (npr. predpomnilnik
95
+ * gatewaya) ali iteracija po kosih ni potrebna.
96
+ */
97
+ export declare function matchManySync<T extends SearchableObject, TQuery>(prepared: PreparedCollection<T>, queries: readonly TQuery[], options: MatchManyOptions<T, TQuery>): MatchManyRezultat<T>[];
92
98
  /**
93
99
  * Masovno uparjanje: indeks ene strani, elementi druge strani kot poizvedbe.
94
100
  *
95
101
  * Vrne async iterator, ki teče po kosih (`kos`, privzeto 50), tako da rezultat
96
- * velikega uparjanja (npr. 40k × 25k) ne gre v celoti v pomnilnik. Za vsak
97
- * element vrne največ `limit` kandidatov nad `minScore`, urejenih padajoče.
102
+ * velikega uparjanja (npr. 40k × 25k) ne gre v celoti v pomnilnik. Za vsak element
103
+ * vrne največ `limit` kandidatov, urejenih padajoče po oceni.
98
104
  *
99
- * Uporablja isto iskalno logiko kot `searchAndRank` (retrieval po `metadata.sorted`
100
- * z AND-ujemanjem + ocena po `metadata.unsorted`), zato so rezultati skladni z
105
+ * Uporablja isto iskalno logiko kot `searchAndRank`, zato so rezultati skladni z
101
106
  * navadnim iskanjem. Domenski modul lahko oceno in sprejem zamenja z `rank`/`accept`.
102
- *
103
- * @example
104
- * ```typescript
105
- * for await (const kos of matchMany(prepared, levi, { queryOf: (a) => a.naziv })) {
106
- * console.log(kos.id, kos.kandidati[0]?.item.naziv);
107
- * }
108
- * ```
109
107
  */
110
108
  export declare function matchMany<T extends SearchableObject, TQuery>(prepared: PreparedCollection<T>, queries: readonly TQuery[], options: MatchManyOptions<T, TQuery>): AsyncGenerator<MatchManyRezultat<T>[], void, void>;
111
109
  //# sourceMappingURL=matchMany.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"matchMany.d.ts","sourceRoot":"","sources":["../../../src/common/numeric/matchMany.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"matchMany.d.ts","sourceRoot":"","sources":["../../../src/common/numeric/matchMany.ts"],"names":[],"mappings":"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"}
package/dist/index.cjs CHANGED
@@ -70,6 +70,7 @@ __export(exports_src, {
70
70
  isDeletedOrBlocked: () => isDeletedOrBlocked,
71
71
  itemClasses: () => itemClasses,
72
72
  matchMany: () => matchMany,
73
+ matchManySync: () => matchManySync,
73
74
  matchPreparedTokenInSortedList: () => matchPreparedTokenInSortedList,
74
75
  matchTokenInSortedListNumeric: () => matchTokenInSortedListNumeric,
75
76
  normalizeDates: () => normalizeDates,
@@ -1761,76 +1762,87 @@ function naSezname(classes) {
1761
1762
  }
1762
1763
  return Object.keys(out).length ? out : undefined;
1763
1764
  }
1764
- async function* matchMany(prepared, queries, options) {
1765
- const { queryOf, idOf, limit = 3, minScore = 0, kos = 50, samoEnolicno, rank, accept, opts } = options;
1765
+ function matchOne(prepared, query, indeks, options, porabljeni) {
1766
+ const { queryOf, idOf, limit = 3, minScore = 0, rank, accept, opts } = options;
1766
1767
  const retrievalLimit = options.retrievalLimit ?? Math.max(20, limit * 4);
1767
1768
  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);
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 } : {} });
1828
1799
  }
1829
- kosZbirka.push({
1830
- id,
1831
- ...queryClasses ? { queryClasses } : {},
1832
- kandidati
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) ?? "");
1833
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));
1834
1846
  if (kosZbirka.length >= kos) {
1835
1847
  yield kosZbirka;
1836
1848
  kosZbirka = [];
package/dist/index.d.cts CHANGED
@@ -24,7 +24,7 @@ export { findInLinkedArraysNumeric, findInLinkedArraysSimpleNumeric, } from './c
24
24
  export { AugmentedMetadata } from './common/numeric/AugmentedMetadata';
25
25
  export { syncSearchArrayMetadataNumeric as syncSearchArrayMetadata, syncSearchArrayMetadataNumericWithPrevious as syncSearchArrayMetadataWithPrevious, } from './common/numeric/syncSearchArrayMetadata';
26
26
  export { normalizeQueryWithOpts } from './common/numeric/prepareQueryVariants';
27
- export { matchMany, type MatchManyKandidat, type MatchManyOptions, type MatchManyRezultat, type PreparedCollection, } from './common/numeric/matchMany';
27
+ export { matchMany, matchManySync, type MatchManyKandidat, type MatchManyOptions, type MatchManyRezultat, type PreparedCollection, } from './common/numeric/matchMany';
28
28
  export { upsertPrimaryItemNumeric as upsertPrimaryItem, removePrimaryItemNumeric as removePrimaryItem, upsertLinkedItemNumeric as upsertLinkedItem, removeLinkedItemNumeric as removeLinkedItem, syncLinkedItemsForPrimaryNumeric as syncLinkedItemsForPrimary, } from './common/numeric/updateSearchLinkedMetadata';
29
29
  export { matchTokenInSortedListNumeric, allTokensMatchNumeric, binarySearchUint32, prepareQueryTokens, matchPreparedTokenInSortedList, allPreparedTokensMatch, type PreparedQueryToken, } from './utils/matchTokenNumeric';
30
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
@@ -24,7 +24,7 @@ export { findInLinkedArraysNumeric, findInLinkedArraysSimpleNumeric, } from './c
24
24
  export { AugmentedMetadata } from './common/numeric/AugmentedMetadata';
25
25
  export { syncSearchArrayMetadataNumeric as syncSearchArrayMetadata, syncSearchArrayMetadataNumericWithPrevious as syncSearchArrayMetadataWithPrevious, } from './common/numeric/syncSearchArrayMetadata';
26
26
  export { normalizeQueryWithOpts } from './common/numeric/prepareQueryVariants';
27
- export { matchMany, type MatchManyKandidat, type MatchManyOptions, type MatchManyRezultat, type PreparedCollection, } from './common/numeric/matchMany';
27
+ export { matchMany, matchManySync, type MatchManyKandidat, type MatchManyOptions, type MatchManyRezultat, type PreparedCollection, } from './common/numeric/matchMany';
28
28
  export { upsertPrimaryItemNumeric as upsertPrimaryItem, removePrimaryItemNumeric as removePrimaryItem, upsertLinkedItemNumeric as upsertLinkedItem, removeLinkedItemNumeric as removeLinkedItem, syncLinkedItemsForPrimaryNumeric as syncLinkedItemsForPrimary, } from './common/numeric/updateSearchLinkedMetadata';
29
29
  export { matchTokenInSortedListNumeric, allTokensMatchNumeric, binarySearchUint32, prepareQueryTokens, matchPreparedTokenInSortedList, allPreparedTokensMatch, type PreparedQueryToken, } from './utils/matchTokenNumeric';
30
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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"}
package/dist/index.js CHANGED
@@ -1650,76 +1650,87 @@ function naSezname(classes) {
1650
1650
  }
1651
1651
  return Object.keys(out).length ? out : undefined;
1652
1652
  }
1653
- async function* matchMany(prepared, queries, options) {
1654
- const { queryOf, idOf, limit = 3, minScore = 0, kos = 50, samoEnolicno, rank, accept, opts } = options;
1653
+ function matchOne(prepared, query, indeks, options, porabljeni) {
1654
+ const { queryOf, idOf, limit = 3, minScore = 0, rank, accept, opts } = options;
1655
1655
  const retrievalLimit = options.retrievalLimit ?? Math.max(20, limit * 4);
1656
1656
  const primaryTextOf = options.primaryTextOf ?? ((item) => item["naziv"]);
1657
- const porabljeni = samoEnolicno ? new Set : undefined;
1658
- let kosZbirka = [];
1659
- for (let indeks = 0;indeks < queries.length; indeks++) {
1660
- const query = queries[indeks];
1661
- const vhod = queryOf(query);
1662
- const text = typeof vhod === "string" ? vhod : vhod.text;
1663
- const queryClasses = typeof vhod === "string" ? undefined : naSezname(vhod.classes);
1664
- const id = idOf ? idOf(query, indeks) : String(query["_id"] ?? query["id"] ?? indeks);
1665
- const poisciKandidate = (besedilo, razredi) => {
1666
- if (!besedilo.trim())
1667
- return { kandidati: [], zadetkov: 0 };
1668
- const zadetki = searchAndRankNumeric(besedilo, prepared.data, prepared.metadata, {
1669
- primaryTextFn: primaryTextOf,
1670
- ...options.exactKeysOf ? { exactKeysFn: options.exactKeysOf } : {},
1671
- ...opts ? { opts } : {},
1672
- limit: retrievalLimit
1673
- });
1674
- const poizvedbaZaDomeno = { text: besedilo, ...razredi ? { classes: razredi } : {} };
1675
- const najdeni = [];
1676
- for (const zadetek of zadetki) {
1677
- const classes = itemClasses(prepared.metadata, zadetek.id);
1678
- const kandidat = {
1679
- id: zadetek.id,
1680
- item: zadetek.item,
1681
- ...classes ? { classes } : {}
1682
- };
1683
- if (accept && !accept(kandidat, poizvedbaZaDomeno))
1684
- continue;
1685
- const ocena = rank ? rank(kandidat, poizvedbaZaDomeno) : zadetek.score;
1686
- if (ocena < minScore)
1687
- continue;
1688
- if (porabljeni?.has(zadetek.id))
1689
- continue;
1690
- najdeni.push({ id: zadetek.id, item: zadetek.item, score: ocena, ...classes ? { classes } : {} });
1691
- }
1692
- najdeni.sort((a, b) => {
1693
- if (b.score !== a.score)
1694
- return b.score - a.score;
1695
- return (primaryTextOf(a.item) ?? "").localeCompare(primaryTextOf(b.item) ?? "");
1696
- });
1697
- if (najdeni.length > limit)
1698
- najdeni.length = limit;
1699
- return { kandidati: najdeni, zadetkov: zadetki.length };
1700
- };
1701
- let { kandidati, zadetkov } = poisciKandidate(text, queryClasses);
1702
- const poskusiAlternative = kandidati.length === 0 && (options.alternativneLeCeNiZadetkov ? zadetkov === 0 : true);
1703
- if (poskusiAlternative && options.alternativnePoizvedbe) {
1704
- for (const alternativa of options.alternativnePoizvedbe(query)) {
1705
- const altBesedilo = typeof alternativa === "string" ? alternativa : alternativa.text;
1706
- if (!altBesedilo?.trim() || altBesedilo === text)
1707
- continue;
1708
- const altRazredi = typeof alternativa === "string" ? undefined : naSezname(alternativa.classes);
1709
- ({ kandidati } = poisciKandidate(altBesedilo, altRazredi));
1710
- if (kandidati.length)
1711
- break;
1712
- }
1713
- }
1714
- if (porabljeni) {
1715
- for (const kandidat of kandidati)
1716
- porabljeni.add(kandidat.id);
1657
+ const vhod = queryOf(query);
1658
+ const text = typeof vhod === "string" ? vhod : vhod.text;
1659
+ const queryClasses = typeof vhod === "string" ? undefined : naSezname(vhod.classes);
1660
+ const id = idOf ? idOf(query, indeks) : String(query["_id"] ?? query["id"] ?? indeks);
1661
+ const poisciKandidate = (besedilo, razredi) => {
1662
+ if (!besedilo.trim())
1663
+ return { kandidati: [], zadetkov: 0 };
1664
+ const zadetki = searchAndRankNumeric(besedilo, prepared.data, prepared.metadata, {
1665
+ primaryTextFn: primaryTextOf,
1666
+ ...options.exactKeysOf ? { exactKeysFn: options.exactKeysOf } : {},
1667
+ ...opts ? { opts } : {},
1668
+ limit: retrievalLimit
1669
+ });
1670
+ const poizvedbaZaDomeno = { text: besedilo, ...razredi ? { classes: razredi } : {} };
1671
+ const najdeni = [];
1672
+ for (const zadetek of zadetki) {
1673
+ const classes = itemClasses(prepared.metadata, zadetek.id);
1674
+ const kandidat = {
1675
+ id: zadetek.id,
1676
+ item: zadetek.item,
1677
+ ...classes ? { classes } : {}
1678
+ };
1679
+ if (accept && !accept(kandidat, poizvedbaZaDomeno))
1680
+ continue;
1681
+ const ocena = rank ? rank(kandidat, poizvedbaZaDomeno) : zadetek.score;
1682
+ if (ocena < minScore)
1683
+ continue;
1684
+ if (porabljeni?.has(zadetek.id))
1685
+ continue;
1686
+ najdeni.push({ id: zadetek.id, item: zadetek.item, score: ocena, ...classes ? { classes } : {} });
1717
1687
  }
1718
- kosZbirka.push({
1719
- id,
1720
- ...queryClasses ? { queryClasses } : {},
1721
- kandidati
1688
+ najdeni.sort((a, b) => {
1689
+ if (b.score !== a.score)
1690
+ return b.score - a.score;
1691
+ return (primaryTextOf(a.item) ?? "").localeCompare(primaryTextOf(b.item) ?? "");
1722
1692
  });
1693
+ if (najdeni.length > limit)
1694
+ najdeni.length = limit;
1695
+ return { kandidati: najdeni, zadetkov: zadetki.length };
1696
+ };
1697
+ let { kandidati, zadetkov } = poisciKandidate(text, queryClasses);
1698
+ const poskusiAlternative = kandidati.length === 0 && (options.alternativneLeCeNiZadetkov ? zadetkov === 0 : true);
1699
+ if (poskusiAlternative && options.alternativnePoizvedbe) {
1700
+ for (const alternativa of options.alternativnePoizvedbe(query)) {
1701
+ const altBesedilo = typeof alternativa === "string" ? alternativa : alternativa.text;
1702
+ if (!altBesedilo?.trim() || altBesedilo === text)
1703
+ continue;
1704
+ const altRazredi = typeof alternativa === "string" ? undefined : naSezname(alternativa.classes);
1705
+ ({ kandidati } = poisciKandidate(altBesedilo, altRazredi));
1706
+ if (kandidati.length)
1707
+ break;
1708
+ }
1709
+ }
1710
+ if (porabljeni) {
1711
+ for (const kandidat of kandidati)
1712
+ porabljeni.add(kandidat.id);
1713
+ }
1714
+ return {
1715
+ id,
1716
+ ...queryClasses ? { queryClasses } : {},
1717
+ kandidati
1718
+ };
1719
+ }
1720
+ function matchManySync(prepared, queries, options) {
1721
+ const porabljeni = options.samoEnolicno ? new Set : undefined;
1722
+ const izhod = new Array(queries.length);
1723
+ for (let indeks = 0;indeks < queries.length; indeks++) {
1724
+ izhod[indeks] = matchOne(prepared, queries[indeks], indeks, options, porabljeni);
1725
+ }
1726
+ return izhod;
1727
+ }
1728
+ async function* matchMany(prepared, queries, options) {
1729
+ const kos = options.kos ?? 50;
1730
+ const porabljeni = options.samoEnolicno ? new Set : undefined;
1731
+ let kosZbirka = [];
1732
+ for (let indeks = 0;indeks < queries.length; indeks++) {
1733
+ kosZbirka.push(matchOne(prepared, queries[indeks], indeks, options, porabljeni));
1723
1734
  if (kosZbirka.length >= kos) {
1724
1735
  yield kosZbirka;
1725
1736
  kosZbirka = [];
@@ -2352,6 +2363,7 @@ export {
2352
2363
  isDeletedOrBlocked,
2353
2364
  itemClasses,
2354
2365
  matchMany,
2366
+ matchManySync,
2355
2367
  matchPreparedTokenInSortedList,
2356
2368
  matchTokenInSortedListNumeric,
2357
2369
  normalizeDates,
@@ -53,6 +53,7 @@ __export(exports_vet, {
53
53
  pripraviVetIndeks: () => pripraviVetIndeks,
54
54
  upariArtikle: () => upariArtikle,
55
55
  upariVse: () => upariVse,
56
+ upariVseSync: () => upariVseSync,
56
57
  vetArtikelSpec: () => vetArtikelSpec,
57
58
  vetQueryOpts: () => vetQueryOpts,
58
59
  vrstaNormalizator: () => vrstaNormalizator,
@@ -2284,76 +2285,87 @@ function naSezname(classes) {
2284
2285
  }
2285
2286
  return Object.keys(out).length ? out : undefined;
2286
2287
  }
2287
- async function* matchMany(prepared, queries, options) {
2288
- const { queryOf, idOf, limit = 3, minScore = 0, kos = 50, samoEnolicno, rank, accept, opts } = options;
2288
+ function matchOne(prepared, query, indeks, options, porabljeni) {
2289
+ const { queryOf, idOf, limit = 3, minScore = 0, rank, accept, opts } = options;
2289
2290
  const retrievalLimit = options.retrievalLimit ?? Math.max(20, limit * 4);
2290
2291
  const primaryTextOf = options.primaryTextOf ?? ((item) => item["naziv"]);
2291
- const porabljeni = samoEnolicno ? new Set : undefined;
2292
- let kosZbirka = [];
2293
- for (let indeks = 0;indeks < queries.length; indeks++) {
2294
- const query = queries[indeks];
2295
- const vhod = queryOf(query);
2296
- const text = typeof vhod === "string" ? vhod : vhod.text;
2297
- const queryClasses = typeof vhod === "string" ? undefined : naSezname(vhod.classes);
2298
- const id = idOf ? idOf(query, indeks) : String(query["_id"] ?? query["id"] ?? indeks);
2299
- const poisciKandidate = (besedilo, razredi) => {
2300
- if (!besedilo.trim())
2301
- return { kandidati: [], zadetkov: 0 };
2302
- const zadetki = searchAndRankNumeric(besedilo, prepared.data, prepared.metadata, {
2303
- primaryTextFn: primaryTextOf,
2304
- ...options.exactKeysOf ? { exactKeysFn: options.exactKeysOf } : {},
2305
- ...opts ? { opts } : {},
2306
- limit: retrievalLimit
2307
- });
2308
- const poizvedbaZaDomeno = { text: besedilo, ...razredi ? { classes: razredi } : {} };
2309
- const najdeni = [];
2310
- for (const zadetek of zadetki) {
2311
- const classes = itemClasses(prepared.metadata, zadetek.id);
2312
- const kandidat = {
2313
- id: zadetek.id,
2314
- item: zadetek.item,
2315
- ...classes ? { classes } : {}
2316
- };
2317
- if (accept && !accept(kandidat, poizvedbaZaDomeno))
2318
- continue;
2319
- const ocena = rank ? rank(kandidat, poizvedbaZaDomeno) : zadetek.score;
2320
- if (ocena < minScore)
2321
- continue;
2322
- if (porabljeni?.has(zadetek.id))
2323
- continue;
2324
- najdeni.push({ id: zadetek.id, item: zadetek.item, score: ocena, ...classes ? { classes } : {} });
2325
- }
2326
- najdeni.sort((a, b) => {
2327
- if (b.score !== a.score)
2328
- return b.score - a.score;
2329
- return (primaryTextOf(a.item) ?? "").localeCompare(primaryTextOf(b.item) ?? "");
2330
- });
2331
- if (najdeni.length > limit)
2332
- najdeni.length = limit;
2333
- return { kandidati: najdeni, zadetkov: zadetki.length };
2334
- };
2335
- let { kandidati, zadetkov } = poisciKandidate(text, queryClasses);
2336
- const poskusiAlternative = kandidati.length === 0 && (options.alternativneLeCeNiZadetkov ? zadetkov === 0 : true);
2337
- if (poskusiAlternative && options.alternativnePoizvedbe) {
2338
- for (const alternativa of options.alternativnePoizvedbe(query)) {
2339
- const altBesedilo = typeof alternativa === "string" ? alternativa : alternativa.text;
2340
- if (!altBesedilo?.trim() || altBesedilo === text)
2341
- continue;
2342
- const altRazredi = typeof alternativa === "string" ? undefined : naSezname(alternativa.classes);
2343
- ({ kandidati } = poisciKandidate(altBesedilo, altRazredi));
2344
- if (kandidati.length)
2345
- break;
2346
- }
2347
- }
2348
- if (porabljeni) {
2349
- for (const kandidat of kandidati)
2350
- porabljeni.add(kandidat.id);
2292
+ const vhod = queryOf(query);
2293
+ const text = typeof vhod === "string" ? vhod : vhod.text;
2294
+ const queryClasses = typeof vhod === "string" ? undefined : naSezname(vhod.classes);
2295
+ const id = idOf ? idOf(query, indeks) : String(query["_id"] ?? query["id"] ?? indeks);
2296
+ const poisciKandidate = (besedilo, razredi) => {
2297
+ if (!besedilo.trim())
2298
+ return { kandidati: [], zadetkov: 0 };
2299
+ const zadetki = searchAndRankNumeric(besedilo, prepared.data, prepared.metadata, {
2300
+ primaryTextFn: primaryTextOf,
2301
+ ...options.exactKeysOf ? { exactKeysFn: options.exactKeysOf } : {},
2302
+ ...opts ? { opts } : {},
2303
+ limit: retrievalLimit
2304
+ });
2305
+ const poizvedbaZaDomeno = { text: besedilo, ...razredi ? { classes: razredi } : {} };
2306
+ const najdeni = [];
2307
+ for (const zadetek of zadetki) {
2308
+ const classes = itemClasses(prepared.metadata, zadetek.id);
2309
+ const kandidat = {
2310
+ id: zadetek.id,
2311
+ item: zadetek.item,
2312
+ ...classes ? { classes } : {}
2313
+ };
2314
+ if (accept && !accept(kandidat, poizvedbaZaDomeno))
2315
+ continue;
2316
+ const ocena = rank ? rank(kandidat, poizvedbaZaDomeno) : zadetek.score;
2317
+ if (ocena < minScore)
2318
+ continue;
2319
+ if (porabljeni?.has(zadetek.id))
2320
+ continue;
2321
+ najdeni.push({ id: zadetek.id, item: zadetek.item, score: ocena, ...classes ? { classes } : {} });
2351
2322
  }
2352
- kosZbirka.push({
2353
- id,
2354
- ...queryClasses ? { queryClasses } : {},
2355
- kandidati
2323
+ najdeni.sort((a, b) => {
2324
+ if (b.score !== a.score)
2325
+ return b.score - a.score;
2326
+ return (primaryTextOf(a.item) ?? "").localeCompare(primaryTextOf(b.item) ?? "");
2356
2327
  });
2328
+ if (najdeni.length > limit)
2329
+ najdeni.length = limit;
2330
+ return { kandidati: najdeni, zadetkov: zadetki.length };
2331
+ };
2332
+ let { kandidati, zadetkov } = poisciKandidate(text, queryClasses);
2333
+ const poskusiAlternative = kandidati.length === 0 && (options.alternativneLeCeNiZadetkov ? zadetkov === 0 : true);
2334
+ if (poskusiAlternative && options.alternativnePoizvedbe) {
2335
+ for (const alternativa of options.alternativnePoizvedbe(query)) {
2336
+ const altBesedilo = typeof alternativa === "string" ? alternativa : alternativa.text;
2337
+ if (!altBesedilo?.trim() || altBesedilo === text)
2338
+ continue;
2339
+ const altRazredi = typeof alternativa === "string" ? undefined : naSezname(alternativa.classes);
2340
+ ({ kandidati } = poisciKandidate(altBesedilo, altRazredi));
2341
+ if (kandidati.length)
2342
+ break;
2343
+ }
2344
+ }
2345
+ if (porabljeni) {
2346
+ for (const kandidat of kandidati)
2347
+ porabljeni.add(kandidat.id);
2348
+ }
2349
+ return {
2350
+ id,
2351
+ ...queryClasses ? { queryClasses } : {},
2352
+ kandidati
2353
+ };
2354
+ }
2355
+ function matchManySync(prepared, queries, options) {
2356
+ const porabljeni = options.samoEnolicno ? new Set : undefined;
2357
+ const izhod = new Array(queries.length);
2358
+ for (let indeks = 0;indeks < queries.length; indeks++) {
2359
+ izhod[indeks] = matchOne(prepared, queries[indeks], indeks, options, porabljeni);
2360
+ }
2361
+ return izhod;
2362
+ }
2363
+ async function* matchMany(prepared, queries, options) {
2364
+ const kos = options.kos ?? 50;
2365
+ const porabljeni = options.samoEnolicno ? new Set : undefined;
2366
+ let kosZbirka = [];
2367
+ for (let indeks = 0;indeks < queries.length; indeks++) {
2368
+ kosZbirka.push(matchOne(prepared, queries[indeks], indeks, options, porabljeni));
2357
2369
  if (kosZbirka.length >= kos) {
2358
2370
  yield kosZbirka;
2359
2371
  kosZbirka = [];
@@ -2435,7 +2447,9 @@ async function* upariArtikle(prepared, artikli, nastavitve = {}) {
2435
2447
  opts: vetQueryOpts(),
2436
2448
  primaryTextOf: (item) => item.naziv,
2437
2449
  rank: (kandidat, poizvedba) => oceni(poizvedba.text, String(kandidat.item.naziv), poizvedba.classes, kandidat.classes).ocena,
2438
- accept: (kandidat, poizvedba) => oceni(poizvedba.text, String(kandidat.item.naziv), poizvedba.classes, kandidat.classes).sprejeto,
2450
+ ...nastavitve.vrniNesprejete ? {} : {
2451
+ accept: (kandidat, poizvedba) => oceni(poizvedba.text, String(kandidat.item.naziv), poizvedba.classes, kandidat.classes).sprejeto
2452
+ },
2439
2453
  ...uporabiZozeno ? {
2440
2454
  alternativnePoizvedbe: (z) => zoziPoizvedbo(z.naziv),
2441
2455
  alternativneLeCeNiZadetkov: true
@@ -2460,6 +2474,58 @@ async function* upariArtikle(prepared, artikli, nastavitve = {}) {
2460
2474
  yield izhod;
2461
2475
  }
2462
2476
  }
2477
+ function upariVseSync(prepared, artikli, nastavitve = {}) {
2478
+ const { limit = 3, retrievalLimit = 10, samoEnolicno, ocena: pragOcene } = nastavitve;
2479
+ const uporabiZozeno = nastavitve.zozenaPoizvedba !== false;
2480
+ const nazivPoId = new Map;
2481
+ for (const artikel of artikli)
2482
+ nazivPoId.set(String(artikel._id), artikel.naziv);
2483
+ const pomnilnik = new Map;
2484
+ const oceni = (poizvedba, kandidat, razrediPoizvedbe, razrediKandidata) => {
2485
+ const kljuc2 = `${poizvedba}\x00${kandidat}`;
2486
+ let rezultat = pomnilnik.get(kljuc2);
2487
+ if (!rezultat) {
2488
+ rezultat = oceniPar(poizvedba, kandidat, pragOcene, {
2489
+ ...razrediPoizvedbe ? { poizvedba: razrediPoizvedbe } : {},
2490
+ ...razrediKandidata ? { kandidat: razrediKandidata } : {}
2491
+ });
2492
+ pomnilnik.set(kljuc2, rezultat);
2493
+ }
2494
+ return rezultat;
2495
+ };
2496
+ const rezultati = matchManySync(prepared, artikli, {
2497
+ queryOf: (z) => {
2498
+ const { classes } = normalizeQueryWithOpts(z.naziv, vetQueryOpts());
2499
+ return { text: z.naziv, ...Object.keys(classes).length ? { classes } : {} };
2500
+ },
2501
+ idOf: (z) => String(z._id),
2502
+ limit,
2503
+ retrievalLimit,
2504
+ ...samoEnolicno ? { samoEnolicno: true } : {},
2505
+ opts: vetQueryOpts(),
2506
+ primaryTextOf: (item) => item.naziv,
2507
+ rank: (kandidat, poizvedba) => oceni(poizvedba.text, String(kandidat.item.naziv), poizvedba.classes, kandidat.classes).ocena,
2508
+ ...nastavitve.vrniNesprejete ? {} : {
2509
+ accept: (kandidat, poizvedba) => oceni(poizvedba.text, String(kandidat.item.naziv), poizvedba.classes, kandidat.classes).sprejeto
2510
+ },
2511
+ ...uporabiZozeno ? { alternativnePoizvedbe: (z) => zoziPoizvedbo(z.naziv), alternativneLeCeNiZadetkov: true } : {}
2512
+ });
2513
+ return rezultati.map((rezultat) => ({
2514
+ id: rezultat.id,
2515
+ kandidati: rezultat.kandidati.map((kandidat) => {
2516
+ const classes = itemClasses(prepared.metadata, kandidat.id);
2517
+ const ocena = oceni(nazivPoId.get(rezultat.id) ?? "", String(kandidat.item.naziv), rezultat.queryClasses, classes);
2518
+ return {
2519
+ id: String(kandidat.id),
2520
+ item: kandidat.item,
2521
+ score: kandidat.score,
2522
+ sprejeto: ocena.sprejeto,
2523
+ ocena,
2524
+ ...classes ? { classes } : {}
2525
+ };
2526
+ })
2527
+ }));
2528
+ }
2463
2529
  async function upariVse(prepared, artikli, nastavitve = {}) {
2464
2530
  const izhod = [];
2465
2531
  for await (const kos of upariArtikle(prepared, artikli, nastavitve))
@@ -18,7 +18,7 @@ export { vetArtikelSpec, vetQueryOpts, type VetSpecNastavitve } from './spec';
18
18
  /** Iz jedra ponovno izvoženo, ker je del vet pogodbe (razredi poizvedbe). */
19
19
  export { normalizeQueryWithOpts } from '../common/numeric/prepareQueryVariants';
20
20
  export { oceniPar, type VetOcena, type VetOcenaNastavitve, type VetRazredi } from './ocena';
21
- export { pripraviVetIndeks, upariArtikle, upariVse, type VetArtikel, type VetKandidat, type VetPar, type VetUparjanjeNastavitve, } from './uparjanje';
21
+ export { pripraviVetIndeks, upariArtikle, upariVse, upariVseSync, type VetArtikel, type VetKandidat, type VetPar, type VetUparjanjeNastavitve, } from './uparjanje';
22
22
  export { ZNAMKE_GEN, type OkrajsavaZnamke, type LinijaZnamke } from './data/znamke.gen';
23
23
  export { ENOTE_SINONIMI, VRSTE_SINONIMI } from './data/enote';
24
24
  //# sourceMappingURL=index.d.ts.map
@@ -18,7 +18,7 @@ export { vetArtikelSpec, vetQueryOpts, type VetSpecNastavitve } from './spec';
18
18
  /** Iz jedra ponovno izvoženo, ker je del vet pogodbe (razredi poizvedbe). */
19
19
  export { normalizeQueryWithOpts } from '../common/numeric/prepareQueryVariants';
20
20
  export { oceniPar, type VetOcena, type VetOcenaNastavitve, type VetRazredi } from './ocena';
21
- export { pripraviVetIndeks, upariArtikle, upariVse, type VetArtikel, type VetKandidat, type VetPar, type VetUparjanjeNastavitve, } from './uparjanje';
21
+ export { pripraviVetIndeks, upariArtikle, upariVse, upariVseSync, type VetArtikel, type VetKandidat, type VetPar, type VetUparjanjeNastavitve, } from './uparjanje';
22
22
  export { ZNAMKE_GEN, type OkrajsavaZnamke, type LinijaZnamke } from './data/znamke.gen';
23
23
  export { ENOTE_SINONIMI, VRSTE_SINONIMI } from './data/enote';
24
24
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/vet/index.ts"],"names":[],"mappings":"AACA;;;;;;;;;;;;;GAaG;AACH,OAAO,EAAE,kBAAkB,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAClE,OAAO,EAAE,qBAAqB,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAC7J,OAAO,EAAE,cAAc,EAAE,YAAY,EAAE,KAAK,iBAAiB,EAAE,MAAM,QAAQ,CAAC;AAC9E,6EAA6E;AAC7E,OAAO,EAAE,sBAAsB,EAAE,MAAM,wCAAwC,CAAC;AAChF,OAAO,EAAE,QAAQ,EAAE,KAAK,QAAQ,EAAE,KAAK,kBAAkB,EAAE,KAAK,UAAU,EAAE,MAAM,SAAS,CAAC;AAC5F,OAAO,EACL,iBAAiB,EACjB,YAAY,EACZ,QAAQ,EACR,KAAK,UAAU,EACf,KAAK,WAAW,EAChB,KAAK,MAAM,EACX,KAAK,sBAAsB,GAC5B,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,UAAU,EAAE,KAAK,eAAe,EAAE,KAAK,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACxF,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/vet/index.ts"],"names":[],"mappings":"AACA;;;;;;;;;;;;;GAaG;AACH,OAAO,EAAE,kBAAkB,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAClE,OAAO,EAAE,qBAAqB,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAC7J,OAAO,EAAE,cAAc,EAAE,YAAY,EAAE,KAAK,iBAAiB,EAAE,MAAM,QAAQ,CAAC;AAC9E,6EAA6E;AAC7E,OAAO,EAAE,sBAAsB,EAAE,MAAM,wCAAwC,CAAC;AAChF,OAAO,EAAE,QAAQ,EAAE,KAAK,QAAQ,EAAE,KAAK,kBAAkB,EAAE,KAAK,UAAU,EAAE,MAAM,SAAS,CAAC;AAC5F,OAAO,EACL,iBAAiB,EACjB,YAAY,EACZ,QAAQ,EACR,YAAY,EACZ,KAAK,UAAU,EACf,KAAK,WAAW,EAChB,KAAK,MAAM,EACX,KAAK,sBAAsB,GAC5B,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,UAAU,EAAE,KAAK,eAAe,EAAE,KAAK,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACxF,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC"}
package/dist/vet/index.js CHANGED
@@ -2222,76 +2222,87 @@ function naSezname(classes) {
2222
2222
  }
2223
2223
  return Object.keys(out).length ? out : undefined;
2224
2224
  }
2225
- async function* matchMany(prepared, queries, options) {
2226
- const { queryOf, idOf, limit = 3, minScore = 0, kos = 50, samoEnolicno, rank, accept, opts } = options;
2225
+ function matchOne(prepared, query, indeks, options, porabljeni) {
2226
+ const { queryOf, idOf, limit = 3, minScore = 0, rank, accept, opts } = options;
2227
2227
  const retrievalLimit = options.retrievalLimit ?? Math.max(20, limit * 4);
2228
2228
  const primaryTextOf = options.primaryTextOf ?? ((item) => item["naziv"]);
2229
- const porabljeni = samoEnolicno ? new Set : undefined;
2230
- let kosZbirka = [];
2231
- for (let indeks = 0;indeks < queries.length; indeks++) {
2232
- const query = queries[indeks];
2233
- const vhod = queryOf(query);
2234
- const text = typeof vhod === "string" ? vhod : vhod.text;
2235
- const queryClasses = typeof vhod === "string" ? undefined : naSezname(vhod.classes);
2236
- const id = idOf ? idOf(query, indeks) : String(query["_id"] ?? query["id"] ?? indeks);
2237
- const poisciKandidate = (besedilo, razredi) => {
2238
- if (!besedilo.trim())
2239
- return { kandidati: [], zadetkov: 0 };
2240
- const zadetki = searchAndRankNumeric(besedilo, prepared.data, prepared.metadata, {
2241
- primaryTextFn: primaryTextOf,
2242
- ...options.exactKeysOf ? { exactKeysFn: options.exactKeysOf } : {},
2243
- ...opts ? { opts } : {},
2244
- limit: retrievalLimit
2245
- });
2246
- const poizvedbaZaDomeno = { text: besedilo, ...razredi ? { classes: razredi } : {} };
2247
- const najdeni = [];
2248
- for (const zadetek of zadetki) {
2249
- const classes = itemClasses(prepared.metadata, zadetek.id);
2250
- const kandidat = {
2251
- id: zadetek.id,
2252
- item: zadetek.item,
2253
- ...classes ? { classes } : {}
2254
- };
2255
- if (accept && !accept(kandidat, poizvedbaZaDomeno))
2256
- continue;
2257
- const ocena = rank ? rank(kandidat, poizvedbaZaDomeno) : zadetek.score;
2258
- if (ocena < minScore)
2259
- continue;
2260
- if (porabljeni?.has(zadetek.id))
2261
- continue;
2262
- najdeni.push({ id: zadetek.id, item: zadetek.item, score: ocena, ...classes ? { classes } : {} });
2263
- }
2264
- najdeni.sort((a, b) => {
2265
- if (b.score !== a.score)
2266
- return b.score - a.score;
2267
- return (primaryTextOf(a.item) ?? "").localeCompare(primaryTextOf(b.item) ?? "");
2268
- });
2269
- if (najdeni.length > limit)
2270
- najdeni.length = limit;
2271
- return { kandidati: najdeni, zadetkov: zadetki.length };
2272
- };
2273
- let { kandidati, zadetkov } = poisciKandidate(text, queryClasses);
2274
- const poskusiAlternative = kandidati.length === 0 && (options.alternativneLeCeNiZadetkov ? zadetkov === 0 : true);
2275
- if (poskusiAlternative && options.alternativnePoizvedbe) {
2276
- for (const alternativa of options.alternativnePoizvedbe(query)) {
2277
- const altBesedilo = typeof alternativa === "string" ? alternativa : alternativa.text;
2278
- if (!altBesedilo?.trim() || altBesedilo === text)
2279
- continue;
2280
- const altRazredi = typeof alternativa === "string" ? undefined : naSezname(alternativa.classes);
2281
- ({ kandidati } = poisciKandidate(altBesedilo, altRazredi));
2282
- if (kandidati.length)
2283
- break;
2284
- }
2285
- }
2286
- if (porabljeni) {
2287
- for (const kandidat of kandidati)
2288
- porabljeni.add(kandidat.id);
2229
+ const vhod = queryOf(query);
2230
+ const text = typeof vhod === "string" ? vhod : vhod.text;
2231
+ const queryClasses = typeof vhod === "string" ? undefined : naSezname(vhod.classes);
2232
+ const id = idOf ? idOf(query, indeks) : String(query["_id"] ?? query["id"] ?? indeks);
2233
+ const poisciKandidate = (besedilo, razredi) => {
2234
+ if (!besedilo.trim())
2235
+ return { kandidati: [], zadetkov: 0 };
2236
+ const zadetki = searchAndRankNumeric(besedilo, prepared.data, prepared.metadata, {
2237
+ primaryTextFn: primaryTextOf,
2238
+ ...options.exactKeysOf ? { exactKeysFn: options.exactKeysOf } : {},
2239
+ ...opts ? { opts } : {},
2240
+ limit: retrievalLimit
2241
+ });
2242
+ const poizvedbaZaDomeno = { text: besedilo, ...razredi ? { classes: razredi } : {} };
2243
+ const najdeni = [];
2244
+ for (const zadetek of zadetki) {
2245
+ const classes = itemClasses(prepared.metadata, zadetek.id);
2246
+ const kandidat = {
2247
+ id: zadetek.id,
2248
+ item: zadetek.item,
2249
+ ...classes ? { classes } : {}
2250
+ };
2251
+ if (accept && !accept(kandidat, poizvedbaZaDomeno))
2252
+ continue;
2253
+ const ocena = rank ? rank(kandidat, poizvedbaZaDomeno) : zadetek.score;
2254
+ if (ocena < minScore)
2255
+ continue;
2256
+ if (porabljeni?.has(zadetek.id))
2257
+ continue;
2258
+ najdeni.push({ id: zadetek.id, item: zadetek.item, score: ocena, ...classes ? { classes } : {} });
2289
2259
  }
2290
- kosZbirka.push({
2291
- id,
2292
- ...queryClasses ? { queryClasses } : {},
2293
- kandidati
2260
+ najdeni.sort((a, b) => {
2261
+ if (b.score !== a.score)
2262
+ return b.score - a.score;
2263
+ return (primaryTextOf(a.item) ?? "").localeCompare(primaryTextOf(b.item) ?? "");
2294
2264
  });
2265
+ if (najdeni.length > limit)
2266
+ najdeni.length = limit;
2267
+ return { kandidati: najdeni, zadetkov: zadetki.length };
2268
+ };
2269
+ let { kandidati, zadetkov } = poisciKandidate(text, queryClasses);
2270
+ const poskusiAlternative = kandidati.length === 0 && (options.alternativneLeCeNiZadetkov ? zadetkov === 0 : true);
2271
+ if (poskusiAlternative && options.alternativnePoizvedbe) {
2272
+ for (const alternativa of options.alternativnePoizvedbe(query)) {
2273
+ const altBesedilo = typeof alternativa === "string" ? alternativa : alternativa.text;
2274
+ if (!altBesedilo?.trim() || altBesedilo === text)
2275
+ continue;
2276
+ const altRazredi = typeof alternativa === "string" ? undefined : naSezname(alternativa.classes);
2277
+ ({ kandidati } = poisciKandidate(altBesedilo, altRazredi));
2278
+ if (kandidati.length)
2279
+ break;
2280
+ }
2281
+ }
2282
+ if (porabljeni) {
2283
+ for (const kandidat of kandidati)
2284
+ porabljeni.add(kandidat.id);
2285
+ }
2286
+ return {
2287
+ id,
2288
+ ...queryClasses ? { queryClasses } : {},
2289
+ kandidati
2290
+ };
2291
+ }
2292
+ function matchManySync(prepared, queries, options) {
2293
+ const porabljeni = options.samoEnolicno ? new Set : undefined;
2294
+ const izhod = new Array(queries.length);
2295
+ for (let indeks = 0;indeks < queries.length; indeks++) {
2296
+ izhod[indeks] = matchOne(prepared, queries[indeks], indeks, options, porabljeni);
2297
+ }
2298
+ return izhod;
2299
+ }
2300
+ async function* matchMany(prepared, queries, options) {
2301
+ const kos = options.kos ?? 50;
2302
+ const porabljeni = options.samoEnolicno ? new Set : undefined;
2303
+ let kosZbirka = [];
2304
+ for (let indeks = 0;indeks < queries.length; indeks++) {
2305
+ kosZbirka.push(matchOne(prepared, queries[indeks], indeks, options, porabljeni));
2295
2306
  if (kosZbirka.length >= kos) {
2296
2307
  yield kosZbirka;
2297
2308
  kosZbirka = [];
@@ -2373,7 +2384,9 @@ async function* upariArtikle(prepared, artikli, nastavitve = {}) {
2373
2384
  opts: vetQueryOpts(),
2374
2385
  primaryTextOf: (item) => item.naziv,
2375
2386
  rank: (kandidat, poizvedba) => oceni(poizvedba.text, String(kandidat.item.naziv), poizvedba.classes, kandidat.classes).ocena,
2376
- accept: (kandidat, poizvedba) => oceni(poizvedba.text, String(kandidat.item.naziv), poizvedba.classes, kandidat.classes).sprejeto,
2387
+ ...nastavitve.vrniNesprejete ? {} : {
2388
+ accept: (kandidat, poizvedba) => oceni(poizvedba.text, String(kandidat.item.naziv), poizvedba.classes, kandidat.classes).sprejeto
2389
+ },
2377
2390
  ...uporabiZozeno ? {
2378
2391
  alternativnePoizvedbe: (z) => zoziPoizvedbo(z.naziv),
2379
2392
  alternativneLeCeNiZadetkov: true
@@ -2398,6 +2411,58 @@ async function* upariArtikle(prepared, artikli, nastavitve = {}) {
2398
2411
  yield izhod;
2399
2412
  }
2400
2413
  }
2414
+ function upariVseSync(prepared, artikli, nastavitve = {}) {
2415
+ const { limit = 3, retrievalLimit = 10, samoEnolicno, ocena: pragOcene } = nastavitve;
2416
+ const uporabiZozeno = nastavitve.zozenaPoizvedba !== false;
2417
+ const nazivPoId = new Map;
2418
+ for (const artikel of artikli)
2419
+ nazivPoId.set(String(artikel._id), artikel.naziv);
2420
+ const pomnilnik = new Map;
2421
+ const oceni = (poizvedba, kandidat, razrediPoizvedbe, razrediKandidata) => {
2422
+ const kljuc2 = `${poizvedba}\x00${kandidat}`;
2423
+ let rezultat = pomnilnik.get(kljuc2);
2424
+ if (!rezultat) {
2425
+ rezultat = oceniPar(poizvedba, kandidat, pragOcene, {
2426
+ ...razrediPoizvedbe ? { poizvedba: razrediPoizvedbe } : {},
2427
+ ...razrediKandidata ? { kandidat: razrediKandidata } : {}
2428
+ });
2429
+ pomnilnik.set(kljuc2, rezultat);
2430
+ }
2431
+ return rezultat;
2432
+ };
2433
+ const rezultati = matchManySync(prepared, artikli, {
2434
+ queryOf: (z) => {
2435
+ const { classes } = normalizeQueryWithOpts(z.naziv, vetQueryOpts());
2436
+ return { text: z.naziv, ...Object.keys(classes).length ? { classes } : {} };
2437
+ },
2438
+ idOf: (z) => String(z._id),
2439
+ limit,
2440
+ retrievalLimit,
2441
+ ...samoEnolicno ? { samoEnolicno: true } : {},
2442
+ opts: vetQueryOpts(),
2443
+ primaryTextOf: (item) => item.naziv,
2444
+ rank: (kandidat, poizvedba) => oceni(poizvedba.text, String(kandidat.item.naziv), poizvedba.classes, kandidat.classes).ocena,
2445
+ ...nastavitve.vrniNesprejete ? {} : {
2446
+ accept: (kandidat, poizvedba) => oceni(poizvedba.text, String(kandidat.item.naziv), poizvedba.classes, kandidat.classes).sprejeto
2447
+ },
2448
+ ...uporabiZozeno ? { alternativnePoizvedbe: (z) => zoziPoizvedbo(z.naziv), alternativneLeCeNiZadetkov: true } : {}
2449
+ });
2450
+ return rezultati.map((rezultat) => ({
2451
+ id: rezultat.id,
2452
+ kandidati: rezultat.kandidati.map((kandidat) => {
2453
+ const classes = itemClasses(prepared.metadata, kandidat.id);
2454
+ const ocena = oceni(nazivPoId.get(rezultat.id) ?? "", String(kandidat.item.naziv), rezultat.queryClasses, classes);
2455
+ return {
2456
+ id: String(kandidat.id),
2457
+ item: kandidat.item,
2458
+ score: kandidat.score,
2459
+ sprejeto: ocena.sprejeto,
2460
+ ocena,
2461
+ ...classes ? { classes } : {}
2462
+ };
2463
+ })
2464
+ }));
2465
+ }
2401
2466
  async function upariVse(prepared, artikli, nastavitve = {}) {
2402
2467
  const izhod = [];
2403
2468
  for await (const kos of upariArtikle(prepared, artikli, nastavitve))
@@ -2419,6 +2484,7 @@ export {
2419
2484
  pripraviVetIndeks,
2420
2485
  upariArtikle,
2421
2486
  upariVse,
2487
+ upariVseSync,
2422
2488
  vetArtikelSpec,
2423
2489
  vetQueryOpts,
2424
2490
  vrstaNormalizator,
@@ -48,6 +48,13 @@ export interface VetUparjanjeNastavitve {
48
48
  dodatniNormalizatorji?: readonly ValueNormalizer[];
49
49
  /** Ali naj se poskusi drugi prehod z zoženo poizvedbo (privzeto da). */
50
50
  zozenaPoizvedba?: boolean;
51
+ /**
52
+ * Vrni tudi **nesprejete** kandidate (privzeto `false`: nesprejeti se izločijo).
53
+ *
54
+ * Uporabno v UI, kjer želimo uporabniku pokazati vse kandidate in le označiti,
55
+ * kateri prestanejo pravilo sprejema (kandidat nosi `sprejeto`).
56
+ */
57
+ vrniNesprejete?: boolean;
51
58
  }
52
59
  /** Pripravi indeks desne strani (npr. Pantheonovi artikli). */
53
60
  export declare function pripraviVetIndeks<T extends VetArtikel>(artikli: readonly T[], nastavitve?: {
@@ -64,6 +71,14 @@ export declare function upariArtikle<T extends VetArtikel>(prepared: {
64
71
  data: SearchableData<T>;
65
72
  metadata: NumericSearchMetadata;
66
73
  }, artikli: readonly VetArtikel[], nastavitve?: VetUparjanjeNastavitve): AsyncGenerator<VetPar<T>[], void, void>;
74
+ /**
75
+ * Sinhrona različica `upariArtikle` v enem kosu — za klicoče, katerih API ni
76
+ * async (npr. predpomnilnik gatewaya).
77
+ */
78
+ export declare function upariVseSync<T extends VetArtikel>(prepared: {
79
+ data: SearchableData<T>;
80
+ metadata: NumericSearchMetadata;
81
+ }, artikli: readonly VetArtikel[], nastavitve?: VetUparjanjeNastavitve): VetPar<T>[];
67
82
  /** Zbere vse pare (za teste in manjše nabore). */
68
83
  export declare function upariVse<T extends VetArtikel>(prepared: {
69
84
  data: SearchableData<T>;
@@ -1 +1 @@
1
- {"version":3,"file":"uparjanje.d.ts","sourceRoot":"","sources":["../../src/vet/uparjanje.ts"],"names":[],"mappings":"AAuBA,OAAO,KAAK,EAAE,qBAAqB,EAAE,cAAc,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AACzG,OAAO,EAAE,QAAQ,EAAE,KAAK,QAAQ,EAAE,MAAM,SAAS,CAAC;AAKlD,uDAAuD;AACvD,MAAM,WAAW,UAAW,SAAQ,gBAAgB;IAClD,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;CACf;AAED,4BAA4B;AAC5B,MAAM,WAAW,WAAW,CAAC,CAAC,SAAS,gBAAgB,GAAG,UAAU;IAClE,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,CAAC,CAAC;IACR,2CAA2C;IAC3C,KAAK,EAAE,MAAM,CAAC;IACd,yCAAyC;IACzC,QAAQ,EAAE,OAAO,CAAC;IAClB,oCAAoC;IACpC,KAAK,EAAE,QAAQ,CAAC;IAChB,8DAA8D;IAC9D,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;CACpC;AAED,0CAA0C;AAC1C,MAAM,WAAW,MAAM,CAAC,CAAC,SAAS,gBAAgB,GAAG,UAAU;IAC7D,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,WAAW,CAAC,CAAC,CAAC,EAAE,CAAC;CAC7B;AAED;;;;;;;;GAQG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,SAAI,GAAG,MAAM,EAAE,CAoBjE;AAED,MAAM,WAAW,sBAAsB;IACrC,iDAAiD;IACjD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,0FAA0F;IAC1F,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,wDAAwD;IACxD,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,iFAAiF;IACjF,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,kDAAkD;IAClD,KAAK,CAAC,EAAE,UAAU,CAAC,OAAO,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;IACvC,+CAA+C;IAC/C,qBAAqB,CAAC,EAAE,SAAS,eAAe,EAAE,CAAC;IACnD,wEAAwE;IACxE,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B;AAED,+DAA+D;AAC/D,wBAAgB,iBAAiB,CAAC,CAAC,SAAS,UAAU,EACpD,OAAO,EAAE,SAAS,CAAC,EAAE,EACrB,UAAU,GAAE;IAAE,KAAK,CAAC,EAAE,SAAS,MAAM,EAAE,CAAA;CAAO,GAC7C;IAAE,IAAI,EAAE,cAAc,CAAC,CAAC,CAAC,CAAC;IAAC,QAAQ,EAAE,qBAAqB,CAAA;CAAE,CAO9D;AAED;;;GAGG;AACH,wBAAuB,YAAY,CAAC,CAAC,SAAS,UAAU,EACtD,QAAQ,EAAE;IAAE,IAAI,EAAE,cAAc,CAAC,CAAC,CAAC,CAAC;IAAC,QAAQ,EAAE,qBAAqB,CAAA;CAAE,EACtE,OAAO,EAAE,SAAS,UAAU,EAAE,EAC9B,UAAU,GAAE,sBAA2B,GACtC,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,CAkFzC;AAED,kDAAkD;AAClD,wBAAsB,QAAQ,CAAC,CAAC,SAAS,UAAU,EACjD,QAAQ,EAAE;IAAE,IAAI,EAAE,cAAc,CAAC,CAAC,CAAC,CAAC;IAAC,QAAQ,EAAE,qBAAqB,CAAA;CAAE,EACtE,OAAO,EAAE,SAAS,UAAU,EAAE,EAC9B,UAAU,GAAE,sBAA2B,GACtC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAItB"}
1
+ {"version":3,"file":"uparjanje.d.ts","sourceRoot":"","sources":["../../src/vet/uparjanje.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "cry-search",
3
- "version": "2.1.0",
3
+ "version": "2.1.1",
4
4
  "description": "A fast, memory-efficient search library for large datasets with support for tokenized matching, linked collections, and per-field match modes.",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",