1
0
mirror of https://github.com/nextapps-de/flexsearch.git synced 2025-08-23 14:13:04 +02:00

support for node.js worker threads

This commit is contained in:
Thomas Wilkerling
2021-05-24 14:41:49 +02:00
parent f178c7a5fb
commit 53f6de26b0
9 changed files with 158 additions and 80 deletions

View File

@@ -5,29 +5,29 @@
* Licence: Apache-2.0
* https://github.com/nextapps-de/flexsearch
*/
(function _f(self){'use strict';try{if(module)self=module}catch(e){}self._factory=_f;var u;const w=/[\W_]+/;function aa(a){if(a=a.toLowerCase())if(a&&this.C&&(a=y(a,this.C)),this.G&&1<a.length&&(a=y(a,this.G)),a&&(w||""===w)&&(a=a.split(w),this.filter)){var b=this.filter;const c=a.length,d=[];for(let e=0,f=0;e<c;e++){const g=a[e];g&&!b[g]&&(d[f++]=g)}a=d}return a};function z(a,b){return"undefined"!==typeof a?a:b}function A(a){const b=Array(a);for(let c=0;c<a;c++)b[c]=B();return b}function B(){return Object.create(null)}function ba(a,b){return b.length-a.length}function C(a){return"string"===typeof a}function D(a){return"object"===typeof a}function E(a){return"function"===typeof a};function H(a,b){const c=Object.keys(a),d=c.length,e=[];let f="",g=0;for(let h=0,k,l;h<d;h++)k=c[h],(l=a[k])?(e[g++]=new RegExp(b?"(?!\\b)"+k+"(\\b|_)":k,"g"),e[g++]=l):f+=(f?"|":"")+k;f&&(e[g++]=new RegExp(b?"(?!\\b)("+f+")(\\b|_)":"("+f+")","g"),e[g]="");return e}function y(a,b){for(let c=0,d=b.length;c<d&&(a=a.replace(b[c],b[c+1]),a);c+=2);return a};const ca={},da={};let I=Promise;Object.assign||(Object.assign=function(){const a=arguments,b=a.length,c=a[0];for(let d=1,e,f,g;d<b;d++){e=a[d];f=Object.keys(e);g=f.length;for(let h=0,k;h<g;h++)k=f[h],c[k]=e[k]}return c});if(!I){function a(b){this.g=null;const c=this;b(function(d){c.g&&c.g(d)})}a.prototype.then=function(b){this.g=b};I=a};function ea(a){J(a,"add");J(a,"append");J(a,"search");J(a,"update");J(a,"remove")}function J(a,b){a[b+"Async"]=function(){const c=this,d=arguments;var e=d[d.length-1];let f;E(e)&&(f=e,delete d[d.length-1]);e=new I(function(g){setTimeout(function(){const h=c[b];h.async=!0;g(h.apply(c,d));h.async=!1})});return f?(e.then(f),this):e}};function fa(a,b,c,d){var e=a.length;let f=[],g,h=0;d&&(d=[]);for(--e;0<=e;e--){const k=a[e],l=k.length,n=B();let q=!g;for(let r=0;r<l;r++){const v=k[r],p=v.length;if(p)for(let m=0,t=0,x;m<p;m++)if(x=v[m],!g)n[x]=1;else if(g[x]){if(e)d&&t<b&&((d[r]||(d[r]=[]))[t++]=x),n[x]=1;else if(c)c--;else if(f[h++]=x,h===b)return f;q=!0}}if(!q&&!d)return[];g=n}if(d)for(let k=d.length-1,l,n;0<=k;k--)if((n=(l=d[k])&&l.length)&&c&&(n<=c?(c-=n,n=0):n-=c),n){if(h+n>=b)return f.concat(l.slice(c,b-h+c));f=f.concat(c?
l.slice(c):l);h+=n;c=0}return f}function ha(a,b){const c=B(),d=B(),e=[];for(let f=0;f<a.length;f++)c[a[f]]=1;for(let f=0,g;f<b.length;f++){g=b[f];for(let h=0,k;h<g.length;h++)k=g[h],c[k]&&!d[k]&&(d[k]=1,e[e.length]=k)}return e};function K(a){this.h=!0!==a&&a;this.cache=B();this.g=[]}function ia(a,b,c){D(a)&&(a=a.query);let d=this.cache.get(a);d||(d=this.search(a,b,c),this.cache.set(a,d));return d}K.prototype.set=function(a,b){if(!this.cache[a]){var c=this.g.length;c===this.h?delete this.cache[this.g[c-1]]:c++;for(--c;0<c;c--)this.g[c]=this.g[c-1];this.g[0]=a}this.cache[a]=b};K.prototype.get=function(a){const b=this.cache[a];if(this.h&&b&&(a=this.g.indexOf(a))){const c=this.g[a-1];this.g[a-1]=this.g[a];this.g[a]=c}return b};const ja={memory:{charset:"latin:extra",s:3,o:3,i:!1,m:"memory"},performance:{threshold:8,o:3,context:{depth:1,v:!0}},match:{charset:"latin:extra",I:"full",s:3},score:{charset:"latin:advanced",threshold:1,context:{depth:3,v:!0}},"default":{s:3,threshold:0,depth:3}};function ka(a,b,c,d,e,f){setTimeout(function(){const g=a(c,JSON.stringify(f));g&&g.then?g.then(function(){b.export(a,b,c,d,e+1)}):b.export(a,b,c,d,e+1)})};function L(a,b){if(!(this instanceof L))return new L(a);var c;if(a){C(a)?a=ja[a]:(c=a.preset)&&(a=Object.assign({},c[c],a));c=a.charset;var d=a.lang;C(c)&&(-1===c.indexOf(":")&&(c+=":default"),c=da[c]);C(d)&&(d=ca[d])}else a={};let e,f,g,h=a.context||{};this.encode=a.encode||c&&c.encode||aa;this.register=b||B();e=a.resolution||9;f=a.threshold||0;f>=e&&(f=e-1);this.s=e;this.threshold=f;this.u=b=c&&c.I||a.tokenize||"strict";this.depth="strict"===b&&h.depth;this.v=z(h.bidirectional,!0);this.m=g="memory"===
a.optimize;this.i=z(a.fastupdate,!0);this.o=a.minlength||1;this.map=g?A(e-f):B();e=h.resolution||e;f=h.threshold||f;f>=e&&(f=e-1);this.h=e;this.l=f;this.g=g?A(e-f):B();this.F=c&&c.F||a.rtl;this.C=(b=a.matcher||d&&d.C)&&H(b,!1);this.G=(b=a.stemmer||d&&d.G)&&H(b,!0);if(c=b=a.filter||d&&d.filter){c=b;d=B();for(let k=0,l=c.length;k<l;k++)d[c[k]]=1;c=d}this.filter=c;this.cache=(b=a.cache)&&new K(b)}u=L.prototype;u.append=function(a,b){return this.add(a,b,!0)};
(function _f(self){'use strict';try{if(module)self=module}catch(e){}self._factory=_f;var u;const w=/[\W_]+/;function aa(a){if(a=a.toLowerCase())if(a&&this.C&&(a=y(a,this.C)),this.G&&1<a.length&&(a=y(a,this.G)),a&&(w||""===w)&&(a=a.split(w),this.filter)){var b=this.filter;const c=a.length,d=[];for(let e=0,f=0;e<c;e++){const g=a[e];g&&!b[g]&&(d[f++]=g)}a=d}return a};function z(a,b){return"undefined"!==typeof a?a:b}function A(a){const b=Array(a);for(let c=0;c<a;c++)b[c]=B();return b}function B(){return Object.create(null)}function ba(a,b){return b.length-a.length}function C(a){return"string"===typeof a}function D(a){return"object"===typeof a}function E(a){return"function"===typeof a};function H(a,b){const c=Object.keys(a),d=c.length,e=[];let f="",g=0;for(let h=0,k,l;h<d;h++)k=c[h],(l=a[k])?(e[g++]=new RegExp(b?"(?!\\b)"+k+"(\\b|_)":k,"g"),e[g++]=l):f+=(f?"|":"")+k;f&&(e[g++]=new RegExp(b?"(?!\\b)("+f+")(\\b|_)":"("+f+")","g"),e[g]="");return e}function y(a,b){for(let c=0,d=b.length;c<d&&(a=a.replace(b[c],b[c+1]),a);c+=2);return a};const ca={},da={};let I=Promise;Object.assign||(Object.assign=function(){const a=arguments,b=a.length,c=a[0];for(let d=1,e,f,g;d<b;d++){e=a[d];f=Object.keys(e);g=f.length;for(let h=0,k;h<g;h++)k=f[h],c[k]=e[k]}return c});if(!I){function a(b){this.g=null;const c=this;b(function(d){c.g&&c.g(d)})}a.prototype.then=function(b){this.g=b};I=a};function ea(a){J(a,"add");J(a,"append");J(a,"search");J(a,"update");J(a,"remove")}function J(a,b){a[b+"Async"]=function(){const c=this,d=arguments;var e=d[d.length-1];let f;E(e)&&(f=e,delete d[d.length-1]);e=new I(function(g){setTimeout(function(){c.async=!0;g(c[b].apply(c,d));c.async=!1})});return f?(e.then(f),this):e}};function fa(a,b,c,d){var e=a.length;let f=[],g,h=0;d&&(d=[]);for(--e;0<=e;e--){const k=a[e],l=k.length,n=B();let q=!g;for(let r=0;r<l;r++){const v=k[r],p=v.length;if(p)for(let m=0,t=0,x;m<p;m++)if(x=v[m],!g)n[x]=1;else if(g[x]){if(e)d&&t<b&&((d[r]||(d[r]=[]))[t++]=x),n[x]=1;else if(c)c--;else if(f[h++]=x,h===b)return f;q=!0}}if(!q&&!d)return[];g=n}if(d)for(let k=d.length-1,l,n;0<=k;k--)if((n=(l=d[k])&&l.length)&&c&&(n<=c?(c-=n,n=0):n-=c),n){if(h+n>=b)return f.concat(l.slice(c,b-h+c));f=f.concat(c?
l.slice(c):l);h+=n;c=0}return f}function ha(a,b){const c=B(),d=B(),e=[];for(let f=0;f<a.length;f++)c[a[f]]=1;for(let f=0,g;f<b.length;f++){g=b[f];for(let h=0,k;h<g.length;h++)k=g[h],c[k]&&!d[k]&&(d[k]=1,e[e.length]=k)}return e};function K(a){this.h=!0!==a&&a;this.cache=B();this.g=[]}function ia(a,b,c){D(a)&&(a=a.query);let d=this.cache.get(a);d||(d=this.search(a,b,c),this.cache.set(a,d));return d}K.prototype.set=function(a,b){if(!this.cache[a]){var c=this.g.length;c===this.h?delete this.cache[this.g[c-1]]:c++;for(--c;0<c;c--)this.g[c]=this.g[c-1];this.g[0]=a}this.cache[a]=b};K.prototype.get=function(a){const b=this.cache[a];if(this.h&&b&&(a=this.g.indexOf(a))){const c=this.g[a-1];this.g[a-1]=this.g[a];this.g[a]=c}return b};const ja={memory:{charset:"latin:extra",s:3,o:3,j:!1,m:"memory"},performance:{threshold:8,o:3,context:{depth:1,v:!0}},match:{charset:"latin:extra",I:"full",s:3},score:{charset:"latin:advanced",threshold:1,context:{depth:3,v:!0}},"default":{s:3,threshold:0,depth:3}};function ka(a,b,c,d,e,f){setTimeout(function(){const g=a(c,JSON.stringify(f));g&&g.then?g.then(function(){b.export(a,b,c,d,e+1)}):b.export(a,b,c,d,e+1)})};function L(a,b){if(!(this instanceof L))return new L(a);var c;if(a){C(a)?a=ja[a]:(c=a.preset)&&(a=Object.assign({},c[c],a));c=a.charset;var d=a.lang;C(c)&&(-1===c.indexOf(":")&&(c+=":default"),c=da[c]);C(d)&&(d=ca[d])}else a={};let e,f,g,h=a.context||{};this.encode=a.encode||c&&c.encode||aa;this.register=b||B();e=a.resolution||9;f=a.threshold||0;f>=e&&(f=e-1);this.s=e;this.threshold=f;this.u=b=c&&c.I||a.tokenize||"strict";this.depth="strict"===b&&h.depth;this.v=z(h.bidirectional,!0);this.m=g="memory"===
a.optimize;this.j=z(a.fastupdate,!0);this.o=a.minlength||1;this.map=g?A(e-f):B();e=h.resolution||e;f=h.threshold||f;f>=e&&(f=e-1);this.h=e;this.l=f;this.g=g?A(e-f):B();this.F=c&&c.F||a.rtl;this.C=(b=a.matcher||d&&d.C)&&H(b,!1);this.G=(b=a.stemmer||d&&d.G)&&H(b,!0);if(c=b=a.filter||d&&d.filter){c=b;d=B();for(let k=0,l=c.length;k<l;k++)d[c[k]]=1;c=d}this.filter=c;this.cache=(b=a.cache)&&new K(b)}u=L.prototype;u.append=function(a,b){return this.add(a,b,!0)};
u.add=function(a,b,c){if(this.register[a]&&!c)return this.update(a,b);if(b&&(a||0===a)){b=this.encode(b);const l=b.length;if(l){const n=this.depth,q=this.s-this.threshold,r=B(),v=B();for(let p=0;p<l;p++){let m=b[this.F?l-1-p:p];var d=m.length;if(m&&d>=this.o&&(n||!r[m])){var e=Math.min(this.s/l*p|0,p);if(e<q){var f="";switch(this.u){case "full":if(3<d){for(var g=0;g<d;g++){var h=g?Math.min(e/2+this.s/d*g/2|0,e+g):e;if(h<q)for(var k=d;k>g;k--)f=m.substring(g,k),f.length>=this.o&&M(this,r,f,h,a,c)}break}case "reverse":if(2<
d){for(g=d-1;0<g;g--)f=m[g]+f,f.length>=this.o&&M(this,r,f,e,a,c);f=""}case "forward":if(1<d)for(g=0;g<d;g++)f+=m[g],f.length>=this.o&&M(this,r,f,e,a,c);break;default:if(M(this,r,m,e,a,c),n&&1<l&&p<l-1)for(d=this.h-this.l,e=B(),f=m,g=Math.min(n+1,l-p),e[f]=1,h=1;h<g;h++)if((m=b[this.F?l-1-p-h:p+h])&&m.length>=this.o&&!e[m]){if(e[m]=1,k=Math.min((this.h-g)/l*p+h|0,p+(h-1)),k<d){const t=this.v&&m>f;M(this,v,t?f:m,k,a,c,t?m:f)}}else g=Math.min(g+1,l-p)}}}}this.i||(this.register[a]=1)}}return this};
function M(a,b,c,d,e,f,g){let h=g?a.g:a.map;if(!b[c]||g&&!b[c][g])a.m&&(h=h[d]),g?(b=b[c]||(b[c]=B()),b[g]=1,h=h[g]||(h[g]=B())):b[c]=1,h=h[c]||(h[c]=[]),a.m||(h=h[d]||(h[d]=[])),f&&-1!==h.indexOf(e)||(h[h.length]=e,a.i&&(a=a.register[e]||(a.register[e]=[]),a[a.length]=h))}
d){for(g=d-1;0<g;g--)f=m[g]+f,f.length>=this.o&&M(this,r,f,e,a,c);f=""}case "forward":if(1<d)for(g=0;g<d;g++)f+=m[g],f.length>=this.o&&M(this,r,f,e,a,c);break;default:if(M(this,r,m,e,a,c),n&&1<l&&p<l-1)for(d=this.h-this.l,e=B(),f=m,g=Math.min(n+1,l-p),e[f]=1,h=1;h<g;h++)if((m=b[this.F?l-1-p-h:p+h])&&m.length>=this.o&&!e[m]){if(e[m]=1,k=Math.min((this.h-g)/l*p+h|0,p+(h-1)),k<d){const t=this.v&&m>f;M(this,v,t?f:m,k,a,c,t?m:f)}}else g=Math.min(g+1,l-p)}}}}this.j||(this.register[a]=1)}}return this};
function M(a,b,c,d,e,f,g){let h=g?a.g:a.map;if(!b[c]||g&&!b[c][g])a.m&&(h=h[d]),g?(b=b[c]||(b[c]=B()),b[g]=1,h=h[g]||(h[g]=B())):b[c]=1,h=h[c]||(h[c]=[]),a.m||(h=h[d]||(h[d]=[])),f&&-1!==h.indexOf(e)||(h[h.length]=e,a.j&&(a=a.register[e]||(a.register[e]=[]),a[a.length]=h))}
u.search=function(a,b,c){D(a)?(c=a,a=c.query):D(b)&&(c=b);let d=[],e;var f=this.threshold;let g,h=0;if(c){b=c.limit;h=c.offset||0;f=z(c.threshold,f);var k=c.context;g=c.suggest}if(a&&(a=this.encode(a),e=a.length,1<e)){c=B();var l=[];for(let q=0,r=0,v;q<e;q++)if((v=a[q])&&v.length>=this.o&&!c[v])if(this.m||g||this.map[v])l[r++]=v,c[v]=1;else return d;a=l;e=a.length}if(!e)return d;b||(b=100);c=this.s-f;f=this.h-f;k=this.depth&&1<e&&!1!==k;l=0;let n;k?(n=a[0],l=1):1<e&&a.sort(ba);for(let q,r;l<e;l++){r=
a[l];k?(q=na(this,d,g,f,b,h,2===e,r,n),g&&!1===q&&d.length||(n=r)):q=na(this,d,g,c,b,h,1===e,r);if(q)return q;if(g&&l===e-1){let v=d.length;if(!v){if(k){k=0;l=-1;continue}return d}if(1===v)return oa(d[0],b,h)}}return fa(d,b,h,g)};
function na(a,b,c,d,e,f,g,h,k){let l=[],n=k?a.g:a.map;a.m||(n=pa(n,h,k,a.v));if(n){let q=0;d=Math.min(n.length,d);for(let r=0,v=0,p,m;r<d&&!(p=n[r],a.m&&(p=pa(p,h,k,a.v)),p&&g&&(m=p.length,m<=f?(f-=m,p=null):f&&(p=p.slice(f),f=0)),p&&(l[q++]=p,g&&(v+=p.length,v>=e)));r++);if(q){if(g)return oa(l,e,0);b[b.length]=l;return}}return!c&&l}function oa(a,b,c){a=1===a.length?a[0]:[].concat.apply([],a);return c||a.length>b?a.slice(c,c+b):a}
function pa(a,b,c,d){c?(d=d&&b>c,a=(a=a[d?b:c])&&a[d?c:b]):a=a[b];return a}u.contain=function(a){return!!this.register[a]};u.update=function(a,b){return this.remove(a).add(a,b)};
u.remove=function(a,b){const c=this.register[a];if(c){if(this.i)for(let d=0,e;d<c.length;d++)e=c[d],e.splice(e.indexOf(a),1);else P(this.map,a,this.s-this.threshold,this.m),this.depth&&P(this.g,a,this.h-this.l,this.m);b||delete this.register[a];if(this.cache){b=this.cache;for(let d=0,e,f;d<b.g.length;d++)f=b.g[d],e=b.cache[f],-1!==e.indexOf(a)&&(b.g.splice(d--,1),delete b.cache[f])}}return this};
u.remove=function(a,b){const c=this.register[a];if(c){if(this.j)for(let d=0,e;d<c.length;d++)e=c[d],e.splice(e.indexOf(a),1);else P(this.map,a,this.s-this.threshold,this.m),this.depth&&P(this.g,a,this.h-this.l,this.m);b||delete this.register[a];if(this.cache){b=this.cache;for(let d=0,e,f;d<b.g.length;d++)f=b.g[d],e=b.cache[f],-1!==e.indexOf(a)&&(b.g.splice(d--,1),delete b.cache[f])}}return this};
function P(a,b,c,d,e){let f=0;if(a.constructor===Array)if(e)b=a.indexOf(b),-1!==b?1<a.length&&(a.splice(b,1),f++):f++;else{e=Math.min(a.length,c);for(let g=0,h;g<e;g++)if(h=a[g])f=P(h,b,c,d,e),d||f||delete a[g]}else for(let g in a)(f=P(a[g],b,c,d,e))||delete a[g];return f}u.searchCache=ia;
u.export=function(a,b,c,d,e){let f,g;switch(e||(e=0)){case 0:f="reg";if(this.i){g=B();for(let h in this.register)g[h]=1}else g=this.register;break;case 1:f="cfg";g={doc:0,opt:this.m?1:0};break;case 2:f="map";g=this.map;break;case 3:f="ctx";g=this.g;break;default:return}ka(a,b||this,c?c+"."+f:f,d,e,g);return!0};u.import=function(a,b){if(b)switch(C(b)&&(b=JSON.parse(b)),a){case "cfg":this.m=!!b.opt;break;case "reg":this.i=!1;this.register=b;break;case "map":this.map=b;break;case "ctx":this.g=b}};ea(L.prototype);function qa(a){var b=self._index;a=a.data;var c=a.args;switch(a.task){case "init":b=a.options||{};a=a.factory;c=b.encode;b.cache=!1;"string"===typeof c&&(b.encode=(new Function("return "+c))());a?((new Function("return "+a))()(self),self._index=self.FlexSearch.Index(b),delete self.FlexSearch):self._index=new L(b);break;case "add":b.add.apply(b,c);break;case "append":b.append.apply(b,c);break;case "search":b=b.search.apply(b,c);postMessage(b);break;case "update":b.update.apply(b,c);break;case "remove":b.remove.apply(b,
c)}};let ra=0;function Q(a,b){var c;D(a)?(b=a,a=0):b?E(c=b.encode)&&(b.encode=c.toString()):b={};(c=(self||window)._factory)&&(c=c.toString());const d=this;this.id=a||ra++;this.g=null;if(this.j=sa(c))this.j.onmessage=function(e){d.g(e.data)},this.j.postMessage({task:"init",factory:c,options:b})}R("add");R("append");R("search");R("update");R("remove");
function R(a){Q.prototype[a]=Q.prototype[a+"Async"]=function(){const b=this,c=[].slice.call(arguments);var d=c[c.length-1];let e;E(d)&&(e=d,c.splice(c.length-1,1));d=new I(function(f){b.j.postMessage({task:a,args:c});"search"===a?b.g=f:f()});return e?(d.then(e),this):d}}function sa(a){let b;try{b=a?new Worker(URL.createObjectURL(new Blob(["onmessage="+qa.toString()],{type:"text/javascript"}))):new Worker("worker.js",{type:"module"})}catch(c){}return b};function S(a){if(!(this instanceof S))return new S(a);var b;a||(a={});this.H=[];this.g=[];this.u=[];this.register=B();this.key=(b=a.key)&&T(b,this.u)||"id";this.i=z(a.fastupdate,!0);this.B=!!(b=a.extern);this.A=!this.B&&(b=a.store)&&!0!==b&&[];this.store=b&&(this.B?b:B());this.D=(b=a.tag)&&T(b,this.u);this.h=b&&B();this.cache=(b=a.cache)&&new K(b);a.cache=!1;this.j=a.worker;this.async=!1;b=a;a=B();let c=b.doc;if(C(c))c=[c];else if(c.constructor!==Array){var d=c;c=Object.keys(c)}for(let e=0,f,g;e<
c.length;e++)f=c[e],C(f)?d&&(g=d[f]):(g=f,f=f.field),g=D(g)?Object.assign({},b,g):b,this.j&&(a[f]=new Q(g),a[f].j||(this.j=!1)),this.j||(a[f]=new L(g,this.register)),this.H[e]=T(f,this.u),this.g[e]=f;if(this.A)for(d=b.store,C(d)&&(d=[d]),b=0;b<d.length;b++)this.A[b]=T(d[b],this.u);this.l=a}function T(a,b){const c=a.split(":");let d=0;for(let e=0;e<c.length;e++)a=c[e],0<=a.indexOf("[]")&&(a=a.substring(0,a.length-2))&&(b[d]=!0),a&&(c[d++]=a);d<c.length&&(c.length=d);return 1<d?c:c[0]}
function ta(a,b){if(C(b))a=a[b];else for(let c=0;a&&c<b.length;c++)a=a[b[c]];return a}function V(a,b,c,d,e){a=a[e];if(d===c.length-1)b[e]=a;else if(a)if(a.constructor===Array)for(b=b[e]=Array(a.length),e=0;e<a.length;e++)V(a,b,c,d,e);else b=b[e]||(b[e]=B()),e=c[++d],V(a,b,c,d,e)}
u.export=function(a,b,c,d,e){let f,g;switch(e||(e=0)){case 0:f="reg";if(this.j){g=B();for(let h in this.register)g[h]=1}else g=this.register;break;case 1:f="cfg";g={doc:0,opt:this.m?1:0};break;case 2:f="map";g=this.map;break;case 3:f="ctx";g=this.g;break;default:return}ka(a,b||this,c?c+"."+f:f,d,e,g);return!0};u.import=function(a,b){if(b)switch(C(b)&&(b=JSON.parse(b)),a){case "cfg":this.m=!!b.opt;break;case "reg":this.j=!1;this.register=b;break;case "map":this.map=b;break;case "ctx":this.g=b}};ea(L.prototype);function qa(a){var b=self._index;a=a.data;var c=a.args;const d=a.task;switch(d){case "init":b=a.options||{};a=a.factory;c=b.encode;b.cache=!1;c&&0===c.indexOf("function")&&(b.encode=Function("return "+c)());a?(Function("return "+a)()(self),self._index=new self.FlexSearch.Index(b),delete self.FlexSearch):self._index=new L(b);break;case "search":b=b.search.apply(b,c);postMessage(b);break;default:b[d].apply(b,c)}};function Q(a,b){var c;D(a)?b=a:b?E(c=b.encode)&&(b.encode=c.toString()):b={};(a=(self||window)._factory)&&(a=a.toString());c=self.exports;if(this.i=ra(a,c)){this.g=null;var d=this;if(c)this.i.on("message",function(e){d.g(e)});else this.i.onmessage=function(e){d.g(e.data)};this.i.postMessage({task:"init",factory:a,options:b})}}R("add");R("append");R("search");R("update");R("remove");
function R(a){Q.prototype[a]=Q.prototype[a+"Async"]=function(){const b=this,c=[].slice.call(arguments);var d=c[c.length-1];let e;E(d)&&(e=d,c.splice(c.length-1,1));d=new I(function(f){setTimeout(function(){b.i.postMessage({task:a,args:c});"search"===a?b.g=f:f()})});return e?(d.then(e),this):d}}
function ra(a,b){let c;try{c=b?eval('new (require("worker_threads")["Worker"])("../dist/node/node.js")'):a?new Worker(URL.createObjectURL(new Blob(["onmessage="+qa.toString()],{type:"text/javascript"}))):new Worker("worker.js",{type:"module"})}catch(d){}return c};function S(a){if(!(this instanceof S))return new S(a);var b;a||(a={});this.H=[];this.g=[];this.u=[];this.register=B();this.key=(b=a.key)&&T(b,this.u)||"id";this.j=z(a.fastupdate,!0);this.B=!!(b=a.extern);this.A=!this.B&&(b=a.store)&&!0!==b&&[];this.store=b&&(this.B?b:B());this.D=(b=a.tag)&&T(b,this.u);this.h=b&&B();this.cache=(b=a.cache)&&new K(b);a.cache=!1;this.i=a.worker;this.async=!1;b=a;a=B();let c=b.doc;if(C(c))c=[c];else if(c.constructor!==Array){var d=c;c=Object.keys(c)}for(let e=0,f,g;e<
c.length;e++)f=c[e],C(f)?d&&(g=d[f]):(g=f,f=f.field),g=D(g)?Object.assign({},b,g):b,this.i&&(a[f]=new Q(g),a[f].i||(this.i=!1)),this.i||(a[f]=new L(g,this.register)),this.H[e]=T(f,this.u),this.g[e]=f;if(this.A)for(d=b.store,C(d)&&(d=[d]),b=0;b<d.length;b++)this.A[b]=T(d[b],this.u);this.l=a}function T(a,b){const c=a.split(":");let d=0;for(let e=0;e<c.length;e++)a=c[e],0<=a.indexOf("[]")&&(a=a.substring(0,a.length-2))&&(b[d]=!0),a&&(c[d++]=a);d<c.length&&(c.length=d);return 1<d?c:c[0]}
function sa(a,b){if(C(b))a=a[b];else for(let c=0;a&&c<b.length;c++)a=a[b[c]];return a}function V(a,b,c,d,e){a=a[e];if(d===c.length-1)b[e]=a;else if(a)if(a.constructor===Array)for(b=b[e]=Array(a.length),e=0;e<a.length;e++)V(a,b,c,d,e);else b=b[e]||(b[e]=B()),e=c[++d],V(a,b,c,d,e)}
function W(a,b,c,d,e,f,g,h){a=a[g];if(d===b.length-1){if(a.constructor===Array){if(c[d]){for(b=0;b<a.length;b++)e.add(f,a[b],!0);return}a=a.join(" ")}e.add(f,a,h)}else if(a)if(a.constructor===Array)for(g=0;g<a.length;g++)W(a,b,c,d,e,f,g,h);else g=b[++d],W(a,b,c,d,e,f,g,h)}u=S.prototype;
u.add=function(a,b,c){D(a)&&(b=a,a=ta(b,this.key));if(b&&(a||0===a)){if(this.register[a])return this.update(a,b);for(let d=0,e,f;d<this.g.length;d++)f=this.g[d],e=this.H[d],C(e)&&(e=[e]),W(b,e,this.u,0,this.l[f],a,e[0],c);if(this.D){let d=ta(b,this.D),e=B();C(d)&&(d=[d]);for(let f=0,g,h;f<d.length;f++)if(g=d[f],!e[g]&&(e[g]=1,h=this.h[g]||(this.h[g]=[]),!c||-1===h.indexOf(a)))if(h[h.length]=a,this.i){const k=this.register[a]||(this.register[a]=[]);k[k.length]=h}}if(this.store&&!this.B){let d;if(this.A){d=
u.add=function(a,b,c){D(a)&&(b=a,a=sa(b,this.key));if(b&&(a||0===a)){if(this.register[a])return this.update(a,b);for(let d=0,e,f;d<this.g.length;d++)f=this.g[d],e=this.H[d],C(e)&&(e=[e]),W(b,e,this.u,0,this.l[f],a,e[0],c);if(this.D){let d=sa(b,this.D),e=B();C(d)&&(d=[d]);for(let f=0,g,h;f<d.length;f++)if(g=d[f],!e[g]&&(e[g]=1,h=this.h[g]||(this.h[g]=[]),!c||-1===h.indexOf(a)))if(h[h.length]=a,this.j){const k=this.register[a]||(this.register[a]=[]);k[k.length]=h}}if(this.store&&!this.B){let d;if(this.A){d=
B();for(let e=0,f;e<this.A.length;e++)f=this.A[e],C(f)?d[f]=b[f]:V(b,d,f,0,f[0])}this.store[a]=d||b}}return this};u.append=function(a,b){return this.add(a,b,!0)};u.update=function(a,b){return this.remove(a).add(a,b)};
u.remove=function(a){D(a)&&(a=a[this.key]);if(this.register[a]){for(var b=0;b<this.g.length&&(this.l[this.g[b]].remove(a,!0),!this.i||this.j);b++);if(this.D&&(!this.i||this.j))for(let c in this.h){b=this.h[c];const d=b.indexOf(a);-1!==d&&(1<b.length?b.splice(d,1):delete this.h[c])}this.store&&!this.B&&delete this.store[a];delete this.register[a]}return this};
u.search=function(a,b,c,d){D(a)?(c=a,a=c.query):D(b)&&(c=b,b=0);let e=[],f=[],g,h,k,l,n,q,r,v=0;if(c)if(c.constructor===Array)k=c,c=null;else if(k=(g=c.pluck)||c.field||c.doc,n=c.tag,h=this.store&&c.enrich,q="and"===c.bool,b=c.limit||100,r=c.offset||0,k&&(C(k)?k=[k]:k.constructor!==Array&&(l=k,k=Object.keys(k))),n&&(C(n)&&(n=[n]),!a)){for(let m=0,t;m<n.length;m++)if(t=ua.call(this,n[m],b,r,h))e[e.length]=t,v++;return v?e:[]}k||(k=this.g);q=q&&(1<k.length||n&&1<n.length);const p=!d&&(this.j||this.async)&&
u.remove=function(a){D(a)&&(a=a[this.key]);if(this.register[a]){for(var b=0;b<this.g.length&&(this.l[this.g[b]].remove(a,!0),!this.j||this.i);b++);if(this.D&&(!this.j||this.i))for(let c in this.h){b=this.h[c];const d=b.indexOf(a);-1!==d&&(1<b.length?b.splice(d,1):delete this.h[c])}this.store&&!this.B&&delete this.store[a];delete this.register[a]}return this};
u.search=function(a,b,c,d){D(a)?(c=a,a=c.query):D(b)&&(c=b,b=0);let e=[],f=[],g,h,k,l,n,q,r,v=0;if(c)if(c.constructor===Array)k=c,c=null;else if(k=(g=c.pluck)||c.field||c.doc,n=c.tag,h=this.store&&c.enrich,q="and"===c.bool,b=c.limit||100,r=c.offset||0,k&&(C(k)?k=[k]:k.constructor!==Array&&(l=k,k=Object.keys(k))),n&&(C(n)&&(n=[n]),!a)){for(let m=0,t;m<n.length;m++)if(t=ta.call(this,n[m],b,r,h))e[e.length]=t,v++;return v?e:[]}k||(k=this.g);q=q&&(1<k.length||n&&1<n.length);const p=!d&&(this.i||this.async)&&
[];for(let m=0,t,x,F;m<k.length;m++){let N;x=k[m];C(x)?l&&(N=l[x]):(N=x,x=x.field);if(p)p[m]=this.l[x].searchAsync(a,b,N||c);else{d?t=d[m]:t=this.l[x].search(a,b,N||c);F=t.length;if(n&&F){const G=[];let la=0;q&&(G[0]=[t]);for(let U=0,ma,O;U<n.length;U++)if(ma=n[U],F=(O=this.h[ma])&&O.length)la++,G[G.length]=q?[O]:O;la&&(t=q?fa(G,b||100,r||0):ha(t,G),F=t.length)}if(F)f[v]=x,e[v++]=t;else if(q)return[]}}if(p){const m=this;return new Promise(function(t){Promise.all(p).then(function(x){t(m.search(a,b,
c,x))})})}if(!v)return[];if(g&&(!h||!this.store))return e[0];for(let m=0,t;m<f.length;m++){t=e[m];t.length&&h&&(t=va.call(this,t));if(g)return t;e[m]={field:f[m],result:t}}return e};function ua(a,b,c,d){let e=this.h[a],f=e&&e.length-c;if(f&&0<f){if(f>b||c)e=e.slice(c,c+b);d&&(e=va.call(this,e));return{tag:a,result:e}}}function va(a){const b=Array(a.length);for(let c=0,d;c<a.length;c++)d=a[c],b[c]={key:d,doc:this.store[d]};return b}u.contain=function(a){return!!this.register[a]};u.get=function(a){return this.store[a]};
c,x))})})}if(!v)return[];if(g&&(!h||!this.store))return e[0];for(let m=0,t;m<f.length;m++){t=e[m];t.length&&h&&(t=ua.call(this,t));if(g)return t;e[m]={field:f[m],result:t}}return e};function ta(a,b,c,d){let e=this.h[a],f=e&&e.length-c;if(f&&0<f){if(f>b||c)e=e.slice(c,c+b);d&&(e=ua.call(this,e));return{tag:a,result:e}}}function ua(a){const b=Array(a.length);for(let c=0,d;c<a.length;c++)d=a[c],b[c]={key:d,doc:this.store[d]};return b}u.contain=function(a){return!!this.register[a]};u.get=function(a){return this.store[a]};
u.set=function(a,b){this.store[a]=b;return this};u.searchCache=ia;u.export=function(a,b,c,d,e){e||(e=0);d||(d=0);if(d<this.g.length){const f=this.g[d],g=this.l[f];b=this;setTimeout(function(){g.export(a,b,e?f.replace(":","-"):"",d,e++)||(d++,e=1,b.export(a,b,f,d,e))})}else{let f;switch(e){case 1:c="tag";f=this.h;break;case 2:c="store";f=this.store;break;default:return}ka(a,this,c,d,e,f)}};
u.import=function(a,b){if(b)switch(C(b)&&(b=JSON.parse(b)),a){case "tag":this.h=b;break;case "reg":this.i=!1;this.register=b;for(let d=0,e;d<this.g.length;d++)e=this.l[this.g[d]],e.register=b,e.i=!1;break;case "store":this.store=b;break;default:a=a.split(".");const c=a[0];a=a[1];c&&a&&this.l[c].import(a,b)}};ea(S.prototype);const X=self;let Y;const Z={Index:L,Document:S,Worker:Q,registerCharset:function(a,b){da[a]=b},registerLanguage:function(a,b){ca[a]=b}};(Y=X.define)&&Y.amd?Y([],function(){return Z}):X.exports?X.exports=Z:X.FlexSearch=Z;}(this));
u.import=function(a,b){if(b)switch(C(b)&&(b=JSON.parse(b)),a){case "tag":this.h=b;break;case "reg":this.j=!1;this.register=b;for(let d=0,e;d<this.g.length;d++)e=this.l[this.g[d]],e.register=b,e.j=!1;break;case "store":this.store=b;break;default:a=a.split(".");const c=a[0];a=a[1];c&&a&&this.l[c].import(a,b)}};ea(S.prototype);const X=self;let Y;const Z={Index:L,Document:S,Worker:Q,registerCharset:function(a,b){da[a]=b},registerLanguage:function(a,b){ca[a]=b}};(Y=X.define)&&Y.amd?Y([],function(){return Z}):X.exports?X.exports=Z:X.FlexSearch=Z;}(this));

39
dist/node/node.js vendored Normal file
View File

@@ -0,0 +1,39 @@
const { parentPort } = require("worker_threads");
const { Index } = require("../flexsearch.min.js");
let index;
parentPort.on("message", function(data){
/** @type Index */
const args = data["args"];
const task = data["task"];
switch(task){
case "init":
const options = data["options"] || {};
const encode = options["encode"];
options["cache"] = false;
if(encode && (encode.indexOf("function") === 0)){
options["encode"] = new Function("return " + encode)();
}
index = new Index(options);
break;
case "search":
const message = index.search.apply(index, args);
parentPort.postMessage(message);
break;
default:
index[task].apply(index, args);
}
});

View File

@@ -90,11 +90,11 @@ Source Code v0.7.0-pre-alpha available here:<br>
What is not included yet but comes soon?
- ~~WebWorker~~
- Worker for Node.js (almost done)
- ~~Worker for Node.js~~
- ~~Inline Worker (optionally)~~
- ~~Offset-Pagination~~
- ~~Export/Import (not implemented yet)~~
- ~~Tags (almost done)~~
- ~~Export/Import~~
- ~~Tags~~
- ~~Bundles: Light, Compact, Full~~
- Test Automation (needs to be migrated)
- Benchmark Suite (almost done)
@@ -107,8 +107,7 @@ What will be dropped?
- Where-Clause
- Index Information `index.info()`
- Paging Cursor (gets replaced by offset)
- ~~Inline Worker (was replaced by native workers)~~
- Paging Cursor (was replaced by offset)
## Builtin Profiles

View File

@@ -1,5 +1,6 @@
import { IndexInterface, DocumentInterface } from "./type.js";
import { promise as Promise } from "./polyfill.js";
import { is_function, is_object } from "./common.js";
import { is_function, is_object, is_string } from "./common.js";
export default function(prototype){
@@ -14,6 +15,7 @@ function register(prototype, key){
prototype[key + "Async"] = function(){
/** @type {IndexInterface|DocumentInterface} */
const self = this;
const args = /*[].slice.call*/(arguments);
const arg = args[args.length - 1];
@@ -29,10 +31,9 @@ function register(prototype, key){
setTimeout(function(){
const fn = self[key];
fn.async = true;
resolve(fn.apply(self, args));
fn.async = false;
self.async = true;
resolve(self[key].apply(self, args));
self.async = false;
});
});

View File

@@ -298,7 +298,7 @@ function add_index(obj, tree, marker, pos, index, id, key, _append){
* @param id
* @param content
* @param {boolean=} _append
* @returns {Document}
* @returns {Document|Promise}
*/
Document.prototype.add = function(id, content, _append){

View File

@@ -6,8 +6,9 @@ export default function handler(event) {
const index = self["_index"];
const data = event["data"];
const args = data["args"];
const task = data["task"];
switch(data["task"]){
switch(task){
case "init":
@@ -16,20 +17,19 @@ export default function handler(event) {
const encode = options["encode"];
options["cache"] = false;
//root["_id"] = data["id"];
if(typeof encode === "string"){
if(encode && (encode.indexOf("function") === 0)){
options["encode"] = new Function("return " + encode)();
options["encode"] = Function("return " + encode)();
}
if(factory){
// export the FlexSearch global payload to "self"
new Function("return " + factory)()(self);
Function("return " + factory)()(self);
/** @type Index */
self["_index"] = self["FlexSearch"]["Index"](options);
self["_index"] = new self["FlexSearch"]["Index"](options);
// destroy the exported payload
delete self["FlexSearch"];
@@ -41,31 +41,14 @@ export default function handler(event) {
break;
case "add":
index.add.apply(index, args);
break;
case "append":
index.append.apply(index, args);
break;
case "search":
const results = index.search.apply(index, args);
//postMessage({ id: id, results: results });
postMessage(results);
const message = index.search.apply(index, args);
postMessage(message);
break;
case "update":
default:
index.update.apply(index, args);
break;
case "remove":
index.remove.apply(index, args);
break;
index[task].apply(index, args);
}
};

View File

@@ -17,7 +17,7 @@ function WorkerIndex(id, options){
if(is_object(id)){
options = /** @type {Object} */ (id);
id = 0;
//id = 0;
}
else{
@@ -44,18 +44,28 @@ function WorkerIndex(id, options){
factory = factory.toString();
}
const _self = this;
const is_node_js = self["exports"];
this.id = id || counter++;
this.resolver = null;
this.worker = create(factory);
this.worker = create(factory, is_node_js);
if(!this.worker){
return;
}
//this.id = id || counter++;
this.resolver = null;
const _self = this;
if(is_node_js){
this.worker["on"]("message", function(msg){ _self.resolver(msg/*["results"]*/) });
}
else{
this.worker.onmessage = function(e){ _self.resolver(e["data"]/*["results"]*/) };
}
this.worker.postMessage({ "task": "init", "factory": factory, /*id: this.id,*/ "options": options });
}
@@ -85,6 +95,8 @@ function register(key){
const promise = new Promise(function(resolve){
setTimeout(function(){
self.worker.postMessage({ "task": key, /*id: this.id,*/ "args": args });
if(key === "search"){
@@ -96,6 +108,7 @@ function register(key){
resolve();
}
});
});
if(callback){
@@ -109,13 +122,17 @@ function register(key){
};
}
function create(factory){
function create(factory, is_node_js){
let worker
try{
worker = factory ?
worker = is_node_js ?
eval('new (require("worker_threads")["Worker"])("../dist/node/node.js")')
:
factory ?
new Worker(URL.createObjectURL(

39
src/worker/node.js Normal file
View File

@@ -0,0 +1,39 @@
const { parentPort } = require("worker_threads");
const { Index } = require("../flexsearch.min.js");
let index;
parentPort.on("message", function(data){
/** @type Index */
const args = data["args"];
const task = data["task"];
switch(task){
case "init":
const options = data["options"] || {};
const encode = options["encode"];
options["cache"] = false;
if(encode && (encode.indexOf("function") === 0)){
options["encode"] = new Function("return " + encode)();
}
index = new Index(options);
break;
case "search":
const message = index.search.apply(index, args);
parentPort.postMessage(message);
break;
default:
index[task].apply(index, args);
}
});

View File

@@ -127,7 +127,7 @@ let parameter = (function(opt){
assume_function_wrapper: true,
//transform_amd_modules: true,
process_common_js_modules: true,
process_common_js_modules: false,
module_resolution: "BROWSER",
//dependency_mode: "SORT_ONLY",
//js_module_root: "./",
@@ -222,7 +222,7 @@ else{
:
"java -jar node_modules/google-closure-compiler-java/compiler.jar"
) + parameter + " --js='src/**.js'" + flag_str + " --js_output_file='" + filename + "' && exit 0", function(){
) + parameter + " --js='src/**.js' --js='!src/**/node.js'" + flag_str + " --js_output_file='" + filename + "' && exit 0", function(){
let build = fs.readFileSync(filename);
let preserve = fs.readFileSync("src/index.js", "utf8");