@delali/narsil 0.3.1-next.73 → 0.3.1-next.75
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/dist/{capabilities-CYeAWYxQ.d.ts → capabilities-BHNksicw.d.ts} +16 -2
- package/dist/{chunk-PU43WDY4.mjs → chunk-2E35UM3G.mjs} +1 -13
- package/dist/{chunk-AK3BLGCI.mjs → chunk-356UOTK2.mjs} +15 -48
- package/dist/chunk-7ODNRREZ.mjs +2050 -0
- package/dist/chunk-AIUOAN7Y.mjs +658 -0
- package/dist/{chunk-WVDFG45M.mjs → chunk-AMGDG4ZJ.mjs} +3 -2
- package/dist/{chunk-AFKH4ZK3.mjs → chunk-BT62MUM5.mjs} +1 -1
- package/dist/{chunk-LPBWCHBE.mjs → chunk-BT6BI4GV.mjs} +42 -4
- package/dist/{chunk-LJYTW7GT.mjs → chunk-IBR6634K.mjs} +1 -1
- package/dist/chunk-KEHK2O6P.mjs +13 -0
- package/dist/{chunk-CVFAFZSN.mjs → chunk-LOARLB4F.mjs} +46 -34
- package/dist/{chunk-3YKWSO54.mjs → chunk-NAMGDK45.mjs} +228 -649
- package/dist/{chunk-2WLD2NFW.mjs → chunk-PXDY5VRT.mjs} +3 -3
- package/dist/chunk-UOJIV2NG.mjs +593 -0
- package/dist/chunk-V3B24XR7.mjs +54 -0
- package/dist/{chunk-ZULSEZCE.mjs → chunk-WL2GDSCV.mjs} +100 -19
- package/dist/{chunk-THMSFOJO.mjs → chunk-YOVS4EV5.mjs} +582 -598
- package/dist/{client-D698E5ge.d.ts → client-D4sXFS9f.d.ts} +3 -3
- package/dist/client.d.ts +8 -8
- package/dist/{config-Bv8etwUZ.d.ts → config-B-GRonqw.d.ts} +2 -2
- package/dist/{config-QXU3HMpq.d.ts → config-C1kbq1X2.d.ts} +2 -2
- package/dist/direct-executor-AVNWB73C.mjs +16 -0
- package/dist/distribution/coordinator/etcd.d.ts +2 -2
- package/dist/distribution/coordinator/etcd.mjs +1 -1
- package/dist/distribution/coordinator/in-memory.d.ts +2 -2
- package/dist/distribution/coordinator/in-memory.mjs +1 -1
- package/dist/distribution.d.ts +8 -8
- package/dist/distribution.mjs +23 -13
- package/dist/{engine-D_OzKZ-6.d.ts → engine-DcGSd5vh.d.ts} +2 -2
- package/dist/index.browser.mjs +1272 -834
- package/dist/index.d.ts +27 -8
- package/dist/index.mjs +14 -11
- package/dist/invalidation/filesystem.mjs +1 -1
- package/dist/{memory-B4jMmygw.d.ts → memory-M9kPmYP8.d.ts} +1257 -1178
- 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 +2 -2
- package/dist/persistence/durability/checkpoint-worker.d.ts +33 -13
- package/dist/persistence/durability/checkpoint-worker.mjs +14 -11
- package/dist/react.d.ts +7 -7
- package/dist/{schema-BBOCdhND.d.ts → schema-DgyDijhf.d.ts} +6 -2
- package/dist/server.d.ts +10 -10
- package/dist/server.mjs +36 -11
- package/dist/{tasks-DpgCpW1x.d.ts → tasks-A8se0J98.d.ts} +1 -1
- package/dist/{thread-3LNVA43V.mjs → thread-BSIKT6ED.mjs} +16 -9
- 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 +3 -3
- package/package.json +16 -7
- package/dist/chunk-XW25X6AU.mjs +0 -614
- package/dist/chunk-ZKRV5M2P.mjs +0 -75
- package/dist/direct-executor-5SRDFZAS.mjs +0 -13
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { MAX_SORT_FIELDS } from './chunk-
|
|
2
|
-
import { nativeSearchCoreIsEnabled, loadNativeCore } from './chunk-
|
|
1
|
+
import { MAX_FILTER_DEPTH, MAX_SORT_FIELDS } from './chunk-V3B24XR7.mjs';
|
|
2
|
+
import { nativeSearchCoreIsEnabled, loadNativeCore } from './chunk-2E35UM3G.mjs';
|
|
3
3
|
import { NarsilError, ServerErrorCodes, ErrorCodes } from './chunk-I64LXKO3.mjs';
|
|
4
4
|
import { mkdtemp, open, rm } from 'fs/promises';
|
|
5
5
|
import { tmpdir } from 'os';
|
|
@@ -423,6 +423,43 @@ function serializeBatchResult(result) {
|
|
|
423
423
|
};
|
|
424
424
|
}
|
|
425
425
|
|
|
426
|
+
// src/server/regex-policy.ts
|
|
427
|
+
function isRecord(value) {
|
|
428
|
+
return value !== null && typeof value === "object" && !Array.isArray(value);
|
|
429
|
+
}
|
|
430
|
+
function regexFieldIn(expression, depth) {
|
|
431
|
+
if (!isRecord(expression) || depth > MAX_FILTER_DEPTH) return null;
|
|
432
|
+
if (isRecord(expression.fields)) {
|
|
433
|
+
for (const [fieldPath, filter] of Object.entries(expression.fields)) {
|
|
434
|
+
if (isRecord(filter) && Object.hasOwn(filter, "regex")) return fieldPath;
|
|
435
|
+
}
|
|
436
|
+
}
|
|
437
|
+
for (const nested of [expression.and, expression.or]) {
|
|
438
|
+
if (!Array.isArray(nested)) continue;
|
|
439
|
+
for (const child of nested) {
|
|
440
|
+
const found = regexFieldIn(child, depth + 1);
|
|
441
|
+
if (found !== null) return found;
|
|
442
|
+
}
|
|
443
|
+
}
|
|
444
|
+
return regexFieldIn(expression.not, depth + 1);
|
|
445
|
+
}
|
|
446
|
+
function refusedRegex(filters, allowRegex) {
|
|
447
|
+
if (allowRegex) return null;
|
|
448
|
+
const fieldPath = regexFieldIn(filters, 0);
|
|
449
|
+
if (fieldPath === null) return null;
|
|
450
|
+
return new NarsilError(
|
|
451
|
+
ErrorCodes.SEARCH_INVALID_FILTER,
|
|
452
|
+
`This server refuses every "regex" test, because its operator set the allowRegex server option to false. Test field "${fieldPath}" with "contains" or "wildcard"`,
|
|
453
|
+
{ fieldPath, operator: "regex", option: "allowRegex" }
|
|
454
|
+
);
|
|
455
|
+
}
|
|
456
|
+
function refuseRegex(ctx, filters, allowRegex) {
|
|
457
|
+
const refused = refusedRegex(filters, allowRegex);
|
|
458
|
+
if (refused === null) return false;
|
|
459
|
+
respondError(ctx, refused);
|
|
460
|
+
return true;
|
|
461
|
+
}
|
|
462
|
+
|
|
426
463
|
// src/server/validation.ts
|
|
427
464
|
function isPlainObject(value) {
|
|
428
465
|
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
@@ -616,7 +653,7 @@ function parseTaskListQuery(params, maxPageSize) {
|
|
|
616
653
|
|
|
617
654
|
// src/server/handlers/document-reads.ts
|
|
618
655
|
function createDocumentReadHandlers(deps) {
|
|
619
|
-
const { engine, limits } = deps;
|
|
656
|
+
const { engine, limits, allowRegex } = deps;
|
|
620
657
|
async function get(ctx) {
|
|
621
658
|
try {
|
|
622
659
|
const document = await engine.get(ctx.params[0], ctx.params[1]);
|
|
@@ -668,6 +705,7 @@ function createDocumentReadHandlers(deps) {
|
|
|
668
705
|
rejectInvalid(ctx, failure);
|
|
669
706
|
return;
|
|
670
707
|
}
|
|
708
|
+
if (refuseRegex(ctx, params.filters, allowRegex)) return;
|
|
671
709
|
try {
|
|
672
710
|
respondJson(ctx, await engine.listDocuments(ctx.params[0], params));
|
|
673
711
|
} catch (err) {
|
|
@@ -1155,4 +1193,4 @@ function childAppOf(app) {
|
|
|
1155
1193
|
return candidate;
|
|
1156
1194
|
}
|
|
1157
1195
|
|
|
1158
|
-
export { ASYNC_IMPORT_CAPABILITY, DEFAULT_IMPORT_BATCH_SIZE, DEFAULT_MAX_BODY_BYTES, DEFAULT_MAX_CONCURRENT_REQUESTS, DEFAULT_MAX_CONCURRENT_TASKS, DEFAULT_MAX_FETCH_DOCUMENTS, DEFAULT_MAX_IMPORT_BYTES, DEFAULT_MAX_IMPORT_ERRORS, DEFAULT_MAX_LINE_BYTES, DEFAULT_MAX_RESTORE_BYTES, DEFAULT_MAX_RESULT_WINDOW, DEFAULT_MAX_RETAINED_TASKS, DEFAULT_MAX_TASK_PAGE_SIZE, DEFAULT_TASK_PAGE_SIZE, DOCUMENT_EXPORT_CAPABILITY, DOCUMENT_EXPORT_CONTENT_TYPE, IMPORT_FLUSHES_IN_FLIGHT, INDEX_LIFECYCLE_CAPABILITY, INDEX_TOUCH_INTERVALS_PER_IDLE_TIMEOUT, MAIN_THREAD_GATE_SLOT, MAX_INDEX_TOUCH_INTERVAL_MS, MIN_COUNTED_SERVER_LIMIT, MIN_UNBOUNDED_SERVER_LIMIT, REBUILD_ANALYSIS_CAPABILITY, RELAY_STREAM_CHUNKS_IN_FLIGHT, RUNNING_TASK_TTL_MS, SERVER_CAPABILITIES, SNAPSHOT_ARCHIVE_CONTENT_TYPE, TASK_CANCEL_CAPABILITY, TASK_FILTER_CAPABILITY, TASK_PROGRESS_WRITE_INTERVAL_MS, TERMINAL_TASK_TTL_MS, acceptorOf, authorizerFor, badRequest, childAppOf, clearGateSlot, corsHeaderReader, createDocumentReadHandlers, createRouteRunner, createSharedGateBuffer, createSharedRequestGate, createVersionHandler, gateSlotOfWorker, httpStatusForNarsilError, loadUWebSockets, parseJson, parseJsonOptional, parseTaskListQuery, registerServerRoutes, rejectInvalid, resolveCors, respondError, respondJson, sendError, sendRelayed, sendStream, serializeBatchResult, serializeNarsilError, serverRoutes, statusLine, toHttpError, validateBatch, validateCreateIndex, validateDocumentBody, validateQuery, validateRebalance, validateSuggest, versionReport };
|
|
1196
|
+
export { ASYNC_IMPORT_CAPABILITY, DEFAULT_IMPORT_BATCH_SIZE, DEFAULT_MAX_BODY_BYTES, DEFAULT_MAX_CONCURRENT_REQUESTS, DEFAULT_MAX_CONCURRENT_TASKS, DEFAULT_MAX_FETCH_DOCUMENTS, DEFAULT_MAX_IMPORT_BYTES, DEFAULT_MAX_IMPORT_ERRORS, DEFAULT_MAX_LINE_BYTES, DEFAULT_MAX_RESTORE_BYTES, DEFAULT_MAX_RESULT_WINDOW, DEFAULT_MAX_RETAINED_TASKS, DEFAULT_MAX_TASK_PAGE_SIZE, DEFAULT_TASK_PAGE_SIZE, DOCUMENT_EXPORT_CAPABILITY, DOCUMENT_EXPORT_CONTENT_TYPE, IMPORT_FLUSHES_IN_FLIGHT, INDEX_LIFECYCLE_CAPABILITY, INDEX_TOUCH_INTERVALS_PER_IDLE_TIMEOUT, MAIN_THREAD_GATE_SLOT, MAX_INDEX_TOUCH_INTERVAL_MS, MIN_COUNTED_SERVER_LIMIT, MIN_UNBOUNDED_SERVER_LIMIT, REBUILD_ANALYSIS_CAPABILITY, RELAY_STREAM_CHUNKS_IN_FLIGHT, RUNNING_TASK_TTL_MS, SERVER_CAPABILITIES, SNAPSHOT_ARCHIVE_CONTENT_TYPE, TASK_CANCEL_CAPABILITY, TASK_FILTER_CAPABILITY, TASK_PROGRESS_WRITE_INTERVAL_MS, TERMINAL_TASK_TTL_MS, acceptorOf, authorizerFor, badRequest, childAppOf, clearGateSlot, corsHeaderReader, createDocumentReadHandlers, createRouteRunner, createSharedGateBuffer, createSharedRequestGate, createVersionHandler, gateSlotOfWorker, httpStatusForNarsilError, loadUWebSockets, parseJson, parseJsonOptional, parseTaskListQuery, refuseRegex, registerServerRoutes, rejectInvalid, resolveCors, respondError, respondJson, sendError, sendRelayed, sendStream, serializeBatchResult, serializeNarsilError, serverRoutes, statusLine, toHttpError, validateBatch, validateCreateIndex, validateDocumentBody, validateQuery, validateRebalance, validateSuggest, versionReport };
|
|
@@ -290,4 +290,4 @@ function compareSortValues(aValues, bValues, directions) {
|
|
|
290
290
|
return 0;
|
|
291
291
|
}
|
|
292
292
|
|
|
293
|
-
export { SORT_MODES, SORT_VALUE_MAX_CODE_POINTS, appendFoldedCodePoint, codePointCount, compareCodePoints, compareComparableKeys, compareComparableValues, compareSortValues, defaultSortMode, exceedsCodePoints, foldedCodePointCount, holdsUnpairedSurrogate, isSortMode, readSortField, sortModeOf, toComparableSortValue, toReducedSortValue, truncateSortString };
|
|
293
|
+
export { SORT_MODES, SORT_VALUE_MAX_CODE_POINTS, appendFoldedCodePoint, codePointCount, compareCodePoints, compareComparableKeys, compareComparableValues, compareSortValues, defaultSortMode, exceedsCodePoints, foldedCodePointCount, holdsUnpairedSurrogate, isSortMode, readSortField, singleFoldTable, sortModeOf, toComparableSortValue, toReducedSortValue, truncateSortString };
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
// src/vector/hnsw/constants.ts
|
|
2
|
+
var MAX_LAYER_CAP = 32;
|
|
3
|
+
var MAX_M = 512;
|
|
4
|
+
var MIN_M = 2;
|
|
5
|
+
var EARLIER_RELEASE_MIN_M = 1;
|
|
6
|
+
var INITIAL_UPPER_SLOTS = 64;
|
|
7
|
+
var INITIAL_LIST_CAPACITY = 64;
|
|
8
|
+
var PLACEMENT_ROOM_REQUESTS = 8;
|
|
9
|
+
var COMPACTION_TOMBSTONE_RATIO = 0.1;
|
|
10
|
+
var COMPACTION_ABSOLUTE_THRESHOLD = 1e3;
|
|
11
|
+
var DEFAULT_EF_SEARCH = 50;
|
|
12
|
+
|
|
13
|
+
export { COMPACTION_ABSOLUTE_THRESHOLD, COMPACTION_TOMBSTONE_RATIO, DEFAULT_EF_SEARCH, EARLIER_RELEASE_MIN_M, INITIAL_LIST_CAPACITY, INITIAL_UPPER_SLOTS, MAX_LAYER_CAP, MAX_M, MIN_M, PLACEMENT_ROOM_REQUESTS };
|
|
@@ -1,14 +1,17 @@
|
|
|
1
|
+
import { validateWorkerConfig, validateIndexName, validatePatternValueLimit, requireSurfaceFormsForPartialFields, validateBM25Params, validatePartitionConfig, executeQuery, queryBindingOf, executePreflight, executeSuggest, executeListDocuments, validateDocId } from './chunk-WL2GDSCV.mjs';
|
|
1
2
|
import { ReplicationMessageTypes } from './chunk-GCM3JFVA.mjs';
|
|
2
|
-
import { WIRE_BATCH_BUDGET, resolveVectorText, bindEngineCore, restoredConfigFields, restoredEmbedding, collectRequiredFieldFailures, embedChunkDocuments, providedDocId, requireDocumentObject, admitInsert, asBatchInsertError, requireMatchingDocId, embedDocumentFields, assertDocumentCarriesMappedVectors, admitBufferedUpsert, createPendingAdmissions, recordPendingAdmission } from './chunk-
|
|
3
|
-
import { NATIVE_CRC32_MIN_BYTES, generateId, decodeEveryStoredDocument, createSharedFrozenSegment, splitWorkerBudget, resolveWorkerCount, createDirectExecutor, createPartitionRouter,
|
|
3
|
+
import { WIRE_BATCH_BUDGET, resolveVectorText, bindEngineCore, restoredConfigFields, restoredEmbedding, collectRequiredFieldFailures, embedChunkDocuments, providedDocId, requireDocumentObject, admitInsert, asBatchInsertError, requireMatchingDocId, embedDocumentFields, assertDocumentCarriesMappedVectors, admitBufferedUpsert, createPendingAdmissions, recordPendingAdmission } from './chunk-BT62MUM5.mjs';
|
|
4
|
+
import { NATIVE_CRC32_MIN_BYTES, generateId, decodeEveryStoredDocument, createSharedFrozenSegment, shareSegmentArrays, splitWorkerBudget, resolveWorkerCount, createDirectExecutor, createPartitionRouter, requirePartialWordSearchFor, MAX_FILE_BYTES, resolveWorkerEntry, missingWorkerEntry, readHeapStatistics, nodeThreadId, CHECKSUM_YIELD_CHUNK_BYTES, createPartitionManager, buildSegmentPayload, resolvePartitionInsertOptions, createFrozenSegment, resolveRequestThreadCount, vectorsPerFile, vectorsToBytes, VECTOR_FILE_PAYLOAD_VERSION, deadBitsWhere, NO_LIVE_VECTOR_AT_POSITION, createPartitionIndex, selectionKeeps, decodeMapWithoutFields, isCompositePartition, segmentArraysOf, mergeSegmentContents, survivorDocumentsOf, partitionStateOf, VECTOR_FILE_MAX_VECTORS, deadBytesFor, resolveIndexAnalysis, mergeFrozenSegments, workerResourceLimits, decodeVectorIndexParts, bytesToVectors, freezeSegmentShared, DEFAULT_BACKPRESSURE_LIMIT, DEFAULT_REQUEST_TIMEOUT_MS, SHUTDOWN_TIMEOUT_MS, decodeVectorFilePayload, decodeVectorGraphPartPayload, assembleGraphParts, countDead, encodeSegmentState, CONSECUTIVE_TIMEOUTS_BEFORE_DEATH, VALID_HNSW_METRICS, spawnNodeWorker, decodeVectorGraphPayload, graphPartsOfEarlierPayload, decodeStoredDocument, isDead } from './chunk-YOVS4EV5.mjs';
|
|
5
|
+
import { requirePatternSearchFor, collectQueryTermStats, mergePartitionStats, oversampledFacetConfig, fnv1a, availablePatternSearch, kWayMerge, mergeFacets, PATTERN_HOST, setNestedValue } from './chunk-NAMGDK45.mjs';
|
|
4
6
|
import { detectRuntime, getLanguage } from './chunk-4MQ5F4IL.mjs';
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
8
|
-
import {
|
|
9
|
-
import {
|
|
10
|
-
import {
|
|
11
|
-
import {
|
|
7
|
+
import { MAX_INDEX_CONFIGURATION_BYTES, STATISTICS_BROADCAST_INTERVAL_MS, MAX_SWEEP_INTERVAL_MS, MIN_SWEEP_INTERVAL_MS, HEAP_PRESSURE_WARNING_FRACTION, MAX_EXPORT_LINE_BYTES, IMPORT_BATCH_DOCUMENTS, FOREIGN_STATS_TTL_MS, MAX_IMPORT_REFUSALS_REPORTED, BATCH_CHUNK_SIZE, MIN_DOCUMENTS_FOR_SEGMENTS, HEAP_PRESSURE_REARM_FRACTION, EXPORT_CHUNK_BYTES } from './chunk-V3B24XR7.mjs';
|
|
8
|
+
import { releaseLocksHeldBy } from './chunk-AMGDG4ZJ.mjs';
|
|
9
|
+
import { requireSearchBackendSettings } from './chunk-2E35UM3G.mjs';
|
|
10
|
+
import { DEFAULT_PATTERN_WORK_CAP, MATCHER_STATE_BUDGET_BYTES, PATTERN_TEST_OPERATORS, PATTERN_EXPRESSION_OPERATORS, MATCHER_CODE_POINT_BYTES, MATCHER_SIMULATION_BYTES_PER_POSITION, MATCHER_STATE_OVERHEAD_BYTES } from './chunk-7ODNRREZ.mjs';
|
|
11
|
+
import { getNestedValue, parseVectorDimension } from './chunk-UOJIV2NG.mjs';
|
|
12
|
+
import { extractVectorFieldsFromSchema, messagePackUpperBoundBytes, validateSchema, requireCreatableSchema, validateVectorPromotion, validateVectorStorage, raiseEarlierReleaseGraphSetting, flattenSchema, isSingleStringFieldType, requireValidFieldTypes, encodeDocument, VECTOR_PATTERN, schemaFieldsOf, MAX_DOCUMENT_NESTING_DEPTH, isQuantizationMode, isStorageMode, validateRequiredFields, requireDocumentWithinSizeLimit, validateDocument, validateDocumentStrict } from './chunk-356UOTK2.mjs';
|
|
13
|
+
import { MIN_M } from './chunk-KEHK2O6P.mjs';
|
|
14
|
+
import { compareCodePoints, foldedCodePointCount, codePointCount } from './chunk-IBR6634K.mjs';
|
|
12
15
|
import { createRequestId, isValidWorkerResponse, threadSlotOfWorker } from './chunk-POWOTUKJ.mjs';
|
|
13
16
|
import { ErrorCodes, NarsilError } from './chunk-I64LXKO3.mjs';
|
|
14
17
|
import { encode, decode } from '@msgpack/msgpack';
|
|
@@ -3502,7 +3505,7 @@ function selectionOfMask(segment, keep) {
|
|
|
3502
3505
|
}
|
|
3503
3506
|
function frozenLiveTail(live, shared) {
|
|
3504
3507
|
if (live.count() === 0) return null;
|
|
3505
|
-
const payload = live.encodeSegment();
|
|
3508
|
+
const payload = { ...live.encodeSegment(), partialSpellings: null };
|
|
3506
3509
|
const documents = survivorDocumentsOf(partitionStateOf(live), payload);
|
|
3507
3510
|
if (shared) {
|
|
3508
3511
|
const snapshot = freezeSegmentShared(payload, documents);
|
|
@@ -5018,6 +5021,7 @@ function emptyPayload() {
|
|
|
5018
5021
|
totalFieldLengths: {},
|
|
5019
5022
|
docFrequencies: {},
|
|
5020
5023
|
surfaceForms: null,
|
|
5024
|
+
partialSpellings: null,
|
|
5021
5025
|
numeric: [],
|
|
5022
5026
|
boolean: [],
|
|
5023
5027
|
enums: [],
|
|
@@ -5123,7 +5127,7 @@ function chooseWindow(segments, wantedLength) {
|
|
|
5123
5127
|
return null;
|
|
5124
5128
|
}
|
|
5125
5129
|
function frozenOf(contents) {
|
|
5126
|
-
return createSharedFrozenSegment(
|
|
5130
|
+
return createSharedFrozenSegment(shareSegmentArrays(contents.arrays, null));
|
|
5127
5131
|
}
|
|
5128
5132
|
function applyTimeOrder(frozen, contents) {
|
|
5129
5133
|
for (let newer = 1; newer < frozen.length; newer++) {
|
|
@@ -5391,7 +5395,7 @@ async function loadPartitionSegments(store, partition, manager, options) {
|
|
|
5391
5395
|
const contents = await readSegmentFile(store, ref);
|
|
5392
5396
|
requireAgreedSchema(options.schema, contents.schema, ref.key);
|
|
5393
5397
|
if (options.decodesEveryDocument) decodeEveryStoredDocument(contents.arrays.documentTable);
|
|
5394
|
-
const segment = createSharedFrozenSegment(
|
|
5398
|
+
const segment = createSharedFrozenSegment(shareSegmentArrays(contents.arrays, manager.partialWordAnalysis));
|
|
5395
5399
|
removeWhatTheSegmentReplaces(manager, segment, contents);
|
|
5396
5400
|
if (contents.arrays.documentCount > 0) manager.attachFrozenSegment(partition.partitionId, segment);
|
|
5397
5401
|
await yieldToEventLoop4();
|
|
@@ -7881,6 +7885,7 @@ async function createIndexFromMetadata(deps, metadata, loadData) {
|
|
|
7881
7885
|
try {
|
|
7882
7886
|
indexConfig.schema = validateSchema(indexConfig.schema);
|
|
7883
7887
|
validatePatternValueLimit(indexConfig.patternValueLimit);
|
|
7888
|
+
requireSurfaceFormsForPartialFields(indexConfig.schema, indexConfig.surfaceForms);
|
|
7884
7889
|
} catch (err) {
|
|
7885
7890
|
throw recoveryFailure(metadata, err);
|
|
7886
7891
|
}
|
|
@@ -8594,7 +8599,7 @@ function checkHeapAfterRecovery(core) {
|
|
|
8594
8599
|
}
|
|
8595
8600
|
|
|
8596
8601
|
// src/core/partition/frozen/share.ts
|
|
8597
|
-
function shareFrozenSegment(segment) {
|
|
8602
|
+
function shareFrozenSegment(segment, analysis) {
|
|
8598
8603
|
if (segment.sharedSnapshot !== null) {
|
|
8599
8604
|
return { snapshot: segment.sharedSnapshot, tombstonedDocIds: segment.tombstonedDocIds() };
|
|
8600
8605
|
}
|
|
@@ -8608,7 +8613,7 @@ function shareFrozenSegment(segment) {
|
|
|
8608
8613
|
}
|
|
8609
8614
|
return stored.fields;
|
|
8610
8615
|
});
|
|
8611
|
-
const snapshot = freezeSegmentShared(payload, documents, segment.segmentId);
|
|
8616
|
+
const snapshot = freezeSegmentShared(payload, documents, segment.segmentId, analysis);
|
|
8612
8617
|
return snapshot === null ? null : { snapshot, tombstonedDocIds: [] };
|
|
8613
8618
|
}
|
|
8614
8619
|
|
|
@@ -8619,7 +8624,7 @@ function captureComposite(manager, partitionId) {
|
|
|
8619
8624
|
const segmentIds = partition.frozenSegmentSizes().map((size) => size.segmentId);
|
|
8620
8625
|
const frozen = [];
|
|
8621
8626
|
for (const segment of partition.frozenSegmentsById(segmentIds)) {
|
|
8622
|
-
const shared = shareFrozenSegment(segment);
|
|
8627
|
+
const shared = shareFrozenSegment(segment, manager.partialWordAnalysis);
|
|
8623
8628
|
if (shared === null) return null;
|
|
8624
8629
|
frozen.push(shared);
|
|
8625
8630
|
}
|
|
@@ -9004,7 +9009,7 @@ function liveTailCount(manager, partitionId) {
|
|
|
9004
9009
|
}
|
|
9005
9010
|
function freezeIntoSharedSegment(manager, partitionId) {
|
|
9006
9011
|
return manager.freezeLiveTail(partitionId, (payload, documents) => {
|
|
9007
|
-
const snapshot = freezeSegmentShared(payload, documents);
|
|
9012
|
+
const snapshot = freezeSegmentShared(payload, documents, void 0, manager.partialWordAnalysis);
|
|
9008
9013
|
return snapshot === null ? null : createSharedFrozenSegment(snapshot);
|
|
9009
9014
|
});
|
|
9010
9015
|
}
|
|
@@ -9127,7 +9132,7 @@ async function compactPartitionSegments2(state, indexName, manager, partitionId,
|
|
|
9127
9132
|
const mainCanMerge = composite !== null && mainHoldsAll(composite, segmentIds);
|
|
9128
9133
|
let snapshot = await compactOnWorker(state, indexName, partitionId, segmentIds);
|
|
9129
9134
|
if (snapshot === null && mainCanMerge && composite !== null) {
|
|
9130
|
-
snapshot = mergeFrozenSegments(composite.frozenSegmentsById(segmentIds));
|
|
9135
|
+
snapshot = mergeFrozenSegments(composite.frozenSegmentsById(segmentIds), manager.partialWordAnalysis);
|
|
9131
9136
|
}
|
|
9132
9137
|
if (snapshot === null) {
|
|
9133
9138
|
if (!mainCanMerge) forgetLedgerSegments(state, indexName, partitionId, segmentIds);
|
|
@@ -10223,57 +10228,61 @@ var POSITIONS_PER_WORD = 32;
|
|
|
10223
10228
|
function positionWords(positions) {
|
|
10224
10229
|
return Math.max(1, Math.ceil(positions / POSITIONS_PER_WORD));
|
|
10225
10230
|
}
|
|
10226
|
-
function automatonBytes(positions) {
|
|
10227
|
-
return 2 * positionWords(positions) * Uint32Array.BYTES_PER_ELEMENT + positions * MATCHER_CODE_POINT_BYTES;
|
|
10228
|
-
}
|
|
10229
10231
|
function smallestMatcherBytes(positions) {
|
|
10230
|
-
return
|
|
10232
|
+
return 2 * positionWords(positions) * Uint32Array.BYTES_PER_ELEMENT + positions * MATCHER_CODE_POINT_BYTES + positions * MATCHER_SIMULATION_BYTES_PER_POSITION + MATCHER_STATE_OVERHEAD_BYTES + positions * Uint32Array.BYTES_PER_ELEMENT;
|
|
10231
10233
|
}
|
|
10232
|
-
function widestPatternSplit(
|
|
10233
|
-
return Math.max(1, Math.floor(MATCHER_STATE_BUDGET_BYTES /
|
|
10234
|
+
function widestPatternSplit(footprintBytes) {
|
|
10235
|
+
return Math.max(1, Math.floor(MATCHER_STATE_BUDGET_BYTES / Math.max(1, footprintBytes)));
|
|
10234
10236
|
}
|
|
10235
10237
|
|
|
10236
10238
|
// src/core/pattern-index/query-positions.ts
|
|
10237
10239
|
function isRecord4(value) {
|
|
10238
10240
|
return value !== null && typeof value === "object" && !Array.isArray(value);
|
|
10239
10241
|
}
|
|
10240
|
-
function
|
|
10241
|
-
if (typeof text !== "string") return
|
|
10242
|
-
return caseFold ? foldedCodePointCount(text) : codePointCount(text);
|
|
10242
|
+
function literalFootprint(text, caseFold) {
|
|
10243
|
+
if (typeof text !== "string") return null;
|
|
10244
|
+
return smallestMatcherBytes(caseFold ? foldedCodePointCount(text) : codePointCount(text));
|
|
10243
10245
|
}
|
|
10244
10246
|
function larger(left, right) {
|
|
10245
10247
|
if (left === null) return right;
|
|
10246
10248
|
if (right === null) return left;
|
|
10247
10249
|
return Math.max(left, right);
|
|
10248
10250
|
}
|
|
10249
|
-
function largestTestOf(filter) {
|
|
10251
|
+
function largestTestOf(filter, module) {
|
|
10250
10252
|
const caseFold = filter.caseFold === true;
|
|
10251
10253
|
let largest = null;
|
|
10252
10254
|
for (const operator of PATTERN_TEST_OPERATORS) {
|
|
10253
10255
|
const operand = filter[operator];
|
|
10254
10256
|
if (operand === void 0) continue;
|
|
10255
10257
|
const texts = Array.isArray(operand) ? operand : [operand];
|
|
10256
|
-
for (const text of texts) largest = larger(largest,
|
|
10258
|
+
for (const text of texts) largest = larger(largest, literalFootprint(text, caseFold));
|
|
10259
|
+
}
|
|
10260
|
+
for (const operator of PATTERN_EXPRESSION_OPERATORS) {
|
|
10261
|
+
const pattern = filter[operator];
|
|
10262
|
+
if (typeof pattern !== "string") continue;
|
|
10263
|
+
largest = larger(largest, module.expressionFootprint(operator, pattern, caseFold, PATTERN_HOST));
|
|
10257
10264
|
}
|
|
10258
10265
|
return largest;
|
|
10259
10266
|
}
|
|
10260
|
-
function largestIn(expression, patternFields) {
|
|
10267
|
+
function largestIn(expression, patternFields, module) {
|
|
10261
10268
|
let largest = null;
|
|
10262
10269
|
if (isRecord4(expression.fields)) {
|
|
10263
10270
|
for (const [fieldPath, filter] of Object.entries(expression.fields)) {
|
|
10264
|
-
if (patternFields.has(fieldPath) && isRecord4(filter)) largest = larger(largest, largestTestOf(filter));
|
|
10271
|
+
if (patternFields.has(fieldPath) && isRecord4(filter)) largest = larger(largest, largestTestOf(filter, module));
|
|
10265
10272
|
}
|
|
10266
10273
|
}
|
|
10267
10274
|
const nested = [...expression.and ?? [], ...expression.or ?? []];
|
|
10268
10275
|
if (expression.not !== void 0) nested.push(expression.not);
|
|
10269
|
-
for (const child of nested) largest = larger(largest, largestIn(child, patternFields));
|
|
10276
|
+
for (const child of nested) largest = larger(largest, largestIn(child, patternFields, module));
|
|
10270
10277
|
return largest;
|
|
10271
10278
|
}
|
|
10272
|
-
function
|
|
10279
|
+
function largestPatternFootprint(expression, schema) {
|
|
10273
10280
|
if (expression === void 0) return null;
|
|
10281
|
+
const module = availablePatternSearch();
|
|
10282
|
+
if (module === null) return null;
|
|
10274
10283
|
const patternFields = /* @__PURE__ */ new Set();
|
|
10275
10284
|
for (const { path, pattern } of schemaFieldsOf(schema)) if (pattern) patternFields.add(path);
|
|
10276
|
-
return patternFields.size === 0 ? null : largestIn(expression, patternFields);
|
|
10285
|
+
return patternFields.size === 0 ? null : largestIn(expression, patternFields, module);
|
|
10277
10286
|
}
|
|
10278
10287
|
|
|
10279
10288
|
// src/engine/orchestration/search.ts
|
|
@@ -10340,7 +10349,7 @@ function isWorkCapError(err) {
|
|
|
10340
10349
|
function patternSplitWidth(state, indexName, params) {
|
|
10341
10350
|
const schema = state.indexRegistry.get(indexName)?.config.schema;
|
|
10342
10351
|
if (schema === void 0) return Number.POSITIVE_INFINITY;
|
|
10343
|
-
const largest =
|
|
10352
|
+
const largest = largestPatternFootprint(params.filters, schema);
|
|
10344
10353
|
if (largest === null) return Number.POSITIVE_INFINITY;
|
|
10345
10354
|
if (typeof SharedArrayBuffer !== "function") return 1;
|
|
10346
10355
|
return widestPatternSplit(largest);
|
|
@@ -11117,7 +11126,9 @@ async function createEngineIndex(core, config, name, requestedConfig, creation =
|
|
|
11117
11126
|
if (appliesCreationLimits) requireCreatableSchema(schema);
|
|
11118
11127
|
const indexConfig = schema === requestedConfig.schema ? requestedConfig : { ...requestedConfig, schema };
|
|
11119
11128
|
requirePatternSearchFor(schema);
|
|
11129
|
+
requirePartialWordSearchFor(schema);
|
|
11120
11130
|
validatePatternValueLimit(indexConfig.patternValueLimit);
|
|
11131
|
+
requireSurfaceFormsForPartialFields(schema, indexConfig.surfaceForms);
|
|
11121
11132
|
validateVectorPromotion(indexConfig.vectorPromotion);
|
|
11122
11133
|
validateVectorStorage(indexConfig.vectorPromotion, core.filesystemDurability);
|
|
11123
11134
|
validateBM25Params(indexConfig.bm25);
|
|
@@ -13918,6 +13929,7 @@ function prepareRestoredIndex(configuration, deps, reject) {
|
|
|
13918
13929
|
const language = getLanguage(languageName);
|
|
13919
13930
|
const schema = validateSchema(configuration.schema);
|
|
13920
13931
|
validatePatternValueLimit(configFields.patternValueLimit);
|
|
13932
|
+
requireSurfaceFormsForPartialFields(schema, configFields.surfaceForms);
|
|
13921
13933
|
validateVectorPromotion(configFields.vectorPromotion);
|
|
13922
13934
|
validateVectorStorage(configFields.vectorPromotion, deps.filesystemDurability);
|
|
13923
13935
|
if (configFields.required !== void 0 && configFields.required.length > 0) {
|