@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.js CHANGED
@@ -1,2 +1,2 @@
1
- import{index as k}from"@wcs-colab/orama/components";import{avl as E,bkd as v,flat as V,radix as z,bool as K,vector as _}from"@wcs-colab/orama/trees";import{getVectorSize as q,isVectorType as $}from"@wcs-colab/orama/components";function w(e,d,r){for(let s of Object.entries(d)){let n=s[0],a=s[1],o=`${r}${r?".":""}${n}`;if(typeof a=="object"&&!Array.isArray(a)){w(e,a,o);continue}if($(a))e.searchableProperties.push(o),e.searchablePropertiesWithTypes[o]=a,e.vectorIndexes[o]={type:"Vector",node:new _.VectorIndex(q(a)),isArray:!1};else{let t=/\[/.test(a);switch(a){case"boolean":case"boolean[]":e.indexes[o]={type:"Bool",node:new K.BoolNode,isArray:t};break;case"number":case"number[]":e.indexes[o]={type:"AVL",node:new E.AVLTree(0,[]),isArray:t};break;case"string":case"string[]":e.indexes[o]={type:"Radix",node:new z.RadixTree,isArray:t};break;case"enum":case"enum[]":e.indexes[o]={type:"Flat",node:new V.FlatTree,isArray:t};break;case"geopoint":e.indexes[o]={type:"BKD",node:new v.BKDTree,isArray:t};break;default:throw new Error("INVALID_SCHEMA_TYPE: "+o)}e.searchableProperties.push(o),e.searchablePropertiesWithTypes[o]=a}}}var J=1048575;function H(e,d){let r=C(e),n=N(e)|1<<d;return r+1<<20|n}function R(e,d,r,s,n,a,o){let t=e.split(/\.|\?|!/),c=0,m=0;for(let i of t){let l=o.tokenize(i,a,s);for(let u of l){m++,r[u]||(r[u]=0);let I=Math.min(c,20);r.tokenQuantums[n][u]=H(r.tokenQuantums[n][u],I),d.insert(u,n)}l.length>1&&c++}r.tokensLength.set(n,m)}function M(e){let d=e.tokens,r=e.radixNode,s=e.exact,n=e.tolerance,a=e.stats,o=e.boostPerProp,t=e.resultMap,c=e.whereFiltersIDs,m=a.tokensLength,i=a.tokenQuantums,l={term:"",exact:s,tolerance:n},u={},I=d.length;for(let b=0;b<I;b++){let x=d[b];l.term=x;let S=r.find(l);u={...u,...S}}let f=Object.keys(u),g=f.length;for(let b=0;b<g;b++){let x=f[b],S=u[x],p=S.length,y=d.includes(x);for(let D=0;D<p;D++){let h=S[D];if(c&&!c.has(h))continue;let W=m.get(h),A=i[h][x],O=C(A),T=N(A),L=(O*O/W+(y?1:0))*o;if(!t.has(h)){t.set(h,[L,T]);continue}let P=t.get(h),B=P[0]+Y(P[1]&T)*2+L;P[0]=B,P[1]=P[1]|T}}}function N(e){return e&J}function C(e){return e>>20}function Y(e){let d=0;do e&1&&++d;while(e>>=1);return d}function Q(e,d,r,s,n,a,o){let t=o.tokensLength,c=o.tokenQuantums,m=n.tokenize(e,a,r);for(let i of m)d.removeDocumentByWord(i,s,!0);t.delete(s),delete c[s]}import{radix as F}from"@wcs-colab/orama/trees";import{setIntersection as j}from"@wcs-colab/orama/internals";var G=new F.RadixNode("","",!1),U={tokenQuantums:{},tokensLength:new Map};function X(e,d,r,s,n,a,o,t,c,m,i){let l=new Map,u={tokens:r.tokenize(d,s),radixNode:G,exact:a,tolerance:o,stats:U,boostPerProp:0,all:l,resultMap:l,whereFiltersIDs:i},I=n.length;for(let x=0;x<I;x++){let S=n[x],p=e.stats[S],y=t[S]??1;u.radixNode=e.indexes[S].node,u.stats=p,u.boostPerProp=y,M(u)}let f=Array.from(l),g=f.length,b=[];for(let x=0;x<g;x++){let S=f[x],p=S[0],y=S[1][0];b.push([p,y])}return b}function me(){return{name:"qps",getComponents(e){return Z(e)}}}function Z(e){return{index:{create:function(){let r={indexes:{},vectorIndexes:{},searchableProperties:[],searchablePropertiesWithTypes:{},stats:{}};return w(r,e,""),r},insert:function(r,s,n,a,o,t,c,m,i,l){if(!(c==="string"||c==="string[]"))return k.insert(r,s,n,a,o,t,c,m,i,l);s.stats[n]||(s.stats[n]={tokenQuantums:{},tokensLength:new Map});let u=s.stats[n],I=s.indexes[n].node;if(u.tokenQuantums[o]={},Array.isArray(t))for(let f of t)R(f,I,u,n,o,m,i);else R(t,I,u,n,o,m,i)},remove:function(r,s,n,a,o,t,c,m,i,l){if(!(c==="string"||c==="string[]"))return k.remove(r,s,n,a,o,t,c,m,i,l);let u=s.stats[n],I=s.indexes[n].node;if(Array.isArray(t))for(let f of t)Q(f,I,n,o,i,m,u);else Q(t,I,n,o,i,m,u)},insertDocumentScoreParameters:()=>{throw new Error},insertTokenScoreParameters:()=>{throw new Error},removeDocumentScoreParameters:()=>{throw new Error},removeTokenScoreParameters:()=>{throw new Error},calculateResultScores:()=>{throw new Error},search:X,searchByWhereClause:function(r,s,n,a){let o=Object.entries(n).filter(([i])=>r.indexes[i].type==="Radix");if(o.length===0)return k.searchByWhereClause(r,s,n,a);let t;for(let[i,l]of o){let u=[];if(Array.isArray(l))for(let g of l){let b=s.tokenize(g,a)?.[0];u.push(b)}else u=s.tokenize(l,a);let I=r.indexes[i].node,f=new Set;for(let g of u){let x=I.find({term:g,exact:!0})[g];if(x)for(let S of x)f.add(S)}t?t=j(t,f):t=f}if(Object.entries(n).filter(([i])=>r.indexes[i].type!=="Radix").length===0)return t;let m=k.searchByWhereClause(r,s,n,a);return j(t,m)},getSearchableProperties:function(r){return r.searchableProperties},getSearchablePropertiesWithTypes:function(d){return d.searchablePropertiesWithTypes},load:function(r,s){let n=k.load(r,s[0]),a=s[1],o={...n.indexes,...Object.fromEntries(a.radixTrees.map(([t,c,m,i])=>[t,{node:F.RadixNode.fromJSON(i),isArray:c,type:m}]))};return{...n,indexes:o,stats:Object.fromEntries(a.stats.map(([t,{tokenQuantums:c,tokensLength:m}])=>[t,{tokenQuantums:c,tokensLength:new Map(m)}]))}},save:function(r){let s=r,n=Object.entries(s.indexes).filter(([,{type:c}])=>c!=="Radix"),a=k.save({...s,indexes:Object.fromEntries(n)}),t={radixTrees:Object.entries(s.indexes).filter(([,{type:c}])=>c==="Radix").map(([c,{node:m,isArray:i,type:l}])=>[c,i,l,m.toJSON()]),stats:Object.entries(r.stats).map(([c,{tokenQuantums:m,tokensLength:i}])=>[c,{tokenQuantums:m,tokensLength:Array.from(i.entries())}])};return[a,t]}}}}export{me as pluginQPS};
1
+ import{index as k}from"@wcs-colab/orama/components";import{avl as v,bkd as V,flat as q,radix as K,bool as _,vector as $}from"@wcs-colab/orama/trees";import{getVectorSize as J,isVectorType as H}from"@wcs-colab/orama/components";function w(e,l,u){for(let r of Object.entries(l)){let t=r[0],n=r[1],o=`${u}${u?".":""}${t}`;if(typeof n=="object"&&!Array.isArray(n)){w(e,n,o);continue}if(H(n))e.searchableProperties.push(o),e.searchablePropertiesWithTypes[o]=n,e.vectorIndexes[o]={type:"Vector",node:new $.VectorIndex(J(n)),isArray:!1};else{let a=/\[/.test(n);switch(n){case"boolean":case"boolean[]":e.indexes[o]={type:"Bool",node:new _.BoolNode,isArray:a};break;case"number":case"number[]":e.indexes[o]={type:"AVL",node:new v.AVLTree(0,[]),isArray:a};break;case"string":case"string[]":e.indexes[o]={type:"Radix",node:new K.RadixTree,isArray:a};break;case"enum":case"enum[]":e.indexes[o]={type:"Flat",node:new q.FlatTree,isArray:a};break;case"geopoint":e.indexes[o]={type:"BKD",node:new V.BKDTree,isArray:a};break;default:throw new Error("INVALID_SCHEMA_TYPE: "+o)}e.searchableProperties.push(o),e.searchablePropertiesWithTypes[o]=n}}}var Y=1048575,D={exact:1,fuzzy:.6};function N(e){e?.exact!==void 0&&!Number.isNaN(e.exact)&&(D.exact=e.exact),e?.fuzzy!==void 0&&!Number.isNaN(e.fuzzy)&&(D.fuzzy=e.fuzzy)}function G(e,l){let u=z(e),t=L(e)|1<<l;return u+1<<20|t}function Q(e,l,u,r,t,n,o){let a=e.split(/\.|\?|!/),s=0,i=0;for(let d of a){let c=o.tokenize(d,n,r);for(let m of c){i++,u[m]||(u[m]=0);let f=Math.min(s,20);u.tokenQuantums[t][m]=G(u.tokenQuantums[t][m],f),l.insert(m,t)}c.length>1&&s++}u.tokensLength.set(t,i)}function C(e){let l=e.tokens,u=e.radixNode,r=e.exact,t=e.tolerance,n=e.stats,o=e.boostPerProp,a=e.resultMap,s=e.whereFiltersIDs,i=n.tokensLength,d=n.tokenQuantums,c={term:"",exact:r,tolerance:t},m={},f=l.length;for(let b=0;b<f;b++){let x=l[b];c.term=x;let h=u.find(c);m={...m,...h}}let I=Object.keys(m),S=I.length;for(let b=0;b<S;b++){let x=I[b],h=m[x],g=h.length,y=l.includes(x);for(let T=0;T<g;T++){let p=h[T];if(s&&!s.has(p))continue;let ne=i.get(p),M=d[p][x],F=z(M),A=L(M),B=y?D.exact:D.fuzzy,O=F*B;if(!a.has(p)){a.set(p,[O,A]);continue}let P=a.get(p),E=P[0]+O;P[0]=E,P[1]=P[1]|A}}}function L(e){return e&Y}function z(e){return e>>20}function R(e,l,u,r,t,n,o){let a=o.tokensLength,s=o.tokenQuantums,i=t.tokenize(e,n,u);for(let d of i)l.removeDocumentByWord(d,r,!0);a.delete(r),delete s[r]}import{radix as j}from"@wcs-colab/orama/trees";import{setIntersection as W}from"@wcs-colab/orama/internals";var U=new j.RadixNode("","",!1),X={tokenQuantums:{},tokensLength:new Map};function Z(e,l,u,r,t,n,o,a,s,i,d){let c=new Map,m={tokens:u.tokenize(l,r),radixNode:U,exact:n,tolerance:o,stats:X,boostPerProp:0,all:c,resultMap:c,whereFiltersIDs:d},f=t.length;for(let x=0;x<f;x++){let h=t[x],g=e.stats[h],y=a[h]??1;m.radixNode=e.indexes[h].node,m.stats=g,m.boostPerProp=y,C(m)}let I=Array.from(c),S=I.length,b=[];for(let x=0;x<S;x++){let h=I[x],g=h[0],y=h[1][0];b.push([g,y])}return b}function fe(e={}){e.weights&&N(e.weights);let l=e.tolerance,u=e.multiWordThreshold,r=e.candidatePool,t=e.candidateCap,n=e.phraseMode;return{name:"qps",getComponents(o){return ee(o,{tolerance:l,multiWordThreshold:u,candidatePool:r,candidateCap:t,phraseMode:n})}}}function ee(e,l){return{index:{create:function(){let r={indexes:{},vectorIndexes:{},searchableProperties:[],searchablePropertiesWithTypes:{},stats:{}};return w(r,e,""),r.config=l,r},insert:function(r,t,n,o,a,s,i,d,c,m){if(!(i==="string"||i==="string[]"))return k.insert(r,t,n,o,a,s,i,d,c,m);t.stats[n]||(t.stats[n]={tokenQuantums:{},tokensLength:new Map});let f=t.stats[n],I=t.indexes[n].node;if(f.tokenQuantums[a]={},Array.isArray(s))for(let S of s)Q(S,I,f,n,a,d,c);else Q(s,I,f,n,a,d,c)},remove:function(r,t,n,o,a,s,i,d,c,m){if(!(i==="string"||i==="string[]"))return k.remove(r,t,n,o,a,s,i,d,c,m);let f=t.stats[n],I=t.indexes[n].node;if(Array.isArray(s))for(let S of s)R(S,I,n,a,c,d,f);else R(s,I,n,a,c,d,f)},insertDocumentScoreParameters:()=>{throw new Error},insertTokenScoreParameters:()=>{throw new Error},removeDocumentScoreParameters:()=>{throw new Error},removeTokenScoreParameters:()=>{throw new Error},calculateResultScores:()=>{throw new Error},search:Z,searchByWhereClause:function(r,t,n,o){let a=Object.entries(n).filter(([c])=>r.indexes[c].type==="Radix");if(a.length===0)return k.searchByWhereClause(r,t,n,o);let s;for(let[c,m]of a){let f=[];if(Array.isArray(m))for(let b of m){let x=t.tokenize(b,o)?.[0];f.push(x)}else f=t.tokenize(m,o);let I=r.indexes[c].node,S=new Set;for(let b of f){let h=I.find({term:b,exact:!0})[b];if(h)for(let g of h)S.add(g)}s?s=W(s,S):s=S}if(Object.entries(n).filter(([c])=>r.indexes[c].type!=="Radix").length===0)return s;let d=k.searchByWhereClause(r,t,n,o);return W(s,d)},getSearchableProperties:function(r){return r.searchableProperties},getSearchablePropertiesWithTypes:function(u){return u.searchablePropertiesWithTypes},load:function(r,t){let n=k.load(r,t[0]),o=t[1],a={...n.indexes,...Object.fromEntries(o.radixTrees.map(([s,i,d,c])=>[s,{node:j.RadixNode.fromJSON(c),isArray:i,type:d}]))};return{...n,indexes:a,stats:Object.fromEntries(o.stats.map(([s,{tokenQuantums:i,tokensLength:d}])=>[s,{tokenQuantums:i,tokensLength:new Map(d)}]))}},save:function(r){let t=r,n=Object.entries(t.indexes).filter(([,{type:i}])=>i!=="Radix"),o=k.save({...t,indexes:Object.fromEntries(n)}),s={radixTrees:Object.entries(t.indexes).filter(([,{type:i}])=>i==="Radix").map(([i,{node:d,isArray:c,type:m}])=>[i,c,m,d.toJSON()]),stats:Object.entries(r.stats).map(([i,{tokenQuantums:d,tokensLength:c}])=>[i,{tokenQuantums:d,tokensLength:Array.from(c.entries())}])};return[o,s]}}}}export{fe as pluginQPS};
2
2
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -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":["Index","avl","bkd","flat","radix","bool","vector","getVectorSize","isVectorType","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","radix","setIntersection","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":["Index","avl","bkd","flat","radix","bool","vector","getVectorSize","isVectorType","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","radix","setIntersection","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/package.json CHANGED
@@ -1,53 +1,46 @@
1
- {
2
- "name": "@wcs-colab/plugin-qps",
3
- "version": "3.1.16-custom.12",
4
- "description": "Performant search algorithm optimized for descriptive texts",
5
- "keywords": [
6
- "orama",
7
- "embeddings",
8
- "secure proxy",
9
- "vector search"
10
- ],
11
- "license": "Apache-2.0",
12
- "main": "./dist/index.js",
13
- "type": "module",
14
- "exports": {
15
- ".": {
16
- "require": "./dist/index.cjs",
17
- "import": "./dist/index.js",
18
- "types": "./dist/index.d.ts",
19
- "browser": "./dist/index.global.js"
20
- }
21
- },
22
- "bugs": {
23
- "url": "https://github.com/oramasearch/orama/issues"
24
- },
25
- "homepage": "https://github.com/oramasearch/orama#readme",
26
- "repository": {
27
- "type": "git",
28
- "url": "git+https://github.com/oramasearch/orama.git"
29
- },
30
- "sideEffects": false,
31
- "types": "./dist/index.d.ts",
32
- "files": [
33
- "dist"
34
- ],
35
- "publishConfig": {
36
- "access": "public"
37
- },
38
- "devDependencies": {
39
- "@types/node": "^20.9.0",
40
- "tap": "^21.0.1",
41
- "tsup": "^7.2.0",
42
- "tsx": "^4.19.1",
43
- "typescript": "^5.0.0"
44
- },
45
- "dependencies": {
46
- "@wcs-colab/orama": "3.1.16-custom.base.4"
47
- },
48
- "scripts": {
49
- "build": "tsup --config tsup.lib.js",
50
- "lint": "exit 0",
51
- "test": "node --test --import tsx test/*.test.ts"
52
- }
53
- }
1
+ {
2
+ "name": "@wcs-colab/plugin-qps",
3
+ "version": "3.1.16-custom.13",
4
+ "description": "Performant search algorithm optimized for descriptive texts",
5
+ "keywords": ["orama", "embeddings", "secure proxy", "vector search"],
6
+ "license": "Apache-2.0",
7
+ "main": "./dist/index.js",
8
+ "type": "module",
9
+ "exports": {
10
+ ".": {
11
+ "require": "./dist/index.cjs",
12
+ "import": "./dist/index.js",
13
+ "types": "./dist/index.d.ts",
14
+ "browser": "./dist/index.global.js"
15
+ }
16
+ },
17
+ "bugs": {
18
+ "url": "https://github.com/oramasearch/orama/issues"
19
+ },
20
+ "homepage": "https://github.com/oramasearch/orama#readme",
21
+ "repository": {
22
+ "type": "git",
23
+ "url": "git+https://github.com/oramasearch/orama.git"
24
+ },
25
+ "sideEffects": false,
26
+ "types": "./dist/index.d.ts",
27
+ "files": ["dist"],
28
+ "scripts": {
29
+ "build": "tsup --config tsup.lib.js",
30
+ "lint": "exit 0",
31
+ "test": "node --test --import tsx test/*.test.ts"
32
+ },
33
+ "publishConfig": {
34
+ "access": "public"
35
+ },
36
+ "devDependencies": {
37
+ "@types/node": "^20.9.0",
38
+ "tap": "^21.0.1",
39
+ "tsup": "^7.2.0",
40
+ "tsx": "^4.19.1",
41
+ "typescript": "^5.0.0"
42
+ },
43
+ "dependencies": {
44
+ "@wcs-colab/orama": "npm:@wcs-colab/orama@3.1.16-custom.base.4"
45
+ }
46
+ }