@orama/plugin-pt15 3.1.14 → 3.1.16

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 A=Object.defineProperty;var L=Object.getOwnPropertyDescriptor;var V=Object.getOwnPropertyNames;var v=Object.prototype.hasOwnProperty;var R=(r,t)=>{for(var n in t)A(r,n,{get:t[n],enumerable:!0})},z=(r,t,n,i)=>{if(t&&typeof t=="object"||typeof t=="function")for(let e of V(t))!v.call(r,e)&&e!==n&&A(r,e,{get:()=>t[e],enumerable:!(i=L(t,e))||i.enumerable});return r};var W=r=>z(A({},"__esModule",{value:!0}),r);var N={};R(N,{pluginPT15:()=>F});module.exports=W(N);var x=require("@orama/orama/components");var p=require("@orama/orama/trees"),k=require("@orama/orama/components"),y=15;function g(){return Object.create(null)}function O(r,t,n){for(let[i,e]of Object.entries(t)){let s=`${n}${n?".":""}${i}`;if(typeof e=="object"&&!Array.isArray(e)){O(r,e,s);continue}if((0,k.isVectorType)(e))r.searchableProperties.push(s),r.searchablePropertiesWithTypes[s]=e,r.vectorIndexes[s]={type:"Vector",node:new p.vector.VectorIndex((0,k.getVectorSize)(e)),isArray:!1};else{let o=/\[/.test(e);switch(e){case"boolean":case"boolean[]":r.indexes[s]={type:"Bool",node:new p.bool.BoolNode,isArray:o};break;case"number":case"number[]":r.indexes[s]={type:"AVL",node:new p.avl.AVLTree(0,[]),isArray:o};break;case"string":case"string[]":r.indexes[s]={type:"Position",node:[g(),g(),g(),g(),g(),g(),g(),g(),g(),g(),g(),g(),g(),g(),g()],isArray:o};break;case"enum":case"enum[]":r.indexes[s]={type:"Flat",node:new p.flat.FlatTree,isArray:o};break;case"geopoint":r.indexes[s]={type:"BKD",node:new p.bkd.BKDTree,isArray:o};break;default:throw new Error("INVALID_SCHEMA_TYPE: "+s)}r.searchableProperties.push(s),r.searchablePropertiesWithTypes[s]=e}}}function B(r,t,n,i,e,s){let o=s.tokenize(r,e,n),a=o.length;for(let c=0;c<a;c++){let l=o[c],m=y-C(c,a)-1,S=t[m],d=l.length;for(let u=d;u>0;u--){let h=l.slice(0,u);S[h]=S[h]||[],S[h].push(i)}}}function C(r,t){return t<y?r:Math.floor(r*y/t)}function E(r,t,n,i,e){let s=r.tokenize(t),o=new Map;for(let a of s)for(let c=0;c<y;c++){let l=n[c];if(l[a]){let m=l[a],S=m.length;for(let d=0;d<S;d++){if(e&&!e.has(m[d]))continue;let u=m[d];o.has(u)?o.set(u,o.get(u)+c*i):o.set(u,c*i)}}}return o}function j(r,t,n,i,e,s){let o=e.tokenize(r,s,n),a=o.length;for(let c=0;c<a;c++){let l=o[c],m=y-C(c,a)-1,S=t[m],d=l.length;for(let u=d;u>0;u--){let h=l.slice(0,u),f=S[h];if(f){let P=f.indexOf(i);P!==-1&&f.splice(P,1)}}}}function F(){return{name:"orama-plugin-pt15",getComponents:function(t){return M(t)}}}function M(r){return{index:{create:function(){let n={indexes:{},vectorIndexes:{},searchableProperties:[],searchablePropertiesWithTypes:{}};return O(n,r,""),n},insert:function(n,i,e,s,o,a,c,l,m,S){if(!(c==="string"||c==="string[]"))return x.index.insert(n,i,e,s,o,a,c,l,m,S);let d=i.indexes[e].node;if(Array.isArray(a))for(let u of a)B(u,d,e,o,l,m);else B(a,d,e,o,l,m)},remove:function(n,i,e,s,o,a,c,l,m,S){if(!(c==="string"||c==="string[]"))return x.index.remove(n,i,e,s,o,a,c,l,m,S);let d=i.indexes[e].node;if(Array.isArray(a))for(let u of a)j(u,d,e,o,m,l);else j(a,d,e,o,m,l);return!0},insertDocumentScoreParameters:()=>{throw new Error},insertTokenScoreParameters:()=>{throw new Error},removeDocumentScoreParameters:()=>{throw new Error},removeTokenScoreParameters:()=>{throw new Error},calculateResultScores:()=>{throw new Error},search:function(n,i,e,s,o,a,c,l,m,S,d){if(c!==0)throw new Error("Tolerance not implemented yet");if(a===!0)throw new Error("Exact not implemented yet");let u=[],h=o.length,f={score:-1/0,id:-1};for(let I=0;I<h;I++){let b=o[I],T=n.indexes[b].node,D=l[b]??1,w=E(e,i,T,D,d);w.size>f.score&&(f={score:w.size,id:I}),u.push(w)}if(u.length===1)return Array.from(u[0]);let P=u[f.id];for(let I=0;I<u.length;I++){if(I===f.id)continue;let b=u[I];for(let[T,D]of b)P.has(T)?P.set(T,P.get(T)+D):P.set(T,D)}return Array.from(P)},searchByWhereClause:function(n,i,e,s){if(Object.entries(e).filter(([a])=>n.indexes[a].type==="Position").length!==0)throw new Error("String filters are not supported");return x.index.searchByWhereClause(n,i,e,s)},getSearchableProperties:function(n){return n.searchableProperties},getSearchablePropertiesWithTypes:function(t){return t.searchablePropertiesWithTypes},load:function(n,i){let e=x.index.load(n,i[0]),s=i[1];return{...e,indexes:{...Object.fromEntries(s),...e.indexes}}},save:function(n){let i=n,e=Object.entries(n.indexes).filter(([,{type:a}])=>a!=="Position"),s=x.index.save({...i,indexes:Object.fromEntries(e)}),o=Object.entries(n.indexes).filter(([,{type:a}])=>a==="Position");return[s,o]}}}}0&&(module.exports={pluginPT15});
1
+ "use strict";var A=Object.defineProperty;var L=Object.getOwnPropertyDescriptor;var V=Object.getOwnPropertyNames;var v=Object.prototype.hasOwnProperty;var R=(r,t)=>{for(var n in t)A(r,n,{get:t[n],enumerable:!0})},z=(r,t,n,i)=>{if(t&&typeof t=="object"||typeof t=="function")for(let e of V(t))!v.call(r,e)&&e!==n&&A(r,e,{get:()=>t[e],enumerable:!(i=L(t,e))||i.enumerable});return r};var W=r=>z(A({},"__esModule",{value:!0}),r);var N={};R(N,{pluginPT15:()=>F});module.exports=W(N);var y=require("@orama/orama/components");var p=require("@orama/orama/trees"),k=require("@orama/orama/components"),x=15;function g(){return Object.create(null)}function O(r,t,n){for(let[i,e]of Object.entries(t)){let s=`${n}${n?".":""}${i}`;if(typeof e=="object"&&!Array.isArray(e)){O(r,e,s);continue}if((0,k.isVectorType)(e))r.searchableProperties.push(s),r.searchablePropertiesWithTypes[s]=e,r.vectorIndexes[s]={type:"Vector",node:new p.vector.VectorIndex((0,k.getVectorSize)(e)),isArray:!1};else{let o=/\[/.test(e);switch(e){case"boolean":case"boolean[]":r.indexes[s]={type:"Bool",node:new p.bool.BoolNode,isArray:o};break;case"number":case"number[]":r.indexes[s]={type:"AVL",node:new p.avl.AVLTree(0,[]),isArray:o};break;case"string":case"string[]":r.indexes[s]={type:"Position",node:[g(),g(),g(),g(),g(),g(),g(),g(),g(),g(),g(),g(),g(),g(),g()],isArray:o};break;case"enum":case"enum[]":r.indexes[s]={type:"Flat",node:new p.flat.FlatTree,isArray:o};break;case"geopoint":r.indexes[s]={type:"BKD",node:new p.bkd.BKDTree,isArray:o};break;default:throw new Error("INVALID_SCHEMA_TYPE: "+s)}r.searchableProperties.push(s),r.searchablePropertiesWithTypes[s]=e}}}function B(r,t,n,i,e,s){let o=s.tokenize(r,e,n),a=o.length;for(let c=0;c<a;c++){let l=o[c],m=x-C(c,a)-1,S=t[m],d=l.length;for(let u=d;u>0;u--){let h=l.slice(0,u);S[h]=S[h]||[],S[h].push(i)}}}function C(r,t){return t<x?r:Math.floor(r*x/t)}function E(r,t,n,i,e){let s=r.tokenize(t),o=new Map;for(let a of s)for(let c=0;c<x;c++){let l=n[c];if(l[a]){let m=l[a],S=m.length;for(let d=0;d<S;d++){if(e&&!e.has(m[d]))continue;let u=m[d];o.has(u)?o.set(u,o.get(u)+c*i):o.set(u,c*i)}}}return o}function j(r,t,n,i,e,s){let o=e.tokenize(r,s,n),a=o.length;for(let c=0;c<a;c++){let l=o[c],m=x-C(c,a)-1,S=t[m],d=l.length;for(let u=d;u>0;u--){let h=l.slice(0,u),f=S[h];if(f){let P=f.indexOf(i);P!==-1&&f.splice(P,1)}}}}function F(){return{name:"orama-plugin-pt15",getComponents:function(t){return M(t)}}}function M(r){return{index:{create:function(){let n={indexes:{},vectorIndexes:{},searchableProperties:[],searchablePropertiesWithTypes:{}};return O(n,r,""),n},insert:function(n,i,e,s,o,a,c,l,m,S){if(!(c==="string"||c==="string[]"))return y.index.insert(n,i,e,s,o,a,c,l,m,S);let d=i.indexes[e].node;if(Array.isArray(a))for(let u of a)B(u,d,e,o,l,m);else B(a,d,e,o,l,m)},remove:function(n,i,e,s,o,a,c,l,m,S){if(!(c==="string"||c==="string[]"))return y.index.remove(n,i,e,s,o,a,c,l,m,S);let d=i.indexes[e].node;if(Array.isArray(a))for(let u of a)j(u,d,e,o,m,l);else j(a,d,e,o,m,l);return!0},insertDocumentScoreParameters:()=>{throw new Error},insertTokenScoreParameters:()=>{throw new Error},removeDocumentScoreParameters:()=>{throw new Error},removeTokenScoreParameters:()=>{throw new Error},calculateResultScores:()=>{throw new Error},search:function(n,i,e,s,o,a,c,l,m,S,d){if(c!==0)throw new Error("Tolerance not implemented yet");if(a===!0)throw new Error("Exact not implemented yet");let u=[],h=o.length,f={score:-1/0,id:-1};for(let I=0;I<h;I++){let b=o[I],T=n.indexes[b].node,D=l[b]??1,w=E(e,i,T,D,d);w.size>f.score&&(f={score:w.size,id:I}),u.push(w)}if(u.length===1)return Array.from(u[0]);let P=u[f.id];for(let I=0;I<u.length;I++){if(I===f.id)continue;let b=u[I];for(let[T,D]of b)P.has(T)?P.set(T,P.get(T)+D):P.set(T,D)}return Array.from(P)},searchByWhereClause:function(n,i,e,s){if(Object.entries(e).filter(([a])=>n.indexes[a].type==="Position").length!==0)throw new Error("String filters are not supported");return y.index.searchByWhereClause(n,i,e,s)},getSearchableProperties:function(n){return n.searchableProperties},getSearchablePropertiesWithTypes:function(t){return t.searchablePropertiesWithTypes},load:function(n,i){let e=y.index.load(n,i[0]),s=i[1];return{...e,indexes:{...Object.fromEntries(s),...e.indexes}}},save:function(n){let i=n,e=Object.entries(n.indexes).filter(([,{type:a}])=>a!=="Position"),s=y.index.save({...i,indexes:Object.fromEntries(e)}),o=Object.entries(n.indexes).filter(([,{type:a}])=>a==="Position");return[s,o]}}}}0&&(module.exports={pluginPT15});
2
2
  //# sourceMappingURL=index.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/algorithm.ts"],"sourcesContent":["import type { AnyOrama, SearchableType, IIndex, SearchableValue, Tokenizer, OnlyStrings, FlattenSchemaProperty, TokenScore, WhereCondition, OramaPluginSync, AnySchema, ObjectComponents, BM25Params } from '@orama/orama'\nimport {\n index as Index, internalDocumentIDStore } from '@orama/orama/components'\nimport { PT15IndexStore, insertString, recursiveCreate, PositionsStorage, searchString, removeString } from './algorithm.js';\n\ntype InternalDocumentID = internalDocumentIDStore.InternalDocumentID;\ntype InternalDocumentIDStore = internalDocumentIDStore.InternalDocumentIDStore;\ntype DocumentID = internalDocumentIDStore.DocumentID;\n\nexport function pluginPT15(): OramaPluginSync {\n\n return {\n name: 'orama-plugin-pt15',\n\n getComponents: function getComponents(schema: AnySchema) {\n return createComponents(schema)\n },\n }\n}\n\nfunction createComponents(schema: AnySchema): Partial<ObjectComponents<any, any, any>> {\n return {\n index: {\n create: function create() {\n const indexDatastore: PT15IndexStore = {\n indexes: {},\n vectorIndexes: {},\n searchableProperties: [],\n searchablePropertiesWithTypes: {},\n }\n\n recursiveCreate(indexDatastore, schema, '')\n\n return indexDatastore\n },\n insert: function insert(\n implementation: IIndex<PT15IndexStore>,\n indexDatastorage: PT15IndexStore,\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(implementation as unknown as IIndex<Index.Index>, indexDatastorage as unknown as Index.Index, prop, id, internalId, value, schemaType, language, tokenizer, docsCount)\n }\n\n const storage = indexDatastorage.indexes[prop].node as PositionsStorage\n\n if (Array.isArray(value)) {\n for (const item of value) {\n insertString(\n item as string,\n storage,\n prop,\n internalId,\n language,\n tokenizer,\n )\n }\n } else {\n insertString(\n value as string,\n storage,\n prop,\n internalId,\n language,\n tokenizer,\n )\n }\n },\n // remove: <T extends I>(implementation: IIndex<T>, index: T, prop: string, id: DocumentID, value: SearchableValue, schemaType: SearchableType, language: string | undefined, tokenizer: Tokenizer, docsCount: number) => SyncOrAsyncValue<boolean>;\n remove: function remove(implementation: IIndex<PT15IndexStore>, indexDatastorage: PT15IndexStore, prop: string, id: DocumentID, internalId: InternalDocumentID, value: SearchableValue, schemaType: SearchableType, language: string | undefined, tokenizer: Tokenizer, docsCount: number) {\n if (!(schemaType === 'string' || schemaType === 'string[]')) {\n return Index.remove(implementation as IIndex<Index.Index>, indexDatastorage as Index.Index, prop, id, internalId, value, schemaType, language, tokenizer, docsCount)\n }\n\n const storage = indexDatastorage.indexes[prop].node as PositionsStorage\n\n if (Array.isArray(value)) {\n for (const item of value) {\n removeString(\n item as string,\n storage,\n prop,\n internalId,\n tokenizer,\n language\n )\n }\n } else {\n removeString(\n value as string,\n storage,\n prop,\n internalId,\n tokenizer,\n language\n )\n }\n\n return true\n },\n insertDocumentScoreParameters: () => {throw new Error()},\n insertTokenScoreParameters: () => {throw new Error()},\n removeDocumentScoreParameters: () => {throw new Error()},\n removeTokenScoreParameters: () => {throw new Error()},\n calculateResultScores: () => {throw new Error()},\n search: function search<T extends AnyOrama>(index: PT15IndexStore, term: string, tokenizer: Tokenizer, language: string | undefined, propertiesToSearch: string[], exact: boolean, tolerance: number, boost: Partial<Record<OnlyStrings<FlattenSchemaProperty<T>[]>, number>>, relevance: Required<BM25Params>, docsCount: number, whereFiltersIDs: Set<InternalDocumentID> | undefined): TokenScore[] {\n if (tolerance !== 0) {\n throw new Error('Tolerance not implemented yet')\n }\n if (exact === true) {\n throw new Error('Exact not implemented yet')\n }\n\n const maps: Map<number, number>[] = []\n const propertyLength = propertiesToSearch.length\n let max = {\n score: -Infinity,\n id: -1\n }\n for (let i = 0; i < propertyLength; i++) {\n const property = propertiesToSearch[i]\n const storage = index.indexes[property].node as PositionsStorage\n const boostPerProp = boost[property] ?? 1\n const map = searchString(tokenizer, term, storage, boostPerProp, whereFiltersIDs);\n if (map.size > max.score) {\n max = {\n score: map.size,\n id: i\n }\n }\n maps.push(map)\n }\n\n if (maps.length === 1) {\n return Array.from(maps[0])\n }\n\n const base = maps[max.id]\n for (let i = 0; i < maps.length; i++) {\n if (i === max.id) {\n continue\n }\n\n const map = maps[i]\n for (const [id, score] of map) {\n if (base.has(id)) {\n base.set(id, base.get(id)! + score)\n } else {\n base.set(id, score)\n }\n }\n }\n \n return Array.from(base)\n },\n searchByWhereClause: function searchByWhereClause<T extends AnyOrama>(index: PT15IndexStore, tokenizer: Tokenizer, filters: Partial<WhereCondition<T['schema']>>, language: string | undefined) {\n const stringFiltersList = Object.entries(filters).filter(([propName]) => index.indexes[propName].type === 'Position')\n\n // PT15 doen't support string filters.\n // this plugin doesn't distringuish between prefix and exact match.\n if (stringFiltersList.length !== 0) {\n throw new Error('String filters are not supported')\n }\n\n return Index.searchByWhereClause(index as Index.Index, tokenizer, filters, language)\n },\n getSearchableProperties: function getSearchableProperties(index: PT15IndexStore): string[] {\n return index.searchableProperties\n },\n getSearchablePropertiesWithTypes: function (index: PT15IndexStore) {\n return index.searchablePropertiesWithTypes\n },\n load: function load<R = unknown>(sharedInternalDocumentStore: InternalDocumentIDStore, raw: R): PT15IndexStore {\n const dump1 = Index.load(sharedInternalDocumentStore, raw[0])\n const dump2 = raw[1]\n return {\n ...dump1,\n indexes: {\n ...Object.fromEntries(dump2),\n ...dump1.indexes\n } as PT15IndexStore['indexes']\n }\n },\n save: function save<R = unknown>(index: PT15IndexStore): R {\n const baseIndex = index as unknown as Index.Index\n const nonStringIndexes = Object.entries(index.indexes).filter(([, { type }]) => type !== 'Position')\n const dump1 = Index.save({\n ...baseIndex,\n indexes: Object.fromEntries(nonStringIndexes) as Index.Index['indexes']\n })\n\n const stringIndexes = Object.entries(index.indexes).filter(([, { type }]) => type === 'Position')\n\n return [dump1, stringIndexes] as unknown as R\n }\n }\n }\n}\n","import { AnyIndexStore, AnyOrama, SearchableType, Tokenizer } from \"@orama/orama\"\nimport { avl, bkd, flat, bool, vector } from '@orama/orama/trees'\nimport {\n getVectorSize, internalDocumentIDStore, isVectorType } from '@orama/orama/components'\n\ntype InternalDocumentID = internalDocumentIDStore.InternalDocumentID;\n\nexport type TreeType = 'AVL' | 'Radix' | 'Bool' | 'Flat' | 'BKD';\nexport type TTree<T = TreeType, N = unknown> = {\n type: T;\n node: N;\n isArray: boolean;\n};\nexport type Tree =\n // We don't store strings inside a tree\n // | TTree<'Radix', radix.RadixNode>\n | TTree<'Position', PositionsStorage>\n | TTree<'AVL', avl.AVLTree<number, InternalDocumentID[]>>\n | TTree<'Bool', bool.BoolNode>\n | TTree<'Flat', flat.FlatTree>\n | TTree<'BKD', bkd.BKDTree>;\n\nconst MAX_POSITION = 15\nexport type PositionStorage = Record<string, number[]>\n// 15 `PositionStorage`s\nexport type PositionsStorage = [\n PositionStorage,\n PositionStorage,\n PositionStorage,\n PositionStorage,\n PositionStorage,\n PositionStorage,\n PositionStorage,\n PositionStorage,\n PositionStorage,\n PositionStorage,\n PositionStorage,\n PositionStorage,\n PositionStorage,\n PositionStorage,\n PositionStorage,\n]\n\nexport interface PT15IndexStore extends AnyIndexStore {\n indexes: Record<string, Tree>\n searchableProperties: string[]\n searchablePropertiesWithTypes: Record<string, SearchableType>\n}\n\nfunction create_obj() {\n // object with empty prototype to cheap objects\n return Object.create(null)\n}\n\nexport function recursiveCreate<T extends AnyOrama>(indexDatastore: PT15IndexStore, schema: T['schema'], prefix: string) {\n for (const [prop, type] of Object.entries<SearchableType>(schema)) {\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] = { type: 'AVL', node: new avl.AVLTree<number, InternalDocumentID[]>(0, []), isArray }\n break\n case 'string':\n case 'string[]':\n indexDatastore.indexes[path] = { type: 'Position', node: [\n create_obj(),\n create_obj(),\n create_obj(),\n create_obj(),\n create_obj(),\n create_obj(),\n create_obj(),\n create_obj(),\n create_obj(),\n create_obj(),\n create_obj(),\n create_obj(),\n create_obj(),\n create_obj(),\n create_obj(),\n ], 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\nexport function insertString(\n value: string,\n positionsStorage: PositionsStorage,\n prop: string,\n internalId: InternalDocumentID,\n language: string | undefined,\n tokenizer: Tokenizer,\n) {\n const tokens = tokenizer.tokenize(value, language, prop)\n const tokensLength = tokens.length\n for (let i = 0; i < tokensLength; i++) {\n const token = tokens[i]\n const position = MAX_POSITION - get_position(i, tokensLength) - 1\n\n const positionStorage = positionsStorage[position]\n\n const tokenLength = token.length\n for (let j = tokenLength; j > 0; j--) {\n const tokenPart = token.slice(0, j)\n positionStorage[tokenPart] = positionStorage[tokenPart] || []\n positionStorage[tokenPart].push(internalId)\n }\n }\n}\n\nexport function get_position(n: number, totalLength: number) {\n if (totalLength < MAX_POSITION) {\n return n\n }\n // Scale\n return Math.floor(n * MAX_POSITION / totalLength) \n}\n\nexport function searchString(\n tokenizer: Tokenizer,\n term: string,\n positionsStorage: PositionsStorage,\n boostPerProp: number,\n whereFiltersIDs: Set<InternalDocumentID> | undefined,\n) {\n const tokens = tokenizer.tokenize(term)\n\n const ret: Map<number, number> = new Map()\n for (const token of tokens) {\n for (let i = 0; i < MAX_POSITION; i++) {\n const positionStorage = positionsStorage[i]\n if (positionStorage[token]) {\n const a = positionStorage[token]\n const aLength = a.length\n\n for (let j = 0; j < aLength; j++) {\n if (whereFiltersIDs && !whereFiltersIDs.has(a[j])) {\n continue\n }\n\n const id = a[j]\n if (ret.has(id)) {\n ret.set(id, ret.get(id)! + i * boostPerProp)\n } else {\n ret.set(id, i * boostPerProp)\n }\n }\n }\n }\n }\n\n return ret\n}\n\nexport function removeString(\n value: string,\n positionsStorage: PositionsStorage,\n prop: string,\n internalId: InternalDocumentID,\n tokenizer: Tokenizer,\n language: string | undefined,\n) {\n const tokens = tokenizer.tokenize(value, language, prop)\n const tokensLength = tokens.length\n for (let i = 0; i < tokensLength; i++) {\n const token = tokens[i]\n const position = MAX_POSITION - get_position(i, tokensLength) - 1\n\n const positionStorage = positionsStorage[position]\n\n const tokenLength = token.length\n for (let j = tokenLength; j > 0; j--) {\n const tokenPart = token.slice(0, j)\n const a = positionStorage[tokenPart]\n if (a) {\n const index = a.indexOf(internalId)\n if (index !== -1) {\n a.splice(index, 1)\n }\n }\n }\n }\n\n}"],"mappings":"yaAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,gBAAAE,IAAA,eAAAC,EAAAH,GACA,IAAAI,EACiD,mCCDjD,IAAAC,EAA6C,8BAC7CC,EAC8D,mCAmBxDC,EAAe,GA2BrB,SAASC,GAAa,CAEpB,OAAO,OAAO,OAAO,IAAI,CAC3B,CAEO,SAASC,EAAoCC,EAAgCC,EAAqBC,EAAgB,CACvH,OAAW,CAACC,EAAMC,CAAI,IAAK,OAAO,QAAwBH,CAAM,EAAG,CACjE,IAAMI,EAAO,GAAGH,CAAM,GAAGA,EAAS,IAAM,EAAE,GAAGC,CAAI,GAEjD,GAAI,OAAOC,GAAS,UAAY,CAAC,MAAM,QAAQA,CAAI,EAAG,CAEpDL,EAAgBC,EAAgBI,EAAMC,CAAI,EAC1C,QACF,CAEA,MAAI,gBAAaD,CAAI,EACnBJ,EAAe,qBAAqB,KAAKK,CAAI,EAC7CL,EAAe,8BAA8BK,CAAI,EAAID,EACrDJ,EAAe,cAAcK,CAAI,EAAI,CACnC,KAAM,SACN,KAAM,IAAI,SAAO,eAAY,iBAAcD,CAAI,CAAC,EAChD,QAAS,EACX,MACK,CACL,IAAME,EAAU,KAAK,KAAKF,CAAc,EACxC,OAAQA,EAAM,CACZ,IAAK,UACL,IAAK,YACHJ,EAAe,QAAQK,CAAI,EAAI,CAAE,KAAM,OAAQ,KAAM,IAAI,OAAK,SAAY,QAAAC,CAAQ,EAClF,MACF,IAAK,SACL,IAAK,WACHN,EAAe,QAAQK,CAAI,EAAI,CAAE,KAAM,MAAO,KAAM,IAAI,MAAI,QAAsC,EAAG,CAAC,CAAC,EAAG,QAAAC,CAAQ,EAClH,MACF,IAAK,SACL,IAAK,WACHN,EAAe,QAAQK,CAAI,EAAI,CAAE,KAAM,WAAY,KAAM,CACvDP,EAAW,EACXA,EAAW,EACXA,EAAW,EACXA,EAAW,EACXA,EAAW,EACXA,EAAW,EACXA,EAAW,EACXA,EAAW,EACXA,EAAW,EACXA,EAAW,EACXA,EAAW,EACXA,EAAW,EACXA,EAAW,EACXA,EAAW,EACXA,EAAW,CACb,EAAG,QAAAQ,CAAQ,EACX,MACF,IAAK,OACL,IAAK,SACHN,EAAe,QAAQK,CAAI,EAAI,CAAE,KAAM,OAAQ,KAAM,IAAI,OAAK,SAAY,QAAAC,CAAQ,EAClF,MACF,IAAK,WACHN,EAAe,QAAQK,CAAI,EAAI,CAAE,KAAM,MAAO,KAAM,IAAI,MAAI,QAAW,QAAAC,CAAQ,EAC/E,MACF,QACE,MAAM,IAAI,MAAM,wBAA0BD,CAAI,CAClD,CAEAL,EAAe,qBAAqB,KAAKK,CAAI,EAC7CL,EAAe,8BAA8BK,CAAI,EAAID,CACvD,CACF,CACF,CAEO,SAASG,EACdC,EACAC,EACAN,EACAO,EACAC,EACAC,EACA,CACA,IAAMC,EAASD,EAAU,SAASJ,EAAOG,EAAUR,CAAI,EACjDW,EAAeD,EAAO,OAC5B,QAASE,EAAI,EAAGA,EAAID,EAAcC,IAAK,CACrC,IAAMC,EAAQH,EAAOE,CAAC,EAChBE,EAAWpB,EAAeqB,EAAaH,EAAGD,CAAY,EAAI,EAE1DK,EAAkBV,EAAiBQ,CAAQ,EAE3CG,EAAcJ,EAAM,OAC1B,QAASK,EAAID,EAAaC,EAAI,EAAGA,IAAK,CACpC,IAAMC,EAAYN,EAAM,MAAM,EAAGK,CAAC,EAClCF,EAAgBG,CAAS,EAAIH,EAAgBG,CAAS,GAAK,CAAC,EAC5DH,EAAgBG,CAAS,EAAE,KAAKZ,CAAU,CAC5C,CACF,CACF,CAEO,SAASQ,EAAaK,EAAWC,EAAqB,CAC3D,OAAIA,EAAc3B,EACT0B,EAGF,KAAK,MAAMA,EAAI1B,EAAe2B,CAAW,CAClD,CAEO,SAASC,EACdb,EACAc,EACAjB,EACAkB,EACAC,EACA,CACA,IAAMf,EAASD,EAAU,SAASc,CAAI,EAEhCG,EAA2B,IAAI,IACrC,QAAWb,KAASH,EAClB,QAASE,EAAI,EAAGA,EAAIlB,EAAckB,IAAK,CACrC,IAAMI,EAAkBV,EAAiBM,CAAC,EAC1C,GAAII,EAAgBH,CAAK,EAAG,CAC1B,IAAMc,EAAIX,EAAgBH,CAAK,EACzBe,EAAUD,EAAE,OAElB,QAAST,EAAI,EAAGA,EAAIU,EAASV,IAAK,CAChC,GAAIO,GAAmB,CAACA,EAAgB,IAAIE,EAAET,CAAC,CAAC,EAC9C,SAGF,IAAMW,EAAKF,EAAET,CAAC,EACVQ,EAAI,IAAIG,CAAE,EACZH,EAAI,IAAIG,EAAIH,EAAI,IAAIG,CAAE,EAAKjB,EAAIY,CAAY,EAE3CE,EAAI,IAAIG,EAAIjB,EAAIY,CAAY,CAEhC,CACF,CACF,CAGF,OAAOE,CACT,CAEO,SAASI,EACdzB,EACAC,EACAN,EACAO,EACAE,EACAD,EACA,CACA,IAAME,EAASD,EAAU,SAASJ,EAAOG,EAAUR,CAAI,EACjDW,EAAeD,EAAO,OAC5B,QAASE,EAAI,EAAGA,EAAID,EAAcC,IAAK,CACrC,IAAMC,EAAQH,EAAOE,CAAC,EAChBE,EAAWpB,EAAeqB,EAAaH,EAAGD,CAAY,EAAI,EAE1DK,EAAkBV,EAAiBQ,CAAQ,EAE3CG,EAAcJ,EAAM,OAC1B,QAASK,EAAID,EAAaC,EAAI,EAAGA,IAAK,CACpC,IAAMC,EAAYN,EAAM,MAAM,EAAGK,CAAC,EAC5BS,EAAIX,EAAgBG,CAAS,EACnC,GAAIQ,EAAG,CACL,IAAMI,EAAQJ,EAAE,QAAQpB,CAAU,EAC9BwB,IAAU,IACZJ,EAAE,OAAOI,EAAO,CAAC,CAErB,CACF,CACF,CAEF,CDjNO,SAASC,GAA8B,CAE5C,MAAO,CACL,KAAM,oBAEN,cAAe,SAAuBC,EAAmB,CACvD,OAAOC,EAAiBD,CAAM,CAChC,CACF,CACF,CAEA,SAASC,EAAiBD,EAA6D,CACrF,MAAO,CACL,MAAO,CACL,OAAQ,UAAkB,CACxB,IAAME,EAAiC,CACrC,QAAS,CAAC,EACV,cAAe,CAAC,EAChB,qBAAsB,CAAC,EACvB,8BAA+B,CAAC,CAClC,EAEA,OAAAC,EAAgBD,EAAgBF,EAAQ,EAAE,EAEnCE,CACT,EACA,OAAQ,SACNE,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACA,CACA,GAAI,EAAEH,IAAe,UAAYA,IAAe,YAC9C,OAAO,EAAAI,MAAM,OAAOV,EAAkDC,EAA4CC,EAAMC,EAAIC,EAAYC,EAAOC,EAAYC,EAAUC,EAAWC,CAAS,EAG3L,IAAME,EAAUV,EAAiB,QAAQC,CAAI,EAAE,KAE/C,GAAI,MAAM,QAAQG,CAAK,EACrB,QAAWO,KAAQP,EACjBQ,EACED,EACAD,EACAT,EACAE,EACAG,EACAC,CACF,OAGFK,EACER,EACAM,EACAT,EACAE,EACAG,EACAC,CACF,CAEJ,EAEA,OAAQ,SAAgBR,EAAwCC,EAAkCC,EAAcC,EAAgBC,EAAgCC,EAAwBC,EAA4BC,EAA8BC,EAAsBC,EAAmB,CACzR,GAAI,EAAEH,IAAe,UAAYA,IAAe,YAC9C,OAAO,EAAAI,MAAM,OAAOV,EAAuCC,EAAiCC,EAAMC,EAAIC,EAAYC,EAAOC,EAAYC,EAAUC,EAAWC,CAAS,EAGrK,IAAME,EAAUV,EAAiB,QAAQC,CAAI,EAAE,KAE/C,GAAI,MAAM,QAAQG,CAAK,EACrB,QAAWO,KAAQP,EACjBS,EACEF,EACAD,EACAT,EACAE,EACAI,EACAD,CACF,OAGFO,EACET,EACAM,EACAT,EACAE,EACAI,EACAD,CACF,EAGF,MAAO,EACT,EACA,8BAA+B,IAAM,CAAC,MAAM,IAAI,KAAO,EACvD,2BAA4B,IAAM,CAAC,MAAM,IAAI,KAAO,EACpD,8BAA+B,IAAM,CAAC,MAAM,IAAI,KAAO,EACvD,2BAA4B,IAAM,CAAC,MAAM,IAAI,KAAO,EACpD,sBAAuB,IAAM,CAAC,MAAM,IAAI,KAAO,EAC/C,OAAQ,SAAoCQ,EAAuBC,EAAcR,EAAsBD,EAA8BU,EAA8BC,EAAgBC,EAAmBC,EAAyEC,EAAiCZ,EAAmBa,EAAoE,CACrY,GAAIH,IAAc,EAChB,MAAM,IAAI,MAAM,+BAA+B,EAEjD,GAAID,IAAU,GACZ,MAAM,IAAI,MAAM,2BAA2B,EAG7C,IAAMK,EAA8B,CAAC,EAC/BC,EAAiBP,EAAmB,OACtCQ,EAAM,CACR,MAAO,KACP,GAAI,EACN,EACA,QAASC,EAAI,EAAGA,EAAIF,EAAgBE,IAAK,CACvC,IAAMC,EAAWV,EAAmBS,CAAC,EAC/Bf,EAAUI,EAAM,QAAQY,CAAQ,EAAE,KAClCC,EAAeR,EAAMO,CAAQ,GAAK,EAClCE,EAAMC,EAAatB,EAAWQ,EAAML,EAASiB,EAAcN,CAAe,EAC5EO,EAAI,KAAOJ,EAAI,QACjBA,EAAM,CACJ,MAAOI,EAAI,KACX,GAAIH,CACN,GAEFH,EAAK,KAAKM,CAAG,CACf,CAEA,GAAIN,EAAK,SAAW,EAClB,OAAO,MAAM,KAAKA,EAAK,CAAC,CAAC,EAG3B,IAAMQ,EAAOR,EAAKE,EAAI,EAAE,EACxB,QAASC,EAAI,EAAGA,EAAIH,EAAK,OAAQG,IAAK,CACpC,GAAIA,IAAMD,EAAI,GACZ,SAGF,IAAMI,EAAMN,EAAKG,CAAC,EAClB,OAAW,CAACvB,EAAI6B,CAAK,IAAKH,EACpBE,EAAK,IAAI5B,CAAE,EACb4B,EAAK,IAAI5B,EAAI4B,EAAK,IAAI5B,CAAE,EAAK6B,CAAK,EAElCD,EAAK,IAAI5B,EAAI6B,CAAK,CAGxB,CAEA,OAAO,MAAM,KAAKD,CAAI,CACxB,EACA,oBAAqB,SAAiDhB,EAAuBP,EAAsByB,EAA+C1B,EAA8B,CAK9L,GAJ0B,OAAO,QAAQ0B,CAAO,EAAE,OAAO,CAAC,CAACC,CAAQ,IAAMnB,EAAM,QAAQmB,CAAQ,EAAE,OAAS,UAAU,EAI9F,SAAW,EAC/B,MAAM,IAAI,MAAM,kCAAkC,EAGpD,OAAO,EAAAxB,MAAM,oBAAoBK,EAAsBP,EAAWyB,EAAS1B,CAAQ,CACrF,EACA,wBAAyB,SAAiCQ,EAAiC,CACzF,OAAOA,EAAM,oBACf,EACA,iCAAkC,SAAUA,EAAuB,CACjE,OAAOA,EAAM,6BACf,EACA,KAAM,SAA2BoB,EAAsDC,EAAwB,CAC7G,IAAMC,EAAQ,EAAA3B,MAAM,KAAKyB,EAA6BC,EAAI,CAAC,CAAC,EACtDE,EAAQF,EAAI,CAAC,EACnB,MAAO,CACL,GAAGC,EACH,QAAS,CACP,GAAG,OAAO,YAAYC,CAAK,EAC3B,GAAGD,EAAM,OACX,CACF,CACF,EACA,KAAM,SAA2BtB,EAA0B,CACzD,IAAMwB,EAAYxB,EACZyB,EAAmB,OAAO,QAAQzB,EAAM,OAAO,EAAE,OAAO,CAAC,CAAC,CAAE,CAAE,KAAA0B,CAAK,CAAC,IAAMA,IAAS,UAAU,EAC7FJ,EAAQ,EAAA3B,MAAM,KAAK,CACvB,GAAG6B,EACH,QAAS,OAAO,YAAYC,CAAgB,CAC9C,CAAC,EAEKE,EAAgB,OAAO,QAAQ3B,EAAM,OAAO,EAAE,OAAO,CAAC,CAAC,CAAE,CAAE,KAAA0B,CAAK,CAAC,IAAMA,IAAS,UAAU,EAEhG,MAAO,CAACJ,EAAOK,CAAa,CAC9B,CACF,CACF,CACF","names":["src_exports","__export","pluginPT15","__toCommonJS","import_components","import_trees","import_components","MAX_POSITION","create_obj","recursiveCreate","indexDatastore","schema","prefix","prop","type","path","isArray","insertString","value","positionsStorage","internalId","language","tokenizer","tokens","tokensLength","i","token","position","get_position","positionStorage","tokenLength","j","tokenPart","n","totalLength","searchString","term","boostPerProp","whereFiltersIDs","ret","a","aLength","id","removeString","index","pluginPT15","schema","createComponents","indexDatastore","recursiveCreate","implementation","indexDatastorage","prop","id","internalId","value","schemaType","language","tokenizer","docsCount","Index","storage","item","insertString","removeString","index","term","propertiesToSearch","exact","tolerance","boost","relevance","whereFiltersIDs","maps","propertyLength","max","i","property","boostPerProp","map","searchString","base","score","filters","propName","sharedInternalDocumentStore","raw","dump1","dump2","baseIndex","nonStringIndexes","type","stringIndexes"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/algorithm.ts"],"sourcesContent":["import type { AnyOrama, SearchableType, IIndex, SearchableValue, Tokenizer, OnlyStrings, FlattenSchemaProperty, TokenScore, WhereCondition, OramaPluginSync, AnySchema, ObjectComponents, BM25Params } from '@orama/orama'\nimport {\n index as Index, internalDocumentIDStore } from '@orama/orama/components'\nimport { PT15IndexStore, insertString, recursiveCreate, PositionsStorage, searchString, removeString } from './algorithm.js';\n\ntype InternalDocumentID = internalDocumentIDStore.InternalDocumentID;\ntype InternalDocumentIDStore = internalDocumentIDStore.InternalDocumentIDStore;\ntype DocumentID = internalDocumentIDStore.DocumentID;\n\nexport function pluginPT15(): OramaPluginSync {\n\n return {\n name: 'orama-plugin-pt15',\n\n getComponents: function getComponents(schema: AnySchema) {\n return createComponents(schema)\n },\n }\n}\n\nfunction createComponents(schema: AnySchema): Partial<ObjectComponents<any, any, any, any>> {\n return {\n index: {\n create: function create() {\n const indexDatastore: PT15IndexStore = {\n indexes: {},\n vectorIndexes: {},\n searchableProperties: [],\n searchablePropertiesWithTypes: {},\n }\n\n recursiveCreate(indexDatastore, schema, '')\n\n return indexDatastore\n },\n insert: function insert(\n implementation: IIndex<PT15IndexStore>,\n indexDatastorage: PT15IndexStore,\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(implementation as unknown as IIndex<Index.Index>, indexDatastorage as unknown as Index.Index, prop, id, internalId, value, schemaType, language, tokenizer, docsCount)\n }\n\n const storage = indexDatastorage.indexes[prop].node as PositionsStorage\n\n if (Array.isArray(value)) {\n for (const item of value) {\n insertString(\n item as string,\n storage,\n prop,\n internalId,\n language,\n tokenizer,\n )\n }\n } else {\n insertString(\n value as string,\n storage,\n prop,\n internalId,\n language,\n tokenizer,\n )\n }\n },\n // remove: <T extends I>(implementation: IIndex<T>, index: T, prop: string, id: DocumentID, value: SearchableValue, schemaType: SearchableType, language: string | undefined, tokenizer: Tokenizer, docsCount: number) => SyncOrAsyncValue<boolean>;\n remove: function remove(implementation: IIndex<PT15IndexStore>, indexDatastorage: PT15IndexStore, prop: string, id: DocumentID, internalId: InternalDocumentID, value: SearchableValue, schemaType: SearchableType, language: string | undefined, tokenizer: Tokenizer, docsCount: number) {\n if (!(schemaType === 'string' || schemaType === 'string[]')) {\n return Index.remove(implementation as IIndex<Index.Index>, indexDatastorage as Index.Index, prop, id, internalId, value, schemaType, language, tokenizer, docsCount)\n }\n\n const storage = indexDatastorage.indexes[prop].node as PositionsStorage\n\n if (Array.isArray(value)) {\n for (const item of value) {\n removeString(\n item as string,\n storage,\n prop,\n internalId,\n tokenizer,\n language\n )\n }\n } else {\n removeString(\n value as string,\n storage,\n prop,\n internalId,\n tokenizer,\n language\n )\n }\n\n return true\n },\n insertDocumentScoreParameters: () => {throw new Error()},\n insertTokenScoreParameters: () => {throw new Error()},\n removeDocumentScoreParameters: () => {throw new Error()},\n removeTokenScoreParameters: () => {throw new Error()},\n calculateResultScores: () => {throw new Error()},\n search: function search<T extends AnyOrama>(index: PT15IndexStore, term: string, tokenizer: Tokenizer, language: string | undefined, propertiesToSearch: string[], exact: boolean, tolerance: number, boost: Partial<Record<OnlyStrings<FlattenSchemaProperty<T>[]>, number>>, relevance: Required<BM25Params>, docsCount: number, whereFiltersIDs: Set<InternalDocumentID> | undefined): TokenScore[] {\n if (tolerance !== 0) {\n throw new Error('Tolerance not implemented yet')\n }\n if (exact === true) {\n throw new Error('Exact not implemented yet')\n }\n\n const maps: Map<number, number>[] = []\n const propertyLength = propertiesToSearch.length\n let max = {\n score: -Infinity,\n id: -1\n }\n for (let i = 0; i < propertyLength; i++) {\n const property = propertiesToSearch[i]\n const storage = index.indexes[property].node as PositionsStorage\n const boostPerProp = boost[property] ?? 1\n const map = searchString(tokenizer, term, storage, boostPerProp, whereFiltersIDs);\n if (map.size > max.score) {\n max = {\n score: map.size,\n id: i\n }\n }\n maps.push(map)\n }\n\n if (maps.length === 1) {\n return Array.from(maps[0])\n }\n\n const base = maps[max.id]\n for (let i = 0; i < maps.length; i++) {\n if (i === max.id) {\n continue\n }\n\n const map = maps[i]\n for (const [id, score] of map) {\n if (base.has(id)) {\n base.set(id, base.get(id)! + score)\n } else {\n base.set(id, score)\n }\n }\n }\n \n return Array.from(base)\n },\n searchByWhereClause: function searchByWhereClause<T extends AnyOrama>(index: PT15IndexStore, tokenizer: Tokenizer, filters: Partial<WhereCondition<T['schema']>>, language: string | undefined) {\n const stringFiltersList = Object.entries(filters).filter(([propName]) => index.indexes[propName].type === 'Position')\n\n // PT15 doen't support string filters.\n // this plugin doesn't distringuish between prefix and exact match.\n if (stringFiltersList.length !== 0) {\n throw new Error('String filters are not supported')\n }\n\n return Index.searchByWhereClause(index as Index.Index, tokenizer, filters, language)\n },\n getSearchableProperties: function getSearchableProperties(index: PT15IndexStore): string[] {\n return index.searchableProperties\n },\n getSearchablePropertiesWithTypes: function (index: PT15IndexStore) {\n return index.searchablePropertiesWithTypes\n },\n load: function load<R = unknown>(sharedInternalDocumentStore: InternalDocumentIDStore, raw: R): PT15IndexStore {\n const dump1 = Index.load(sharedInternalDocumentStore, raw[0])\n const dump2 = raw[1]\n return {\n ...dump1,\n indexes: {\n ...Object.fromEntries(dump2),\n ...dump1.indexes\n } as PT15IndexStore['indexes']\n }\n },\n save: function save<R = unknown>(index: PT15IndexStore): R {\n const baseIndex = index as unknown as Index.Index\n const nonStringIndexes = Object.entries(index.indexes).filter(([, { type }]) => type !== 'Position')\n const dump1 = Index.save({\n ...baseIndex,\n indexes: Object.fromEntries(nonStringIndexes) as Index.Index['indexes']\n })\n\n const stringIndexes = Object.entries(index.indexes).filter(([, { type }]) => type === 'Position')\n\n return [dump1, stringIndexes] as unknown as R\n }\n }\n }\n}\n","import { AnyIndexStore, AnyOrama, SearchableType, Tokenizer } from \"@orama/orama\"\nimport { avl, bkd, flat, bool, vector } from '@orama/orama/trees'\nimport {\n getVectorSize, internalDocumentIDStore, isVectorType } from '@orama/orama/components'\n\ntype InternalDocumentID = internalDocumentIDStore.InternalDocumentID;\n\nexport type TreeType = 'AVL' | 'Radix' | 'Bool' | 'Flat' | 'BKD';\nexport type TTree<T = TreeType, N = unknown> = {\n type: T;\n node: N;\n isArray: boolean;\n};\nexport type Tree =\n // We don't store strings inside a tree\n // | TTree<'Radix', radix.RadixNode>\n | TTree<'Position', PositionsStorage>\n | TTree<'AVL', avl.AVLTree<number, InternalDocumentID[]>>\n | TTree<'Bool', bool.BoolNode>\n | TTree<'Flat', flat.FlatTree>\n | TTree<'BKD', bkd.BKDTree>;\n\nconst MAX_POSITION = 15\nexport type PositionStorage = Record<string, number[]>\n// 15 `PositionStorage`s\nexport type PositionsStorage = [\n PositionStorage,\n PositionStorage,\n PositionStorage,\n PositionStorage,\n PositionStorage,\n PositionStorage,\n PositionStorage,\n PositionStorage,\n PositionStorage,\n PositionStorage,\n PositionStorage,\n PositionStorage,\n PositionStorage,\n PositionStorage,\n PositionStorage,\n]\n\nexport interface PT15IndexStore extends AnyIndexStore {\n indexes: Record<string, Tree>\n searchableProperties: string[]\n searchablePropertiesWithTypes: Record<string, SearchableType>\n}\n\nfunction create_obj() {\n // object with empty prototype to cheap objects\n return Object.create(null)\n}\n\nexport function recursiveCreate<T extends AnyOrama>(indexDatastore: PT15IndexStore, schema: T['schema'], prefix: string) {\n for (const [prop, type] of Object.entries<SearchableType>(schema)) {\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] = { type: 'AVL', node: new avl.AVLTree<number, InternalDocumentID[]>(0, []), isArray }\n break\n case 'string':\n case 'string[]':\n indexDatastore.indexes[path] = { type: 'Position', node: [\n create_obj(),\n create_obj(),\n create_obj(),\n create_obj(),\n create_obj(),\n create_obj(),\n create_obj(),\n create_obj(),\n create_obj(),\n create_obj(),\n create_obj(),\n create_obj(),\n create_obj(),\n create_obj(),\n create_obj(),\n ], 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\nexport function insertString(\n value: string,\n positionsStorage: PositionsStorage,\n prop: string,\n internalId: InternalDocumentID,\n language: string | undefined,\n tokenizer: Tokenizer,\n) {\n const tokens = tokenizer.tokenize(value, language, prop)\n const tokensLength = tokens.length\n for (let i = 0; i < tokensLength; i++) {\n const token = tokens[i]\n const position = MAX_POSITION - get_position(i, tokensLength) - 1\n\n const positionStorage = positionsStorage[position]\n\n const tokenLength = token.length\n for (let j = tokenLength; j > 0; j--) {\n const tokenPart = token.slice(0, j)\n positionStorage[tokenPart] = positionStorage[tokenPart] || []\n positionStorage[tokenPart].push(internalId)\n }\n }\n}\n\nexport function get_position(n: number, totalLength: number) {\n if (totalLength < MAX_POSITION) {\n return n\n }\n // Scale\n return Math.floor(n * MAX_POSITION / totalLength) \n}\n\nexport function searchString(\n tokenizer: Tokenizer,\n term: string,\n positionsStorage: PositionsStorage,\n boostPerProp: number,\n whereFiltersIDs: Set<InternalDocumentID> | undefined,\n) {\n const tokens = tokenizer.tokenize(term)\n\n const ret: Map<number, number> = new Map()\n for (const token of tokens) {\n for (let i = 0; i < MAX_POSITION; i++) {\n const positionStorage = positionsStorage[i]\n if (positionStorage[token]) {\n const a = positionStorage[token]\n const aLength = a.length\n\n for (let j = 0; j < aLength; j++) {\n if (whereFiltersIDs && !whereFiltersIDs.has(a[j])) {\n continue\n }\n\n const id = a[j]\n if (ret.has(id)) {\n ret.set(id, ret.get(id)! + i * boostPerProp)\n } else {\n ret.set(id, i * boostPerProp)\n }\n }\n }\n }\n }\n\n return ret\n}\n\nexport function removeString(\n value: string,\n positionsStorage: PositionsStorage,\n prop: string,\n internalId: InternalDocumentID,\n tokenizer: Tokenizer,\n language: string | undefined,\n) {\n const tokens = tokenizer.tokenize(value, language, prop)\n const tokensLength = tokens.length\n for (let i = 0; i < tokensLength; i++) {\n const token = tokens[i]\n const position = MAX_POSITION - get_position(i, tokensLength) - 1\n\n const positionStorage = positionsStorage[position]\n\n const tokenLength = token.length\n for (let j = tokenLength; j > 0; j--) {\n const tokenPart = token.slice(0, j)\n const a = positionStorage[tokenPart]\n if (a) {\n const index = a.indexOf(internalId)\n if (index !== -1) {\n a.splice(index, 1)\n }\n }\n }\n }\n\n}"],"mappings":"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","names":["src_exports","__export","pluginPT15","__toCommonJS","import_components","import_trees","import_components","MAX_POSITION","create_obj","recursiveCreate","indexDatastore","schema","prefix","prop","type","path","isArray","insertString","value","positionsStorage","internalId","language","tokenizer","tokens","tokensLength","i","token","position","get_position","positionStorage","tokenLength","j","tokenPart","n","totalLength","searchString","term","boostPerProp","whereFiltersIDs","ret","a","aLength","id","removeString","index","pluginPT15","schema","createComponents","indexDatastore","recursiveCreate","implementation","indexDatastorage","prop","id","internalId","value","schemaType","language","tokenizer","docsCount","Index","storage","item","insertString","removeString","index","term","propertiesToSearch","exact","tolerance","boost","relevance","whereFiltersIDs","maps","propertyLength","max","i","property","boostPerProp","map","searchString","base","score","filters","propName","sharedInternalDocumentStore","raw","dump1","dump2","baseIndex","nonStringIndexes","type","stringIndexes"]}