@delali/narsil 0.3.1-next.72 → 0.3.1-next.74
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.
- package/README.md +2 -2
- package/dist/adapters/filesystem.mjs +1 -1
- package/dist/adapters/indexeddb.mjs +1 -1
- package/dist/{capabilities-D6gjjQyA.d.ts → capabilities-CAMzmkAg.d.ts} +19 -4
- package/dist/{chunk-P2ZZN32C.mjs → chunk-2E35UM3G.mjs} +2 -12
- package/dist/chunk-3DDUNI6N.mjs +48 -0
- package/dist/{chunk-KZTI25D3.mjs → chunk-4MQ5F4IL.mjs} +1 -1
- package/dist/{chunk-HVJYTKK7.mjs → chunk-BVBIQQKG.mjs} +947 -1327
- package/dist/{chunk-2X2ZQOAB.mjs → chunk-CTOSGRM7.mjs} +101 -21
- package/dist/{chunk-7QMTA7AA.mjs → chunk-CUZOX6CN.mjs} +7784 -4276
- package/dist/chunk-I23G3IZC.mjs +593 -0
- package/dist/{chunk-RV77FR2F.mjs → chunk-I64LXKO3.mjs} +0 -1
- package/dist/chunk-KEHK2O6P.mjs +13 -0
- package/dist/{chunk-CVPA5Q7R.mjs → chunk-LX4JERXI.mjs} +9 -6
- package/dist/{chunk-EDMCZLSJ.mjs → chunk-NOZUQM7J.mjs} +193 -13
- package/dist/{chunk-LCCL6EEH.mjs → chunk-PO53FV4Q.mjs} +93 -94
- package/dist/chunk-T5ZWEWVD.mjs +658 -0
- package/dist/{chunk-Y52WZWAU.mjs → chunk-TVFLHM7M.mjs} +4 -4
- package/dist/{chunk-QR4OKRVY.mjs → chunk-VKX2BPXD.mjs} +147 -642
- package/dist/{chunk-3HQPUCCT.mjs → chunk-XW25X6AU.mjs} +66 -237
- package/dist/{chunk-M6XF5HDE.mjs → chunk-Z3DQPOJQ.mjs} +127 -30
- package/dist/{client-C2TiW29y.d.ts → client-C-I70ArH.d.ts} +77 -26
- package/dist/client.d.ts +9 -9
- package/dist/client.mjs +44 -22
- package/dist/{config-BLguB-om.d.ts → config-C6Iw5rCX.d.ts} +11 -4
- package/dist/{config-C7Ip8Ife.d.ts → config-DJPH3IQB.d.ts} +11 -2
- package/dist/direct-executor-KFAGILJC.mjs +17 -0
- package/dist/distribution/coordinator/etcd.d.ts +29 -16
- package/dist/distribution/coordinator/etcd.mjs +162 -75
- package/dist/distribution/coordinator/in-memory.d.ts +2 -2
- package/dist/distribution/transport/grpc.d.ts +2 -2
- package/dist/distribution/transport/grpc.mjs +22 -2
- package/dist/distribution/transport/in-memory.d.ts +2 -2
- package/dist/distribution/transport/in-memory.mjs +6 -3
- package/dist/distribution/transport/tcp.d.ts +2 -2
- package/dist/distribution/transport/tcp.mjs +40 -16
- package/dist/distribution.d.ts +9 -9
- package/dist/distribution.mjs +647 -366
- package/dist/embeddings/openai.mjs +1 -1
- package/dist/{engine-Dm4446j1.d.ts → engine-B8eRPO7m.d.ts} +97 -188
- package/dist/index.browser.mjs +12132 -8592
- package/dist/index.d.ts +27 -8
- package/dist/index.mjs +15 -14
- package/dist/{memory-CKHTU1CL.d.ts → memory-DJEwWoCi.d.ts} +1204 -968
- package/dist/partial-words-DTIHO8G4.d.ts +19 -0
- package/dist/partial-words.d.ts +22 -0
- package/dist/partial-words.mjs +11 -0
- package/dist/pattern.mjs +1 -1
- package/dist/persistence/durability/checkpoint-worker.d.ts +57 -29
- package/dist/persistence/durability/checkpoint-worker.mjs +26 -16
- package/dist/react.d.ts +7 -7
- package/dist/react.mjs +0 -1
- package/dist/{schema-BBOCdhND.d.ts → schema-DgyDijhf.d.ts} +6 -2
- package/dist/server.d.ts +11 -11
- package/dist/server.mjs +212 -32
- package/dist/{tasks-BECd0b__.d.ts → tasks-BVmAKYBh.d.ts} +3 -3
- package/dist/{thread-IBSIZZ6W.mjs → thread-W6DPKEF6.mjs} +82 -21
- package/dist/{types-BQDlIvfS.d.ts → types-B3b68nfF.d.ts} +1 -1
- package/dist/{types-D5OwhtsQ.d.ts → types-Cb9kiY5P.d.ts} +1 -1
- package/dist/{types-BiUmaiWT.d.ts → types-ChrVy4lH.d.ts} +1 -1
- package/dist/vector/search-worker.d.ts +1 -1
- package/dist/vector/search-worker.mjs +4 -3
- package/dist/workers/entry.mjs +4 -4
- package/package.json +15 -7
- package/dist/chunk-3L4U6EJQ.mjs +0 -49
- package/dist/chunk-IFBKLBGB.mjs +0 -7
- package/dist/chunk-XZ4PAREY.mjs +0 -25
- package/dist/direct-executor-SVCHXR74.mjs +0 -14
- package/dist/serialization/crc32-worker.d.ts +0 -20
- package/dist/serialization/crc32-worker.mjs +0 -62
|
@@ -1,463 +1,9 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { MAX_SORT_FIELDS, MAX_SORT_FIELD_NAME_LENGTH, MAX_CURSOR_LENGTH, MAX_CURSOR_ANCHOR_CODE_POINTS, RESULT_WINDOW, DEFAULT_FUZZY_PREFIX_LENGTH, DEFAULT_PAGE_SIZE, PREFIX_MAX_EXPANSIONS, PARTIAL_WORD_MIN_CODE_POINTS, PARTIAL_WORDS_ADDED_PER_QUERY } from './chunk-3DDUNI6N.mjs';
|
|
2
2
|
import { DEFAULT_PATTERN_WORK_CAP, PATTERN_TEST_OPERATORS, bitsetIsEmpty, MAX_PATTERN_TEXT_CODE_POINTS, MAX_PATTERN_POSITIONS, createBitSet, bitsetSet, PATTERN_WORK_FLUSH_UNITS, MATCHER_STATE_BUDGET_BYTES } from './chunk-ZKRV5M2P.mjs';
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
var TOKEN_CACHE_SIZE_FLOOR = 5e4;
|
|
8
|
-
var TOKEN_CACHE_SIZE_CEILING = 2e6;
|
|
9
|
-
var TOKEN_CACHE_BYTES_PER_ENTRY = 200;
|
|
10
|
-
var NODE_TOKEN_CACHE_ENTRIES = 1e6;
|
|
11
|
-
var UNKNOWN_MEMORY_TOKEN_CACHE_ENTRIES = 2e5;
|
|
12
|
-
var CONSTRAINED_MEMORY_TOKEN_CACHE_FRACTION = 0.05;
|
|
13
|
-
var SMALL_DEVICE_MEMORY_GB = 1;
|
|
14
|
-
var MEDIUM_DEVICE_MEMORY_GB = 4;
|
|
15
|
-
var SMALL_DEVICE_TOKEN_CACHE_ENTRIES = 1e5;
|
|
16
|
-
var MEDIUM_DEVICE_TOKEN_CACHE_ENTRIES = 25e4;
|
|
17
|
-
var LARGE_DEVICE_TOKEN_CACHE_ENTRIES = 5e5;
|
|
18
|
-
var DEFAULT_MIN_TOKEN_LENGTH = 1;
|
|
19
|
-
|
|
20
|
-
// src/core/tokenizer/normalize.ts
|
|
21
|
-
var DOTTED_CAPITAL_I = "\u0130";
|
|
22
|
-
var COMBINING_DOT_ABOVE = "\u0307";
|
|
23
|
-
var ARMENIAN_MARKS = /[\u055B-\u055F]/;
|
|
24
|
-
var FOLDED_FORMS = /\u0307|[\u0130\u055B-\u055F\u2018\u2019\u02BC\u02BB]/g;
|
|
25
|
-
var WIDTH_FORMS = /[\uFF01-\uFF5E\uFF61-\uFF9F]/;
|
|
26
|
-
var WIDTH_FORMS_GLOBAL = /[\uFF01-\uFF5E\uFF61-\uFF9F]/g;
|
|
27
|
-
var FULLWIDTH_ASCII_END = 65374;
|
|
28
|
-
var FULLWIDTH_ASCII_OFFSET = 65248;
|
|
29
|
-
var HALFWIDTH_KANA_START = 65377;
|
|
30
|
-
var HALFWIDTH_VOICED_MARK = 65438;
|
|
31
|
-
var HALFWIDTH_SEMI_VOICED_MARK = 65439;
|
|
32
|
-
var COMBINING_VOICED_MARK = "\u3099";
|
|
33
|
-
var COMBINING_SEMI_VOICED_MARK = "\u309A";
|
|
34
|
-
var HALFWIDTH_KANA_TARGETS = "\u3002\u300C\u300D\u3001\u30FB\u30F2\u30A1\u30A3\u30A5\u30A7\u30A9\u30E3\u30E5\u30E7\u30C3\u30FC\u30A2\u30A4\u30A6\u30A8\u30AA\u30AB\u30AD\u30AF\u30B1\u30B3\u30B5\u30B7\u30B9\u30BB\u30BD\u30BF\u30C1\u30C4\u30C6\u30C8\u30CA\u30CB\u30CC\u30CD\u30CE\u30CF\u30D2\u30D5\u30D8\u30DB\u30DE\u30DF\u30E0\u30E1\u30E2\u30E4\u30E6\u30E8\u30E9\u30EA\u30EB\u30EC\u30ED\u30EF\u30F3";
|
|
35
|
-
function foldForm(match) {
|
|
36
|
-
if (match === DOTTED_CAPITAL_I) return "i";
|
|
37
|
-
if (match === COMBINING_DOT_ABOVE || ARMENIAN_MARKS.test(match)) return "";
|
|
38
|
-
return "'";
|
|
39
|
-
}
|
|
40
|
-
function foldWidth(match) {
|
|
41
|
-
const codePoint = match.charCodeAt(0);
|
|
42
|
-
if (codePoint <= FULLWIDTH_ASCII_END) return String.fromCharCode(codePoint - FULLWIDTH_ASCII_OFFSET);
|
|
43
|
-
if (codePoint === HALFWIDTH_VOICED_MARK) return COMBINING_VOICED_MARK;
|
|
44
|
-
if (codePoint === HALFWIDTH_SEMI_VOICED_MARK) return COMBINING_SEMI_VOICED_MARK;
|
|
45
|
-
return HALFWIDTH_KANA_TARGETS[codePoint - HALFWIDTH_KANA_START];
|
|
46
|
-
}
|
|
47
|
-
function isAscii(text) {
|
|
48
|
-
for (let i = 0; i < text.length; i++) {
|
|
49
|
-
if (text.charCodeAt(i) > 127) return false;
|
|
50
|
-
}
|
|
51
|
-
return true;
|
|
52
|
-
}
|
|
53
|
-
function foldWidthForms(text) {
|
|
54
|
-
if (!WIDTH_FORMS.test(text)) return text;
|
|
55
|
-
return text.replace(WIDTH_FORMS_GLOBAL, foldWidth);
|
|
56
|
-
}
|
|
57
|
-
function normalizeForSplitting(text) {
|
|
58
|
-
if (isAscii(text)) return text.toLowerCase();
|
|
59
|
-
return foldWidthForms(text).normalize("NFC").replace(FOLDED_FORMS, foldForm).toLowerCase();
|
|
60
|
-
}
|
|
61
|
-
function stripDiacritics(text) {
|
|
62
|
-
return text.normalize("NFD").replace(/[\u0300-\u036f]/g, "");
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
// src/core/tokenizer/cache.ts
|
|
66
|
-
function clampCacheSize(entries) {
|
|
67
|
-
return Math.max(TOKEN_CACHE_SIZE_FLOOR, Math.min(entries, TOKEN_CACHE_SIZE_CEILING));
|
|
68
|
-
}
|
|
69
|
-
function computeDefaultCacheSize() {
|
|
70
|
-
try {
|
|
71
|
-
if (typeof process !== "undefined" && typeof process.versions?.node === "string" && typeof window === "undefined") {
|
|
72
|
-
const constrainedMemory = typeof process.constrainedMemory === "function" ? process.constrainedMemory() : 0;
|
|
73
|
-
if (constrainedMemory > 0 && constrainedMemory < Number.MAX_SAFE_INTEGER) {
|
|
74
|
-
const budget = constrainedMemory * CONSTRAINED_MEMORY_TOKEN_CACHE_FRACTION;
|
|
75
|
-
return clampCacheSize(Math.floor(budget / TOKEN_CACHE_BYTES_PER_ENTRY));
|
|
76
|
-
}
|
|
77
|
-
return clampCacheSize(NODE_TOKEN_CACHE_ENTRIES);
|
|
78
|
-
}
|
|
79
|
-
if (typeof navigator !== "undefined") {
|
|
80
|
-
const mem = navigator.deviceMemory;
|
|
81
|
-
if (typeof mem === "number" && mem > 0) {
|
|
82
|
-
let entries;
|
|
83
|
-
if (mem <= SMALL_DEVICE_MEMORY_GB) entries = SMALL_DEVICE_TOKEN_CACHE_ENTRIES;
|
|
84
|
-
else if (mem <= MEDIUM_DEVICE_MEMORY_GB) entries = MEDIUM_DEVICE_TOKEN_CACHE_ENTRIES;
|
|
85
|
-
else entries = LARGE_DEVICE_TOKEN_CACHE_ENTRIES;
|
|
86
|
-
return clampCacheSize(entries);
|
|
87
|
-
}
|
|
88
|
-
}
|
|
89
|
-
} catch {
|
|
90
|
-
return clampCacheSize(UNKNOWN_MEMORY_TOKEN_CACHE_ENTRIES);
|
|
91
|
-
}
|
|
92
|
-
return clampCacheSize(UNKNOWN_MEMORY_TOKEN_CACHE_ENTRIES);
|
|
93
|
-
}
|
|
94
|
-
var normalizationCache = /* @__PURE__ */ new Map();
|
|
95
|
-
var normalizationCacheSize = 0;
|
|
96
|
-
var maxCacheSize = computeDefaultCacheSize();
|
|
97
|
-
var cachedLangName = "";
|
|
98
|
-
var cachedFlags = "";
|
|
99
|
-
var cachedBucket = null;
|
|
100
|
-
function configureNormalizationCache(maxSize) {
|
|
101
|
-
if (!Number.isFinite(maxSize)) {
|
|
102
|
-
throw createNarsilError(ErrorCodes.CONFIG_INVALID, "tokenizerCacheSize must be a finite number", {
|
|
103
|
-
received: maxSize
|
|
104
|
-
});
|
|
105
|
-
}
|
|
106
|
-
if (maxSize < 0) {
|
|
107
|
-
throw createNarsilError(ErrorCodes.CONFIG_INVALID, "tokenizerCacheSize must not be negative", {
|
|
108
|
-
received: maxSize
|
|
109
|
-
});
|
|
110
|
-
}
|
|
111
|
-
if (maxSize === 0) {
|
|
112
|
-
throw createNarsilError(
|
|
113
|
-
ErrorCodes.CONFIG_INVALID,
|
|
114
|
-
"tokenizerCacheSize must be greater than zero; the normalization cache cannot be disabled",
|
|
115
|
-
{
|
|
116
|
-
received: maxSize
|
|
117
|
-
}
|
|
118
|
-
);
|
|
119
|
-
}
|
|
120
|
-
maxCacheSize = Math.max(TOKEN_CACHE_SIZE_FLOOR, Math.min(Math.floor(maxSize), TOKEN_CACHE_SIZE_CEILING));
|
|
121
|
-
if (normalizationCacheSize > maxCacheSize) {
|
|
122
|
-
evictOldestEntries(normalizationCacheSize - maxCacheSize);
|
|
123
|
-
}
|
|
124
|
-
}
|
|
125
|
-
function getCacheBucket(language, flags) {
|
|
126
|
-
const langKey = `${language.name}@${language.revision}`;
|
|
127
|
-
if (cachedBucket && langKey === cachedLangName && flags === cachedFlags) return cachedBucket;
|
|
128
|
-
const key = `${langKey}:${flags}`;
|
|
129
|
-
let bucket = normalizationCache.get(key);
|
|
130
|
-
if (!bucket) {
|
|
131
|
-
bucket = /* @__PURE__ */ new Map();
|
|
132
|
-
normalizationCache.set(key, bucket);
|
|
133
|
-
}
|
|
134
|
-
cachedLangName = langKey;
|
|
135
|
-
cachedFlags = flags;
|
|
136
|
-
cachedBucket = bucket;
|
|
137
|
-
return bucket;
|
|
138
|
-
}
|
|
139
|
-
function evictOldestEntries(count) {
|
|
140
|
-
let remaining = count;
|
|
141
|
-
for (const [key, bucket] of normalizationCache) {
|
|
142
|
-
if (remaining <= 0) break;
|
|
143
|
-
if (bucket.size <= remaining) {
|
|
144
|
-
remaining -= bucket.size;
|
|
145
|
-
normalizationCacheSize -= bucket.size;
|
|
146
|
-
normalizationCache.delete(key);
|
|
147
|
-
if (bucket === cachedBucket) cachedBucket = null;
|
|
148
|
-
} else {
|
|
149
|
-
let deleted = 0;
|
|
150
|
-
for (const raw of bucket.keys()) {
|
|
151
|
-
if (deleted >= remaining) break;
|
|
152
|
-
bucket.delete(raw);
|
|
153
|
-
deleted++;
|
|
154
|
-
}
|
|
155
|
-
normalizationCacheSize -= deleted;
|
|
156
|
-
remaining = 0;
|
|
157
|
-
}
|
|
158
|
-
}
|
|
159
|
-
}
|
|
160
|
-
function transformToken(raw, language, stem, removeDiacritics) {
|
|
161
|
-
const flags = (stem ? "s" : "") + (removeDiacritics ? "d" : "");
|
|
162
|
-
let bucket = getCacheBucket(language, flags);
|
|
163
|
-
const cached = bucket.get(raw);
|
|
164
|
-
if (cached !== void 0) return cached;
|
|
165
|
-
let normalized = raw;
|
|
166
|
-
if (language.normalizer) {
|
|
167
|
-
normalized = language.normalizer(normalized);
|
|
168
|
-
}
|
|
169
|
-
if (removeDiacritics) {
|
|
170
|
-
normalized = stripDiacritics(normalized);
|
|
171
|
-
}
|
|
172
|
-
if (stem && language.stemmer) {
|
|
173
|
-
normalized = language.stemmer(normalized);
|
|
174
|
-
}
|
|
175
|
-
if (normalizationCacheSize >= maxCacheSize) {
|
|
176
|
-
evictOldestEntries(Math.max(1, maxCacheSize >>> 2));
|
|
177
|
-
bucket = getCacheBucket(language, flags);
|
|
178
|
-
}
|
|
179
|
-
bucket.set(raw, normalized);
|
|
180
|
-
normalizationCacheSize++;
|
|
181
|
-
return normalized;
|
|
182
|
-
}
|
|
183
|
-
function clearNormalizationCache() {
|
|
184
|
-
normalizationCache.clear();
|
|
185
|
-
normalizationCacheSize = 0;
|
|
186
|
-
cachedBucket = null;
|
|
187
|
-
}
|
|
188
|
-
function resetNormalizationCache() {
|
|
189
|
-
clearNormalizationCache();
|
|
190
|
-
maxCacheSize = computeDefaultCacheSize();
|
|
191
|
-
}
|
|
192
|
-
function getNormalizationCacheSize() {
|
|
193
|
-
return normalizationCacheSize;
|
|
194
|
-
}
|
|
195
|
-
|
|
196
|
-
// src/core/tokenizer/ngrams.ts
|
|
197
|
-
var OTHER_SCRIPT = 0;
|
|
198
|
-
var HAN_SCRIPT = 1;
|
|
199
|
-
var HIRAGANA_SCRIPT = 2;
|
|
200
|
-
var KATAKANA_SCRIPT = 3;
|
|
201
|
-
var HANGUL_SCRIPT = 4;
|
|
202
|
-
var THAI_SCRIPT = 5;
|
|
203
|
-
var LAO_SCRIPT = 6;
|
|
204
|
-
var KHMER_SCRIPT = 7;
|
|
205
|
-
var MYANMAR_SCRIPT = 8;
|
|
206
|
-
var PROLONGED_SOUND_MARK = 12540;
|
|
207
|
-
var IDEOGRAPHIC_ITERATION_MARK = 12293;
|
|
208
|
-
var LOWEST_NGRAM_CODE_POINT = 3584;
|
|
209
|
-
var LOWEST_MARK_CODE_POINT = 768;
|
|
210
|
-
var THAI_BLOCK_END = 3711;
|
|
211
|
-
var LAO_BLOCK_END = 3839;
|
|
212
|
-
var MYANMAR_BLOCK_START = 4096;
|
|
213
|
-
var MYANMAR_BLOCK_END = 4255;
|
|
214
|
-
var KHMER_BLOCK_START = 6016;
|
|
215
|
-
var KHMER_BLOCK_END = 6655;
|
|
216
|
-
var SOUTHEAST_ASIAN_BLOCKS_END = 6656;
|
|
217
|
-
var HIRAGANA_BLOCK_START = 12352;
|
|
218
|
-
var HIRAGANA_BLOCK_END = 12447;
|
|
219
|
-
var COMBINING_VOICED_MARK2 = 12441;
|
|
220
|
-
var COMBINING_SEMI_VOICED_MARK2 = 12442;
|
|
221
|
-
var KATAKANA_BLOCK_START = 12448;
|
|
222
|
-
var KATAKANA_BLOCK_END = 12543;
|
|
223
|
-
var HAN_EXTENSION_A_START = 13312;
|
|
224
|
-
var HAN_EXTENSION_A_END = 19903;
|
|
225
|
-
var HAN_UNIFIED_START = 19968;
|
|
226
|
-
var HAN_UNIFIED_END = 40959;
|
|
227
|
-
var HANGUL_SYLLABLE_START = 44032;
|
|
228
|
-
var HANGUL_SYLLABLE_END = 55203;
|
|
229
|
-
var HAN_COMPATIBILITY_START = 63744;
|
|
230
|
-
var HAN_COMPATIBILITY_END = 64255;
|
|
231
|
-
var SUPPLEMENTARY_PLANE_START = 65536;
|
|
232
|
-
var MARK = /\p{M}/uy;
|
|
233
|
-
var HAN = /\p{Script=Han}/uy;
|
|
234
|
-
var HIRAGANA = /\p{Script=Hiragana}/uy;
|
|
235
|
-
var KATAKANA = /\p{Script=Katakana}/uy;
|
|
236
|
-
var HANGUL = /\p{Script=Hangul}/uy;
|
|
237
|
-
var THAI = /\p{Script=Thai}/uy;
|
|
238
|
-
var LAO = /\p{Script=Lao}/uy;
|
|
239
|
-
var KHMER = /\p{Script=Khmer}/uy;
|
|
240
|
-
var MYANMAR = /\p{Script=Myanmar}/uy;
|
|
241
|
-
function matchesAt(pattern, part, index) {
|
|
242
|
-
pattern.lastIndex = index;
|
|
243
|
-
return pattern.test(part);
|
|
244
|
-
}
|
|
245
|
-
function isMark(part, index, codePoint) {
|
|
246
|
-
if (codePoint < LOWEST_MARK_CODE_POINT) return false;
|
|
247
|
-
if (codePoint >= HAN_UNIFIED_START && codePoint <= HAN_UNIFIED_END) return false;
|
|
248
|
-
if (codePoint >= HIRAGANA_BLOCK_START && codePoint <= KATAKANA_BLOCK_END) {
|
|
249
|
-
return codePoint === COMBINING_VOICED_MARK2 || codePoint === COMBINING_SEMI_VOICED_MARK2;
|
|
250
|
-
}
|
|
251
|
-
if (codePoint >= HANGUL_SYLLABLE_START && codePoint <= HANGUL_SYLLABLE_END) return false;
|
|
252
|
-
if (codePoint >= HAN_EXTENSION_A_START && codePoint <= HAN_EXTENSION_A_END) return false;
|
|
253
|
-
return matchesAt(MARK, part, index);
|
|
254
|
-
}
|
|
255
|
-
function classifyOutsideCommonBlocks(part, index) {
|
|
256
|
-
if (matchesAt(HAN, part, index)) return HAN_SCRIPT;
|
|
257
|
-
if (matchesAt(HIRAGANA, part, index)) return HIRAGANA_SCRIPT;
|
|
258
|
-
if (matchesAt(KATAKANA, part, index)) return KATAKANA_SCRIPT;
|
|
259
|
-
if (matchesAt(HANGUL, part, index)) return HANGUL_SCRIPT;
|
|
260
|
-
if (matchesAt(THAI, part, index)) return THAI_SCRIPT;
|
|
261
|
-
if (matchesAt(LAO, part, index)) return LAO_SCRIPT;
|
|
262
|
-
if (matchesAt(KHMER, part, index)) return KHMER_SCRIPT;
|
|
263
|
-
if (matchesAt(MYANMAR, part, index)) return MYANMAR_SCRIPT;
|
|
264
|
-
return OTHER_SCRIPT;
|
|
265
|
-
}
|
|
266
|
-
function classifySoutheastAsian(part, index, codePoint) {
|
|
267
|
-
if (codePoint <= THAI_BLOCK_END) return matchesAt(THAI, part, index) ? THAI_SCRIPT : OTHER_SCRIPT;
|
|
268
|
-
if (codePoint <= LAO_BLOCK_END) return matchesAt(LAO, part, index) ? LAO_SCRIPT : OTHER_SCRIPT;
|
|
269
|
-
if (codePoint >= MYANMAR_BLOCK_START && codePoint <= MYANMAR_BLOCK_END) {
|
|
270
|
-
return matchesAt(MYANMAR, part, index) ? MYANMAR_SCRIPT : OTHER_SCRIPT;
|
|
271
|
-
}
|
|
272
|
-
if (codePoint >= KHMER_BLOCK_START && codePoint <= KHMER_BLOCK_END) {
|
|
273
|
-
return matchesAt(KHMER, part, index) ? KHMER_SCRIPT : OTHER_SCRIPT;
|
|
274
|
-
}
|
|
275
|
-
return classifyOutsideCommonBlocks(part, index);
|
|
276
|
-
}
|
|
277
|
-
function classify(part, index, codePoint, current) {
|
|
278
|
-
if (codePoint < LOWEST_NGRAM_CODE_POINT) return OTHER_SCRIPT;
|
|
279
|
-
if (codePoint < SOUTHEAST_ASIAN_BLOCKS_END) return classifySoutheastAsian(part, index, codePoint);
|
|
280
|
-
if (codePoint === PROLONGED_SOUND_MARK) {
|
|
281
|
-
return current === HIRAGANA_SCRIPT ? HIRAGANA_SCRIPT : KATAKANA_SCRIPT;
|
|
282
|
-
}
|
|
283
|
-
if (codePoint >= HIRAGANA_BLOCK_START && codePoint <= HIRAGANA_BLOCK_END) return HIRAGANA_SCRIPT;
|
|
284
|
-
if (codePoint >= KATAKANA_BLOCK_START && codePoint <= KATAKANA_BLOCK_END) return KATAKANA_SCRIPT;
|
|
285
|
-
if (codePoint >= HAN_UNIFIED_START && codePoint <= HAN_UNIFIED_END) return HAN_SCRIPT;
|
|
286
|
-
if (codePoint >= HAN_EXTENSION_A_START && codePoint <= HAN_EXTENSION_A_END) return HAN_SCRIPT;
|
|
287
|
-
if (codePoint >= HANGUL_SYLLABLE_START && codePoint <= HANGUL_SYLLABLE_END) return HANGUL_SCRIPT;
|
|
288
|
-
if (codePoint >= HAN_COMPATIBILITY_START && codePoint <= HAN_COMPATIBILITY_END) return HAN_SCRIPT;
|
|
289
|
-
if (codePoint === IDEOGRAPHIC_ITERATION_MARK) return HAN_SCRIPT;
|
|
290
|
-
return classifyOutsideCommonBlocks(part, index);
|
|
291
|
-
}
|
|
292
|
-
function emitRun(part, offsets, kind, size, out) {
|
|
293
|
-
const count = offsets.length - 1;
|
|
294
|
-
if (count < 1) return;
|
|
295
|
-
if (kind === OTHER_SCRIPT || count <= size) {
|
|
296
|
-
out.push(part.slice(offsets[0], offsets[count]));
|
|
297
|
-
return;
|
|
298
|
-
}
|
|
299
|
-
for (let start = 0; start + size <= count; start++) {
|
|
300
|
-
out.push(part.slice(offsets[start], offsets[start + size]));
|
|
301
|
-
}
|
|
302
|
-
}
|
|
303
|
-
function expandNgrams(part, size, out) {
|
|
304
|
-
const length = part.length;
|
|
305
|
-
if (length === 0) return;
|
|
306
|
-
const offsets = [];
|
|
307
|
-
let kind = OTHER_SCRIPT;
|
|
308
|
-
let index = 0;
|
|
309
|
-
while (index < length) {
|
|
310
|
-
const codePoint = part.codePointAt(index);
|
|
311
|
-
if (codePoint === void 0) break;
|
|
312
|
-
const width = codePoint >= SUPPLEMENTARY_PLANE_START ? 2 : 1;
|
|
313
|
-
if (offsets.length > 0 && isMark(part, index, codePoint)) {
|
|
314
|
-
index += width;
|
|
315
|
-
continue;
|
|
316
|
-
}
|
|
317
|
-
const next = classify(part, index, codePoint, kind);
|
|
318
|
-
if (offsets.length > 0 && next !== kind) {
|
|
319
|
-
offsets.push(index);
|
|
320
|
-
emitRun(part, offsets, kind, size, out);
|
|
321
|
-
offsets.length = 0;
|
|
322
|
-
}
|
|
323
|
-
kind = next;
|
|
324
|
-
offsets.push(index);
|
|
325
|
-
index += width;
|
|
326
|
-
}
|
|
327
|
-
offsets.push(length);
|
|
328
|
-
emitRun(part, offsets, kind, size, out);
|
|
329
|
-
}
|
|
330
|
-
|
|
331
|
-
// src/core/tokenizer/tokenize.ts
|
|
332
|
-
function producesSurfaceForms(language, options) {
|
|
333
|
-
if (!options?.collectSurfaces || options.customTokenizer) return false;
|
|
334
|
-
return (options.stem ?? true) && language.stemmer !== null;
|
|
335
|
-
}
|
|
336
|
-
var DEFAULT_SPLIT_PATTERN = /[^\p{L}\p{M}\p{N}_'-]+/u;
|
|
337
|
-
function resolveStopWords(language, override) {
|
|
338
|
-
if (!override) return language.stopWords;
|
|
339
|
-
if (override instanceof Set) return override;
|
|
340
|
-
return override(language.stopWords);
|
|
341
|
-
}
|
|
342
|
-
function splitText(text, language) {
|
|
343
|
-
const pattern = language.tokenizer?.splitPattern ?? DEFAULT_SPLIT_PATTERN;
|
|
344
|
-
const parts = text.split(pattern);
|
|
345
|
-
const ngramSize = language.tokenizer?.ngramSize;
|
|
346
|
-
if (ngramSize === void 0 || ngramSize < 1) return parts;
|
|
347
|
-
const size = Math.floor(ngramSize);
|
|
348
|
-
const expanded = [];
|
|
349
|
-
for (const part of parts) {
|
|
350
|
-
expandNgrams(part, size, expanded);
|
|
351
|
-
}
|
|
352
|
-
return expanded;
|
|
353
|
-
}
|
|
354
|
-
var CHAR_APOSTROPHE = 39;
|
|
355
|
-
var CHAR_S = 115;
|
|
356
|
-
function stripPossessive(token) {
|
|
357
|
-
const len = token.length;
|
|
358
|
-
if (len >= 2 && token.charCodeAt(len - 1) === CHAR_S && token.charCodeAt(len - 2) === CHAR_APOSTROPHE) {
|
|
359
|
-
return token.slice(0, -2);
|
|
360
|
-
}
|
|
361
|
-
if (len >= 1 && token.charCodeAt(len - 1) === CHAR_APOSTROPHE) {
|
|
362
|
-
return token.slice(0, -1);
|
|
363
|
-
}
|
|
364
|
-
return token;
|
|
365
|
-
}
|
|
366
|
-
function visitTokens(text, language, options, visit) {
|
|
367
|
-
const {
|
|
368
|
-
stem = true,
|
|
369
|
-
removeStopWords = true,
|
|
370
|
-
removeDiacritics = false,
|
|
371
|
-
collectSurfaces = false,
|
|
372
|
-
customTokenizer,
|
|
373
|
-
stopWordOverride
|
|
374
|
-
} = options ?? {};
|
|
375
|
-
if (customTokenizer) {
|
|
376
|
-
for (const entry of customTokenizer.tokenize(text)) visit(entry.token, entry.position, void 0, entry.token);
|
|
377
|
-
return;
|
|
378
|
-
}
|
|
379
|
-
const rawParts = splitText(normalizeForSplitting(text), language);
|
|
380
|
-
const minLength = language.tokenizer?.minTokenLength ?? DEFAULT_MIN_TOKEN_LENGTH;
|
|
381
|
-
const effectiveDiacritics = removeDiacritics || (language.tokenizer?.normalizeDiacritics ?? false);
|
|
382
|
-
const wantSurfaces = collectSurfaces && stem && language.stemmer !== null;
|
|
383
|
-
const stopWords = removeStopWords ? resolveStopWords(language, stopWordOverride) : null;
|
|
384
|
-
const stripPossessives = language.tokenizer?.stripPossessive ?? false;
|
|
385
|
-
for (let position = 0; position < rawParts.length; position++) {
|
|
386
|
-
const part = rawParts[position];
|
|
387
|
-
const candidate = stripPossessives ? stripPossessive(part) : part;
|
|
388
|
-
if (candidate.length < minLength || stopWords?.has(candidate)) continue;
|
|
389
|
-
const processed = transformToken(candidate, language, stem, effectiveDiacritics);
|
|
390
|
-
if (processed.length === 0) continue;
|
|
391
|
-
if (!wantSurfaces) {
|
|
392
|
-
visit(processed, position, void 0, part);
|
|
393
|
-
continue;
|
|
394
|
-
}
|
|
395
|
-
const surface = effectiveDiacritics ? transformToken(candidate, language, false, true) : candidate;
|
|
396
|
-
visit(processed, position, surface === processed ? void 0 : surface, part);
|
|
397
|
-
}
|
|
398
|
-
}
|
|
399
|
-
function tokenize(text, language, options) {
|
|
400
|
-
if (options?.customTokenizer) {
|
|
401
|
-
const customResult = options.customTokenizer.tokenize(text);
|
|
402
|
-
return { tokens: customResult, originalTokens: customResult.map((entry) => entry.token) };
|
|
403
|
-
}
|
|
404
|
-
const tokens = [];
|
|
405
|
-
const originalTokens = [];
|
|
406
|
-
const surfaces = producesSurfaceForms(language, options) ? [] : void 0;
|
|
407
|
-
visitTokens(text, language, options, (token, position, surface, original) => {
|
|
408
|
-
tokens.push({ token, position });
|
|
409
|
-
originalTokens.push(original);
|
|
410
|
-
surfaces?.push(surface);
|
|
411
|
-
});
|
|
412
|
-
return { tokens, originalTokens, surfaces };
|
|
413
|
-
}
|
|
414
|
-
function* tokenizeIterator(text, language, options) {
|
|
415
|
-
const {
|
|
416
|
-
stem = true,
|
|
417
|
-
removeStopWords = true,
|
|
418
|
-
removeDiacritics = false,
|
|
419
|
-
collectSurfaces = false,
|
|
420
|
-
customTokenizer,
|
|
421
|
-
stopWordOverride
|
|
422
|
-
} = options ?? {};
|
|
423
|
-
if (customTokenizer) {
|
|
424
|
-
const customResult = customTokenizer.tokenize(text);
|
|
425
|
-
for (const entry of customResult) {
|
|
426
|
-
yield entry;
|
|
427
|
-
}
|
|
428
|
-
return;
|
|
429
|
-
}
|
|
430
|
-
const normalized = normalizeForSplitting(text);
|
|
431
|
-
const rawParts = splitText(normalized, language);
|
|
432
|
-
const minLength = language.tokenizer?.minTokenLength ?? DEFAULT_MIN_TOKEN_LENGTH;
|
|
433
|
-
const effectiveDiacritics = removeDiacritics || (language.tokenizer?.normalizeDiacritics ?? false);
|
|
434
|
-
const stemsTokens = stem && language.stemmer !== null;
|
|
435
|
-
const wantSurfaces = collectSurfaces && stemsTokens;
|
|
436
|
-
const stopWords = removeStopWords ? resolveStopWords(language, stopWordOverride) : /* @__PURE__ */ new Set();
|
|
437
|
-
const stripPossessives = language.tokenizer?.stripPossessive ?? false;
|
|
438
|
-
let position = 0;
|
|
439
|
-
for (const part of rawParts) {
|
|
440
|
-
const candidate = stripPossessives ? stripPossessive(part) : part;
|
|
441
|
-
if (candidate.length < minLength) {
|
|
442
|
-
position++;
|
|
443
|
-
continue;
|
|
444
|
-
}
|
|
445
|
-
if (stopWords.has(candidate)) {
|
|
446
|
-
position++;
|
|
447
|
-
continue;
|
|
448
|
-
}
|
|
449
|
-
const processed = transformToken(candidate, language, stem, effectiveDiacritics);
|
|
450
|
-
if (processed.length > 0) {
|
|
451
|
-
if (wantSurfaces) {
|
|
452
|
-
const surface = effectiveDiacritics ? transformToken(candidate, language, false, true) : candidate;
|
|
453
|
-
yield { token: processed, position, surface: surface === processed ? void 0 : surface };
|
|
454
|
-
} else {
|
|
455
|
-
yield { token: processed, position };
|
|
456
|
-
}
|
|
457
|
-
}
|
|
458
|
-
position++;
|
|
459
|
-
}
|
|
460
|
-
}
|
|
3
|
+
import { getFlatSchema, tokenize, getFieldValueByInternalId, getFieldValueForDoc, fuzzyTermMatches } from './chunk-I23G3IZC.mjs';
|
|
4
|
+
import { MAX_LATITUDE_DEGREES, MAX_LONGITUDE_DEGREES, MIN_POLYGON_POINTS, flattenSchema, parsedTypeOf, isStringValuedBase, withSortableOption, isGeopointOrVectorType, EARTH_RADIUS_METERS, RADIUS_BOX_MARGIN_RATIO, RADIUS_BOX_MARGIN_RADIANS, FULL_TURN_DEGREES, ANTIMERIDIAN_SPAN_DEGREES, PROTOTYPE_POLLUTION_KEYS, DEG_TO_RAD, LOCATION_CODE_BITS_PER_AXIS, isLatitude, isLongitude, isWordIndexedFieldType, partialFieldsOf, MAX_COVERING_CELLS } from './chunk-Z3DQPOJQ.mjs';
|
|
5
|
+
import { compareCodePoints, sortModeOf, defaultSortMode, SORT_VALUE_MAX_CODE_POINTS, toReducedSortValue, readSortField, compareComparableKeys, toComparableSortValue, exceedsCodePoints, holdsUnpairedSurrogate, isSortMode, SORT_MODES, compareSortValues, foldedCodePointCount, codePointCount } from './chunk-LJYTW7GT.mjs';
|
|
6
|
+
import { NarsilError, ErrorCodes } from './chunk-I64LXKO3.mjs';
|
|
461
7
|
|
|
462
8
|
// src/core/pattern-index/work-meter.ts
|
|
463
9
|
var COUNTER_BYTES = 8;
|
|
@@ -768,73 +314,6 @@ function heapPop(heap) {
|
|
|
768
314
|
return top;
|
|
769
315
|
}
|
|
770
316
|
|
|
771
|
-
// src/core/partition/utils.ts
|
|
772
|
-
function getOrCreateFieldNameIndex(table, fieldName) {
|
|
773
|
-
const existing = table.indexMap.get(fieldName);
|
|
774
|
-
if (existing !== void 0) return existing;
|
|
775
|
-
const idx = table.names.length;
|
|
776
|
-
table.names.push(fieldName);
|
|
777
|
-
table.indexMap.set(fieldName, idx);
|
|
778
|
-
return idx;
|
|
779
|
-
}
|
|
780
|
-
function getNestedValue(obj, path) {
|
|
781
|
-
const parts = path.split(".");
|
|
782
|
-
let current = obj;
|
|
783
|
-
for (let i = 0; i < parts.length; i++) {
|
|
784
|
-
if (current === null || current === void 0 || typeof current !== "object") return void 0;
|
|
785
|
-
if (!Object.hasOwn(current, parts[i])) return void 0;
|
|
786
|
-
current = current[parts[i]];
|
|
787
|
-
}
|
|
788
|
-
return current;
|
|
789
|
-
}
|
|
790
|
-
function stringArraysEqual(a, b) {
|
|
791
|
-
if (a === b) return true;
|
|
792
|
-
if (!a || !b) return false;
|
|
793
|
-
if (a.length !== b.length) return false;
|
|
794
|
-
for (let i = 0; i < a.length; i++) {
|
|
795
|
-
if (a[i] !== b[i]) return false;
|
|
796
|
-
}
|
|
797
|
-
return true;
|
|
798
|
-
}
|
|
799
|
-
function textFieldsChanged(oldDoc, newDoc, fields) {
|
|
800
|
-
for (const { path, base } of fields) {
|
|
801
|
-
if (!isWordIndexedBase(base)) continue;
|
|
802
|
-
const oldVal = getNestedValue(oldDoc, path);
|
|
803
|
-
const newVal = getNestedValue(newDoc, path);
|
|
804
|
-
if (base === "string") {
|
|
805
|
-
if (oldVal !== newVal) return true;
|
|
806
|
-
} else {
|
|
807
|
-
if (!stringArraysEqual(oldVal, newVal)) return true;
|
|
808
|
-
}
|
|
809
|
-
}
|
|
810
|
-
return false;
|
|
811
|
-
}
|
|
812
|
-
function tokenizeOptions(options) {
|
|
813
|
-
return {
|
|
814
|
-
stem: true,
|
|
815
|
-
removeStopWords: true,
|
|
816
|
-
collectSurfaces: options?.collectSurfaces === true,
|
|
817
|
-
stopWordOverride: options?.stopWordOverride,
|
|
818
|
-
customTokenizer: options?.customTokenizer
|
|
819
|
-
};
|
|
820
|
-
}
|
|
821
|
-
function getFlatSchema(state, schema) {
|
|
822
|
-
if (state.lastSchemaRef === schema && state.flatSchemaCache) return state.flatSchemaCache;
|
|
823
|
-
state.flatSchemaCache = flattenSchema(schema);
|
|
824
|
-
state.lastSchemaRef = schema;
|
|
825
|
-
return state.flatSchemaCache;
|
|
826
|
-
}
|
|
827
|
-
function getFieldValueForDoc(docStore, docId, fieldPath) {
|
|
828
|
-
const stored = docStore.get(docId);
|
|
829
|
-
if (!stored) return void 0;
|
|
830
|
-
return getNestedValue(stored.fields, fieldPath);
|
|
831
|
-
}
|
|
832
|
-
function getFieldValueByInternalId(docStore, internalId, fieldPath) {
|
|
833
|
-
const externalId = docStore.getExternalId(internalId);
|
|
834
|
-
if (externalId === void 0) return void 0;
|
|
835
|
-
return getFieldValueForDoc(docStore, externalId, fieldPath);
|
|
836
|
-
}
|
|
837
|
-
|
|
838
317
|
// src/core/partition/facets.ts
|
|
839
318
|
var UNDECLARED_FIELD_TYPE = "";
|
|
840
319
|
function keptFacetValues(limit) {
|
|
@@ -1034,67 +513,6 @@ function mergeFacets(partitionFacets, config) {
|
|
|
1034
513
|
return result;
|
|
1035
514
|
}
|
|
1036
515
|
|
|
1037
|
-
// src/core/fuzzy.ts
|
|
1038
|
-
var FIRST_SURROGATE = 55296;
|
|
1039
|
-
var LAST_SURROGATE = 57343;
|
|
1040
|
-
var LAST_BASIC_PLANE_CODE_POINT = 65535;
|
|
1041
|
-
function hasSurrogate(text) {
|
|
1042
|
-
for (let index = 0; index < text.length; index++) {
|
|
1043
|
-
const unit = text.charCodeAt(index);
|
|
1044
|
-
if (unit >= FIRST_SURROGATE && unit <= LAST_SURROGATE) return true;
|
|
1045
|
-
}
|
|
1046
|
-
return false;
|
|
1047
|
-
}
|
|
1048
|
-
function fuzzyPrefixOf(queryTerm, prefixLength) {
|
|
1049
|
-
let end = 0;
|
|
1050
|
-
for (let counted = 0; counted < prefixLength && end < queryTerm.length; counted++) {
|
|
1051
|
-
const codePoint = queryTerm.codePointAt(end);
|
|
1052
|
-
end += codePoint !== void 0 && codePoint > LAST_BASIC_PLANE_CODE_POINT ? 2 : 1;
|
|
1053
|
-
}
|
|
1054
|
-
return queryTerm.slice(0, end);
|
|
1055
|
-
}
|
|
1056
|
-
function fuzzyTermMatches(queryTerm, indexTerm, tolerance, prefixLength) {
|
|
1057
|
-
if (queryTerm === indexTerm) return true;
|
|
1058
|
-
if (tolerance <= 0) return false;
|
|
1059
|
-
if (!indexTerm.startsWith(fuzzyPrefixOf(queryTerm, prefixLength))) return false;
|
|
1060
|
-
return boundedLevenshtein(queryTerm, indexTerm, tolerance).withinTolerance;
|
|
1061
|
-
}
|
|
1062
|
-
function boundedLevenshtein(a, b, tolerance) {
|
|
1063
|
-
if (tolerance < 0) return { distance: -1, withinTolerance: false };
|
|
1064
|
-
if (a === b) return { distance: 0, withinTolerance: true };
|
|
1065
|
-
if (hasSurrogate(a) || hasSurrogate(b)) return bandedDistance(Array.from(a), Array.from(b), tolerance);
|
|
1066
|
-
return bandedDistance(a, b, tolerance);
|
|
1067
|
-
}
|
|
1068
|
-
function bandedDistance(a, b, tolerance) {
|
|
1069
|
-
const m = a.length;
|
|
1070
|
-
const n = b.length;
|
|
1071
|
-
const beyond = tolerance + 1;
|
|
1072
|
-
if (Math.abs(m - n) > tolerance) return { distance: beyond, withinTolerance: false };
|
|
1073
|
-
let previous = new Uint32Array(n + 1).fill(beyond);
|
|
1074
|
-
let current = new Uint32Array(n + 1).fill(beyond);
|
|
1075
|
-
const firstRowEnd = Math.min(n, tolerance);
|
|
1076
|
-
for (let j = 0; j <= firstRowEnd; j++) previous[j] = j;
|
|
1077
|
-
for (let i = 1; i <= m; i++) {
|
|
1078
|
-
const low = Math.max(1, i - tolerance);
|
|
1079
|
-
const high = Math.min(n, i + tolerance);
|
|
1080
|
-
current[low - 1] = low === 1 ? i : beyond;
|
|
1081
|
-
let rowMin = current[low - 1];
|
|
1082
|
-
const character = a[i - 1];
|
|
1083
|
-
for (let j = low; j <= high; j++) {
|
|
1084
|
-
const substitution = previous[j - 1] + (character === b[j - 1] ? 0 : 1);
|
|
1085
|
-
const cell = Math.min(previous[j] + 1, current[j - 1] + 1, substitution, beyond);
|
|
1086
|
-
current[j] = cell;
|
|
1087
|
-
if (cell < rowMin) rowMin = cell;
|
|
1088
|
-
}
|
|
1089
|
-
if (rowMin > tolerance) return { distance: beyond, withinTolerance: false };
|
|
1090
|
-
const finished = previous;
|
|
1091
|
-
previous = current;
|
|
1092
|
-
current = finished;
|
|
1093
|
-
}
|
|
1094
|
-
const distance = previous[n];
|
|
1095
|
-
return { distance, withinTolerance: distance <= tolerance };
|
|
1096
|
-
}
|
|
1097
|
-
|
|
1098
516
|
// src/search/cursor-codec.ts
|
|
1099
517
|
function encodeCursorText(text) {
|
|
1100
518
|
if (typeof Buffer !== "undefined") return Buffer.from(text, "utf-8").toString("base64");
|
|
@@ -2059,36 +1477,120 @@ function applyPagination(results, limit, offset, binding, cursor, sort, pinnedId
|
|
|
2059
1477
|
return { paginated: sliced, nextCursor };
|
|
2060
1478
|
}
|
|
2061
1479
|
|
|
2062
|
-
// src/search/
|
|
2063
|
-
function
|
|
2064
|
-
const term = params.term;
|
|
2065
|
-
if (term === void 0) return void 0;
|
|
1480
|
+
// src/search/term-groups.ts
|
|
1481
|
+
function writtenWordsByPosition(term, language, analysis) {
|
|
2066
1482
|
const unstemmed = tokenize(term, language, {
|
|
2067
1483
|
stem: false,
|
|
2068
1484
|
removeStopWords: true,
|
|
2069
|
-
customTokenizer:
|
|
2070
|
-
stopWordOverride:
|
|
1485
|
+
customTokenizer: analysis?.customTokenizer,
|
|
1486
|
+
stopWordOverride: analysis?.stopWords
|
|
2071
1487
|
});
|
|
2072
|
-
|
|
2073
|
-
for (const
|
|
2074
|
-
if (
|
|
2075
|
-
|
|
2076
|
-
|
|
1488
|
+
const written = /* @__PURE__ */ new Map();
|
|
1489
|
+
for (const token of unstemmed.tokens) {
|
|
1490
|
+
if (!written.has(token.position)) written.set(token.position, token.token);
|
|
1491
|
+
}
|
|
1492
|
+
return written;
|
|
1493
|
+
}
|
|
1494
|
+
function groupFor(groups, token, typoMatches) {
|
|
1495
|
+
let group = groups.get(token);
|
|
1496
|
+
if (group === void 0) {
|
|
1497
|
+
group = { token, members: [{ token, factor: 1, partialFactor: 1 }], typoMatches };
|
|
1498
|
+
groups.set(token, group);
|
|
1499
|
+
}
|
|
1500
|
+
return group;
|
|
1501
|
+
}
|
|
1502
|
+
function addCompletions(groups, partition, lastToken, typedPrefix) {
|
|
1503
|
+
if (typedPrefix === void 0 || typedPrefix.length === 0) return;
|
|
1504
|
+
const group = groupFor(groups, lastToken.token, false);
|
|
1505
|
+
const ownLength = codePointCount(lastToken.token);
|
|
1506
|
+
for (const completion of partition.expandTermPrefix(typedPrefix, lastToken.token, PREFIX_MAX_EXPANSIONS)) {
|
|
1507
|
+
if (completion === lastToken.token) continue;
|
|
1508
|
+
const factor = Math.min(1, ownLength / codePointCount(completion));
|
|
1509
|
+
group.members.push({ token: completion, factor, partialFactor: factor });
|
|
1510
|
+
}
|
|
1511
|
+
}
|
|
1512
|
+
function addPartialWords(group, added) {
|
|
1513
|
+
const membersByToken = /* @__PURE__ */ new Map();
|
|
1514
|
+
for (const member of group.members) membersByToken.set(member.token, member);
|
|
1515
|
+
for (const word of added) {
|
|
1516
|
+
const member = membersByToken.get(word.token);
|
|
1517
|
+
if (member === void 0) {
|
|
1518
|
+
group.members.push({ token: word.token, factor: 0, partialFactor: word.factor });
|
|
1519
|
+
} else if (word.factor > member.partialFactor) {
|
|
1520
|
+
member.partialFactor = word.factor;
|
|
2077
1521
|
}
|
|
2078
1522
|
}
|
|
2079
|
-
|
|
2080
|
-
|
|
2081
|
-
|
|
2082
|
-
|
|
2083
|
-
|
|
1523
|
+
}
|
|
1524
|
+
function partialWordAnalysisOf(fields, language, analysis) {
|
|
1525
|
+
return {
|
|
1526
|
+
fields,
|
|
1527
|
+
language,
|
|
1528
|
+
options: {
|
|
1529
|
+
stopWordOverride: analysis?.stopWords,
|
|
1530
|
+
customTokenizer: analysis?.customTokenizer,
|
|
1531
|
+
collectSurfaces: true
|
|
1532
|
+
}
|
|
1533
|
+
};
|
|
1534
|
+
}
|
|
1535
|
+
function searchesAPartialField(params, partialFields) {
|
|
1536
|
+
if (params.fields === void 0) return true;
|
|
1537
|
+
for (const field of params.fields) {
|
|
1538
|
+
if (partialFields.includes(field)) return true;
|
|
2084
1539
|
}
|
|
2085
|
-
|
|
2086
|
-
|
|
2087
|
-
|
|
1540
|
+
return false;
|
|
1541
|
+
}
|
|
1542
|
+
function partialWordRequests(params, queryTokens, written, prefixToken) {
|
|
1543
|
+
const eligible = [];
|
|
1544
|
+
for (const queryToken of queryTokens) {
|
|
1545
|
+
const word = written.get(queryToken.position);
|
|
1546
|
+
if (word === void 0 || codePointCount(word) < PARTIAL_WORD_MIN_CODE_POINTS) continue;
|
|
1547
|
+
eligible.push({ token: queryToken.token, written: word });
|
|
1548
|
+
if (eligible.length === PARTIAL_WORDS_ADDED_PER_QUERY) break;
|
|
1549
|
+
}
|
|
1550
|
+
const count = eligible.length;
|
|
1551
|
+
if (count === 0) return [];
|
|
1552
|
+
const evenShare = Math.floor(PARTIAL_WORDS_ADDED_PER_QUERY / count);
|
|
1553
|
+
const remainder = PARTIAL_WORDS_ADDED_PER_QUERY % count;
|
|
1554
|
+
return eligible.map((entry, order) => ({
|
|
1555
|
+
token: entry.token,
|
|
1556
|
+
request: {
|
|
1557
|
+
written: entry.written,
|
|
1558
|
+
ownToken: entry.token,
|
|
1559
|
+
share: evenShare + (order < remainder ? 1 : 0),
|
|
1560
|
+
tolerance: entry.token === prefixToken ? 0 : params.tolerance ?? 0,
|
|
1561
|
+
prefixLength: params.prefixLength ?? DEFAULT_FUZZY_PREFIX_LENGTH
|
|
1562
|
+
}
|
|
1563
|
+
}));
|
|
1564
|
+
}
|
|
1565
|
+
function resolveTermGroups(partition, params, language, schema, queryTokens, lastToken, analysis) {
|
|
1566
|
+
const term = params.term;
|
|
1567
|
+
if (term === void 0 || params.exact === true) return {};
|
|
1568
|
+
const usesPrefix = params.prefix === true;
|
|
1569
|
+
const partialFields = params.partialWords === true ? partialFieldsOf(schema) : [];
|
|
1570
|
+
const usesPartialWords = partialFields.length > 0 && searchesAPartialField(params, partialFields);
|
|
1571
|
+
if (!usesPrefix && !usesPartialWords) return {};
|
|
1572
|
+
const written = writtenWordsByPosition(term, language, analysis);
|
|
1573
|
+
const groups = /* @__PURE__ */ new Map();
|
|
1574
|
+
if (usesPrefix) addCompletions(groups, partition, lastToken, written.get(lastToken.position));
|
|
1575
|
+
const prefixToken = groups.has(lastToken.token) ? lastToken.token : void 0;
|
|
1576
|
+
if (usesPartialWords) {
|
|
1577
|
+
const requests = partialWordRequests(params, queryTokens, written, prefixToken);
|
|
1578
|
+
const added = partition.expandPartialWords(
|
|
1579
|
+
partialWordAnalysisOf(partialFields, language, analysis),
|
|
1580
|
+
requests.map((entry) => entry.request)
|
|
1581
|
+
);
|
|
1582
|
+
for (let at = 0; at < requests.length; at++) {
|
|
1583
|
+
if (added[at].length === 0) continue;
|
|
1584
|
+
const token = requests[at].token;
|
|
1585
|
+
addPartialWords(groupFor(groups, token, token !== prefixToken), added[at]);
|
|
2088
1586
|
}
|
|
2089
1587
|
}
|
|
2090
|
-
|
|
1588
|
+
const termGroups = [...groups.values()];
|
|
1589
|
+
if (termGroups.length === 0) return {};
|
|
1590
|
+
return usesPartialWords ? { termGroups, partialFields: [...partialFields] } : { termGroups };
|
|
2091
1591
|
}
|
|
1592
|
+
|
|
1593
|
+
// src/search/fulltext.ts
|
|
2092
1594
|
function prepareFulltextQuery(partition, params, language, schema, options) {
|
|
2093
1595
|
if (!params.term || params.term.trim().length === 0) return null;
|
|
2094
1596
|
if (params.fields && params.fields.length === 0) return null;
|
|
@@ -2104,11 +1606,6 @@ function prepareFulltextQuery(partition, params, language, schema, options) {
|
|
|
2104
1606
|
});
|
|
2105
1607
|
if (queryTokenResult.tokens.length === 0) return null;
|
|
2106
1608
|
const queryTokens = deduplicateTokens(queryTokenResult.tokens);
|
|
2107
|
-
let prefixExpansion;
|
|
2108
|
-
if (params.prefix === true && params.exact !== true) {
|
|
2109
|
-
const lastToken = queryTokenResult.tokens[queryTokenResult.tokens.length - 1];
|
|
2110
|
-
prefixExpansion = resolvePrefixExpansion(partition, params, language, options, queryTokens, lastToken);
|
|
2111
|
-
}
|
|
2112
1609
|
let filterBitset;
|
|
2113
1610
|
if (params.filters) {
|
|
2114
1611
|
filterBitset = partition.applyFiltersBitset(
|
|
@@ -2118,14 +1615,17 @@ function prepareFulltextQuery(partition, params, language, schema, options) {
|
|
|
2118
1615
|
);
|
|
2119
1616
|
if (bitsetIsEmpty(filterBitset)) return null;
|
|
2120
1617
|
}
|
|
2121
|
-
|
|
1618
|
+
const lastToken = queryTokenResult.tokens[queryTokenResult.tokens.length - 1];
|
|
1619
|
+
const groups = resolveTermGroups(partition, params, language, schema, queryTokens, lastToken, options);
|
|
1620
|
+
return { queryTokens, ...groups, filterBitset };
|
|
2122
1621
|
}
|
|
2123
1622
|
function fulltextMatches(partition, params, language, schema, options) {
|
|
2124
1623
|
const prepared = prepareFulltextQuery(partition, params, language, schema, options);
|
|
2125
1624
|
if (prepared === null) return null;
|
|
2126
1625
|
return partition.searchFulltextMatches({
|
|
2127
1626
|
queryTokens: prepared.queryTokens,
|
|
2128
|
-
|
|
1627
|
+
termGroups: prepared.termGroups,
|
|
1628
|
+
partialFields: prepared.partialFields,
|
|
2129
1629
|
fields: params.fields,
|
|
2130
1630
|
tolerance: params.tolerance ?? 0,
|
|
2131
1631
|
prefixLength: params.prefixLength ?? DEFAULT_FUZZY_PREFIX_LENGTH,
|
|
@@ -2138,14 +1638,15 @@ function fulltextSearch(partition, params, language, schema, options) {
|
|
|
2138
1638
|
if (prepared === null) {
|
|
2139
1639
|
return { scored: [], totalMatched: 0 };
|
|
2140
1640
|
}
|
|
2141
|
-
const { queryTokens,
|
|
1641
|
+
const { queryTokens, termGroups, partialFields, filterBitset } = prepared;
|
|
2142
1642
|
const needsAllResults = params.minScore !== void 0 || params.termMatch !== void 0 && params.termMatch !== "any" || params.sort !== void 0 || params.group !== void 0 || params.pinned !== void 0 || params.searchAfter !== void 0;
|
|
2143
1643
|
const maxResults = needsAllResults ? void 0 : clampRowCount(params.limit, DEFAULT_PAGE_SIZE) + clampRowCount(params.offset, 0) + 1;
|
|
2144
1644
|
const collectMatchedSet = params.facets !== void 0 && !needsAllResults ? "ordinals" : void 0;
|
|
2145
1645
|
const collectComponents = params.includeScoreComponents === true || params.termMatch !== void 0 && params.termMatch !== "any";
|
|
2146
1646
|
const rawResult = partition.searchFulltext({
|
|
2147
1647
|
queryTokens,
|
|
2148
|
-
|
|
1648
|
+
termGroups,
|
|
1649
|
+
partialFields,
|
|
2149
1650
|
fields: params.fields,
|
|
2150
1651
|
boost: params.boost,
|
|
2151
1652
|
tolerance: params.tolerance ?? 0,
|
|
@@ -2169,7 +1670,8 @@ function fulltextSearch(partition, params, language, schema, options) {
|
|
|
2169
1670
|
params.tolerance ?? 0,
|
|
2170
1671
|
params.prefixLength ?? DEFAULT_FUZZY_PREFIX_LENGTH,
|
|
2171
1672
|
params.exact ?? false,
|
|
2172
|
-
|
|
1673
|
+
termGroups,
|
|
1674
|
+
partialFields ?? []
|
|
2173
1675
|
);
|
|
2174
1676
|
}
|
|
2175
1677
|
if (params.minScore !== void 0 && params.minScore > 0) {
|
|
@@ -2211,45 +1713,48 @@ function deduplicateTokens(tokens) {
|
|
|
2211
1713
|
}
|
|
2212
1714
|
return result;
|
|
2213
1715
|
}
|
|
2214
|
-
function filterByTermCoverage(scored, queryTokens, policy, tolerance, prefixLength, exact,
|
|
1716
|
+
function filterByTermCoverage(scored, queryTokens, policy, tolerance, prefixLength, exact, termGroups, partialFields) {
|
|
2215
1717
|
const requiredCount = policy === "all" ? queryTokens.length : policy;
|
|
2216
1718
|
if (requiredCount <= 0) return scored;
|
|
2217
1719
|
if (requiredCount > queryTokens.length) return [];
|
|
2218
|
-
const
|
|
1720
|
+
const groups = /* @__PURE__ */ new Map();
|
|
1721
|
+
for (const group of termGroups ?? []) {
|
|
1722
|
+
const partialOnly = /* @__PURE__ */ new Set();
|
|
1723
|
+
for (const member of group.members) {
|
|
1724
|
+
if (member.factor === 0) partialOnly.add(member.token);
|
|
1725
|
+
}
|
|
1726
|
+
groups.set(group.token, {
|
|
1727
|
+
members: new Set(group.members.map((member) => member.token)),
|
|
1728
|
+
partialOnly,
|
|
1729
|
+
typoMatches: group.typoMatches
|
|
1730
|
+
});
|
|
1731
|
+
}
|
|
2219
1732
|
return scored.filter((doc) => {
|
|
2220
|
-
const matched = countDocTermMatches(
|
|
2221
|
-
doc,
|
|
2222
|
-
queryTokens,
|
|
2223
|
-
tolerance,
|
|
2224
|
-
prefixLength,
|
|
2225
|
-
exact,
|
|
2226
|
-
prefixExpansion?.token,
|
|
2227
|
-
expansionTerms
|
|
2228
|
-
);
|
|
1733
|
+
const matched = countDocTermMatches(doc, queryTokens, tolerance, prefixLength, exact, groups, partialFields);
|
|
2229
1734
|
return matched >= requiredCount;
|
|
2230
1735
|
});
|
|
2231
1736
|
}
|
|
2232
|
-
function countDocTermMatches(doc, queryTokens, tolerance, prefixLength, exact,
|
|
1737
|
+
function countDocTermMatches(doc, queryTokens, tolerance, prefixLength, exact, groups, partialFields) {
|
|
2233
1738
|
const indexTokens = Object.keys(doc.idf);
|
|
2234
1739
|
if (indexTokens.length === 0) return 0;
|
|
2235
1740
|
let count = 0;
|
|
2236
1741
|
for (const qt of queryTokens) {
|
|
2237
|
-
|
|
2238
|
-
|
|
2239
|
-
|
|
2240
|
-
}
|
|
2241
|
-
continue;
|
|
2242
|
-
}
|
|
2243
|
-
if (queryTermSatisfied(qt.token, indexTokens, tolerance, prefixLength, exact)) {
|
|
2244
|
-
count++;
|
|
2245
|
-
}
|
|
1742
|
+
const group = groups.get(qt.token);
|
|
1743
|
+
const satisfied = group === void 0 ? queryTermSatisfied(qt.token, indexTokens, tolerance, prefixLength, exact) : groupSatisfied(group, doc, indexTokens, partialFields) || group.typoMatches && queryTermSatisfied(qt.token, indexTokens, tolerance, prefixLength, exact);
|
|
1744
|
+
if (satisfied) count++;
|
|
2246
1745
|
}
|
|
2247
1746
|
return count;
|
|
2248
1747
|
}
|
|
2249
|
-
function
|
|
1748
|
+
function matchedInPartialField(doc, token, partialFields) {
|
|
1749
|
+
for (const field of partialFields) {
|
|
1750
|
+
if (doc.termFrequencies[`${field}:${token}`] !== void 0) return true;
|
|
1751
|
+
}
|
|
1752
|
+
return false;
|
|
1753
|
+
}
|
|
1754
|
+
function groupSatisfied(group, doc, indexTokens, partialFields) {
|
|
2250
1755
|
for (const indexToken of indexTokens) {
|
|
2251
|
-
if (indexToken
|
|
2252
|
-
if (
|
|
1756
|
+
if (!group.members.has(indexToken)) continue;
|
|
1757
|
+
if (!group.partialOnly.has(indexToken) || matchedInPartialField(doc, indexToken, partialFields)) return true;
|
|
2253
1758
|
}
|
|
2254
1759
|
return false;
|
|
2255
1760
|
}
|
|
@@ -2573,4 +2078,4 @@ function setNestedValue(obj, path, value) {
|
|
|
2573
2078
|
current[segments[segments.length - 1]] = value;
|
|
2574
2079
|
}
|
|
2575
2080
|
|
|
2576
|
-
export { GEO_UNIT_METRES, MAX_FILTER_ARRAY_SIZE, MAX_FILTER_DEPTH, MAX_FILTER_TESTS, applyPagination, applyProjection, applySorting,
|
|
2081
|
+
export { GEO_UNIT_METRES, MAX_FILTER_ARRAY_SIZE, MAX_FILTER_DEPTH, MAX_FILTER_TESTS, applyPagination, applyProjection, applySorting, clampRowCount, cloneProjected, collectQueryTermStats, computeFacets, countsWithoutScores, coveringRanges, createPatternWorkMeter, decodePageCursor, encodePageCursor, everyValueFacetConfig, fanOutMatchCount, fanOutQuery, filterTestCount, fnv1a, fnv1aBytes, fnv1aUint32s, fulltextMatches, joinPatternWorkMeter, kWayMerge, locationCode, mergeFacets, mergePartitionStats, normalizeSort, oversampledFacetConfig, oversampledShardSize, partitionsIn, polygonBoxes, polygonContainment, projectionKeepsField, pruneStatsToQueryTerms, radiusBoxes, readSortValues, requireMatchingCursor, requireSortableFields, requireValidFilter, requireValidOperands, requireWithinResultWindow, resolveProjection, sanitizeGlobalStats, setNestedValue, sortModesOf, sortSignatureEntry, sortSignatureOf, undeclaredFieldOnStrictIndex, undeclaredFilterField };
|