@wcs-colab/plugin-qps 3.1.16-custom.12 → 3.1.16-custom.13

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/index.cjs CHANGED
@@ -1,2 +1,2 @@
1
- "use strict";var Q=Object.defineProperty;var z=Object.getOwnPropertyDescriptor;var K=Object.getOwnPropertyNames;var _=Object.prototype.hasOwnProperty;var q=(e,a)=>{for(var t in a)Q(e,t,{get:a[t],enumerable:!0})},$=(e,a,t,r)=>{if(a&&typeof a=="object"||typeof a=="function")for(let n of K(a))!_.call(e,n)&&n!==t&&Q(e,n,{get:()=>a[n],enumerable:!(r=z(a,n))||r.enumerable});return e};var J=e=>$(Q({},"__esModule",{value:!0}),e);var te={};q(te,{pluginQPS:()=>ee});module.exports=J(te);var k=require("@wcs-colab/orama/components");var g=require("@wcs-colab/orama/trees"),T=require("@wcs-colab/orama/components");function A(e,a,t){for(let r of Object.entries(a)){let n=r[0],c=r[1],s=`${t}${t?".":""}${n}`;if(typeof c=="object"&&!Array.isArray(c)){A(e,c,s);continue}if((0,T.isVectorType)(c))e.searchableProperties.push(s),e.searchablePropertiesWithTypes[s]=c,e.vectorIndexes[s]={type:"Vector",node:new g.vector.VectorIndex((0,T.getVectorSize)(c)),isArray:!1};else{let o=/\[/.test(c);switch(c){case"boolean":case"boolean[]":e.indexes[s]={type:"Bool",node:new g.bool.BoolNode,isArray:o};break;case"number":case"number[]":e.indexes[s]={type:"AVL",node:new g.avl.AVLTree(0,[]),isArray:o};break;case"string":case"string[]":e.indexes[s]={type:"Radix",node:new g.radix.RadixTree,isArray:o};break;case"enum":case"enum[]":e.indexes[s]={type:"Flat",node:new g.flat.FlatTree,isArray:o};break;case"geopoint":e.indexes[s]={type:"BKD",node:new g.bkd.BKDTree,isArray:o};break;default:throw new Error("INVALID_SCHEMA_TYPE: "+s)}e.searchableProperties.push(s),e.searchablePropertiesWithTypes[s]=c}}}var H=1048575;function Y(e,a){let t=E(e),n=B(e)|1<<a;return t+1<<20|n}function O(e,a,t,r,n,c,s){let o=e.split(/\.|\?|!/),i=0,m=0;for(let u of o){let l=s.tokenize(u,c,r);for(let d of l){m++,t[d]||(t[d]=0);let I=Math.min(i,20);t.tokenQuantums[n][d]=Y(t.tokenQuantums[n][d],I),a.insert(d,n)}l.length>1&&i++}t.tokensLength.set(n,m)}function W(e){let a=e.tokens,t=e.radixNode,r=e.exact,n=e.tolerance,c=e.stats,s=e.boostPerProp,o=e.resultMap,i=e.whereFiltersIDs,m=c.tokensLength,u=c.tokenQuantums,l={term:"",exact:r,tolerance:n},d={},I=a.length;for(let b=0;b<I;b++){let x=a[b];l.term=x;let S=t.find(l);d={...d,...S}}let f=Object.keys(d),h=f.length;for(let b=0;b<h;b++){let x=f[b],S=d[x],y=S.length,P=a.includes(x);for(let w=0;w<y;w++){let p=S[w];if(i&&!i.has(p))continue;let v=m.get(p),C=u[p][x],j=E(C),R=B(C),F=(j*j/v+(P?1:0))*s;if(!o.has(p)){o.set(p,[F,R]);continue}let D=o.get(p),V=D[0]+G(D[1]&R)*2+F;D[0]=V,D[1]=D[1]|R}}}function B(e){return e&H}function E(e){return e>>20}function G(e){let a=0;do e&1&&++a;while(e>>=1);return a}function L(e,a,t,r,n,c,s){let o=s.tokensLength,i=s.tokenQuantums,m=n.tokenize(e,c,t);for(let u of m)a.removeDocumentByWord(u,r,!0);o.delete(r),delete i[r]}var N=require("@wcs-colab/orama/trees"),M=require("@wcs-colab/orama/internals"),U=new N.radix.RadixNode("","",!1),X={tokenQuantums:{},tokensLength:new Map};function Z(e,a,t,r,n,c,s,o,i,m,u){let l=new Map,d={tokens:t.tokenize(a,r),radixNode:U,exact:c,tolerance:s,stats:X,boostPerProp:0,all:l,resultMap:l,whereFiltersIDs:u},I=n.length;for(let x=0;x<I;x++){let S=n[x],y=e.stats[S],P=o[S]??1;d.radixNode=e.indexes[S].node,d.stats=y,d.boostPerProp=P,W(d)}let f=Array.from(l),h=f.length,b=[];for(let x=0;x<h;x++){let S=f[x],y=S[0],P=S[1][0];b.push([y,P])}return b}function ee(){return{name:"qps",getComponents(e){return ne(e)}}}function ne(e){return{index:{create:function(){let t={indexes:{},vectorIndexes:{},searchableProperties:[],searchablePropertiesWithTypes:{},stats:{}};return A(t,e,""),t},insert:function(t,r,n,c,s,o,i,m,u,l){if(!(i==="string"||i==="string[]"))return k.index.insert(t,r,n,c,s,o,i,m,u,l);r.stats[n]||(r.stats[n]={tokenQuantums:{},tokensLength:new Map});let d=r.stats[n],I=r.indexes[n].node;if(d.tokenQuantums[s]={},Array.isArray(o))for(let f of o)O(f,I,d,n,s,m,u);else O(o,I,d,n,s,m,u)},remove:function(t,r,n,c,s,o,i,m,u,l){if(!(i==="string"||i==="string[]"))return k.index.remove(t,r,n,c,s,o,i,m,u,l);let d=r.stats[n],I=r.indexes[n].node;if(Array.isArray(o))for(let f of o)L(f,I,n,s,u,m,d);else L(o,I,n,s,u,m,d)},insertDocumentScoreParameters:()=>{throw new Error},insertTokenScoreParameters:()=>{throw new Error},removeDocumentScoreParameters:()=>{throw new Error},removeTokenScoreParameters:()=>{throw new Error},calculateResultScores:()=>{throw new Error},search:Z,searchByWhereClause:function(t,r,n,c){let s=Object.entries(n).filter(([u])=>t.indexes[u].type==="Radix");if(s.length===0)return k.index.searchByWhereClause(t,r,n,c);let o;for(let[u,l]of s){let d=[];if(Array.isArray(l))for(let h of l){let b=r.tokenize(h,c)?.[0];d.push(b)}else d=r.tokenize(l,c);let I=t.indexes[u].node,f=new Set;for(let h of d){let x=I.find({term:h,exact:!0})[h];if(x)for(let S of x)f.add(S)}o?o=(0,M.setIntersection)(o,f):o=f}if(Object.entries(n).filter(([u])=>t.indexes[u].type!=="Radix").length===0)return o;let m=k.index.searchByWhereClause(t,r,n,c);return(0,M.setIntersection)(o,m)},getSearchableProperties:function(t){return t.searchableProperties},getSearchablePropertiesWithTypes:function(a){return a.searchablePropertiesWithTypes},load:function(t,r){let n=k.index.load(t,r[0]),c=r[1],s={...n.indexes,...Object.fromEntries(c.radixTrees.map(([o,i,m,u])=>[o,{node:N.radix.RadixNode.fromJSON(u),isArray:i,type:m}]))};return{...n,indexes:s,stats:Object.fromEntries(c.stats.map(([o,{tokenQuantums:i,tokensLength:m}])=>[o,{tokenQuantums:i,tokensLength:new Map(m)}]))}},save:function(t){let r=t,n=Object.entries(r.indexes).filter(([,{type:i}])=>i!=="Radix"),c=k.index.save({...r,indexes:Object.fromEntries(n)}),o={radixTrees:Object.entries(r.indexes).filter(([,{type:i}])=>i==="Radix").map(([i,{node:m,isArray:u,type:l}])=>[i,u,l,m.toJSON()]),stats:Object.entries(t.stats).map(([i,{tokenQuantums:m,tokensLength:u}])=>[i,{tokenQuantums:m,tokensLength:Array.from(u.entries())}])};return[c,o]}}}}0&&(module.exports={pluginQPS});
1
+ "use strict";var R=Object.defineProperty;var K=Object.getOwnPropertyDescriptor;var _=Object.getOwnPropertyNames;var $=Object.prototype.hasOwnProperty;var J=(e,d)=>{for(var s in d)R(e,s,{get:d[s],enumerable:!0})},H=(e,d,s,r)=>{if(d&&typeof d=="object"||typeof d=="function")for(let n of _(d))!$.call(e,n)&&n!==s&&R(e,n,{get:()=>d[n],enumerable:!(r=K(d,n))||r.enumerable});return e};var Y=e=>H(R({},"__esModule",{value:!0}),e);var re={};J(re,{pluginQPS:()=>ne});module.exports=Y(re);var k=require("@wcs-colab/orama/components");var S=require("@wcs-colab/orama/trees"),w=require("@wcs-colab/orama/components");function M(e,d,s){for(let r of Object.entries(d)){let n=r[0],t=r[1],o=`${s}${s?".":""}${n}`;if(typeof t=="object"&&!Array.isArray(t)){M(e,t,o);continue}if((0,w.isVectorType)(t))e.searchableProperties.push(o),e.searchablePropertiesWithTypes[o]=t,e.vectorIndexes[o]={type:"Vector",node:new S.vector.VectorIndex((0,w.getVectorSize)(t)),isArray:!1};else{let c=/\[/.test(t);switch(t){case"boolean":case"boolean[]":e.indexes[o]={type:"Bool",node:new S.bool.BoolNode,isArray:c};break;case"number":case"number[]":e.indexes[o]={type:"AVL",node:new S.avl.AVLTree(0,[]),isArray:c};break;case"string":case"string[]":e.indexes[o]={type:"Radix",node:new S.radix.RadixTree,isArray:c};break;case"enum":case"enum[]":e.indexes[o]={type:"Flat",node:new S.flat.FlatTree,isArray:c};break;case"geopoint":e.indexes[o]={type:"BKD",node:new S.bkd.BKDTree,isArray:c};break;default:throw new Error("INVALID_SCHEMA_TYPE: "+o)}e.searchableProperties.push(o),e.searchablePropertiesWithTypes[o]=t}}}var G=1048575,T={exact:1,fuzzy:.6};function j(e){e?.exact!==void 0&&!Number.isNaN(e.exact)&&(T.exact=e.exact),e?.fuzzy!==void 0&&!Number.isNaN(e.fuzzy)&&(T.fuzzy=e.fuzzy)}function U(e,d){let s=E(e),n=B(e)|1<<d;return s+1<<20|n}function A(e,d,s,r,n,t,o){let c=e.split(/\.|\?|!/),a=0,u=0;for(let m of c){let i=o.tokenize(m,t,r);for(let l of i){u++,s[l]||(s[l]=0);let f=Math.min(a,20);s.tokenQuantums[n][l]=U(s.tokenQuantums[n][l],f),d.insert(l,n)}i.length>1&&a++}s.tokensLength.set(n,u)}function F(e){let d=e.tokens,s=e.radixNode,r=e.exact,n=e.tolerance,t=e.stats,o=e.boostPerProp,c=e.resultMap,a=e.whereFiltersIDs,u=t.tokensLength,m=t.tokenQuantums,i={term:"",exact:r,tolerance:n},l={},f=d.length;for(let b=0;b<f;b++){let x=d[b];i.term=x;let h=s.find(i);l={...l,...h}}let I=Object.keys(l),g=I.length;for(let b=0;b<g;b++){let x=I[b],h=l[x],p=h.length,P=d.includes(x);for(let Q=0;Q<p;Q++){let y=h[Q];if(a&&!a.has(y))continue;let oe=u.get(y),L=m[y][x],v=E(L),z=B(L),V=P?T.exact:T.fuzzy,W=v*V;if(!c.has(y)){c.set(y,[W,z]);continue}let D=c.get(y),q=D[0]+W;D[0]=q,D[1]=D[1]|z}}}function B(e){return e&G}function E(e){return e>>20}function O(e,d,s,r,n,t,o){let c=o.tokensLength,a=o.tokenQuantums,u=n.tokenize(e,t,s);for(let m of u)d.removeDocumentByWord(m,r,!0);c.delete(r),delete a[r]}var C=require("@wcs-colab/orama/trees"),N=require("@wcs-colab/orama/internals"),X=new C.radix.RadixNode("","",!1),Z={tokenQuantums:{},tokensLength:new Map};function ee(e,d,s,r,n,t,o,c,a,u,m){let i=new Map,l={tokens:s.tokenize(d,r),radixNode:X,exact:t,tolerance:o,stats:Z,boostPerProp:0,all:i,resultMap:i,whereFiltersIDs:m},f=n.length;for(let x=0;x<f;x++){let h=n[x],p=e.stats[h],P=c[h]??1;l.radixNode=e.indexes[h].node,l.stats=p,l.boostPerProp=P,F(l)}let I=Array.from(i),g=I.length,b=[];for(let x=0;x<g;x++){let h=I[x],p=h[0],P=h[1][0];b.push([p,P])}return b}function ne(e={}){e.weights&&j(e.weights);let d=e.tolerance,s=e.multiWordThreshold,r=e.candidatePool,n=e.candidateCap,t=e.phraseMode;return{name:"qps",getComponents(o){return te(o,{tolerance:d,multiWordThreshold:s,candidatePool:r,candidateCap:n,phraseMode:t})}}}function te(e,d){return{index:{create:function(){let r={indexes:{},vectorIndexes:{},searchableProperties:[],searchablePropertiesWithTypes:{},stats:{}};return M(r,e,""),r.config=d,r},insert:function(r,n,t,o,c,a,u,m,i,l){if(!(u==="string"||u==="string[]"))return k.index.insert(r,n,t,o,c,a,u,m,i,l);n.stats[t]||(n.stats[t]={tokenQuantums:{},tokensLength:new Map});let f=n.stats[t],I=n.indexes[t].node;if(f.tokenQuantums[c]={},Array.isArray(a))for(let g of a)A(g,I,f,t,c,m,i);else A(a,I,f,t,c,m,i)},remove:function(r,n,t,o,c,a,u,m,i,l){if(!(u==="string"||u==="string[]"))return k.index.remove(r,n,t,o,c,a,u,m,i,l);let f=n.stats[t],I=n.indexes[t].node;if(Array.isArray(a))for(let g of a)O(g,I,t,c,i,m,f);else O(a,I,t,c,i,m,f)},insertDocumentScoreParameters:()=>{throw new Error},insertTokenScoreParameters:()=>{throw new Error},removeDocumentScoreParameters:()=>{throw new Error},removeTokenScoreParameters:()=>{throw new Error},calculateResultScores:()=>{throw new Error},search:ee,searchByWhereClause:function(r,n,t,o){let c=Object.entries(t).filter(([i])=>r.indexes[i].type==="Radix");if(c.length===0)return k.index.searchByWhereClause(r,n,t,o);let a;for(let[i,l]of c){let f=[];if(Array.isArray(l))for(let b of l){let x=n.tokenize(b,o)?.[0];f.push(x)}else f=n.tokenize(l,o);let I=r.indexes[i].node,g=new Set;for(let b of f){let h=I.find({term:b,exact:!0})[b];if(h)for(let p of h)g.add(p)}a?a=(0,N.setIntersection)(a,g):a=g}if(Object.entries(t).filter(([i])=>r.indexes[i].type!=="Radix").length===0)return a;let m=k.index.searchByWhereClause(r,n,t,o);return(0,N.setIntersection)(a,m)},getSearchableProperties:function(r){return r.searchableProperties},getSearchablePropertiesWithTypes:function(s){return s.searchablePropertiesWithTypes},load:function(r,n){let t=k.index.load(r,n[0]),o=n[1],c={...t.indexes,...Object.fromEntries(o.radixTrees.map(([a,u,m,i])=>[a,{node:C.radix.RadixNode.fromJSON(i),isArray:u,type:m}]))};return{...t,indexes:c,stats:Object.fromEntries(o.stats.map(([a,{tokenQuantums:u,tokensLength:m}])=>[a,{tokenQuantums:u,tokensLength:new Map(m)}]))}},save:function(r){let n=r,t=Object.entries(n.indexes).filter(([,{type:u}])=>u!=="Radix"),o=k.index.save({...n,indexes:Object.fromEntries(t)}),a={radixTrees:Object.entries(n.indexes).filter(([,{type:u}])=>u==="Radix").map(([u,{node:m,isArray:i,type:l}])=>[u,i,l,m.toJSON()]),stats:Object.entries(r.stats).map(([u,{tokenQuantums:m,tokensLength:i}])=>[u,{tokenQuantums:m,tokensLength:Array.from(i.entries())}])};return[o,a]}}}}0&&(module.exports={pluginQPS});
2
2
  //# sourceMappingURL=index.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/algorithm.ts"],"sourcesContent":["import type {\n AnyOrama,\n SearchableType,\n IIndex,\n SearchableValue,\n Tokenizer,\n OnlyStrings,\n FlattenSchemaProperty,\n TokenScore,\n WhereCondition,\n OramaPluginSync,\n AnySchema,\n ObjectComponents,\n BM25Params\n} from '@wcs-colab/orama'\nimport { index as Index, internalDocumentIDStore } from '@wcs-colab/orama/components'\nimport { insertString, QPSIndex as QPSIndexStorage, recursiveCreate, removeString, searchString } from './algorithm.js'\nimport { radix } from '@wcs-colab/orama/trees'\nimport { setIntersection } from '@wcs-colab/orama/internals'\n\ntype InternalDocumentID = internalDocumentIDStore.InternalDocumentID\ntype InternalDocumentIDStore = internalDocumentIDStore.InternalDocumentIDStore\ntype DocumentID = internalDocumentIDStore.DocumentID\n\nconst unusedRadix = new radix.RadixNode('', '', false)\nconst unusedStats = {\n tokenQuantums: {},\n tokensLength: new Map()\n}\n\nfunction search<T extends AnyOrama>(\n index: QPSIndexStorage,\n term: string,\n tokenizer: Tokenizer,\n language: string | undefined,\n propertiesToSearch: string[],\n exact: boolean,\n tolerance: number,\n boost: Partial<Record<OnlyStrings<FlattenSchemaProperty<T>[]>, number>>,\n relevance: Required<BM25Params>,\n docsCount: number,\n whereFiltersIDs: Set<InternalDocumentID> | undefined\n): TokenScore[] {\n const all: Map<InternalDocumentID, [number, number]> = new Map()\n\n const args = {\n tokens: tokenizer.tokenize(term, language),\n radixNode: unusedRadix,\n exact,\n tolerance,\n stats: unusedStats,\n boostPerProp: 0,\n all,\n resultMap: all,\n whereFiltersIDs\n }\n\n const propertiesToSearchLength = propertiesToSearch.length\n for (let i = 0; i < propertiesToSearchLength; i++) {\n const prop = propertiesToSearch[i]\n const stats = index.stats[prop]\n const boostPerProp = boost[prop] ?? 1\n args.radixNode = index.indexes[prop].node as radix.RadixNode\n args.stats = stats\n args.boostPerProp = boostPerProp\n searchString(args)\n }\n\n const g: [number, [number, number]][] = Array.from(all)\n const gLength = g.length\n const res: TokenScore[] = []\n for (let i = 0; i < gLength; i++) {\n const element = g[i]\n const id = element[0]\n const score = element[1][0]\n\n res.push([id, score])\n }\n\n return res\n}\n\nexport function pluginQPS(): OramaPluginSync<unknown> {\n return {\n name: 'qps',\n getComponents(schema: AnySchema) {\n return qpsComponents(schema)\n }\n }\n}\n\nfunction qpsComponents(schema: AnySchema): Partial<ObjectComponents<any, any, any, any>> {\n return {\n index: {\n create: function create() {\n const indexDatastore: QPSIndexStorage = {\n indexes: {},\n vectorIndexes: {},\n searchableProperties: [],\n searchablePropertiesWithTypes: {},\n stats: {}\n }\n\n recursiveCreate(indexDatastore, schema, '')\n\n return indexDatastore\n },\n insert: function insert(\n implementation: IIndex<QPSIndexStorage>,\n indexDatastorage: QPSIndexStorage,\n prop: string,\n id: DocumentID,\n internalId: InternalDocumentID,\n value: SearchableValue,\n schemaType: SearchableType,\n language: string | undefined,\n tokenizer: Tokenizer,\n docsCount: number\n ) {\n if (!(schemaType === 'string' || schemaType === 'string[]')) {\n return Index.insert(\n implementation as unknown as IIndex<Index.Index>,\n indexDatastorage as unknown as Index.Index,\n prop,\n id,\n internalId,\n value,\n schemaType,\n language,\n tokenizer,\n docsCount\n )\n }\n\n if (!indexDatastorage.stats[prop]) {\n indexDatastorage.stats[prop] = {\n tokenQuantums: {},\n tokensLength: new Map()\n }\n }\n\n const stats = indexDatastorage.stats[prop]\n const radixTree = indexDatastorage.indexes[prop].node as radix.RadixNode\n\n stats.tokenQuantums[internalId] = {}\n\n if (Array.isArray(value)) {\n for (const item of value) {\n insertString(item as string, radixTree, stats, prop, internalId, language, tokenizer)\n }\n } else {\n insertString(value as string, radixTree, stats, prop, internalId, language, tokenizer)\n }\n },\n remove: function remove(\n implementation: IIndex<QPSIndexStorage>,\n indexDatastorage: QPSIndexStorage,\n prop: string,\n id: DocumentID,\n internalId: InternalDocumentID,\n value: SearchableValue,\n schemaType: SearchableType,\n language: string | undefined,\n tokenizer: Tokenizer,\n docsCount: number\n ) {\n if (!(schemaType === 'string' || schemaType === 'string[]')) {\n return Index.remove(\n implementation as unknown as IIndex<Index.Index>,\n indexDatastorage as unknown as Index.Index,\n prop,\n id,\n internalId,\n value,\n schemaType,\n language,\n tokenizer,\n docsCount\n )\n }\n\n const stats = indexDatastorage.stats[prop]\n const radixTree = indexDatastorage.indexes[prop].node as radix.RadixNode\n\n if (Array.isArray(value)) {\n for (const item of value) {\n removeString(item as string, radixTree, prop, internalId, tokenizer, language, stats)\n }\n } else {\n removeString(value as string, radixTree, prop, internalId, tokenizer, language, stats)\n }\n },\n insertDocumentScoreParameters: () => {\n throw new Error()\n },\n insertTokenScoreParameters: () => {\n throw new Error()\n },\n removeDocumentScoreParameters: () => {\n throw new Error()\n },\n removeTokenScoreParameters: () => {\n throw new Error()\n },\n calculateResultScores: () => {\n throw new Error()\n },\n search,\n searchByWhereClause: function searchByWhereClause<T extends AnyOrama>(\n index: QPSIndexStorage,\n tokenizer: Tokenizer,\n filters: Partial<WhereCondition<T['schema']>>,\n language: string | undefined\n ) {\n const stringFiltersList = Object.entries(filters).filter(\n ([propName]) => index.indexes[propName].type === 'Radix'\n )\n\n // If there are no string filters, we can use the regular search\n if (stringFiltersList.length === 0) {\n return Index.searchByWhereClause(index as unknown as Index.Index, tokenizer, filters, language)\n }\n\n let idsFromStringFilters: Set<InternalDocumentID> | undefined\n for (const [propName, filter] of stringFiltersList) {\n let tokens: string[] = []\n\n if (Array.isArray(filter)) {\n for (const item of filter) {\n const token = tokenizer.tokenize(item as string, language)?.[0]\n tokens.push(token)\n }\n } else {\n tokens = tokenizer.tokenize(filter as string, language)\n }\n\n const radixTree = index.indexes[propName].node as radix.RadixNode\n const propIds = new Set<InternalDocumentID>()\n for (const token of tokens) {\n const ret = radixTree.find({\n term: token,\n exact: true\n })\n\n const ids = ret[token]\n\n if (ids) {\n for (const id of ids) {\n propIds.add(id)\n }\n }\n }\n\n if (idsFromStringFilters) {\n idsFromStringFilters = setIntersection(idsFromStringFilters, propIds)\n } else {\n idsFromStringFilters = propIds\n }\n }\n\n // Split the filters into string and non-string filters\n const nonStringFiltersList = Object.entries(filters).filter(\n ([propName]) => index.indexes[propName].type !== 'Radix'\n )\n if (nonStringFiltersList.length === 0) {\n return idsFromStringFilters\n }\n\n const idsFromNonStringFilters = Index.searchByWhereClause(\n index as unknown as Index.Index,\n tokenizer,\n filters,\n language\n )\n\n return setIntersection(idsFromStringFilters!, idsFromNonStringFilters)\n },\n getSearchableProperties: function getSearchableProperties(index: QPSIndexStorage): string[] {\n return index.searchableProperties\n },\n getSearchablePropertiesWithTypes: function (index: QPSIndexStorage) {\n return index.searchablePropertiesWithTypes\n },\n load: function load<R = unknown>(sharedInternalDocumentStore: InternalDocumentIDStore, raw: R): QPSIndexStorage {\n const dump1 = Index.load(sharedInternalDocumentStore, raw[0])\n\n const dump2 = raw[1] as {\n radixTrees: [string, boolean, string, unknown][]\n stats: [\n string,\n {\n tokenQuantums: [InternalDocumentID, Record<string, number>][]\n tokensLength: [InternalDocumentID, number][]\n }\n ][]\n }\n\n const indexes = {\n ...dump1.indexes,\n ...Object.fromEntries(\n dump2.radixTrees.map(([prop, isArray, type, node]) => [\n prop,\n {\n node: radix.RadixNode.fromJSON(node),\n isArray,\n type\n } as Index.Tree\n ])\n )\n }\n\n return {\n ...dump1,\n indexes,\n stats: Object.fromEntries(\n dump2.stats.map(([prop, { tokenQuantums, tokensLength }]) => [\n prop,\n {\n tokenQuantums,\n tokensLength: new Map(tokensLength)\n }\n ])\n )\n } as unknown as QPSIndexStorage\n },\n save: function save<R = unknown>(index: QPSIndexStorage): R {\n const baseIndex = index as unknown as Index.Index\n const nonStringIndexes = Object.entries(baseIndex.indexes).filter(([, { type }]) => type !== 'Radix')\n const dump1 = Index.save({\n ...baseIndex,\n indexes: Object.fromEntries(nonStringIndexes)\n })\n\n const stringIndexes = Object.entries(baseIndex.indexes).filter(([, { type }]) => type === 'Radix')\n const dump2 = {\n radixTrees: stringIndexes.map(([prop, { node, isArray, type }]) => [prop, isArray, type, node.toJSON()]),\n stats: Object.entries(index.stats).map(([prop, { tokenQuantums, tokensLength }]) => [\n prop,\n {\n tokenQuantums,\n tokensLength: Array.from(tokensLength.entries())\n }\n ])\n }\n\n return [dump1, dump2] as unknown as R\n }\n }\n }\n}\n","import { AnyIndexStore, AnyOrama, SearchableType, Tokenizer } from '@wcs-colab/orama'\nimport { avl, bkd, flat, radix, bool, vector } from '@wcs-colab/orama/trees'\nimport { getVectorSize, index as Index, internalDocumentIDStore, isVectorType } from '@wcs-colab/orama/components'\n\ntype InternalDocumentID = internalDocumentIDStore.InternalDocumentID\n\nexport interface QPSIndex extends AnyIndexStore {\n indexes: Record<string, Index.Tree>\n searchableProperties: string[]\n searchablePropertiesWithTypes: Record<string, SearchableType>\n stats: Record<\n string,\n {\n tokenQuantums: Record<InternalDocumentID, Record<string, number>>\n tokensLength: Map<InternalDocumentID, number>\n }\n >\n}\n\nexport function recursiveCreate<T extends AnyOrama>(indexDatastore: QPSIndex, schema: T['schema'], prefix: string) {\n for (const entry of Object.entries<SearchableType>(schema)) {\n const prop = entry[0]\n const type = entry[1]\n const path = `${prefix}${prefix ? '.' : ''}${prop}`\n\n if (typeof type === 'object' && !Array.isArray(type)) {\n // Nested\n recursiveCreate(indexDatastore, type, path)\n continue\n }\n\n if (isVectorType(type)) {\n indexDatastore.searchableProperties.push(path)\n indexDatastore.searchablePropertiesWithTypes[path] = type\n indexDatastore.vectorIndexes[path] = {\n type: 'Vector',\n node: new vector.VectorIndex(getVectorSize(type)),\n isArray: false\n }\n } else {\n const isArray = /\\[/.test(type as string)\n switch (type) {\n case 'boolean':\n case 'boolean[]':\n indexDatastore.indexes[path] = { type: 'Bool', node: new bool.BoolNode(), isArray }\n break\n case 'number':\n case 'number[]':\n indexDatastore.indexes[path] = {\n type: 'AVL',\n node: new avl.AVLTree<number, InternalDocumentID>(0, []),\n isArray\n }\n break\n case 'string':\n case 'string[]':\n indexDatastore.indexes[path] = { type: 'Radix', node: new radix.RadixTree(), isArray }\n break\n case 'enum':\n case 'enum[]':\n indexDatastore.indexes[path] = { type: 'Flat', node: new flat.FlatTree(), isArray }\n break\n case 'geopoint':\n indexDatastore.indexes[path] = { type: 'BKD', node: new bkd.BKDTree(), isArray }\n break\n default:\n throw new Error('INVALID_SCHEMA_TYPE: ' + path)\n }\n\n indexDatastore.searchableProperties.push(path)\n indexDatastore.searchablePropertiesWithTypes[path] = type\n }\n }\n}\n\nconst BIT_MASK_20 = 0b11111111111111111111\n\nexport function calculateTokenQuantum(prevValue: number, bit: number) {\n // if (prevValue < 0) {\n // throw new Error(\"Overflow\")\n // }\n // if (bit < 0 || bit > 20) {\n // throw new Error(\"Invalid bit\")\n // }\n\n const currentCount = count(prevValue)\n const currentSentenceMask = bitmask_20(prevValue)\n const newSentenceMask = currentSentenceMask | (1 << bit)\n return ((currentCount + 1) << 20) | newSentenceMask\n}\n\nexport function insertString(\n value: string,\n radixTree: radix.RadixTree,\n stats: QPSIndex['stats'][string],\n prop: string,\n internalId: InternalDocumentID,\n language: string | undefined,\n tokenizer: Tokenizer\n) {\n const sentences = value.split(/\\.|\\?|!/)\n\n let quantumIndex = 0\n let tokenNumber = 0\n for (const sentence of sentences) {\n const tokens = tokenizer.tokenize(sentence, language, prop)\n\n for (const token of tokens) {\n tokenNumber++\n\n if (!stats[token]) {\n stats[token] = 0\n }\n\n const tokenBitIndex = Math.min(quantumIndex, 20)\n\n stats.tokenQuantums[internalId][token] = calculateTokenQuantum(\n stats.tokenQuantums[internalId][token],\n tokenBitIndex\n )\n\n radixTree.insert(token, internalId)\n }\n\n // Don't increment the quantum index if the sentence is too short\n if (tokens.length > 1) {\n quantumIndex++\n }\n }\n\n stats.tokensLength.set(internalId, tokenNumber)\n}\n\nexport function searchString(prop: {\n tokens: string[]\n radixNode: radix.RadixNode\n exact: boolean\n tolerance: number\n stats: {\n tokensLength: Map<number, number>\n tokenQuantums: Record<number, Record<string, number>>\n }\n boostPerProp: number\n resultMap: Map<number, [number, number]>\n whereFiltersIDs: Set<number> | undefined\n}) {\n const tokens = prop.tokens\n const radixNode = prop.radixNode\n const exact = prop.exact\n const tolerance = prop.tolerance\n const stats = prop.stats\n const boostPerProp = prop.boostPerProp\n const resultMap = prop.resultMap\n const whereFiltersIDs = prop.whereFiltersIDs\n const tokensLength = stats.tokensLength\n const tokenQuantums = stats.tokenQuantums\n\n const findParam = {\n term: '',\n exact,\n tolerance\n }\n\n let foundWords = {} as Record<string, number[]>\n const tokenLength = tokens.length\n for (let i = 0; i < tokenLength; i++) {\n const term = tokens[i]\n findParam.term = term\n const results = radixNode.find(findParam)\n foundWords = {\n ...foundWords,\n ...results\n }\n }\n\n const foundKeys = Object.keys(foundWords)\n const foundKeysLength = foundKeys.length\n for (let i = 0; i < foundKeysLength; i++) {\n const key = foundKeys[i]\n const matchedDocs = foundWords[key]\n const matchedDocsLength = matchedDocs.length\n const isExactMatch = tokens.includes(key)\n\n for (let j = 0; j < matchedDocsLength; j++) {\n const docId = matchedDocs[j]\n\n if (whereFiltersIDs && !whereFiltersIDs.has(docId)) {\n continue\n }\n\n const numberOfQuantums = tokensLength.get(docId)!\n const tokenQuantumDescriptor = tokenQuantums[docId][key]\n\n const occurrence = count(tokenQuantumDescriptor)\n const bitMask = bitmask_20(tokenQuantumDescriptor)\n const score = ((occurrence * occurrence) / numberOfQuantums + (isExactMatch ? 1 : 0)) * boostPerProp\n\n if (!resultMap.has(docId)) {\n resultMap.set(docId, [score, bitMask])\n continue\n }\n\n const current = resultMap.get(docId)!\n\n const totalScore = current[0] + numberOfOnes(current[1] & bitMask) * 2 + score\n\n current[0] = totalScore\n current[1] = current[1] | bitMask\n }\n }\n}\n\nexport function bitmask_20(n: number) {\n return n & BIT_MASK_20\n}\nexport function count(n: number) {\n return n >> 20\n}\n\nexport function numberOfOnes(n: number) {\n let i = 0\n do {\n if (n & 1) {\n ++i\n }\n // eslint-disable-next-line no-cond-assign\n } while ((n >>= 1))\n return i\n}\n\nexport function removeString(\n value: string,\n radixTree: radix.RadixTree,\n prop: string,\n internalId: InternalDocumentID,\n tokenizer: Tokenizer,\n language: string | undefined,\n stats: {\n tokensLength: Map<number, number>\n tokenQuantums: Record<number, Record<string, number>>\n }\n) {\n const tokensLength = stats.tokensLength\n const tokenQuantums = stats.tokenQuantums\n\n const tokens = tokenizer.tokenize(value, language, prop)\n\n for (const token of tokens) {\n radixTree.removeDocumentByWord(token, internalId, true)\n }\n\n tokensLength.delete(internalId)\n delete tokenQuantums[internalId]\n}\n"],"mappings":"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","names":["src_exports","__export","pluginQPS","__toCommonJS","import_components","import_trees","import_components","recursiveCreate","indexDatastore","schema","prefix","entry","prop","type","path","isArray","BIT_MASK_20","calculateTokenQuantum","prevValue","bit","currentCount","count","newSentenceMask","bitmask_20","insertString","value","radixTree","stats","internalId","language","tokenizer","sentences","quantumIndex","tokenNumber","sentence","tokens","token","tokenBitIndex","searchString","radixNode","exact","tolerance","boostPerProp","resultMap","whereFiltersIDs","tokensLength","tokenQuantums","findParam","foundWords","tokenLength","i","term","results","foundKeys","foundKeysLength","key","matchedDocs","matchedDocsLength","isExactMatch","j","docId","numberOfQuantums","tokenQuantumDescriptor","occurrence","bitMask","score","current","totalScore","numberOfOnes","n","removeString","import_trees","import_internals","unusedRadix","unusedStats","search","index","term","tokenizer","language","propertiesToSearch","exact","tolerance","boost","relevance","docsCount","whereFiltersIDs","all","args","propertiesToSearchLength","i","prop","stats","boostPerProp","searchString","g","gLength","res","element","id","score","pluginQPS","schema","qpsComponents","indexDatastore","recursiveCreate","implementation","indexDatastorage","internalId","value","schemaType","Index","radixTree","item","insertString","removeString","filters","stringFiltersList","propName","idsFromStringFilters","filter","tokens","token","propIds","ids","idsFromNonStringFilters","sharedInternalDocumentStore","raw","dump1","dump2","indexes","isArray","type","node","tokenQuantums","tokensLength","baseIndex","nonStringIndexes"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/algorithm.ts"],"sourcesContent":["import type {\n AnyOrama,\n SearchableType,\n IIndex,\n SearchableValue,\n Tokenizer,\n OnlyStrings,\n FlattenSchemaProperty,\n TokenScore,\n WhereCondition,\n OramaPluginSync,\n AnySchema,\n ObjectComponents,\n BM25Params\n} from '@wcs-colab/orama'\nimport { index as Index, internalDocumentIDStore } from '@wcs-colab/orama/components'\nimport { insertString, QPSIndex as QPSIndexStorage, recursiveCreate, removeString, searchString, setQpsWeights } from './algorithm.js'\nimport { radix } from '@wcs-colab/orama/trees'\nimport { setIntersection } from '@wcs-colab/orama/internals'\n\ntype InternalDocumentID = internalDocumentIDStore.InternalDocumentID\ntype InternalDocumentIDStore = internalDocumentIDStore.InternalDocumentIDStore\ntype DocumentID = internalDocumentIDStore.DocumentID\n\nconst unusedRadix = new radix.RadixNode('', '', false)\nconst unusedStats = {\n tokenQuantums: {},\n tokensLength: new Map()\n}\n\nfunction search<T extends AnyOrama>(\n index: QPSIndexStorage,\n term: string,\n tokenizer: Tokenizer,\n language: string | undefined,\n propertiesToSearch: string[],\n exact: boolean,\n tolerance: number,\n boost: Partial<Record<OnlyStrings<FlattenSchemaProperty<T>[]>, number>>,\n relevance: Required<BM25Params>,\n docsCount: number,\n whereFiltersIDs: Set<InternalDocumentID> | undefined\n): TokenScore[] {\n const all: Map<InternalDocumentID, [number, number]> = new Map()\n\n const args = {\n tokens: tokenizer.tokenize(term, language),\n radixNode: unusedRadix,\n exact,\n tolerance,\n stats: unusedStats,\n boostPerProp: 0,\n all,\n resultMap: all,\n whereFiltersIDs\n }\n\n const propertiesToSearchLength = propertiesToSearch.length\n for (let i = 0; i < propertiesToSearchLength; i++) {\n const prop = propertiesToSearch[i]\n const stats = index.stats[prop]\n const boostPerProp = boost[prop] ?? 1\n args.radixNode = index.indexes[prop].node as radix.RadixNode\n args.stats = stats\n args.boostPerProp = boostPerProp\n searchString(args)\n }\n\n const g: [number, [number, number]][] = Array.from(all)\n const gLength = g.length\n const res: TokenScore[] = []\n for (let i = 0; i < gLength; i++) {\n const element = g[i]\n const id = element[0]\n const score = element[1][0]\n\n res.push([id, score])\n }\n\n return res\n}\n\nexport interface QPSConfig {\n weights?: {\n exact?: number\n fuzzy?: number\n }\n /** Explicit tolerance to apply when callers omit it. */\n tolerance?: number\n /** Threshold for non-phrase multi-word searches (AND=0, OR=1) */\n multiWordThreshold?: 0 | 1\n /** Maximum QPS hits to fetch before capping for phrase handoff */\n candidatePool?: number\n /** How many of the pooled hits to forward to FuzzyPhrase */\n candidateCap?: number\n /** Whether phrase mode (QPS→FuzzyPhrase) is active */\n phraseMode?: boolean\n}\n\nexport function pluginQPS(config: QPSConfig = {}): OramaPluginSync<unknown> {\n if (config.weights) {\n setQpsWeights(config.weights)\n }\n const defaultTolerance = config.tolerance\n const defaultMultiWordThreshold = config.multiWordThreshold\n const defaultCandidatePool = config.candidatePool\n const defaultCandidateCap = config.candidateCap\n const defaultPhraseMode = config.phraseMode\n return {\n name: 'qps',\n getComponents(schema: AnySchema) {\n return qpsComponents(schema, {\n tolerance: defaultTolerance,\n multiWordThreshold: defaultMultiWordThreshold,\n candidatePool: defaultCandidatePool,\n candidateCap: defaultCandidateCap,\n phraseMode: defaultPhraseMode\n })\n }\n }\n}\n\nfunction qpsComponents(\n schema: AnySchema,\n defaults: {\n tolerance?: number\n multiWordThreshold?: 0 | 1\n candidatePool?: number\n candidateCap?: number\n phraseMode?: boolean\n }\n): Partial<ObjectComponents<any, any, any, any>> {\n return {\n index: {\n create: function create() {\n const indexDatastore: QPSIndexStorage = {\n indexes: {},\n vectorIndexes: {},\n searchableProperties: [],\n searchablePropertiesWithTypes: {},\n stats: {}\n }\n\n recursiveCreate(indexDatastore, schema, '')\n\n // Expose defaults on the datastore for consumers\n ;(indexDatastore as any).config = defaults\n\n return indexDatastore\n },\n insert: function insert(\n implementation: IIndex<QPSIndexStorage>,\n indexDatastorage: QPSIndexStorage,\n prop: string,\n id: DocumentID,\n internalId: InternalDocumentID,\n value: SearchableValue,\n schemaType: SearchableType,\n language: string | undefined,\n tokenizer: Tokenizer,\n docsCount: number\n ) {\n if (!(schemaType === 'string' || schemaType === 'string[]')) {\n return Index.insert(\n implementation as unknown as IIndex<Index.Index>,\n indexDatastorage as unknown as Index.Index,\n prop,\n id,\n internalId,\n value,\n schemaType,\n language,\n tokenizer,\n docsCount\n )\n }\n\n if (!indexDatastorage.stats[prop]) {\n indexDatastorage.stats[prop] = {\n tokenQuantums: {},\n tokensLength: new Map()\n }\n }\n\n const stats = indexDatastorage.stats[prop]\n const radixTree = indexDatastorage.indexes[prop].node as radix.RadixNode\n\n stats.tokenQuantums[internalId] = {}\n\n if (Array.isArray(value)) {\n for (const item of value) {\n insertString(item as string, radixTree, stats, prop, internalId, language, tokenizer)\n }\n } else {\n insertString(value as string, radixTree, stats, prop, internalId, language, tokenizer)\n }\n },\n remove: function remove(\n implementation: IIndex<QPSIndexStorage>,\n indexDatastorage: QPSIndexStorage,\n prop: string,\n id: DocumentID,\n internalId: InternalDocumentID,\n value: SearchableValue,\n schemaType: SearchableType,\n language: string | undefined,\n tokenizer: Tokenizer,\n docsCount: number\n ) {\n if (!(schemaType === 'string' || schemaType === 'string[]')) {\n return Index.remove(\n implementation as unknown as IIndex<Index.Index>,\n indexDatastorage as unknown as Index.Index,\n prop,\n id,\n internalId,\n value,\n schemaType,\n language,\n tokenizer,\n docsCount\n )\n }\n\n const stats = indexDatastorage.stats[prop]\n const radixTree = indexDatastorage.indexes[prop].node as radix.RadixNode\n\n if (Array.isArray(value)) {\n for (const item of value) {\n removeString(item as string, radixTree, prop, internalId, tokenizer, language, stats)\n }\n } else {\n removeString(value as string, radixTree, prop, internalId, tokenizer, language, stats)\n }\n },\n insertDocumentScoreParameters: () => {\n throw new Error()\n },\n insertTokenScoreParameters: () => {\n throw new Error()\n },\n removeDocumentScoreParameters: () => {\n throw new Error()\n },\n removeTokenScoreParameters: () => {\n throw new Error()\n },\n calculateResultScores: () => {\n throw new Error()\n },\n search,\n searchByWhereClause: function searchByWhereClause<T extends AnyOrama>(\n index: QPSIndexStorage,\n tokenizer: Tokenizer,\n filters: Partial<WhereCondition<T['schema']>>,\n language: string | undefined\n ) {\n const stringFiltersList = Object.entries(filters).filter(\n ([propName]) => index.indexes[propName].type === 'Radix'\n )\n\n // If there are no string filters, we can use the regular search\n if (stringFiltersList.length === 0) {\n return Index.searchByWhereClause(index as unknown as Index.Index, tokenizer, filters, language)\n }\n\n let idsFromStringFilters: Set<InternalDocumentID> | undefined\n for (const [propName, filter] of stringFiltersList) {\n let tokens: string[] = []\n\n if (Array.isArray(filter)) {\n for (const item of filter) {\n const token = tokenizer.tokenize(item as string, language)?.[0]\n tokens.push(token)\n }\n } else {\n tokens = tokenizer.tokenize(filter as string, language)\n }\n\n const radixTree = index.indexes[propName].node as radix.RadixNode\n const propIds = new Set<InternalDocumentID>()\n for (const token of tokens) {\n const ret = radixTree.find({\n term: token,\n exact: true\n })\n\n const ids = ret[token]\n\n if (ids) {\n for (const id of ids) {\n propIds.add(id)\n }\n }\n }\n\n if (idsFromStringFilters) {\n idsFromStringFilters = setIntersection(idsFromStringFilters, propIds)\n } else {\n idsFromStringFilters = propIds\n }\n }\n\n // Split the filters into string and non-string filters\n const nonStringFiltersList = Object.entries(filters).filter(\n ([propName]) => index.indexes[propName].type !== 'Radix'\n )\n if (nonStringFiltersList.length === 0) {\n return idsFromStringFilters\n }\n\n const idsFromNonStringFilters = Index.searchByWhereClause(\n index as unknown as Index.Index,\n tokenizer,\n filters,\n language\n )\n\n return setIntersection(idsFromStringFilters!, idsFromNonStringFilters)\n },\n getSearchableProperties: function getSearchableProperties(index: QPSIndexStorage): string[] {\n return index.searchableProperties\n },\n getSearchablePropertiesWithTypes: function (index: QPSIndexStorage) {\n return index.searchablePropertiesWithTypes\n },\n load: function load<R = unknown>(sharedInternalDocumentStore: InternalDocumentIDStore, raw: R): QPSIndexStorage {\n const dump1 = Index.load(sharedInternalDocumentStore, raw[0])\n\n const dump2 = raw[1] as {\n radixTrees: [string, boolean, string, unknown][]\n stats: [\n string,\n {\n tokenQuantums: [InternalDocumentID, Record<string, number>][]\n tokensLength: [InternalDocumentID, number][]\n }\n ][]\n }\n\n const indexes = {\n ...dump1.indexes,\n ...Object.fromEntries(\n dump2.radixTrees.map(([prop, isArray, type, node]) => [\n prop,\n {\n node: radix.RadixNode.fromJSON(node),\n isArray,\n type\n } as Index.Tree\n ])\n )\n }\n\n return {\n ...dump1,\n indexes,\n stats: Object.fromEntries(\n dump2.stats.map(([prop, { tokenQuantums, tokensLength }]) => [\n prop,\n {\n tokenQuantums,\n tokensLength: new Map(tokensLength)\n }\n ])\n )\n } as unknown as QPSIndexStorage\n },\n save: function save<R = unknown>(index: QPSIndexStorage): R {\n const baseIndex = index as unknown as Index.Index\n const nonStringIndexes = Object.entries(baseIndex.indexes).filter(([, { type }]) => type !== 'Radix')\n const dump1 = Index.save({\n ...baseIndex,\n indexes: Object.fromEntries(nonStringIndexes)\n })\n\n const stringIndexes = Object.entries(baseIndex.indexes).filter(([, { type }]) => type === 'Radix')\n const dump2 = {\n radixTrees: stringIndexes.map(([prop, { node, isArray, type }]) => [prop, isArray, type, node.toJSON()]),\n stats: Object.entries(index.stats).map(([prop, { tokenQuantums, tokensLength }]) => [\n prop,\n {\n tokenQuantums,\n tokensLength: Array.from(tokensLength.entries())\n }\n ])\n }\n\n return [dump1, dump2] as unknown as R\n }\n }\n }\n}\n","import { AnyIndexStore, AnyOrama, SearchableType, Tokenizer } from '@wcs-colab/orama'\nimport { avl, bkd, flat, radix, bool, vector } from '@wcs-colab/orama/trees'\nimport { getVectorSize, index as Index, internalDocumentIDStore, isVectorType } from '@wcs-colab/orama/components'\n\ntype InternalDocumentID = internalDocumentIDStore.InternalDocumentID\n\nexport interface QPSIndex extends AnyIndexStore {\n indexes: Record<string, Index.Tree>\n searchableProperties: string[]\n searchablePropertiesWithTypes: Record<string, SearchableType>\n stats: Record<\n string,\n {\n tokenQuantums: Record<InternalDocumentID, Record<string, number>>\n tokensLength: Map<InternalDocumentID, number>\n }\n >\n}\n\nexport function recursiveCreate<T extends AnyOrama>(indexDatastore: QPSIndex, schema: T['schema'], prefix: string) {\n for (const entry of Object.entries<SearchableType>(schema)) {\n const prop = entry[0]\n const type = entry[1]\n const path = `${prefix}${prefix ? '.' : ''}${prop}`\n\n if (typeof type === 'object' && !Array.isArray(type)) {\n // Nested\n recursiveCreate(indexDatastore, type, path)\n continue\n }\n\n if (isVectorType(type)) {\n indexDatastore.searchableProperties.push(path)\n indexDatastore.searchablePropertiesWithTypes[path] = type\n indexDatastore.vectorIndexes[path] = {\n type: 'Vector',\n node: new vector.VectorIndex(getVectorSize(type)),\n isArray: false\n }\n } else {\n const isArray = /\\[/.test(type as string)\n switch (type) {\n case 'boolean':\n case 'boolean[]':\n indexDatastore.indexes[path] = { type: 'Bool', node: new bool.BoolNode(), isArray }\n break\n case 'number':\n case 'number[]':\n indexDatastore.indexes[path] = {\n type: 'AVL',\n node: new avl.AVLTree<number, InternalDocumentID>(0, []),\n isArray\n }\n break\n case 'string':\n case 'string[]':\n indexDatastore.indexes[path] = { type: 'Radix', node: new radix.RadixTree(), isArray }\n break\n case 'enum':\n case 'enum[]':\n indexDatastore.indexes[path] = { type: 'Flat', node: new flat.FlatTree(), isArray }\n break\n case 'geopoint':\n indexDatastore.indexes[path] = { type: 'BKD', node: new bkd.BKDTree(), isArray }\n break\n default:\n throw new Error('INVALID_SCHEMA_TYPE: ' + path)\n }\n\n indexDatastore.searchableProperties.push(path)\n indexDatastore.searchablePropertiesWithTypes[path] = type\n }\n }\n}\n\nconst BIT_MASK_20 = 0b11111111111111111111\n\n// Runtime-configurable weights (default exact=1, fuzzy=0.6)\nconst qpsWeights = {\n exact: 1,\n fuzzy: 0.6\n}\n\nexport function setQpsWeights(weights?: { exact?: number; fuzzy?: number }) {\n if (weights?.exact !== undefined && !Number.isNaN(weights.exact)) {\n qpsWeights.exact = weights.exact\n }\n if (weights?.fuzzy !== undefined && !Number.isNaN(weights.fuzzy)) {\n qpsWeights.fuzzy = weights.fuzzy\n }\n}\n\nexport function calculateTokenQuantum(prevValue: number, bit: number) {\n // if (prevValue < 0) {\n // throw new Error(\"Overflow\")\n // }\n // if (bit < 0 || bit > 20) {\n // throw new Error(\"Invalid bit\")\n // }\n\n const currentCount = count(prevValue)\n const currentSentenceMask = bitmask_20(prevValue)\n const newSentenceMask = currentSentenceMask | (1 << bit)\n return ((currentCount + 1) << 20) | newSentenceMask\n}\n\nexport function insertString(\n value: string,\n radixTree: radix.RadixTree,\n stats: QPSIndex['stats'][string],\n prop: string,\n internalId: InternalDocumentID,\n language: string | undefined,\n tokenizer: Tokenizer\n) {\n const sentences = value.split(/\\.|\\?|!/)\n\n let quantumIndex = 0\n let tokenNumber = 0\n for (const sentence of sentences) {\n const tokens = tokenizer.tokenize(sentence, language, prop)\n\n for (const token of tokens) {\n tokenNumber++\n\n if (!stats[token]) {\n stats[token] = 0\n }\n\n const tokenBitIndex = Math.min(quantumIndex, 20)\n\n stats.tokenQuantums[internalId][token] = calculateTokenQuantum(\n stats.tokenQuantums[internalId][token],\n tokenBitIndex\n )\n\n radixTree.insert(token, internalId)\n }\n\n // Don't increment the quantum index if the sentence is too short\n if (tokens.length > 1) {\n quantumIndex++\n }\n }\n\n stats.tokensLength.set(internalId, tokenNumber)\n}\n\nexport function searchString(prop: {\n tokens: string[]\n radixNode: radix.RadixNode\n exact: boolean\n tolerance: number\n stats: {\n tokensLength: Map<number, number>\n tokenQuantums: Record<number, Record<string, number>>\n }\n boostPerProp: number\n resultMap: Map<number, [number, number]>\n whereFiltersIDs: Set<number> | undefined\n}) {\n const tokens = prop.tokens\n const radixNode = prop.radixNode\n const exact = prop.exact\n const tolerance = prop.tolerance\n const stats = prop.stats\n const boostPerProp = prop.boostPerProp\n const resultMap = prop.resultMap\n const whereFiltersIDs = prop.whereFiltersIDs\n const tokensLength = stats.tokensLength\n const tokenQuantums = stats.tokenQuantums\n\n const findParam = {\n term: '',\n exact,\n tolerance\n }\n\n let foundWords = {} as Record<string, number[]>\n const tokenLength = tokens.length\n for (let i = 0; i < tokenLength; i++) {\n const term = tokens[i]\n findParam.term = term\n const results = radixNode.find(findParam)\n foundWords = {\n ...foundWords,\n ...results\n }\n }\n\n const foundKeys = Object.keys(foundWords)\n const foundKeysLength = foundKeys.length\n for (let i = 0; i < foundKeysLength; i++) {\n const key = foundKeys[i]\n const matchedDocs = foundWords[key]\n const matchedDocsLength = matchedDocs.length\n const isExactMatch = tokens.includes(key)\n\n for (let j = 0; j < matchedDocsLength; j++) {\n const docId = matchedDocs[j]\n\n if (whereFiltersIDs && !whereFiltersIDs.has(docId)) {\n continue\n }\n\n const numberOfQuantums = tokensLength.get(docId)!\n const tokenQuantumDescriptor = tokenQuantums[docId][key]\n\n const occurrence = count(tokenQuantumDescriptor)\n const bitMask = bitmask_20(tokenQuantumDescriptor)\n // Original scoring (kept for easy restore):\n // const score = ((occurrence * occurrence) / numberOfQuantums + (isExactMatch ? 1 : 0)) * boostPerProp\n // const totalScore = current[0] + numberOfOnes(current[1] & bitMask) * 2 + score\n // New spec (runtime-configurable): exact/fuzzy weights, no proximity bonus\n const weight = isExactMatch ? qpsWeights.exact : qpsWeights.fuzzy\n // Ignore boostPerProp in new spec\n const score = occurrence * weight\n\n if (!resultMap.has(docId)) {\n resultMap.set(docId, [score, bitMask])\n continue\n }\n\n const current = resultMap.get(docId)!\n\n const totalScore = current[0] + score\n\n current[0] = totalScore\n current[1] = current[1] | bitMask\n }\n }\n}\n\nexport function bitmask_20(n: number) {\n return n & BIT_MASK_20\n}\nexport function count(n: number) {\n return n >> 20\n}\n\nexport function numberOfOnes(n: number) {\n let i = 0\n do {\n if (n & 1) {\n ++i\n }\n // eslint-disable-next-line no-cond-assign\n } while ((n >>= 1))\n return i\n}\n\nexport function removeString(\n value: string,\n radixTree: radix.RadixTree,\n prop: string,\n internalId: InternalDocumentID,\n tokenizer: Tokenizer,\n language: string | undefined,\n stats: {\n tokensLength: Map<number, number>\n tokenQuantums: Record<number, Record<string, number>>\n }\n) {\n const tokensLength = stats.tokensLength\n const tokenQuantums = stats.tokenQuantums\n\n const tokens = tokenizer.tokenize(value, language, prop)\n\n for (const token of tokens) {\n radixTree.removeDocumentByWord(token, internalId, true)\n }\n\n tokensLength.delete(internalId)\n delete tokenQuantums[internalId]\n}\n"],"mappings":"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","names":["src_exports","__export","pluginQPS","__toCommonJS","import_components","import_trees","import_components","recursiveCreate","indexDatastore","schema","prefix","entry","prop","type","path","isArray","BIT_MASK_20","qpsWeights","setQpsWeights","weights","calculateTokenQuantum","prevValue","bit","currentCount","count","newSentenceMask","bitmask_20","insertString","value","radixTree","stats","internalId","language","tokenizer","sentences","quantumIndex","tokenNumber","sentence","tokens","token","tokenBitIndex","searchString","radixNode","exact","tolerance","boostPerProp","resultMap","whereFiltersIDs","tokensLength","tokenQuantums","findParam","foundWords","tokenLength","i","term","results","foundKeys","foundKeysLength","key","matchedDocs","matchedDocsLength","isExactMatch","j","docId","numberOfQuantums","tokenQuantumDescriptor","occurrence","bitMask","weight","score","current","totalScore","n","removeString","value","radixTree","prop","internalId","tokenizer","language","stats","tokensLength","tokenQuantums","tokens","token","import_trees","import_internals","unusedRadix","unusedStats","search","index","term","tokenizer","language","propertiesToSearch","exact","tolerance","boost","relevance","docsCount","whereFiltersIDs","all","args","propertiesToSearchLength","i","prop","stats","boostPerProp","searchString","g","gLength","res","element","id","score","pluginQPS","config","setQpsWeights","defaultTolerance","defaultMultiWordThreshold","defaultCandidatePool","defaultCandidateCap","defaultPhraseMode","schema","qpsComponents","defaults","indexDatastore","recursiveCreate","implementation","indexDatastorage","internalId","value","schemaType","Index","radixTree","item","insertString","removeString","filters","stringFiltersList","propName","idsFromStringFilters","filter","tokens","token","propIds","ids","idsFromNonStringFilters","sharedInternalDocumentStore","raw","dump1","dump2","indexes","isArray","type","node","tokenQuantums","tokensLength","baseIndex","nonStringIndexes"]}
package/dist/index.d.cts CHANGED
@@ -1,5 +1,21 @@
1
1
  import { OramaPluginSync } from '@wcs-colab/orama';
2
2
 
3
- declare function pluginQPS(): OramaPluginSync<unknown>;
3
+ interface QPSConfig {
4
+ weights?: {
5
+ exact?: number;
6
+ fuzzy?: number;
7
+ };
8
+ /** Explicit tolerance to apply when callers omit it. */
9
+ tolerance?: number;
10
+ /** Threshold for non-phrase multi-word searches (AND=0, OR=1) */
11
+ multiWordThreshold?: 0 | 1;
12
+ /** Maximum QPS hits to fetch before capping for phrase handoff */
13
+ candidatePool?: number;
14
+ /** How many of the pooled hits to forward to FuzzyPhrase */
15
+ candidateCap?: number;
16
+ /** Whether phrase mode (QPS→FuzzyPhrase) is active */
17
+ phraseMode?: boolean;
18
+ }
19
+ declare function pluginQPS(config?: QPSConfig): OramaPluginSync<unknown>;
4
20
 
5
- export { pluginQPS };
21
+ export { QPSConfig, pluginQPS };
package/dist/index.d.ts CHANGED
@@ -1,5 +1,21 @@
1
1
  import { OramaPluginSync } from '@wcs-colab/orama';
2
2
 
3
- declare function pluginQPS(): OramaPluginSync<unknown>;
3
+ interface QPSConfig {
4
+ weights?: {
5
+ exact?: number;
6
+ fuzzy?: number;
7
+ };
8
+ /** Explicit tolerance to apply when callers omit it. */
9
+ tolerance?: number;
10
+ /** Threshold for non-phrase multi-word searches (AND=0, OR=1) */
11
+ multiWordThreshold?: 0 | 1;
12
+ /** Maximum QPS hits to fetch before capping for phrase handoff */
13
+ candidatePool?: number;
14
+ /** How many of the pooled hits to forward to FuzzyPhrase */
15
+ candidateCap?: number;
16
+ /** Whether phrase mode (QPS→FuzzyPhrase) is active */
17
+ phraseMode?: boolean;
18
+ }
19
+ declare function pluginQPS(config?: QPSConfig): OramaPluginSync<unknown>;
4
20
 
5
- export { pluginQPS };
21
+ export { QPSConfig, pluginQPS };
@@ -1,12 +1,12 @@
1
- "use strict";var orama=orama||{};orama.plugin=orama.plugin||{};orama.plugin.qps=(()=>{var Z=Object.defineProperty;var $e=Object.getOwnPropertyDescriptor;var Ge=Object.getOwnPropertyNames;var Ke=Object.prototype.hasOwnProperty;var je=(i,e,t)=>e in i?Z(i,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):i[e]=t;var v=(i,e)=>{for(var t in e)Z(i,t,{get:e[t],enumerable:!0})},Ye=(i,e,t,n)=>{if(e&&typeof e=="object"||typeof e=="function")for(let o of Ge(e))!Ke.call(i,o)&&o!==t&&Z(i,o,{get:()=>e[o],enumerable:!(n=$e(e,o))||n.enumerable});return i};var He=i=>Ye(Z({},"__esModule",{value:!0}),i);var y=(i,e,t)=>(je(i,typeof e!="symbol"?e+"":e,t),t);var Nt={};v(Nt,{pluginQPS:()=>wt});var Qe={arabic:"ar",armenian:"am",bulgarian:"bg",czech:"cz",danish:"dk",dutch:"nl",english:"en",finnish:"fi",french:"fr",german:"de",greek:"gr",hungarian:"hu",indian:"in",indonesian:"id",irish:"ie",italian:"it",lithuanian:"lt",nepali:"np",norwegian:"no",portuguese:"pt",romanian:"ro",russian:"ru",serbian:"rs",slovenian:"ru",spanish:"es",swedish:"se",tamil:"ta",turkish:"tr",ukrainian:"uk",sanskrit:"sk"};var ue=Object.keys(Qe);var Et=Date.now().toString().slice(5);var _t=BigInt(1e3),vt=BigInt(1e6),Lt=BigInt(1e9);function Te(i,...e){return i.replace(/%(?:(?<position>\d+)\$)?(?<width>-?\d*\.?\d*)(?<type>[dfs])/g,function(...t){let n=t[t.length-1],{width:o,type:s,position:r}=n,a=r?e[Number.parseInt(r)-1]:e.shift(),c=o===""?0:Number.parseInt(o);switch(s){case"d":return a.toString().padStart(c,"0");case"f":{let l=a,[u,d]=o.split(".").map(f=>Number.parseFloat(f));return typeof d=="number"&&d>=0&&(l=l.toFixed(d)),typeof u=="number"&&u>=0?l.toString().padStart(c,"0"):l.toString()}case"s":return c<0?a.toString().padEnd(-c," "):a.toString().padStart(c," ");default:return a}})}function ee(i,e){return Object.hasOwn===void 0?Object.prototype.hasOwnProperty.call(i,e)?i[e]:void 0:Object.hasOwn(i,e)?i[e]:void 0}var qe={cm:.01,m:1,km:1e3,ft:.3048,yd:.9144,mi:1609.344};function te(i,e){let t=qe[e];if(t===void 0)throw new Error(w("INVALID_DISTANCE_SUFFIX",i).message);return i*t}var be="intersection"in new Set;function C(...i){if(i.length===0)return new Set;if(i.length===1)return i[0];if(i.length===2){let n=i[0],o=i[1];if(be)return n.intersection(o);let s=new Set,r=n.size<o.size?n:o,a=r===n?o:n;for(let c of r)a.has(c)&&s.add(c);return s}let e={index:0,size:i[0].size};for(let n=1;n<i.length;n++)i[n].size<e.size&&(e.index=n,e.size=i[n].size);if(be){let n=i[e.index];for(let o=0;o<i.length;o++)o!==e.index&&(n=n.intersection(i[o]));return n}let t=i[e.index];for(let n=0;n<i.length;n++){if(n===e.index)continue;let o=i[n];for(let s of t)o.has(s)||t.delete(s)}return t}var Xe="union"in new Set;function V(i,e){return Xe?i?i.union(e):e:i?new Set([...i,...e]):new Set(e)}function fe(i,e){let t=new Set;for(let n of i)e.has(n)||t.add(n);return t}var Ze=ue.join(`
2
- - `),et={NO_LANGUAGE_WITH_CUSTOM_TOKENIZER:"Do not pass the language option to create when using a custom tokenizer.",LANGUAGE_NOT_SUPPORTED:`Language "%s" is not supported.
1
+ "use strict";var orama=orama||{};orama.plugin=orama.plugin||{};orama.plugin.qps=(()=>{var Z=Object.defineProperty;var Ke=Object.getOwnPropertyDescriptor;var je=Object.getOwnPropertyNames;var Qe=Object.prototype.hasOwnProperty;var Ye=(i,e,t)=>e in i?Z(i,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):i[e]=t;var v=(i,e)=>{for(var t in e)Z(i,t,{get:e[t],enumerable:!0})},He=(i,e,t,n)=>{if(e&&typeof e=="object"||typeof e=="function")for(let s of je(e))!Qe.call(i,s)&&s!==t&&Z(i,s,{get:()=>e[s],enumerable:!(n=Ke(e,s))||n.enumerable});return i};var qe=i=>He(Z({},"__esModule",{value:!0}),i);var b=(i,e,t)=>(Ye(i,typeof e!="symbol"?e+"":e,t),t);var Pt={};v(Pt,{pluginQPS:()=>wt});var Xe={arabic:"ar",armenian:"am",bulgarian:"bg",czech:"cz",danish:"dk",dutch:"nl",english:"en",finnish:"fi",french:"fr",german:"de",greek:"gr",hungarian:"hu",indian:"in",indonesian:"id",irish:"ie",italian:"it",lithuanian:"lt",nepali:"np",norwegian:"no",portuguese:"pt",romanian:"ro",russian:"ru",serbian:"rs",slovenian:"ru",spanish:"es",swedish:"se",tamil:"ta",turkish:"tr",ukrainian:"uk",sanskrit:"sk"};var fe=Object.keys(Xe);var _t=Date.now().toString().slice(5);var vt=BigInt(1e3),Lt=BigInt(1e6),Mt=BigInt(1e9);function xe(i,...e){return i.replace(/%(?:(?<position>\d+)\$)?(?<width>-?\d*\.?\d*)(?<type>[dfs])/g,function(...t){let n=t[t.length-1],{width:s,type:o,position:r}=n,a=r?e[Number.parseInt(r)-1]:e.shift(),c=s===""?0:Number.parseInt(s);switch(o){case"d":return a.toString().padStart(c,"0");case"f":{let l=a,[u,f]=s.split(".").map(d=>Number.parseFloat(d));return typeof f=="number"&&f>=0&&(l=l.toFixed(f)),typeof u=="number"&&u>=0?l.toString().padStart(c,"0"):l.toString()}case"s":return c<0?a.toString().padEnd(-c," "):a.toString().padStart(c," ");default:return a}})}function ee(i,e){return Object.hasOwn===void 0?Object.prototype.hasOwnProperty.call(i,e)?i[e]:void 0:Object.hasOwn(i,e)?i[e]:void 0}var Ze={cm:.01,m:1,km:1e3,ft:.3048,yd:.9144,mi:1609.344};function te(i,e){let t=Ze[e];if(t===void 0)throw new Error(O("INVALID_DISTANCE_SUFFIX",i).message);return i*t}var Te="intersection"in new Set;function C(...i){if(i.length===0)return new Set;if(i.length===1)return i[0];if(i.length===2){let n=i[0],s=i[1];if(Te)return n.intersection(s);let o=new Set,r=n.size<s.size?n:s,a=r===n?s:n;for(let c of r)a.has(c)&&o.add(c);return o}let e={index:0,size:i[0].size};for(let n=1;n<i.length;n++)i[n].size<e.size&&(e.index=n,e.size=i[n].size);if(Te){let n=i[e.index];for(let s=0;s<i.length;s++)s!==e.index&&(n=n.intersection(i[s]));return n}let t=i[e.index];for(let n=0;n<i.length;n++){if(n===e.index)continue;let s=i[n];for(let o of t)s.has(o)||t.delete(o)}return t}var et="union"in new Set;function V(i,e){return et?i?i.union(e):e:i?new Set([...i,...e]):new Set(e)}function de(i,e){let t=new Set;for(let n of i)e.has(n)||t.add(n);return t}var tt=fe.join(`
2
+ - `),nt={NO_LANGUAGE_WITH_CUSTOM_TOKENIZER:"Do not pass the language option to create when using a custom tokenizer.",LANGUAGE_NOT_SUPPORTED:`Language "%s" is not supported.
3
3
  Supported languages are:
4
- - ${Ze}`,INVALID_STEMMER_FUNCTION_TYPE:"config.stemmer property must be a function.",MISSING_STEMMER:'As of version 1.0.0 @wcs-colab/orama does not ship non English stemmers by default. To solve this, please explicitly import and specify the "%s" stemmer from the package @orama/stemmers. See https://docs.orama.com/docs/orama-js/text-analysis/stemming for more information.',CUSTOM_STOP_WORDS_MUST_BE_FUNCTION_OR_ARRAY:"Custom stop words array must only contain strings.",UNSUPPORTED_COMPONENT:'Unsupported component "%s".',COMPONENT_MUST_BE_FUNCTION:'The component "%s" must be a function.',COMPONENT_MUST_BE_FUNCTION_OR_ARRAY_FUNCTIONS:'The component "%s" must be a function or an array of functions.',INVALID_SCHEMA_TYPE:'Unsupported schema type "%s" at "%s". Expected "string", "boolean" or "number" or array of them.',DOCUMENT_ID_MUST_BE_STRING:'Document id must be of type "string". Got "%s" instead.',DOCUMENT_ALREADY_EXISTS:'A document with id "%s" already exists.',DOCUMENT_DOES_NOT_EXIST:'A document with id "%s" does not exists.',MISSING_DOCUMENT_PROPERTY:'Missing searchable property "%s".',INVALID_DOCUMENT_PROPERTY:'Invalid document property "%s": expected "%s", got "%s"',UNKNOWN_INDEX:'Invalid property name "%s". Expected a wildcard string ("*") or array containing one of the following properties: %s',INVALID_BOOST_VALUE:"Boost value must be a number greater than, or less than 0.",INVALID_FILTER_OPERATION:"You can only use one operation per filter, you requested %d.",SCHEMA_VALIDATION_FAILURE:'Cannot insert document due schema validation failure on "%s" property.',INVALID_SORT_SCHEMA_TYPE:'Unsupported sort schema type "%s" at "%s". Expected "string" or "number".',CANNOT_SORT_BY_ARRAY:'Cannot configure sort for "%s" because it is an array (%s).',UNABLE_TO_SORT_ON_UNKNOWN_FIELD:'Unable to sort on unknown field "%s". Allowed fields: %s',SORT_DISABLED:"Sort is disabled. Please read the documentation at https://docs.orama.com/docs/orama-js for more information.",UNKNOWN_GROUP_BY_PROPERTY:'Unknown groupBy property "%s".',INVALID_GROUP_BY_PROPERTY:'Invalid groupBy property "%s". Allowed types: "%s", but given "%s".',UNKNOWN_FILTER_PROPERTY:'Unknown filter property "%s".',UNKNOWN_VECTOR_PROPERTY:'Unknown vector property "%s". Make sure the property exists in the schema and is configured as a vector.',INVALID_VECTOR_SIZE:'Vector size must be a number greater than 0. Got "%s" instead.',INVALID_VECTOR_VALUE:'Vector value must be a number greater than 0. Got "%s" instead.',INVALID_INPUT_VECTOR:`Property "%s" was declared as a %s-dimensional vector, but got a %s-dimensional vector instead.
4
+ - ${tt}`,INVALID_STEMMER_FUNCTION_TYPE:"config.stemmer property must be a function.",MISSING_STEMMER:'As of version 1.0.0 @wcs-colab/orama does not ship non English stemmers by default. To solve this, please explicitly import and specify the "%s" stemmer from the package @orama/stemmers. See https://docs.orama.com/docs/orama-js/text-analysis/stemming for more information.',CUSTOM_STOP_WORDS_MUST_BE_FUNCTION_OR_ARRAY:"Custom stop words array must only contain strings.",UNSUPPORTED_COMPONENT:'Unsupported component "%s".',COMPONENT_MUST_BE_FUNCTION:'The component "%s" must be a function.',COMPONENT_MUST_BE_FUNCTION_OR_ARRAY_FUNCTIONS:'The component "%s" must be a function or an array of functions.',INVALID_SCHEMA_TYPE:'Unsupported schema type "%s" at "%s". Expected "string", "boolean" or "number" or array of them.',DOCUMENT_ID_MUST_BE_STRING:'Document id must be of type "string". Got "%s" instead.',DOCUMENT_ALREADY_EXISTS:'A document with id "%s" already exists.',DOCUMENT_DOES_NOT_EXIST:'A document with id "%s" does not exists.',MISSING_DOCUMENT_PROPERTY:'Missing searchable property "%s".',INVALID_DOCUMENT_PROPERTY:'Invalid document property "%s": expected "%s", got "%s"',UNKNOWN_INDEX:'Invalid property name "%s". Expected a wildcard string ("*") or array containing one of the following properties: %s',INVALID_BOOST_VALUE:"Boost value must be a number greater than, or less than 0.",INVALID_FILTER_OPERATION:"You can only use one operation per filter, you requested %d.",SCHEMA_VALIDATION_FAILURE:'Cannot insert document due schema validation failure on "%s" property.',INVALID_SORT_SCHEMA_TYPE:'Unsupported sort schema type "%s" at "%s". Expected "string" or "number".',CANNOT_SORT_BY_ARRAY:'Cannot configure sort for "%s" because it is an array (%s).',UNABLE_TO_SORT_ON_UNKNOWN_FIELD:'Unable to sort on unknown field "%s". Allowed fields: %s',SORT_DISABLED:"Sort is disabled. Please read the documentation at https://docs.orama.com/docs/orama-js for more information.",UNKNOWN_GROUP_BY_PROPERTY:'Unknown groupBy property "%s".',INVALID_GROUP_BY_PROPERTY:'Invalid groupBy property "%s". Allowed types: "%s", but given "%s".',UNKNOWN_FILTER_PROPERTY:'Unknown filter property "%s".',UNKNOWN_VECTOR_PROPERTY:'Unknown vector property "%s". Make sure the property exists in the schema and is configured as a vector.',INVALID_VECTOR_SIZE:'Vector size must be a number greater than 0. Got "%s" instead.',INVALID_VECTOR_VALUE:'Vector value must be a number greater than 0. Got "%s" instead.',INVALID_INPUT_VECTOR:`Property "%s" was declared as a %s-dimensional vector, but got a %s-dimensional vector instead.
5
5
  Input vectors must be of the size declared in the schema, as calculating similarity between vectors of different sizes can lead to unexpected results.`,WRONG_SEARCH_PROPERTY_TYPE:'Property "%s" is not searchable. Only "string" properties are searchable.',FACET_NOT_SUPPORTED:`Facet doens't support the type "%s".`,INVALID_DISTANCE_SUFFIX:'Invalid distance suffix "%s". Valid suffixes are: cm, m, km, mi, yd, ft.',INVALID_SEARCH_MODE:'Invalid search mode "%s". Valid modes are: "fulltext", "vector", "hybrid".',MISSING_VECTOR_AND_SECURE_PROXY:"No vector was provided and no secure proxy was configured. Please provide a vector or configure an Orama Secure Proxy to perform hybrid search.",MISSING_TERM:'"term" is a required parameter when performing hybrid search. Please provide a search term.',INVALID_VECTOR_INPUT:'Invalid "vector" property. Expected an object with "value" and "property" properties, but got "%s" instead.',PLUGIN_CRASHED:"A plugin crashed during initialization. Please check the error message for more information:",PLUGIN_SECURE_PROXY_NOT_FOUND:`Could not find '@wcs-colab/plugin-secure-proxy' installed in your Orama instance.
6
6
  Please install it before proceeding with creating an answer session.
7
7
  Read more at https://docs.orama.com/docs/orama-js/plugins/plugin-secure-proxy#plugin-secure-proxy
8
8
  `,PLUGIN_SECURE_PROXY_MISSING_CHAT_MODEL:`Could not find a chat model defined in the secure proxy plugin configuration.
9
9
  Please provide a chat model before proceeding with creating an answer session.
10
10
  Read more at https://docs.orama.com/docs/orama-js/plugins/plugin-secure-proxy#plugin-secure-proxy
11
- `,ANSWER_SESSION_LAST_MESSAGE_IS_NOT_ASSISTANT:"The last message in the session is not an assistant message. Cannot regenerate non-assistant messages.",PLUGIN_COMPONENT_CONFLICT:'The component "%s" is already defined. The plugin "%s" is trying to redefine it.'};function w(i,...e){let t=new Error(Te(et[i]??`Unsupported Orama Error code: ${i}`,...e));return t.code=i,"captureStackTrace"in Error.prototype&&Error.captureStackTrace(t),t}var rt={string:!1,number:!1,boolean:!1,enum:!1,geopoint:!1,"string[]":!0,"number[]":!0,"boolean[]":!0,"enum[]":!0},ot={"string[]":"string","number[]":"number","boolean[]":"boolean","enum[]":"enum"};function z(i){return typeof i=="string"&&/^vector\[\d+\]$/.test(i)}function de(i){return typeof i=="string"&&rt[i]}function xe(i){return ot[i]}function ne(i){let e=Number(i.slice(7,-1));switch(!0){case isNaN(e):throw w("INVALID_VECTOR_VALUE",i);case e<=0:throw w("INVALID_VECTOR_SIZE",i);default:return e}}function B(i,e){if(typeof e=="string"){let t=i.idToInternalId.get(e);if(t)return t;let n=i.idToInternalId.size+1;return i.idToInternalId.set(e,n),i.internalIdToId.push(e),n}return e>i.internalIdToId.length?B(i,e.toString()):e}var E={};v(E,{calculateResultScores:()=>ge,create:()=>me,createIndex:()=>ut,getSearchableProperties:()=>Ce,getSearchablePropertiesWithTypes:()=>ze,insert:()=>_e,insertDocumentScoreParameters:()=>ke,insertTokenScoreParameters:()=>Pe,insertVector:()=>ve,load:()=>Be,remove:()=>Le,removeDocumentScoreParameters:()=>Re,removeTokenScoreParameters:()=>Ee,save:()=>Fe,search:()=>Me,searchByGeoWhereClause:()=>dt,searchByWhereClause:()=>q});var re={};v(re,{AVLNode:()=>L,AVLTree:()=>J});var L=class i{constructor(e,t){y(this,"k");y(this,"v");y(this,"l",null);y(this,"r",null);y(this,"h",1);this.k=e,this.v=new Set(t)}updateHeight(){this.h=Math.max(i.getHeight(this.l),i.getHeight(this.r))+1}static getHeight(e){return e?e.h:0}getBalanceFactor(){return i.getHeight(this.l)-i.getHeight(this.r)}rotateLeft(){let e=this.r;return this.r=e.l,e.l=this,this.updateHeight(),e.updateHeight(),e}rotateRight(){let e=this.l;return this.l=e.r,e.r=this,this.updateHeight(),e.updateHeight(),e}toJSON(){return{k:this.k,v:Array.from(this.v),l:this.l?this.l.toJSON():null,r:this.r?this.r.toJSON():null,h:this.h}}static fromJSON(e){let t=new i(e.k,e.v);return t.l=e.l?i.fromJSON(e.l):null,t.r=e.r?i.fromJSON(e.r):null,t.h=e.h,t}},J=class i{constructor(e,t){y(this,"root",null);y(this,"insertCount",0);e!==void 0&&t!==void 0&&(this.root=new L(e,t))}insert(e,t,n=1e3){this.root=this.insertNode(this.root,e,t,n)}insertMultiple(e,t,n=1e3){for(let o of t)this.insert(e,o,n)}rebalance(){this.root&&(this.root=this.rebalanceNode(this.root))}toJSON(){return{root:this.root?this.root.toJSON():null,insertCount:this.insertCount}}static fromJSON(e){let t=new i;return t.root=e.root?L.fromJSON(e.root):null,t.insertCount=e.insertCount||0,t}insertNode(e,t,n,o){if(e===null)return new L(t,[n]);let s=[],r=e,a=null;for(;r!==null;)if(s.push({parent:a,node:r}),t<r.k)if(r.l===null){r.l=new L(t,[n]),s.push({parent:r,node:r.l});break}else a=r,r=r.l;else if(t>r.k)if(r.r===null){r.r=new L(t,[n]),s.push({parent:r,node:r.r});break}else a=r,r=r.r;else return r.v.add(n),e;let c=!1;this.insertCount++%o===0&&(c=!0);for(let l=s.length-1;l>=0;l--){let{parent:u,node:d}=s[l];if(d.updateHeight(),c){let f=this.rebalanceNode(d);u?u.l===d?u.l=f:u.r===d&&(u.r=f):e=f}}return e}rebalanceNode(e){let t=e.getBalanceFactor();if(t>1){if(e.l&&e.l.getBalanceFactor()>=0)return e.rotateRight();if(e.l)return e.l=e.l.rotateLeft(),e.rotateRight()}if(t<-1){if(e.r&&e.r.getBalanceFactor()<=0)return e.rotateLeft();if(e.r)return e.r=e.r.rotateRight(),e.rotateLeft()}return e}find(e){let t=this.findNodeByKey(e);return t?t.v:null}contains(e){return this.find(e)!==null}getSize(){let e=0,t=[],n=this.root;for(;n||t.length>0;){for(;n;)t.push(n),n=n.l;n=t.pop(),e++,n=n.r}return e}isBalanced(){if(!this.root)return!0;let e=[this.root];for(;e.length>0;){let t=e.pop(),n=t.getBalanceFactor();if(Math.abs(n)>1)return!1;t.l&&e.push(t.l),t.r&&e.push(t.r)}return!0}remove(e){this.root=this.removeNode(this.root,e)}removeDocument(e,t){let n=this.findNodeByKey(e);n&&(n.v.size===1?this.root=this.removeNode(this.root,e):n.v=new Set([...n.v.values()].filter(o=>o!==t)))}findNodeByKey(e){let t=this.root;for(;t;)if(e<t.k)t=t.l;else if(e>t.k)t=t.r;else return t;return null}removeNode(e,t){if(e===null)return null;let n=[],o=e;for(;o!==null&&o.k!==t;)n.push(o),t<o.k?o=o.l:o=o.r;if(o===null)return e;if(o.l===null||o.r===null){let s=o.l?o.l:o.r;if(n.length===0)e=s;else{let r=n[n.length-1];r.l===o?r.l=s:r.r=s}}else{let s=o,r=o.r;for(;r.l!==null;)s=r,r=r.l;o.k=r.k,o.v=r.v,s.l===r?s.l=r.r:s.r=r.r,o=s}n.push(o);for(let s=n.length-1;s>=0;s--){let r=n[s];r.updateHeight();let a=this.rebalanceNode(r);if(s>0){let c=n[s-1];c.l===r?c.l=a:c.r===r&&(c.r=a)}else e=a}return e}rangeSearch(e,t){let n=new Set,o=[],s=this.root;for(;s||o.length>0;){for(;s;)o.push(s),s=s.l;if(s=o.pop(),s.k>=e&&s.k<=t)for(let r of s.v)n.add(r);if(s.k>t)break;s=s.r}return n}greaterThan(e,t=!1){let n=new Set,o=[],s=this.root;for(;s||o.length>0;){for(;s;)o.push(s),s=s.r;if(s=o.pop(),t&&s.k>=e||!t&&s.k>e)for(let r of s.v)n.add(r);else if(s.k<=e)break;s=s.l}return n}lessThan(e,t=!1){let n=new Set,o=[],s=this.root;for(;s||o.length>0;){for(;s;)o.push(s),s=s.l;if(s=o.pop(),t&&s.k<=e||!t&&s.k<e)for(let r of s.v)n.add(r);else if(s.k>e)break;s=s.r}return n}};var oe={};v(oe,{FlatTree:()=>$});var $=class i{constructor(){y(this,"numberToDocumentId");this.numberToDocumentId=new Map}insert(e,t){this.numberToDocumentId.has(e)?this.numberToDocumentId.get(e).add(t):this.numberToDocumentId.set(e,new Set([t]))}find(e){let t=this.numberToDocumentId.get(e);return t?Array.from(t):null}remove(e){this.numberToDocumentId.delete(e)}removeDocument(e,t){let n=this.numberToDocumentId.get(t);n&&(n.delete(e),n.size===0&&this.numberToDocumentId.delete(t))}contains(e){return this.numberToDocumentId.has(e)}getSize(){let e=0;for(let t of this.numberToDocumentId.values())e+=t.size;return e}filter(e){let t=Object.keys(e);if(t.length!==1)throw new Error("Invalid operation");let n=t[0];switch(n){case"eq":{let o=e[n],s=this.numberToDocumentId.get(o);return s?Array.from(s):[]}case"in":{let o=e[n],s=new Set;for(let r of o){let a=this.numberToDocumentId.get(r);if(a)for(let c of a)s.add(c)}return Array.from(s)}case"nin":{let o=new Set(e[n]),s=new Set;for(let[r,a]of this.numberToDocumentId.entries())if(!o.has(r))for(let c of a)s.add(c);return Array.from(s)}default:throw new Error("Invalid operation")}}filterArr(e){let t=Object.keys(e);if(t.length!==1)throw new Error("Invalid operation");let n=t[0];switch(n){case"containsAll":{let s=e[n].map(a=>this.numberToDocumentId.get(a)??new Set);if(s.length===0)return[];let r=s.reduce((a,c)=>new Set([...a].filter(l=>c.has(l))));return Array.from(r)}case"containsAny":{let s=e[n].map(a=>this.numberToDocumentId.get(a)??new Set);if(s.length===0)return[];let r=s.reduce((a,c)=>new Set([...a,...c]));return Array.from(r)}default:throw new Error("Invalid operation")}}static fromJSON(e){if(!e.numberToDocumentId)throw new Error("Invalid Flat Tree JSON");let t=new i;for(let[n,o]of e.numberToDocumentId)t.numberToDocumentId.set(n,new Set(o));return t}toJSON(){return{numberToDocumentId:Array.from(this.numberToDocumentId.entries()).map(([e,t])=>[e,Array.from(t)])}}};var F={};v(F,{RadixNode:()=>Q,RadixTree:()=>G});var H=!1;function at(i,e,t){if(t<0)return-1;if(i===e)return 0;let n=i.length,o=e.length;if(n===0)return o<=t?o:-1;if(o===0)return n<=t?n:-1;let s=Math.abs(n-o);if(H){if(i.startsWith(e))return s<=t?s:-1;if(e.startsWith(i))return 0}if(s>t)return-1;let r=[];for(let a=0;a<=n;a++){r[a]=[a];for(let c=1;c<=o;c++)r[a][c]=a===0?c:0}for(let a=1;a<=n;a++){let c=1/0;for(let l=1;l<=o;l++)i[a-1]===e[l-1]?r[a][l]=r[a-1][l-1]:r[a][l]=Math.min(r[a-1][l]+1,r[a][l-1]+1,r[a-1][l-1]+1),c=Math.min(c,r[a][l]);if(c>t)return-1}return r[n][o]<=t?r[n][o]:-1}function he(i,e,t){let n=at(i,e,t);return{distance:n,isBounded:n>=0}}var Q=class i{constructor(e,t,n){y(this,"k");y(this,"s");y(this,"c",new Map);y(this,"d",new Set);y(this,"e");y(this,"w","");this.k=e,this.s=t,this.e=n}updateParent(e){this.w=e.w+this.s}addDocument(e){this.d.add(e)}removeDocument(e){return this.d.delete(e)}findAllWords(e,t,n,o){let s=[this];for(;s.length>0;){let r=s.pop();if(r.e){let{w:a,d:c}=r;if(n&&a!==t)continue;if(ee(e,a)!==null)if(o)if(Math.abs(t.length-a.length)<=o&&he(t,a,o).isBounded)e[a]=[];else continue;else e[a]=[];if(ee(e,a)!=null&&c.size>0){let l=e[a];for(let u of c)l.includes(u)||l.push(u)}}r.c.size>0&&s.push(...r.c.values())}return e}insert(e,t){let n=this,o=0,s=e.length;for(;o<s;){let r=e[o],a=n.c.get(r);if(a){let c=a.s,l=c.length,u=0;for(;u<l&&o+u<s&&c[u]===e[o+u];)u++;if(u===l){if(n=a,o+=u,o===s){a.e||(a.e=!0),a.addDocument(t);return}continue}let d=c.slice(0,u),f=c.slice(u),h=e.slice(o+u),p=new i(d[0],d,!1);if(n.c.set(d[0],p),p.updateParent(n),a.s=f,a.k=f[0],p.c.set(f[0],a),a.updateParent(p),h){let m=new i(h[0],h,!0);m.addDocument(t),p.c.set(h[0],m),m.updateParent(p)}else p.e=!0,p.addDocument(t);return}else{let c=new i(r,e.slice(o),!0);c.addDocument(t),n.c.set(r,c),c.updateParent(n);return}}n.e||(n.e=!0),n.addDocument(t)}_findLevenshtein(e,t,n,o,s){let r=[{node:this,index:t,tolerance:n}];for(;r.length>0;){let{node:a,index:c,tolerance:l}=r.pop();if(H&&a.w.startsWith(e)&&a.w!==e){console.log("[RADIX FIX] Prefix optimization triggered for:",a.w,"term:",e),a.findAllWords(s,e,!1,0);continue}if(H&&a.w.startsWith(e)&&a.w===e&&console.log("[RADIX FIX] Exact match excluded from prefix optimization:",e),l<0)continue;if(a.e){let{w:d,d:f}=a;if(d&&(he(e,d,o).isBounded&&(s[d]=[]),ee(s,d)!==void 0&&f.size>0)){let h=new Set(s[d]);for(let p of f)h.add(p);s[d]=Array.from(h)}}if(c>=e.length)continue;let u=e[c];if(a.c.has(u)){let d=a.c.get(u);r.push({node:d,index:c+1,tolerance:l})}r.push({node:a,index:c+1,tolerance:l-1});for(let[d,f]of a.c)r.push({node:f,index:c,tolerance:l-1}),d!==u&&r.push({node:f,index:c+1,tolerance:l-1})}}find(e){let{term:t,exact:n,tolerance:o}=e;if(o&&!n){let s={};return this._findLevenshtein(t,0,o,o,s),s}else{let s=this,r=0,a=t.length;for(;r<a;){let l=t[r],u=s.c.get(l);if(u){let d=u.s,f=d.length,h=0;for(;h<f&&r+h<a&&d[h]===t[r+h];)h++;if(h===f)s=u,r+=h;else if(r+h===a)if(h===a-r){if(n)return{};{let p={};return u.findAllWords(p,t,n,o),p}}else return{};else return{}}else return{}}let c={};return s.findAllWords(c,t,n,o),c}}contains(e){let t=this,n=0,o=e.length;for(;n<o;){let s=e[n],r=t.c.get(s);if(r){let a=r.s,c=a.length,l=0;for(;l<c&&n+l<o&&a[l]===e[n+l];)l++;if(l<c)return!1;n+=c,t=r}else return!1}return!0}removeWord(e){if(!e)return!1;let t=this,n=e.length,o=[];for(let s=0;s<n;s++){let r=e[s];if(t.c.has(r)){let a=t.c.get(r);o.push({parent:t,character:r}),s+=a.s.length-1,t=a}else return!1}for(t.d.clear(),t.e=!1;o.length>0&&t.c.size===0&&!t.e&&t.d.size===0;){let{parent:s,character:r}=o.pop();s.c.delete(r),t=s}return!0}removeDocumentByWord(e,t,n=!0){if(!e)return!0;let o=this,s=e.length;for(let r=0;r<s;r++){let a=e[r];if(o.c.has(a)){let c=o.c.get(a);r+=c.s.length-1,o=c,n&&o.w!==e||o.removeDocument(t)}else return!1}return!0}static getCommonPrefix(e,t){let n=Math.min(e.length,t.length),o=0;for(;o<n&&e.charCodeAt(o)===t.charCodeAt(o);)o++;return e.slice(0,o)}toJSON(){return{w:this.w,s:this.s,e:this.e,k:this.k,d:Array.from(this.d),c:Array.from(this.c?.entries())?.map(([e,t])=>[e,t.toJSON()])}}static fromJSON(e){let t=new i(e.k,e.s,e.e);return t.w=e.w,t.d=new Set(e.d),t.c=new Map(e?.c?.map(([n,o])=>[n,i.fromJSON(o)])||[]),t}},G=class i extends Q{constructor(){super("","",!1)}static fromJSON(e){let t=new i;return t.w=e.w,t.s=e.s,t.e=e.e,t.k=e.k,t.d=new Set(e.d),t.c=new Map(e?.c?.map(([n,o])=>[n,Q.fromJSON(o)])||[]),t}toJSON(){return super.toJSON()}};var ie={};v(ie,{BKDTree:()=>R});var se=class i{constructor(e,t){y(this,"point");y(this,"docIDs");y(this,"left");y(this,"right");y(this,"parent");this.point=e,this.docIDs=new Set(t),this.left=null,this.right=null,this.parent=null}toJSON(){return{point:this.point,docIDs:Array.from(this.docIDs),left:this.left?this.left.toJSON():null,right:this.right?this.right.toJSON():null}}static fromJSON(e,t=null){let n=new i(e.point,e.docIDs);return n.parent=t,e.left&&(n.left=i.fromJSON(e.left,n)),e.right&&(n.right=i.fromJSON(e.right,n)),n}},R=class i{constructor(){y(this,"root");y(this,"nodeMap");this.root=null,this.nodeMap=new Map}getPointKey(e){return`${e.lon},${e.lat}`}insert(e,t){let n=this.getPointKey(e),o=this.nodeMap.get(n);if(o){t.forEach(c=>o.docIDs.add(c));return}let s=new se(e,t);if(this.nodeMap.set(n,s),this.root==null){this.root=s;return}let r=this.root,a=0;for(;;){if(a%2===0)if(e.lon<r.point.lon){if(r.left==null){r.left=s,s.parent=r;return}r=r.left}else{if(r.right==null){r.right=s,s.parent=r;return}r=r.right}else if(e.lat<r.point.lat){if(r.left==null){r.left=s,s.parent=r;return}r=r.left}else{if(r.right==null){r.right=s,s.parent=r;return}r=r.right}a++}}contains(e){let t=this.getPointKey(e);return this.nodeMap.has(t)}getDocIDsByCoordinates(e){let t=this.getPointKey(e),n=this.nodeMap.get(t);return n?Array.from(n.docIDs):null}removeDocByID(e,t){let n=this.getPointKey(e),o=this.nodeMap.get(n);o&&(o.docIDs.delete(t),o.docIDs.size===0&&(this.nodeMap.delete(n),this.deleteNode(o)))}deleteNode(e){let t=e.parent,n=e.left?e.left:e.right;n&&(n.parent=t),t?t.left===e?t.left=n:t.right===e&&(t.right=n):(this.root=n,this.root&&(this.root.parent=null))}searchByRadius(e,t,n=!0,o="asc",s=!1){let r=s?i.vincentyDistance:i.haversineDistance,a=[{node:this.root,depth:0}],c=[];for(;a.length>0;){let{node:l,depth:u}=a.pop();if(l==null)continue;let d=r(e,l.point);(n?d<=t:d>t)&&c.push({point:l.point,docIDs:Array.from(l.docIDs)}),l.left!=null&&a.push({node:l.left,depth:u+1}),l.right!=null&&a.push({node:l.right,depth:u+1})}return o&&c.sort((l,u)=>{let d=r(e,l.point),f=r(e,u.point);return o.toLowerCase()==="asc"?d-f:f-d}),c}searchByPolygon(e,t=!0,n=null,o=!1){let s=[{node:this.root,depth:0}],r=[];for(;s.length>0;){let{node:c,depth:l}=s.pop();if(c==null)continue;c.left!=null&&s.push({node:c.left,depth:l+1}),c.right!=null&&s.push({node:c.right,depth:l+1});let u=i.isPointInPolygon(e,c.point);(u&&t||!u&&!t)&&r.push({point:c.point,docIDs:Array.from(c.docIDs)})}let a=i.calculatePolygonCentroid(e);if(n){let c=o?i.vincentyDistance:i.haversineDistance;r.sort((l,u)=>{let d=c(a,l.point),f=c(a,u.point);return n.toLowerCase()==="asc"?d-f:f-d})}return r}toJSON(){return{root:this.root?this.root.toJSON():null}}static fromJSON(e){let t=new i;return e.root&&(t.root=se.fromJSON(e.root),t.buildNodeMap(t.root)),t}buildNodeMap(e){if(e==null)return;let t=this.getPointKey(e.point);this.nodeMap.set(t,e),e.left&&this.buildNodeMap(e.left),e.right&&this.buildNodeMap(e.right)}static calculatePolygonCentroid(e){let t=0,n=0,o=0,s=e.length;for(let a=0,c=s-1;a<s;c=a++){let l=e[a].lon,u=e[a].lat,d=e[c].lon,f=e[c].lat,h=l*f-d*u;t+=h,n+=(l+d)*h,o+=(u+f)*h}t/=2;let r=6*t;return n/=r,o/=r,{lon:n,lat:o}}static isPointInPolygon(e,t){let n=!1,o=t.lon,s=t.lat,r=e.length;for(let a=0,c=r-1;a<r;c=a++){let l=e[a].lon,u=e[a].lat,d=e[c].lon,f=e[c].lat;u>s!=f>s&&o<(d-l)*(s-u)/(f-u)+l&&(n=!n)}return n}static haversineDistance(e,t){let n=Math.PI/180,o=e.lat*n,s=t.lat*n,r=(t.lat-e.lat)*n,a=(t.lon-e.lon)*n,c=Math.sin(r/2)*Math.sin(r/2)+Math.cos(o)*Math.cos(s)*Math.sin(a/2)*Math.sin(a/2);return 6371e3*(2*Math.atan2(Math.sqrt(c),Math.sqrt(1-c)))}static vincentyDistance(e,t){let o=.0033528106647474805,s=(1-o)*6378137,r=Math.PI/180,a=e.lat*r,c=t.lat*r,l=(t.lon-e.lon)*r,u=Math.atan((1-o)*Math.tan(a)),d=Math.atan((1-o)*Math.tan(c)),f=Math.sin(u),h=Math.cos(u),p=Math.sin(d),m=Math.cos(d),b=l,S,I=1e3,g,T,x,D,k,O;do{let W=Math.sin(b),Y=Math.cos(b);if(g=Math.sqrt(m*W*(m*W)+(h*p-f*m*Y)*(h*p-f*m*Y)),g===0)return 0;T=f*p+h*m*Y,x=Math.atan2(g,T),D=h*m*W/g,k=1-D*D,O=T-2*f*p/k,isNaN(O)&&(O=0);let le=o/16*k*(4+o*(4-3*k));S=b,b=l+(1-le)*o*D*(x+le*g*(O+le*T*(-1+2*O*O)))}while(Math.abs(b-S)>1e-12&&--I>0);if(I===0)return NaN;let A=k*(6378137*6378137-s*s)/(s*s),_=1+A/16384*(4096+A*(-768+A*(320-175*A))),N=A/1024*(256+A*(-128+A*(74-47*A))),P=N*g*(O+N/4*(T*(-1+2*O*O)-N/6*O*(-3+4*g*g)*(-3+4*O*O)));return s*_*(x-P)}};var ae={};v(ae,{BoolNode:()=>K});var K=class i{constructor(){y(this,"true");y(this,"false");this.true=new Set,this.false=new Set}insert(e,t){t?this.true.add(e):this.false.add(e)}delete(e,t){t?this.true.delete(e):this.false.delete(e)}getSize(){return this.true.size+this.false.size}toJSON(){return{true:Array.from(this.true),false:Array.from(this.false)}}static fromJSON(e){let t=new i;return t.true=new Set(e.true),t.false=new Set(e.false),t}};function De(i,e,t,n,o,{k:s,b:r,d:a}){return Math.log(1+(t-e+.5)/(e+.5))*(a+i*(s+1))/(i+s*(1-r+r*n/o))}var ce={};v(ce,{DEFAULT_SIMILARITY:()=>ct,VectorIndex:()=>j,findSimilarVectors:()=>Oe,getMagnitude:()=>pe});var ct=.8,j=class i{constructor(e){y(this,"size");y(this,"vectors",new Map);this.size=e}add(e,t){t instanceof Float32Array||(t=new Float32Array(t));let n=pe(t,this.size);this.vectors.set(e,[n,t])}remove(e){this.vectors.delete(e)}find(e,t,n){return e instanceof Float32Array||(e=new Float32Array(e)),Oe(e,n,this.vectors,this.size,t)}toJSON(){let e=[];for(let[t,[n,o]]of this.vectors)e.push([t,[n,Array.from(o)]]);return{size:this.size,vectors:e}}static fromJSON(e){let t=e,n=new i(t.size);for(let[o,[s,r]]of t.vectors)n.vectors.set(o,[s,new Float32Array(r)]);return n}};function pe(i,e){let t=0;for(let n=0;n<e;n++)t+=i[n]*i[n];return Math.sqrt(t)}function Oe(i,e,t,n,o){let s=pe(i,n),r=[],a=e||t.keys();for(let c of a){let l=t.get(c);if(!l)continue;let u=l[0],d=l[1],f=0;for(let p=0;p<n;p++)f+=i[p]*d[p];let h=f/(s*u);h>=o&&r.push([c,h])}return r}function ke(i,e,t,n,o){let s=B(i.sharedInternalDocumentStore,t);i.avgFieldLength[e]=((i.avgFieldLength[e]??0)*(o-1)+n.length)/o,i.fieldLengths[e][s]=n.length,i.frequencies[e][s]={}}function Pe(i,e,t,n,o){let s=0;for(let c of n)c===o&&s++;let r=B(i.sharedInternalDocumentStore,t),a=s/n.length;i.frequencies[e][r][o]=a,o in i.tokenOccurrences[e]||(i.tokenOccurrences[e][o]=0),i.tokenOccurrences[e][o]=(i.tokenOccurrences[e][o]??0)+1}function Re(i,e,t,n){let o=B(i.sharedInternalDocumentStore,t);n>1?i.avgFieldLength[e]=(i.avgFieldLength[e]*n-i.fieldLengths[e][o])/(n-1):i.avgFieldLength[e]=void 0,i.fieldLengths[e][o]=void 0,i.frequencies[e][o]=void 0}function Ee(i,e,t){i.tokenOccurrences[e][t]--}function me(i,e,t,n,o=""){n||(n={sharedInternalDocumentStore:e,indexes:{},vectorIndexes:{},searchableProperties:[],searchablePropertiesWithTypes:{},frequencies:{},tokenOccurrences:{},avgFieldLength:{},fieldLengths:{}});for(let[s,r]of Object.entries(t)){let a=`${o}${o?".":""}${s}`;if(typeof r=="object"&&!Array.isArray(r)){me(i,e,r,n,a);continue}if(z(r))n.searchableProperties.push(a),n.searchablePropertiesWithTypes[a]=r,n.vectorIndexes[a]={type:"Vector",node:new j(ne(r)),isArray:!1};else{let c=/\[/.test(r);switch(r){case"boolean":case"boolean[]":n.indexes[a]={type:"Bool",node:new K,isArray:c};break;case"number":case"number[]":n.indexes[a]={type:"AVL",node:new J(0,[]),isArray:c};break;case"string":case"string[]":n.indexes[a]={type:"Radix",node:new G,isArray:c},n.avgFieldLength[a]=0,n.frequencies[a]={},n.tokenOccurrences[a]={},n.fieldLengths[a]={};break;case"enum":case"enum[]":n.indexes[a]={type:"Flat",node:new $,isArray:c};break;case"geopoint":n.indexes[a]={type:"BKD",node:new R,isArray:c};break;default:throw w("INVALID_SCHEMA_TYPE",Array.isArray(r)?"array":r,a)}n.searchableProperties.push(a),n.searchablePropertiesWithTypes[a]=r}}return n}function lt(i,e,t,n,o,s,r,a){return c=>{let{type:l,node:u}=e.indexes[t];switch(l){case"Bool":{u[c?"true":"false"].add(n);break}case"AVL":{let d=a?.avlRebalanceThreshold??1;u.insert(c,n,d);break}case"Radix":{let d=s.tokenize(c,o,t,!1);i.insertDocumentScoreParameters(e,t,n,d,r);for(let f of d)i.insertTokenScoreParameters(e,t,n,d,f),u.insert(f,n);break}case"Flat":{u.insert(c,n);break}case"BKD":{u.insert(c,[n]);break}}}}function _e(i,e,t,n,o,s,r,a,c,l,u){if(z(r))return ve(e,t,s,n,o);let d=lt(i,e,t,o,a,c,l,u);if(!de(r))return d(s);let f=s,h=f.length;for(let p=0;p<h;p++)d(f[p])}function ve(i,e,t,n,o){i.vectorIndexes[e].node.add(o,t)}function we(i,e,t,n,o,s,r,a,c,l){if(z(r))return e.vectorIndexes[t].node.remove(o),!0;let{type:u,node:d}=e.indexes[t];switch(u){case"AVL":return d.removeDocument(s,o),!0;case"Bool":return d[s?"true":"false"].delete(o),!0;case"Radix":{let f=c.tokenize(s,a,t);i.removeDocumentScoreParameters(e,t,n,l);for(let h of f)i.removeTokenScoreParameters(e,t,h),d.removeDocumentByWord(h,o);return!0}case"Flat":return d.removeDocument(o,s),!0;case"BKD":return d.removeDocByID(s,o),!1}}function Le(i,e,t,n,o,s,r,a,c,l){if(!de(r))return we(i,e,t,n,o,s,r,a,c,l);let u=xe(r),d=s,f=d.length;for(let h=0;h<f;h++)we(i,e,t,n,o,d[h],u,a,c,l);return!0}function ge(i,e,t,n,o,s,r,a,c,l){let u=Array.from(n),d=i.avgFieldLength[e],f=i.fieldLengths[e],h=i.tokenOccurrences[e],p=i.frequencies[e],m=typeof h[t]=="number"?h[t]??0:0,b=u.length;for(let S=0;S<b;S++){let I=u[S];if(c&&!c.has(I))continue;l.has(I)||l.set(I,new Map);let g=l.get(I);g.set(e,(g.get(e)||0)+1);let T=p?.[I]?.[t]??0,x=De(T,m,o,f[I],d,s);r.has(I)?r.set(I,r.get(I)+x*a):r.set(I,x*a)}}function Me(i,e,t,n,o,s,r,a,c,l,u,d=0){let f=t.tokenize(e,n),h=f.length||1,p=new Map,m=new Map,b=new Map;for(let g of o){if(!(g in i.indexes))continue;let T=i.indexes[g],{type:x}=T;if(x!=="Radix")throw w("WRONG_SEARCH_PROPERTY_TYPE",g);let D=a[g]??1;if(D<=0)throw w("INVALID_BOOST_VALUE",D);f.length===0&&!e&&f.push("");let k=f.length;for(let O=0;O<k;O++){let A=f[O],_=T.node.find({term:A,exact:s,tolerance:r}),N=Object.keys(_);N.length>0&&m.set(A,!0);let P=N.length;for(let U=0;U<P;U++){let W=N[U],Y=_[W];ge(i,g,W,Y,l,c,b,D,u,p)}}}let S=Array.from(b.entries()).map(([g,T])=>[g,T]).sort((g,T)=>T[1]-g[1]);if(S.length===0)return[];if(d===1)return S;if(d===0){if(h===1)return S;for(let T of f)if(!m.get(T))return[];return S.filter(([T])=>{let x=p.get(T);return x?Array.from(x.values()).some(D=>D===h):!1})}let I=S.filter(([g])=>{let T=p.get(g);return T?Array.from(T.values()).some(x=>x===h):!1});if(I.length>0){let g=S.filter(([x])=>!I.some(([D])=>D===x)),T=Math.ceil(g.length*d);return[...I,...g.slice(0,T)]}return S}function q(i,e,t,n){if("and"in t&&t.and&&Array.isArray(t.and)){let r=t.and;if(r.length===0)return new Set;let a=r.map(c=>q(i,e,c,n));return C(...a)}if("or"in t&&t.or&&Array.isArray(t.or)){let r=t.or;return r.length===0?new Set:r.map(c=>q(i,e,c,n)).reduce((c,l)=>V(c,l),new Set)}if("not"in t&&t.not){let r=t.not,a=new Set,c=i.sharedInternalDocumentStore;for(let u=1;u<=c.internalIdToId.length;u++)a.add(u);let l=q(i,e,r,n);return fe(a,l)}let o=Object.keys(t),s=o.reduce((r,a)=>({[a]:new Set,...r}),{});for(let r of o){let a=t[r];if(typeof i.indexes[r]>"u")throw w("UNKNOWN_FILTER_PROPERTY",r);let{node:c,type:l,isArray:u}=i.indexes[r];if(l==="Bool"){let f=c,h=a?f.true:f.false;s[r]=V(s[r],h);continue}if(l==="BKD"){let f;if("radius"in a)f="radius";else if("polygon"in a)f="polygon";else throw new Error(`Invalid operation ${a}`);if(f==="radius"){let{value:h,coordinates:p,unit:m="m",inside:b=!0,highPrecision:S=!1}=a[f],I=te(h,m),g=c.searchByRadius(p,I,b,void 0,S);s[r]=Ae(s[r],g)}else{let{coordinates:h,inside:p=!0,highPrecision:m=!1}=a[f],b=c.searchByPolygon(h,p,void 0,m);s[r]=Ae(s[r],b)}continue}if(l==="Radix"&&(typeof a=="string"||Array.isArray(a))){for(let f of[a].flat()){let h=e.tokenize(f,n,r);for(let p of h){let m=c.find({term:p,exact:!0});s[r]=ht(s[r],m)}}continue}let d=Object.keys(a);if(d.length>1)throw w("INVALID_FILTER_OPERATION",d.length);if(l==="Flat"){let f=new Set(u?c.filterArr(a):c.filter(a));s[r]=V(s[r],f);continue}if(l==="AVL"){let f=d[0],h=a[f],p;switch(f){case"gt":{p=c.greaterThan(h,!1);break}case"gte":{p=c.greaterThan(h,!0);break}case"lt":{p=c.lessThan(h,!1);break}case"lte":{p=c.lessThan(h,!0);break}case"eq":{p=c.find(h)??new Set;break}case"between":{let[m,b]=h;p=c.rangeSearch(m,b);break}default:throw w("INVALID_FILTER_OPERATION",f)}s[r]=V(s[r],p)}}return C(...Object.values(s))}function Ce(i){return i.searchableProperties}function ze(i){return i.searchablePropertiesWithTypes}function Be(i,e){let{indexes:t,vectorIndexes:n,searchableProperties:o,searchablePropertiesWithTypes:s,frequencies:r,tokenOccurrences:a,avgFieldLength:c,fieldLengths:l}=e,u={},d={};for(let f of Object.keys(t)){let{node:h,type:p,isArray:m}=t[f];switch(p){case"Radix":u[f]={type:"Radix",node:G.fromJSON(h),isArray:m};break;case"Flat":u[f]={type:"Flat",node:$.fromJSON(h),isArray:m};break;case"AVL":u[f]={type:"AVL",node:J.fromJSON(h),isArray:m};break;case"BKD":u[f]={type:"BKD",node:R.fromJSON(h),isArray:m};break;case"Bool":u[f]={type:"Bool",node:K.fromJSON(h),isArray:m};break;default:u[f]=t[f]}}for(let f of Object.keys(n))d[f]={type:"Vector",isArray:!1,node:j.fromJSON(n[f])};return{sharedInternalDocumentStore:i,indexes:u,vectorIndexes:d,searchableProperties:o,searchablePropertiesWithTypes:s,frequencies:r,tokenOccurrences:a,avgFieldLength:c,fieldLengths:l}}function Fe(i){let{indexes:e,vectorIndexes:t,searchableProperties:n,searchablePropertiesWithTypes:o,frequencies:s,tokenOccurrences:r,avgFieldLength:a,fieldLengths:c}=i,l={};for(let d of Object.keys(t))l[d]=t[d].node.toJSON();let u={};for(let d of Object.keys(e)){let{type:f,node:h,isArray:p}=e[d];f==="Flat"||f==="Radix"||f==="AVL"||f==="BKD"||f==="Bool"?u[d]={type:f,node:h.toJSON(),isArray:p}:(u[d]=e[d],u[d].node=u[d].node.toJSON())}return{indexes:u,vectorIndexes:l,searchableProperties:n,searchablePropertiesWithTypes:o,frequencies:s,tokenOccurrences:r,avgFieldLength:a,fieldLengths:c}}function ut(){return{create:me,insert:_e,remove:Le,insertDocumentScoreParameters:ke,insertTokenScoreParameters:Pe,removeDocumentScoreParameters:Re,removeTokenScoreParameters:Ee,calculateResultScores:ge,search:Me,searchByWhereClause:q,getSearchableProperties:Ce,getSearchablePropertiesWithTypes:ze,load:Be,save:Fe}}function Ae(i,e){i||(i=new Set);let t=e.length;for(let n=0;n<t;n++){let o=e[n].docIDs,s=o.length;for(let r=0;r<s;r++)i.add(o[r])}return i}function Ne(i,e,t=!1){let n=t?R.vincentyDistance:R.haversineDistance,o=[],s=[];for(let{point:c}of i)s.push(n(e,c));let r=Math.max(...s),a=0;for(let{docIDs:c}of i){let l=s[a],u=r-l+1;for(let d of c)o.push([d,u]);a++}return o.sort((c,l)=>l[1]-c[1]),o}function ft(i,e){let t=Object.keys(i);if(t.length!==1)return{isGeoOnly:!1};let n=t[0],o=i[n];if(typeof e.indexes[n]>"u")return{isGeoOnly:!1};let{type:s}=e.indexes[n];return s==="BKD"&&o&&("radius"in o||"polygon"in o)?{isGeoOnly:!0,geoProperty:n,geoOperation:o}:{isGeoOnly:!1}}function dt(i,e){let t=i,n=ft(e,t);if(!n.isGeoOnly||!n.geoProperty||!n.geoOperation)return null;let{node:o}=t.indexes[n.geoProperty],s=n.geoOperation,r=o,a;if("radius"in s){let{value:c,coordinates:l,unit:u="m",inside:d=!0,highPrecision:f=!1}=s.radius,h=l,p=te(c,u);return a=r.searchByRadius(h,p,d,"asc",f),Ne(a,h,f)}else if("polygon"in s){let{coordinates:c,inside:l=!0,highPrecision:u=!1}=s.polygon;a=r.searchByPolygon(c,l,"asc",u);let d=R.calculatePolygonCentroid(c);return Ne(a,d,u)}return null}function ht(i,e){i||(i=new Set);let t=Object.keys(e),n=t.length;for(let o=0;o<n;o++){let s=e[t[o]],r=s.length;for(let a=0;a<r;a++)i.add(s[a])}return i}var pt="[^aeiou]",Ue="[aeiouy]",M=pt+"[^aeiouy]*",X=Ue+"[aeiou]*",mn="^("+M+")?"+X+M,gn="^("+M+")?"+X+M+"("+X+")?$",Sn="^("+M+")?"+X+M+X+M,In="^("+M+")?"+Ue;function Se(i,e,t){for(let n of Object.entries(e)){let o=n[0],s=n[1],r=`${t}${t?".":""}${o}`;if(typeof s=="object"&&!Array.isArray(s)){Se(i,s,r);continue}if(z(s))i.searchableProperties.push(r),i.searchablePropertiesWithTypes[r]=s,i.vectorIndexes[r]={type:"Vector",node:new ce.VectorIndex(ne(s)),isArray:!1};else{let a=/\[/.test(s);switch(s){case"boolean":case"boolean[]":i.indexes[r]={type:"Bool",node:new ae.BoolNode,isArray:a};break;case"number":case"number[]":i.indexes[r]={type:"AVL",node:new re.AVLTree(0,[]),isArray:a};break;case"string":case"string[]":i.indexes[r]={type:"Radix",node:new F.RadixTree,isArray:a};break;case"enum":case"enum[]":i.indexes[r]={type:"Flat",node:new oe.FlatTree,isArray:a};break;case"geopoint":i.indexes[r]={type:"BKD",node:new ie.BKDTree,isArray:a};break;default:throw new Error("INVALID_SCHEMA_TYPE: "+r)}i.searchableProperties.push(r),i.searchablePropertiesWithTypes[r]=s}}}var yt=1048575;function bt(i,e){let t=Je(i),o=Ve(i)|1<<e;return t+1<<20|o}function Ie(i,e,t,n,o,s,r){let a=i.split(/\.|\?|!/),c=0,l=0;for(let u of a){let d=r.tokenize(u,s,n);for(let f of d){l++,t[f]||(t[f]=0);let h=Math.min(c,20);t.tokenQuantums[o][f]=bt(t.tokenQuantums[o][f],h),e.insert(f,o)}d.length>1&&c++}t.tokensLength.set(o,l)}function We(i){let e=i.tokens,t=i.radixNode,n=i.exact,o=i.tolerance,s=i.stats,r=i.boostPerProp,a=i.resultMap,c=i.whereFiltersIDs,l=s.tokensLength,u=s.tokenQuantums,d={term:"",exact:n,tolerance:o},f={},h=e.length;for(let b=0;b<h;b++){let S=e[b];d.term=S;let I=t.find(d);f={...f,...I}}let p=Object.keys(f),m=p.length;for(let b=0;b<m;b++){let S=p[b],I=f[S],g=I.length,T=e.includes(S);for(let x=0;x<g;x++){let D=I[x];if(c&&!c.has(D))continue;let k=l.get(D),O=u[D][S],A=Je(O),_=Ve(O),N=(A*A/k+(T?1:0))*r;if(!a.has(D)){a.set(D,[N,_]);continue}let P=a.get(D),U=P[0]+Tt(P[1]&_)*2+N;P[0]=U,P[1]=P[1]|_}}}function Ve(i){return i&yt}function Je(i){return i>>20}function Tt(i){let e=0;do i&1&&++e;while(i>>=1);return e}function ye(i,e,t,n,o,s,r){let a=r.tokensLength,c=r.tokenQuantums,l=o.tokenize(i,s,t);for(let u of l)e.removeDocumentByWord(u,n,!0);a.delete(n),delete c[n]}var xt=new F.RadixNode("","",!1),Dt={tokenQuantums:{},tokensLength:new Map};function Ot(i,e,t,n,o,s,r,a,c,l,u){let d=new Map,f={tokens:t.tokenize(e,n),radixNode:xt,exact:s,tolerance:r,stats:Dt,boostPerProp:0,all:d,resultMap:d,whereFiltersIDs:u},h=o.length;for(let S=0;S<h;S++){let I=o[S],g=i.stats[I],T=a[I]??1;f.radixNode=i.indexes[I].node,f.stats=g,f.boostPerProp=T,We(f)}let p=Array.from(d),m=p.length,b=[];for(let S=0;S<m;S++){let I=p[S],g=I[0],T=I[1][0];b.push([g,T])}return b}function wt(){return{name:"qps",getComponents(i){return At(i)}}}function At(i){return{index:{create:function(){let t={indexes:{},vectorIndexes:{},searchableProperties:[],searchablePropertiesWithTypes:{},stats:{}};return Se(t,i,""),t},insert:function(t,n,o,s,r,a,c,l,u,d){if(!(c==="string"||c==="string[]"))return E.insert(t,n,o,s,r,a,c,l,u,d);n.stats[o]||(n.stats[o]={tokenQuantums:{},tokensLength:new Map});let f=n.stats[o],h=n.indexes[o].node;if(f.tokenQuantums[r]={},Array.isArray(a))for(let p of a)Ie(p,h,f,o,r,l,u);else Ie(a,h,f,o,r,l,u)},remove:function(t,n,o,s,r,a,c,l,u,d){if(!(c==="string"||c==="string[]"))return E.remove(t,n,o,s,r,a,c,l,u,d);let f=n.stats[o],h=n.indexes[o].node;if(Array.isArray(a))for(let p of a)ye(p,h,o,r,u,l,f);else ye(a,h,o,r,u,l,f)},insertDocumentScoreParameters:()=>{throw new Error},insertTokenScoreParameters:()=>{throw new Error},removeDocumentScoreParameters:()=>{throw new Error},removeTokenScoreParameters:()=>{throw new Error},calculateResultScores:()=>{throw new Error},search:Ot,searchByWhereClause:function(t,n,o,s){let r=Object.entries(o).filter(([u])=>t.indexes[u].type==="Radix");if(r.length===0)return E.searchByWhereClause(t,n,o,s);let a;for(let[u,d]of r){let f=[];if(Array.isArray(d))for(let m of d){let b=n.tokenize(m,s)?.[0];f.push(b)}else f=n.tokenize(d,s);let h=t.indexes[u].node,p=new Set;for(let m of f){let S=h.find({term:m,exact:!0})[m];if(S)for(let I of S)p.add(I)}a?a=C(a,p):a=p}if(Object.entries(o).filter(([u])=>t.indexes[u].type!=="Radix").length===0)return a;let l=E.searchByWhereClause(t,n,o,s);return C(a,l)},getSearchableProperties:function(t){return t.searchableProperties},getSearchablePropertiesWithTypes:function(e){return e.searchablePropertiesWithTypes},load:function(t,n){let o=E.load(t,n[0]),s=n[1],r={...o.indexes,...Object.fromEntries(s.radixTrees.map(([a,c,l,u])=>[a,{node:F.RadixNode.fromJSON(u),isArray:c,type:l}]))};return{...o,indexes:r,stats:Object.fromEntries(s.stats.map(([a,{tokenQuantums:c,tokensLength:l}])=>[a,{tokenQuantums:c,tokensLength:new Map(l)}]))}},save:function(t){let n=t,o=Object.entries(n.indexes).filter(([,{type:c}])=>c!=="Radix"),s=E.save({...n,indexes:Object.fromEntries(o)}),a={radixTrees:Object.entries(n.indexes).filter(([,{type:c}])=>c==="Radix").map(([c,{node:l,isArray:u,type:d}])=>[c,u,d,l.toJSON()]),stats:Object.entries(t.stats).map(([c,{tokenQuantums:l,tokensLength:u}])=>[c,{tokenQuantums:l,tokensLength:Array.from(u.entries())}])};return[s,a]}}}}return He(Nt);})();
11
+ `,ANSWER_SESSION_LAST_MESSAGE_IS_NOT_ASSISTANT:"The last message in the session is not an assistant message. Cannot regenerate non-assistant messages.",PLUGIN_COMPONENT_CONFLICT:'The component "%s" is already defined. The plugin "%s" is trying to redefine it.'};function O(i,...e){let t=new Error(xe(nt[i]??`Unsupported Orama Error code: ${i}`,...e));return t.code=i,"captureStackTrace"in Error.prototype&&Error.captureStackTrace(t),t}var st={string:!1,number:!1,boolean:!1,enum:!1,geopoint:!1,"string[]":!0,"number[]":!0,"boolean[]":!0,"enum[]":!0},it={"string[]":"string","number[]":"number","boolean[]":"boolean","enum[]":"enum"};function B(i){return typeof i=="string"&&/^vector\[\d+\]$/.test(i)}function he(i){return typeof i=="string"&&st[i]}function De(i){return it[i]}function ne(i){let e=Number(i.slice(7,-1));switch(!0){case isNaN(e):throw O("INVALID_VECTOR_VALUE",i);case e<=0:throw O("INVALID_VECTOR_SIZE",i);default:return e}}function F(i,e){if(typeof e=="string"){let t=i.idToInternalId.get(e);if(t)return t;let n=i.idToInternalId.size+1;return i.idToInternalId.set(e,n),i.internalIdToId.push(e),n}return e>i.internalIdToId.length?F(i,e.toString()):e}var R={};v(R,{calculateResultScores:()=>Se,create:()=>ge,createIndex:()=>dt,getSearchableProperties:()=>Ce,getSearchablePropertiesWithTypes:()=>Be,insert:()=>ve,insertDocumentScoreParameters:()=>ke,insertTokenScoreParameters:()=>Re,insertVector:()=>Le,load:()=>Fe,remove:()=>Me,removeDocumentScoreParameters:()=>Ee,removeTokenScoreParameters:()=>_e,save:()=>Ue,search:()=>ze,searchByGeoWhereClause:()=>pt,searchByWhereClause:()=>q});var re={};v(re,{AVLNode:()=>L,AVLTree:()=>J});var L=class i{constructor(e,t){b(this,"k");b(this,"v");b(this,"l",null);b(this,"r",null);b(this,"h",1);this.k=e,this.v=new Set(t)}updateHeight(){this.h=Math.max(i.getHeight(this.l),i.getHeight(this.r))+1}static getHeight(e){return e?e.h:0}getBalanceFactor(){return i.getHeight(this.l)-i.getHeight(this.r)}rotateLeft(){let e=this.r;return this.r=e.l,e.l=this,this.updateHeight(),e.updateHeight(),e}rotateRight(){let e=this.l;return this.l=e.r,e.r=this,this.updateHeight(),e.updateHeight(),e}toJSON(){return{k:this.k,v:Array.from(this.v),l:this.l?this.l.toJSON():null,r:this.r?this.r.toJSON():null,h:this.h}}static fromJSON(e){let t=new i(e.k,e.v);return t.l=e.l?i.fromJSON(e.l):null,t.r=e.r?i.fromJSON(e.r):null,t.h=e.h,t}},J=class i{constructor(e,t){b(this,"root",null);b(this,"insertCount",0);e!==void 0&&t!==void 0&&(this.root=new L(e,t))}insert(e,t,n=1e3){this.root=this.insertNode(this.root,e,t,n)}insertMultiple(e,t,n=1e3){for(let s of t)this.insert(e,s,n)}rebalance(){this.root&&(this.root=this.rebalanceNode(this.root))}toJSON(){return{root:this.root?this.root.toJSON():null,insertCount:this.insertCount}}static fromJSON(e){let t=new i;return t.root=e.root?L.fromJSON(e.root):null,t.insertCount=e.insertCount||0,t}insertNode(e,t,n,s){if(e===null)return new L(t,[n]);let o=[],r=e,a=null;for(;r!==null;)if(o.push({parent:a,node:r}),t<r.k)if(r.l===null){r.l=new L(t,[n]),o.push({parent:r,node:r.l});break}else a=r,r=r.l;else if(t>r.k)if(r.r===null){r.r=new L(t,[n]),o.push({parent:r,node:r.r});break}else a=r,r=r.r;else return r.v.add(n),e;let c=!1;this.insertCount++%s===0&&(c=!0);for(let l=o.length-1;l>=0;l--){let{parent:u,node:f}=o[l];if(f.updateHeight(),c){let d=this.rebalanceNode(f);u?u.l===f?u.l=d:u.r===f&&(u.r=d):e=d}}return e}rebalanceNode(e){let t=e.getBalanceFactor();if(t>1){if(e.l&&e.l.getBalanceFactor()>=0)return e.rotateRight();if(e.l)return e.l=e.l.rotateLeft(),e.rotateRight()}if(t<-1){if(e.r&&e.r.getBalanceFactor()<=0)return e.rotateLeft();if(e.r)return e.r=e.r.rotateRight(),e.rotateLeft()}return e}find(e){let t=this.findNodeByKey(e);return t?t.v:null}contains(e){return this.find(e)!==null}getSize(){let e=0,t=[],n=this.root;for(;n||t.length>0;){for(;n;)t.push(n),n=n.l;n=t.pop(),e++,n=n.r}return e}isBalanced(){if(!this.root)return!0;let e=[this.root];for(;e.length>0;){let t=e.pop(),n=t.getBalanceFactor();if(Math.abs(n)>1)return!1;t.l&&e.push(t.l),t.r&&e.push(t.r)}return!0}remove(e){this.root=this.removeNode(this.root,e)}removeDocument(e,t){let n=this.findNodeByKey(e);n&&(n.v.size===1?this.root=this.removeNode(this.root,e):n.v=new Set([...n.v.values()].filter(s=>s!==t)))}findNodeByKey(e){let t=this.root;for(;t;)if(e<t.k)t=t.l;else if(e>t.k)t=t.r;else return t;return null}removeNode(e,t){if(e===null)return null;let n=[],s=e;for(;s!==null&&s.k!==t;)n.push(s),t<s.k?s=s.l:s=s.r;if(s===null)return e;if(s.l===null||s.r===null){let o=s.l?s.l:s.r;if(n.length===0)e=o;else{let r=n[n.length-1];r.l===s?r.l=o:r.r=o}}else{let o=s,r=s.r;for(;r.l!==null;)o=r,r=r.l;s.k=r.k,s.v=r.v,o.l===r?o.l=r.r:o.r=r.r,s=o}n.push(s);for(let o=n.length-1;o>=0;o--){let r=n[o];r.updateHeight();let a=this.rebalanceNode(r);if(o>0){let c=n[o-1];c.l===r?c.l=a:c.r===r&&(c.r=a)}else e=a}return e}rangeSearch(e,t){let n=new Set,s=[],o=this.root;for(;o||s.length>0;){for(;o;)s.push(o),o=o.l;if(o=s.pop(),o.k>=e&&o.k<=t)for(let r of o.v)n.add(r);if(o.k>t)break;o=o.r}return n}greaterThan(e,t=!1){let n=new Set,s=[],o=this.root;for(;o||s.length>0;){for(;o;)s.push(o),o=o.r;if(o=s.pop(),t&&o.k>=e||!t&&o.k>e)for(let r of o.v)n.add(r);else if(o.k<=e)break;o=o.l}return n}lessThan(e,t=!1){let n=new Set,s=[],o=this.root;for(;o||s.length>0;){for(;o;)s.push(o),o=o.l;if(o=s.pop(),t&&o.k<=e||!t&&o.k<e)for(let r of o.v)n.add(r);else if(o.k>e)break;o=o.r}return n}};var oe={};v(oe,{FlatTree:()=>$});var $=class i{constructor(){b(this,"numberToDocumentId");this.numberToDocumentId=new Map}insert(e,t){this.numberToDocumentId.has(e)?this.numberToDocumentId.get(e).add(t):this.numberToDocumentId.set(e,new Set([t]))}find(e){let t=this.numberToDocumentId.get(e);return t?Array.from(t):null}remove(e){this.numberToDocumentId.delete(e)}removeDocument(e,t){let n=this.numberToDocumentId.get(t);n&&(n.delete(e),n.size===0&&this.numberToDocumentId.delete(t))}contains(e){return this.numberToDocumentId.has(e)}getSize(){let e=0;for(let t of this.numberToDocumentId.values())e+=t.size;return e}filter(e){let t=Object.keys(e);if(t.length!==1)throw new Error("Invalid operation");let n=t[0];switch(n){case"eq":{let s=e[n],o=this.numberToDocumentId.get(s);return o?Array.from(o):[]}case"in":{let s=e[n],o=new Set;for(let r of s){let a=this.numberToDocumentId.get(r);if(a)for(let c of a)o.add(c)}return Array.from(o)}case"nin":{let s=new Set(e[n]),o=new Set;for(let[r,a]of this.numberToDocumentId.entries())if(!s.has(r))for(let c of a)o.add(c);return Array.from(o)}default:throw new Error("Invalid operation")}}filterArr(e){let t=Object.keys(e);if(t.length!==1)throw new Error("Invalid operation");let n=t[0];switch(n){case"containsAll":{let o=e[n].map(a=>this.numberToDocumentId.get(a)??new Set);if(o.length===0)return[];let r=o.reduce((a,c)=>new Set([...a].filter(l=>c.has(l))));return Array.from(r)}case"containsAny":{let o=e[n].map(a=>this.numberToDocumentId.get(a)??new Set);if(o.length===0)return[];let r=o.reduce((a,c)=>new Set([...a,...c]));return Array.from(r)}default:throw new Error("Invalid operation")}}static fromJSON(e){if(!e.numberToDocumentId)throw new Error("Invalid Flat Tree JSON");let t=new i;for(let[n,s]of e.numberToDocumentId)t.numberToDocumentId.set(n,new Set(s));return t}toJSON(){return{numberToDocumentId:Array.from(this.numberToDocumentId.entries()).map(([e,t])=>[e,Array.from(t)])}}};var U={};v(U,{RadixNode:()=>H,RadixTree:()=>G});var Y=!1;function lt(i,e,t){if(t<0)return-1;if(i===e)return 0;let n=i.length,s=e.length;if(n===0)return s<=t?s:-1;if(s===0)return n<=t?n:-1;let o=Math.abs(n-s);if(Y){if(i.startsWith(e))return o<=t?o:-1;if(e.startsWith(i))return 0}if(o>t)return-1;let r=[];for(let a=0;a<=n;a++){r[a]=[a];for(let c=1;c<=s;c++)r[a][c]=a===0?c:0}for(let a=1;a<=n;a++){let c=1/0;for(let l=1;l<=s;l++)i[a-1]===e[l-1]?r[a][l]=r[a-1][l-1]:r[a][l]=Math.min(r[a-1][l]+1,r[a][l-1]+1,r[a-1][l-1]+1),c=Math.min(c,r[a][l]);if(c>t)return-1}return r[n][s]<=t?r[n][s]:-1}function pe(i,e,t){let n=lt(i,e,t);return{distance:n,isBounded:n>=0}}var H=class i{constructor(e,t,n){b(this,"k");b(this,"s");b(this,"c",new Map);b(this,"d",new Set);b(this,"e");b(this,"w","");this.k=e,this.s=t,this.e=n}updateParent(e){this.w=e.w+this.s}addDocument(e){this.d.add(e)}removeDocument(e){return this.d.delete(e)}findAllWords(e,t,n,s){let o=[this];for(;o.length>0;){let r=o.pop();if(r.e){let{w:a,d:c}=r;if(n&&a!==t)continue;if(ee(e,a)!==null)if(s)if(Math.abs(t.length-a.length)<=s&&pe(t,a,s).isBounded)e[a]=[];else continue;else e[a]=[];if(ee(e,a)!=null&&c.size>0){let l=e[a];for(let u of c)l.includes(u)||l.push(u)}}r.c.size>0&&o.push(...r.c.values())}return e}insert(e,t){let n=this,s=0,o=e.length;for(;s<o;){let r=e[s],a=n.c.get(r);if(a){let c=a.s,l=c.length,u=0;for(;u<l&&s+u<o&&c[u]===e[s+u];)u++;if(u===l){if(n=a,s+=u,s===o){a.e||(a.e=!0),a.addDocument(t);return}continue}let f=c.slice(0,u),d=c.slice(u),h=e.slice(s+u),p=new i(f[0],f,!1);if(n.c.set(f[0],p),p.updateParent(n),a.s=d,a.k=d[0],p.c.set(d[0],a),a.updateParent(p),h){let m=new i(h[0],h,!0);m.addDocument(t),p.c.set(h[0],m),m.updateParent(p)}else p.e=!0,p.addDocument(t);return}else{let c=new i(r,e.slice(s),!0);c.addDocument(t),n.c.set(r,c),c.updateParent(n);return}}n.e||(n.e=!0),n.addDocument(t)}_findLevenshtein(e,t,n,s,o){let r=[{node:this,index:t,tolerance:n}];for(;r.length>0;){let{node:a,index:c,tolerance:l}=r.pop();if(Y&&a.w.startsWith(e)&&a.w!==e){console.log("[RADIX FIX] Prefix optimization triggered for:",a.w,"term:",e),a.findAllWords(o,e,!1,0);continue}if(Y&&a.w.startsWith(e)&&a.w===e&&console.log("[RADIX FIX] Exact match excluded from prefix optimization:",e),l<0)continue;if(a.e){let{w:f,d}=a;if(f&&(pe(e,f,s).isBounded&&(o[f]=[]),ee(o,f)!==void 0&&d.size>0)){let h=new Set(o[f]);for(let p of d)h.add(p);o[f]=Array.from(h)}}if(c>=e.length)continue;let u=e[c];if(a.c.has(u)){let f=a.c.get(u);r.push({node:f,index:c+1,tolerance:l})}r.push({node:a,index:c+1,tolerance:l-1});for(let[f,d]of a.c)r.push({node:d,index:c,tolerance:l-1}),f!==u&&r.push({node:d,index:c+1,tolerance:l-1})}}find(e){let{term:t,exact:n,tolerance:s}=e;if(s&&!n){let o={};return this._findLevenshtein(t,0,s,s,o),o}else{let o=this,r=0,a=t.length;for(;r<a;){let l=t[r],u=o.c.get(l);if(u){let f=u.s,d=f.length,h=0;for(;h<d&&r+h<a&&f[h]===t[r+h];)h++;if(h===d)o=u,r+=h;else if(r+h===a)if(h===a-r){if(n)return{};{let p={};return u.findAllWords(p,t,n,s),p}}else return{};else return{}}else return{}}let c={};return o.findAllWords(c,t,n,s),c}}contains(e){let t=this,n=0,s=e.length;for(;n<s;){let o=e[n],r=t.c.get(o);if(r){let a=r.s,c=a.length,l=0;for(;l<c&&n+l<s&&a[l]===e[n+l];)l++;if(l<c)return!1;n+=c,t=r}else return!1}return!0}removeWord(e){if(!e)return!1;let t=this,n=e.length,s=[];for(let o=0;o<n;o++){let r=e[o];if(t.c.has(r)){let a=t.c.get(r);s.push({parent:t,character:r}),o+=a.s.length-1,t=a}else return!1}for(t.d.clear(),t.e=!1;s.length>0&&t.c.size===0&&!t.e&&t.d.size===0;){let{parent:o,character:r}=s.pop();o.c.delete(r),t=o}return!0}removeDocumentByWord(e,t,n=!0){if(!e)return!0;let s=this,o=e.length;for(let r=0;r<o;r++){let a=e[r];if(s.c.has(a)){let c=s.c.get(a);r+=c.s.length-1,s=c,n&&s.w!==e||s.removeDocument(t)}else return!1}return!0}static getCommonPrefix(e,t){let n=Math.min(e.length,t.length),s=0;for(;s<n&&e.charCodeAt(s)===t.charCodeAt(s);)s++;return e.slice(0,s)}toJSON(){return{w:this.w,s:this.s,e:this.e,k:this.k,d:Array.from(this.d),c:Array.from(this.c?.entries())?.map(([e,t])=>[e,t.toJSON()])}}static fromJSON(e){let t=new i(e.k,e.s,e.e);return t.w=e.w,t.d=new Set(e.d),t.c=new Map(e?.c?.map(([n,s])=>[n,i.fromJSON(s)])||[]),t}},G=class i extends H{constructor(){super("","",!1)}static fromJSON(e){let t=new i;return t.w=e.w,t.s=e.s,t.e=e.e,t.k=e.k,t.d=new Set(e.d),t.c=new Map(e?.c?.map(([n,s])=>[n,H.fromJSON(s)])||[]),t}toJSON(){return super.toJSON()}};var ie={};v(ie,{BKDTree:()=>k});var se=class i{constructor(e,t){b(this,"point");b(this,"docIDs");b(this,"left");b(this,"right");b(this,"parent");this.point=e,this.docIDs=new Set(t),this.left=null,this.right=null,this.parent=null}toJSON(){return{point:this.point,docIDs:Array.from(this.docIDs),left:this.left?this.left.toJSON():null,right:this.right?this.right.toJSON():null}}static fromJSON(e,t=null){let n=new i(e.point,e.docIDs);return n.parent=t,e.left&&(n.left=i.fromJSON(e.left,n)),e.right&&(n.right=i.fromJSON(e.right,n)),n}},k=class i{constructor(){b(this,"root");b(this,"nodeMap");this.root=null,this.nodeMap=new Map}getPointKey(e){return`${e.lon},${e.lat}`}insert(e,t){let n=this.getPointKey(e),s=this.nodeMap.get(n);if(s){t.forEach(c=>s.docIDs.add(c));return}let o=new se(e,t);if(this.nodeMap.set(n,o),this.root==null){this.root=o;return}let r=this.root,a=0;for(;;){if(a%2===0)if(e.lon<r.point.lon){if(r.left==null){r.left=o,o.parent=r;return}r=r.left}else{if(r.right==null){r.right=o,o.parent=r;return}r=r.right}else if(e.lat<r.point.lat){if(r.left==null){r.left=o,o.parent=r;return}r=r.left}else{if(r.right==null){r.right=o,o.parent=r;return}r=r.right}a++}}contains(e){let t=this.getPointKey(e);return this.nodeMap.has(t)}getDocIDsByCoordinates(e){let t=this.getPointKey(e),n=this.nodeMap.get(t);return n?Array.from(n.docIDs):null}removeDocByID(e,t){let n=this.getPointKey(e),s=this.nodeMap.get(n);s&&(s.docIDs.delete(t),s.docIDs.size===0&&(this.nodeMap.delete(n),this.deleteNode(s)))}deleteNode(e){let t=e.parent,n=e.left?e.left:e.right;n&&(n.parent=t),t?t.left===e?t.left=n:t.right===e&&(t.right=n):(this.root=n,this.root&&(this.root.parent=null))}searchByRadius(e,t,n=!0,s="asc",o=!1){let r=o?i.vincentyDistance:i.haversineDistance,a=[{node:this.root,depth:0}],c=[];for(;a.length>0;){let{node:l,depth:u}=a.pop();if(l==null)continue;let f=r(e,l.point);(n?f<=t:f>t)&&c.push({point:l.point,docIDs:Array.from(l.docIDs)}),l.left!=null&&a.push({node:l.left,depth:u+1}),l.right!=null&&a.push({node:l.right,depth:u+1})}return s&&c.sort((l,u)=>{let f=r(e,l.point),d=r(e,u.point);return s.toLowerCase()==="asc"?f-d:d-f}),c}searchByPolygon(e,t=!0,n=null,s=!1){let o=[{node:this.root,depth:0}],r=[];for(;o.length>0;){let{node:c,depth:l}=o.pop();if(c==null)continue;c.left!=null&&o.push({node:c.left,depth:l+1}),c.right!=null&&o.push({node:c.right,depth:l+1});let u=i.isPointInPolygon(e,c.point);(u&&t||!u&&!t)&&r.push({point:c.point,docIDs:Array.from(c.docIDs)})}let a=i.calculatePolygonCentroid(e);if(n){let c=s?i.vincentyDistance:i.haversineDistance;r.sort((l,u)=>{let f=c(a,l.point),d=c(a,u.point);return n.toLowerCase()==="asc"?f-d:d-f})}return r}toJSON(){return{root:this.root?this.root.toJSON():null}}static fromJSON(e){let t=new i;return e.root&&(t.root=se.fromJSON(e.root),t.buildNodeMap(t.root)),t}buildNodeMap(e){if(e==null)return;let t=this.getPointKey(e.point);this.nodeMap.set(t,e),e.left&&this.buildNodeMap(e.left),e.right&&this.buildNodeMap(e.right)}static calculatePolygonCentroid(e){let t=0,n=0,s=0,o=e.length;for(let a=0,c=o-1;a<o;c=a++){let l=e[a].lon,u=e[a].lat,f=e[c].lon,d=e[c].lat,h=l*d-f*u;t+=h,n+=(l+f)*h,s+=(u+d)*h}t/=2;let r=6*t;return n/=r,s/=r,{lon:n,lat:s}}static isPointInPolygon(e,t){let n=!1,s=t.lon,o=t.lat,r=e.length;for(let a=0,c=r-1;a<r;c=a++){let l=e[a].lon,u=e[a].lat,f=e[c].lon,d=e[c].lat;u>o!=d>o&&s<(f-l)*(o-u)/(d-u)+l&&(n=!n)}return n}static haversineDistance(e,t){let n=Math.PI/180,s=e.lat*n,o=t.lat*n,r=(t.lat-e.lat)*n,a=(t.lon-e.lon)*n,c=Math.sin(r/2)*Math.sin(r/2)+Math.cos(s)*Math.cos(o)*Math.sin(a/2)*Math.sin(a/2);return 6371e3*(2*Math.atan2(Math.sqrt(c),Math.sqrt(1-c)))}static vincentyDistance(e,t){let s=.0033528106647474805,o=(1-s)*6378137,r=Math.PI/180,a=e.lat*r,c=t.lat*r,l=(t.lon-e.lon)*r,u=Math.atan((1-s)*Math.tan(a)),f=Math.atan((1-s)*Math.tan(c)),d=Math.sin(u),h=Math.cos(u),p=Math.sin(f),m=Math.cos(f),y=l,I,S=1e3,g,T,x,D,E,N;do{let _=Math.sin(y),Q=Math.cos(y);if(g=Math.sqrt(m*_*(m*_)+(h*p-d*m*Q)*(h*p-d*m*Q)),g===0)return 0;T=d*p+h*m*Q,x=Math.atan2(g,T),D=h*m*_/g,E=1-D*D,N=T-2*d*p/E,isNaN(N)&&(N=0);let ue=s/16*E*(4+s*(4-3*E));I=y,y=l+(1-ue)*s*D*(x+ue*g*(N+ue*T*(-1+2*N*N)))}while(Math.abs(y-I)>1e-12&&--S>0);if(S===0)return NaN;let w=E*(6378137*6378137-o*o)/(o*o),z=1+w/16384*(4096+w*(-768+w*(320-175*w))),A=w/1024*(256+w*(-128+w*(74-47*w))),W=A*g*(N+A/4*(T*(-1+2*N*N)-A/6*N*(-3+4*g*g)*(-3+4*N*N)));return o*z*(x-W)}};var ae={};v(ae,{BoolNode:()=>K});var K=class i{constructor(){b(this,"true");b(this,"false");this.true=new Set,this.false=new Set}insert(e,t){t?this.true.add(e):this.false.add(e)}delete(e,t){t?this.true.delete(e):this.false.delete(e)}getSize(){return this.true.size+this.false.size}toJSON(){return{true:Array.from(this.true),false:Array.from(this.false)}}static fromJSON(e){let t=new i;return t.true=new Set(e.true),t.false=new Set(e.false),t}};function Ne(i,e,t,n,s,{k:o,b:r,d:a}){return Math.log(1+(t-e+.5)/(e+.5))*(a+i*(o+1))/(i+o*(1-r+r*n/s))}var ce={};v(ce,{DEFAULT_SIMILARITY:()=>ut,VectorIndex:()=>j,findSimilarVectors:()=>Oe,getMagnitude:()=>me});var ut=.8,j=class i{constructor(e){b(this,"size");b(this,"vectors",new Map);this.size=e}add(e,t){t instanceof Float32Array||(t=new Float32Array(t));let n=me(t,this.size);this.vectors.set(e,[n,t])}remove(e){this.vectors.delete(e)}find(e,t,n){return e instanceof Float32Array||(e=new Float32Array(e)),Oe(e,n,this.vectors,this.size,t)}toJSON(){let e=[];for(let[t,[n,s]]of this.vectors)e.push([t,[n,Array.from(s)]]);return{size:this.size,vectors:e}}static fromJSON(e){let t=e,n=new i(t.size);for(let[s,[o,r]]of t.vectors)n.vectors.set(s,[o,new Float32Array(r)]);return n}};function me(i,e){let t=0;for(let n=0;n<e;n++)t+=i[n]*i[n];return Math.sqrt(t)}function Oe(i,e,t,n,s){let o=me(i,n),r=[],a=e||t.keys();for(let c of a){let l=t.get(c);if(!l)continue;let u=l[0],f=l[1],d=0;for(let p=0;p<n;p++)d+=i[p]*f[p];let h=d/(o*u);h>=s&&r.push([c,h])}return r}function ke(i,e,t,n,s){let o=F(i.sharedInternalDocumentStore,t);i.avgFieldLength[e]=((i.avgFieldLength[e]??0)*(s-1)+n.length)/s,i.fieldLengths[e][o]=n.length,i.frequencies[e][o]={}}function Re(i,e,t,n,s){let o=0;for(let c of n)c===s&&o++;let r=F(i.sharedInternalDocumentStore,t),a=o/n.length;i.frequencies[e][r][s]=a,s in i.tokenOccurrences[e]||(i.tokenOccurrences[e][s]=0),i.tokenOccurrences[e][s]=(i.tokenOccurrences[e][s]??0)+1}function Ee(i,e,t,n){let s=F(i.sharedInternalDocumentStore,t);n>1?i.avgFieldLength[e]=(i.avgFieldLength[e]*n-i.fieldLengths[e][s])/(n-1):i.avgFieldLength[e]=void 0,i.fieldLengths[e][s]=void 0,i.frequencies[e][s]=void 0}function _e(i,e,t){i.tokenOccurrences[e][t]--}function ge(i,e,t,n,s=""){n||(n={sharedInternalDocumentStore:e,indexes:{},vectorIndexes:{},searchableProperties:[],searchablePropertiesWithTypes:{},frequencies:{},tokenOccurrences:{},avgFieldLength:{},fieldLengths:{}});for(let[o,r]of Object.entries(t)){let a=`${s}${s?".":""}${o}`;if(typeof r=="object"&&!Array.isArray(r)){ge(i,e,r,n,a);continue}if(B(r))n.searchableProperties.push(a),n.searchablePropertiesWithTypes[a]=r,n.vectorIndexes[a]={type:"Vector",node:new j(ne(r)),isArray:!1};else{let c=/\[/.test(r);switch(r){case"boolean":case"boolean[]":n.indexes[a]={type:"Bool",node:new K,isArray:c};break;case"number":case"number[]":n.indexes[a]={type:"AVL",node:new J(0,[]),isArray:c};break;case"string":case"string[]":n.indexes[a]={type:"Radix",node:new G,isArray:c},n.avgFieldLength[a]=0,n.frequencies[a]={},n.tokenOccurrences[a]={},n.fieldLengths[a]={};break;case"enum":case"enum[]":n.indexes[a]={type:"Flat",node:new $,isArray:c};break;case"geopoint":n.indexes[a]={type:"BKD",node:new k,isArray:c};break;default:throw O("INVALID_SCHEMA_TYPE",Array.isArray(r)?"array":r,a)}n.searchableProperties.push(a),n.searchablePropertiesWithTypes[a]=r}}return n}function ft(i,e,t,n,s,o,r,a){return c=>{let{type:l,node:u}=e.indexes[t];switch(l){case"Bool":{u[c?"true":"false"].add(n);break}case"AVL":{let f=a?.avlRebalanceThreshold??1;u.insert(c,n,f);break}case"Radix":{let f=o.tokenize(c,s,t,!1);i.insertDocumentScoreParameters(e,t,n,f,r);for(let d of f)i.insertTokenScoreParameters(e,t,n,f,d),u.insert(d,n);break}case"Flat":{u.insert(c,n);break}case"BKD":{u.insert(c,[n]);break}}}}function ve(i,e,t,n,s,o,r,a,c,l,u){if(B(r))return Le(e,t,o,n,s);let f=ft(i,e,t,s,a,c,l,u);if(!he(r))return f(o);let d=o,h=d.length;for(let p=0;p<h;p++)f(d[p])}function Le(i,e,t,n,s){i.vectorIndexes[e].node.add(s,t)}function we(i,e,t,n,s,o,r,a,c,l){if(B(r))return e.vectorIndexes[t].node.remove(s),!0;let{type:u,node:f}=e.indexes[t];switch(u){case"AVL":return f.removeDocument(o,s),!0;case"Bool":return f[o?"true":"false"].delete(s),!0;case"Radix":{let d=c.tokenize(o,a,t);i.removeDocumentScoreParameters(e,t,n,l);for(let h of d)i.removeTokenScoreParameters(e,t,h),f.removeDocumentByWord(h,s);return!0}case"Flat":return f.removeDocument(s,o),!0;case"BKD":return f.removeDocByID(o,s),!1}}function Me(i,e,t,n,s,o,r,a,c,l){if(!he(r))return we(i,e,t,n,s,o,r,a,c,l);let u=De(r),f=o,d=f.length;for(let h=0;h<d;h++)we(i,e,t,n,s,f[h],u,a,c,l);return!0}function Se(i,e,t,n,s,o,r,a,c,l){let u=Array.from(n),f=i.avgFieldLength[e],d=i.fieldLengths[e],h=i.tokenOccurrences[e],p=i.frequencies[e],m=typeof h[t]=="number"?h[t]??0:0,y=u.length;for(let I=0;I<y;I++){let S=u[I];if(c&&!c.has(S))continue;l.has(S)||l.set(S,new Map);let g=l.get(S);g.set(e,(g.get(e)||0)+1);let T=p?.[S]?.[t]??0,x=Ne(T,m,s,d[S],f,o);r.has(S)?r.set(S,r.get(S)+x*a):r.set(S,x*a)}}function ze(i,e,t,n,s,o,r,a,c,l,u,f=0){let d=t.tokenize(e,n),h=d.length||1,p=new Map,m=new Map,y=new Map;for(let g of s){if(!(g in i.indexes))continue;let T=i.indexes[g],{type:x}=T;if(x!=="Radix")throw O("WRONG_SEARCH_PROPERTY_TYPE",g);let D=a[g]??1;if(D<=0)throw O("INVALID_BOOST_VALUE",D);d.length===0&&!e&&d.push("");let E=d.length;for(let N=0;N<E;N++){let w=d[N],z=T.node.find({term:w,exact:o,tolerance:r}),A=Object.keys(z);A.length>0&&m.set(w,!0);let W=A.length;for(let P=0;P<W;P++){let _=A[P],Q=z[_];Se(i,g,_,Q,l,c,y,D,u,p)}}}let I=Array.from(y.entries()).map(([g,T])=>[g,T]).sort((g,T)=>T[1]-g[1]);if(I.length===0)return[];if(f===1)return I;if(f===0){if(h===1)return I;for(let T of d)if(!m.get(T))return[];return I.filter(([T])=>{let x=p.get(T);return x?Array.from(x.values()).some(D=>D===h):!1})}let S=I.filter(([g])=>{let T=p.get(g);return T?Array.from(T.values()).some(x=>x===h):!1});if(S.length>0){let g=I.filter(([x])=>!S.some(([D])=>D===x)),T=Math.ceil(g.length*f);return[...S,...g.slice(0,T)]}return I}function q(i,e,t,n){if("and"in t&&t.and&&Array.isArray(t.and)){let r=t.and;if(r.length===0)return new Set;let a=r.map(c=>q(i,e,c,n));return C(...a)}if("or"in t&&t.or&&Array.isArray(t.or)){let r=t.or;return r.length===0?new Set:r.map(c=>q(i,e,c,n)).reduce((c,l)=>V(c,l),new Set)}if("not"in t&&t.not){let r=t.not,a=new Set,c=i.sharedInternalDocumentStore;for(let u=1;u<=c.internalIdToId.length;u++)a.add(u);let l=q(i,e,r,n);return de(a,l)}let s=Object.keys(t),o=s.reduce((r,a)=>({[a]:new Set,...r}),{});for(let r of s){let a=t[r];if(typeof i.indexes[r]>"u")throw O("UNKNOWN_FILTER_PROPERTY",r);let{node:c,type:l,isArray:u}=i.indexes[r];if(l==="Bool"){let d=c,h=a?d.true:d.false;o[r]=V(o[r],h);continue}if(l==="BKD"){let d;if("radius"in a)d="radius";else if("polygon"in a)d="polygon";else throw new Error(`Invalid operation ${a}`);if(d==="radius"){let{value:h,coordinates:p,unit:m="m",inside:y=!0,highPrecision:I=!1}=a[d],S=te(h,m),g=c.searchByRadius(p,S,y,void 0,I);o[r]=Ae(o[r],g)}else{let{coordinates:h,inside:p=!0,highPrecision:m=!1}=a[d],y=c.searchByPolygon(h,p,void 0,m);o[r]=Ae(o[r],y)}continue}if(l==="Radix"&&(typeof a=="string"||Array.isArray(a))){for(let d of[a].flat()){let h=e.tokenize(d,n,r);for(let p of h){let m=c.find({term:p,exact:!0});o[r]=mt(o[r],m)}}continue}let f=Object.keys(a);if(f.length>1)throw O("INVALID_FILTER_OPERATION",f.length);if(l==="Flat"){let d=new Set(u?c.filterArr(a):c.filter(a));o[r]=V(o[r],d);continue}if(l==="AVL"){let d=f[0],h=a[d],p;switch(d){case"gt":{p=c.greaterThan(h,!1);break}case"gte":{p=c.greaterThan(h,!0);break}case"lt":{p=c.lessThan(h,!1);break}case"lte":{p=c.lessThan(h,!0);break}case"eq":{p=c.find(h)??new Set;break}case"between":{let[m,y]=h;p=c.rangeSearch(m,y);break}default:throw O("INVALID_FILTER_OPERATION",d)}o[r]=V(o[r],p)}}return C(...Object.values(o))}function Ce(i){return i.searchableProperties}function Be(i){return i.searchablePropertiesWithTypes}function Fe(i,e){let{indexes:t,vectorIndexes:n,searchableProperties:s,searchablePropertiesWithTypes:o,frequencies:r,tokenOccurrences:a,avgFieldLength:c,fieldLengths:l}=e,u={},f={};for(let d of Object.keys(t)){let{node:h,type:p,isArray:m}=t[d];switch(p){case"Radix":u[d]={type:"Radix",node:G.fromJSON(h),isArray:m};break;case"Flat":u[d]={type:"Flat",node:$.fromJSON(h),isArray:m};break;case"AVL":u[d]={type:"AVL",node:J.fromJSON(h),isArray:m};break;case"BKD":u[d]={type:"BKD",node:k.fromJSON(h),isArray:m};break;case"Bool":u[d]={type:"Bool",node:K.fromJSON(h),isArray:m};break;default:u[d]=t[d]}}for(let d of Object.keys(n))f[d]={type:"Vector",isArray:!1,node:j.fromJSON(n[d])};return{sharedInternalDocumentStore:i,indexes:u,vectorIndexes:f,searchableProperties:s,searchablePropertiesWithTypes:o,frequencies:r,tokenOccurrences:a,avgFieldLength:c,fieldLengths:l}}function Ue(i){let{indexes:e,vectorIndexes:t,searchableProperties:n,searchablePropertiesWithTypes:s,frequencies:o,tokenOccurrences:r,avgFieldLength:a,fieldLengths:c}=i,l={};for(let f of Object.keys(t))l[f]=t[f].node.toJSON();let u={};for(let f of Object.keys(e)){let{type:d,node:h,isArray:p}=e[f];d==="Flat"||d==="Radix"||d==="AVL"||d==="BKD"||d==="Bool"?u[f]={type:d,node:h.toJSON(),isArray:p}:(u[f]=e[f],u[f].node=u[f].node.toJSON())}return{indexes:u,vectorIndexes:l,searchableProperties:n,searchablePropertiesWithTypes:s,frequencies:o,tokenOccurrences:r,avgFieldLength:a,fieldLengths:c}}function dt(){return{create:ge,insert:ve,remove:Me,insertDocumentScoreParameters:ke,insertTokenScoreParameters:Re,removeDocumentScoreParameters:Ee,removeTokenScoreParameters:_e,calculateResultScores:Se,search:ze,searchByWhereClause:q,getSearchableProperties:Ce,getSearchablePropertiesWithTypes:Be,load:Fe,save:Ue}}function Ae(i,e){i||(i=new Set);let t=e.length;for(let n=0;n<t;n++){let s=e[n].docIDs,o=s.length;for(let r=0;r<o;r++)i.add(s[r])}return i}function Pe(i,e,t=!1){let n=t?k.vincentyDistance:k.haversineDistance,s=[],o=[];for(let{point:c}of i)o.push(n(e,c));let r=Math.max(...o),a=0;for(let{docIDs:c}of i){let l=o[a],u=r-l+1;for(let f of c)s.push([f,u]);a++}return s.sort((c,l)=>l[1]-c[1]),s}function ht(i,e){let t=Object.keys(i);if(t.length!==1)return{isGeoOnly:!1};let n=t[0],s=i[n];if(typeof e.indexes[n]>"u")return{isGeoOnly:!1};let{type:o}=e.indexes[n];return o==="BKD"&&s&&("radius"in s||"polygon"in s)?{isGeoOnly:!0,geoProperty:n,geoOperation:s}:{isGeoOnly:!1}}function pt(i,e){let t=i,n=ht(e,t);if(!n.isGeoOnly||!n.geoProperty||!n.geoOperation)return null;let{node:s}=t.indexes[n.geoProperty],o=n.geoOperation,r=s,a;if("radius"in o){let{value:c,coordinates:l,unit:u="m",inside:f=!0,highPrecision:d=!1}=o.radius,h=l,p=te(c,u);return a=r.searchByRadius(h,p,f,"asc",d),Pe(a,h,d)}else if("polygon"in o){let{coordinates:c,inside:l=!0,highPrecision:u=!1}=o.polygon;a=r.searchByPolygon(c,l,"asc",u);let f=k.calculatePolygonCentroid(c);return Pe(a,f,u)}return null}function mt(i,e){i||(i=new Set);let t=Object.keys(e),n=t.length;for(let s=0;s<n;s++){let o=e[t[s]],r=o.length;for(let a=0;a<r;a++)i.add(o[a])}return i}var gt="[^aeiou]",We="[aeiouy]",M=gt+"[^aeiouy]*",X=We+"[aeiou]*",gn="^("+M+")?"+X+M,Sn="^("+M+")?"+X+M+"("+X+")?$",In="^("+M+")?"+X+M+X+M,yn="^("+M+")?"+We;function Ie(i,e,t){for(let n of Object.entries(e)){let s=n[0],o=n[1],r=`${t}${t?".":""}${s}`;if(typeof o=="object"&&!Array.isArray(o)){Ie(i,o,r);continue}if(B(o))i.searchableProperties.push(r),i.searchablePropertiesWithTypes[r]=o,i.vectorIndexes[r]={type:"Vector",node:new ce.VectorIndex(ne(o)),isArray:!1};else{let a=/\[/.test(o);switch(o){case"boolean":case"boolean[]":i.indexes[r]={type:"Bool",node:new ae.BoolNode,isArray:a};break;case"number":case"number[]":i.indexes[r]={type:"AVL",node:new re.AVLTree(0,[]),isArray:a};break;case"string":case"string[]":i.indexes[r]={type:"Radix",node:new U.RadixTree,isArray:a};break;case"enum":case"enum[]":i.indexes[r]={type:"Flat",node:new oe.FlatTree,isArray:a};break;case"geopoint":i.indexes[r]={type:"BKD",node:new ie.BKDTree,isArray:a};break;default:throw new Error("INVALID_SCHEMA_TYPE: "+r)}i.searchableProperties.push(r),i.searchablePropertiesWithTypes[r]=o}}}var Tt=1048575,le={exact:1,fuzzy:.6};function Ve(i){i?.exact!==void 0&&!Number.isNaN(i.exact)&&(le.exact=i.exact),i?.fuzzy!==void 0&&!Number.isNaN(i.fuzzy)&&(le.fuzzy=i.fuzzy)}function xt(i,e){let t=Ge(i),s=$e(i)|1<<e;return t+1<<20|s}function ye(i,e,t,n,s,o,r){let a=i.split(/\.|\?|!/),c=0,l=0;for(let u of a){let f=r.tokenize(u,o,n);for(let d of f){l++,t[d]||(t[d]=0);let h=Math.min(c,20);t.tokenQuantums[s][d]=xt(t.tokenQuantums[s][d],h),e.insert(d,s)}f.length>1&&c++}t.tokensLength.set(s,l)}function Je(i){let e=i.tokens,t=i.radixNode,n=i.exact,s=i.tolerance,o=i.stats,r=i.boostPerProp,a=i.resultMap,c=i.whereFiltersIDs,l=o.tokensLength,u=o.tokenQuantums,f={term:"",exact:n,tolerance:s},d={},h=e.length;for(let y=0;y<h;y++){let I=e[y];f.term=I;let S=t.find(f);d={...d,...S}}let p=Object.keys(d),m=p.length;for(let y=0;y<m;y++){let I=p[y],S=d[I],g=S.length,T=e.includes(I);for(let x=0;x<g;x++){let D=S[x];if(c&&!c.has(D))continue;let E=l.get(D),N=u[D][I],w=Ge(N),z=$e(N),A=T?le.exact:le.fuzzy,W=w*A;if(!a.has(D)){a.set(D,[W,z]);continue}let P=a.get(D),_=P[0]+W;P[0]=_,P[1]=P[1]|z}}}function $e(i){return i&Tt}function Ge(i){return i>>20}function be(i,e,t,n,s,o,r){let a=r.tokensLength,c=r.tokenQuantums,l=s.tokenize(i,o,t);for(let u of l)e.removeDocumentByWord(u,n,!0);a.delete(n),delete c[n]}var Dt=new U.RadixNode("","",!1),Nt={tokenQuantums:{},tokensLength:new Map};function Ot(i,e,t,n,s,o,r,a,c,l,u){let f=new Map,d={tokens:t.tokenize(e,n),radixNode:Dt,exact:o,tolerance:r,stats:Nt,boostPerProp:0,all:f,resultMap:f,whereFiltersIDs:u},h=s.length;for(let I=0;I<h;I++){let S=s[I],g=i.stats[S],T=a[S]??1;d.radixNode=i.indexes[S].node,d.stats=g,d.boostPerProp=T,Je(d)}let p=Array.from(f),m=p.length,y=[];for(let I=0;I<m;I++){let S=p[I],g=S[0],T=S[1][0];y.push([g,T])}return y}function wt(i={}){i.weights&&Ve(i.weights);let e=i.tolerance,t=i.multiWordThreshold,n=i.candidatePool,s=i.candidateCap,o=i.phraseMode;return{name:"qps",getComponents(r){return At(r,{tolerance:e,multiWordThreshold:t,candidatePool:n,candidateCap:s,phraseMode:o})}}}function At(i,e){return{index:{create:function(){let n={indexes:{},vectorIndexes:{},searchableProperties:[],searchablePropertiesWithTypes:{},stats:{}};return Ie(n,i,""),n.config=e,n},insert:function(n,s,o,r,a,c,l,u,f,d){if(!(l==="string"||l==="string[]"))return R.insert(n,s,o,r,a,c,l,u,f,d);s.stats[o]||(s.stats[o]={tokenQuantums:{},tokensLength:new Map});let h=s.stats[o],p=s.indexes[o].node;if(h.tokenQuantums[a]={},Array.isArray(c))for(let m of c)ye(m,p,h,o,a,u,f);else ye(c,p,h,o,a,u,f)},remove:function(n,s,o,r,a,c,l,u,f,d){if(!(l==="string"||l==="string[]"))return R.remove(n,s,o,r,a,c,l,u,f,d);let h=s.stats[o],p=s.indexes[o].node;if(Array.isArray(c))for(let m of c)be(m,p,o,a,f,u,h);else be(c,p,o,a,f,u,h)},insertDocumentScoreParameters:()=>{throw new Error},insertTokenScoreParameters:()=>{throw new Error},removeDocumentScoreParameters:()=>{throw new Error},removeTokenScoreParameters:()=>{throw new Error},calculateResultScores:()=>{throw new Error},search:Ot,searchByWhereClause:function(n,s,o,r){let a=Object.entries(o).filter(([f])=>n.indexes[f].type==="Radix");if(a.length===0)return R.searchByWhereClause(n,s,o,r);let c;for(let[f,d]of a){let h=[];if(Array.isArray(d))for(let y of d){let I=s.tokenize(y,r)?.[0];h.push(I)}else h=s.tokenize(d,r);let p=n.indexes[f].node,m=new Set;for(let y of h){let S=p.find({term:y,exact:!0})[y];if(S)for(let g of S)m.add(g)}c?c=C(c,m):c=m}if(Object.entries(o).filter(([f])=>n.indexes[f].type!=="Radix").length===0)return c;let u=R.searchByWhereClause(n,s,o,r);return C(c,u)},getSearchableProperties:function(n){return n.searchableProperties},getSearchablePropertiesWithTypes:function(t){return t.searchablePropertiesWithTypes},load:function(n,s){let o=R.load(n,s[0]),r=s[1],a={...o.indexes,...Object.fromEntries(r.radixTrees.map(([c,l,u,f])=>[c,{node:U.RadixNode.fromJSON(f),isArray:l,type:u}]))};return{...o,indexes:a,stats:Object.fromEntries(r.stats.map(([c,{tokenQuantums:l,tokensLength:u}])=>[c,{tokenQuantums:l,tokensLength:new Map(u)}]))}},save:function(n){let s=n,o=Object.entries(s.indexes).filter(([,{type:l}])=>l!=="Radix"),r=R.save({...s,indexes:Object.fromEntries(o)}),c={radixTrees:Object.entries(s.indexes).filter(([,{type:l}])=>l==="Radix").map(([l,{node:u,isArray:f,type:d}])=>[l,f,d,u.toJSON()]),stats:Object.entries(n.stats).map(([l,{tokenQuantums:u,tokensLength:f}])=>[l,{tokenQuantums:u,tokensLength:Array.from(f.entries())}])};return[r,c]}}}}return qe(Pt);})();
12
12
  //# sourceMappingURL=index.global.js.map