diff --git a/node_modules/@orama/orama/dist/components/index.js b/node_modules/@orama/orama/dist/components/index.js index cb09ce7..805511e 100644 --- a/node_modules/@orama/orama/dist/components/index.js +++ b/node_modules/@orama/orama/dist/components/index.js @@ -1,7 +1,7 @@ import { createError } from '../errors.js'; import { create as avlCreate, find as avlFind, greaterThan as avlGreaterThan, insert as avlInsert, lessThan as avlLessThan, rangeSearch as avlRangeSearch, removeDocument as avlRemoveDocument } from '../trees/avl.js'; import { create as radixCreate, find as radixFind, insert as radixInsert, removeDocumentByWord as radixRemoveDocument } from '../trees/radix.js'; -import { intersect } from '../utils.js'; +import { intersect, safeAddNewItems } from '../utils.js'; import { BM25 } from './algorithms.js'; import { getInnerType, isArrayType } from './defaults.js'; export async function insertDocumentScoreParameters(index, prop, id, tokens, docsCount) { @@ -212,7 +212,7 @@ export async function searchByWhereClause(context, index, filters) { throw createError('UNKNOWN_FILTER_PROPERTY', param); } const filteredIDs = idx[operation.toString()]; - filtersMap[param].push(...filteredIDs); + filtersMap[param] = safeAddNewItems(filtersMap[param], filteredIDs) continue; } if (typeof operation === 'string' || Array.isArray(operation)) { @@ -228,7 +228,7 @@ export async function searchByWhereClause(context, index, filters) { term: term[0], exact: true }); - filtersMap[param].push(...Object.values(filteredIDsResults).flat()); + filtersMap[param] = safeAddNewItems(filtersMap[param], Object.values(filteredIDsResults).flat()) } continue; } diff --git a/node_modules/@orama/orama/dist/methods/search.js b/node_modules/@orama/orama/dist/methods/search.js index eea5ddb..b13f8ea 100644 --- a/node_modules/@orama/orama/dist/methods/search.js +++ b/node_modules/@orama/orama/dist/methods/search.js @@ -4,7 +4,7 @@ import { intersectFilteredIDs } from '../components/filters.js'; import { getGroups } from '../components/groups.js'; import { runAfterSearch } from '../components/hooks.js'; import { createError } from '../errors.js'; -import { getNanosecondsTime, getNested, sortTokenScorePredicate } from '../utils.js'; +import { getNanosecondsTime, getNested, sortTokenScorePredicate, safeAddNewItems } from '../utils.js'; const defaultBM25Params = { k: 1.2, b: 0.75, @@ -105,7 +105,7 @@ export async function search(orama, params, language) { const term = tokens[j]; // Lookup const scoreList = await orama.index.search(context, index, prop, term); - context.indexMap[prop][term].push(...scoreList); + context.indexMap[prop][term] = safeAddNewItems(context.indexMap[prop][term], scoreList); } const docIds = context.indexMap[prop]; const vals = Object.values(docIds); diff --git a/node_modules/@orama/orama/dist/trees/avl.js b/node_modules/@orama/orama/dist/trees/avl.js index 51fea8b..5a5f261 100644 --- a/node_modules/@orama/orama/dist/trees/avl.js +++ b/node_modules/@orama/orama/dist/trees/avl.js @@ -280,6 +280,9 @@ export function remove(root, key) { } export function removeDocument(root, id, key) { const node = getNodeByKey(root, key); + if (!node) { + return + } if (node.value.length === 1) { remove(root, key); return; diff --git a/node_modules/@orama/orama/dist/utils.js b/node_modules/@orama/orama/dist/utils.js index 3a726d8..d1ab99b 100644 --- a/node_modules/@orama/orama/dist/utils.js +++ b/node_modules/@orama/orama/dist/utils.js @@ -5,6 +5,21 @@ const nano = BigInt(1e3); const milli = BigInt(1e6); const second = BigInt(1e9); export const isServer = typeof window === 'undefined'; +export const MAX_ARGUMENT_FOR_STACK = 10_000; + +export function safeAddNewItems(arr, newArr) { + // we need to use by apply because of issues like: https://github.com/oramasearch/orama/issues/301 + // that issue is caused because scoreList can be huge + if (newArr.length < MAX_ARGUMENT_FOR_STACK) { + arr.push(...newArr) + + return arr; + } else { + return arr.concat(newArr) + } +} + + export function sprintf(template, ...args) { return template.replace(/%(?:(?\d+)\$)?(?-?\d*\.?\d*)(?[dfs])/g, function(...replaceArgs) { const groups = replaceArgs[replaceArgs.length - 1];