Comparing version 2.0.1 to 2.0.2
Changelog | ||
========= | ||
## 2.0.1 / 2017-09-xx | ||
## 2.0.2 / 2017-09-14 | ||
- Remove array size constraint on `$concatArrays`. [#64](https://github.com/kofrasa/mingo/issues/64) | ||
- Filter out empty values from collection. [#65](https://github.com/kofrasa/mingo/issues/65) | ||
- Fix false positive tests and `$substrBytes`. [#66](https://github.com/kofrasa/mingo/issues/66) | ||
- `$regex` should matched nested one level deep. [#70](https://github.com/kofrasa/mingo/issues/70) | ||
## 2.0.1 / 2017-09-07 | ||
- Minimize cloning in pipeline operators | ||
@@ -11,7 +17,7 @@ - Return new object for `$lookup` without mutating original. Fixes #59 and #60 | ||
- Removed custom polyfills | ||
- Added $strLenBytes, $strLenCP, $substrCP, $substrBytes | ||
- Fix $indexOfBytes | ||
- Fix $stdDevSamp | ||
- Fix $in for aggregation operations | ||
- Removed max and min cursor methods. | ||
- Added `$strLenBytes`, `$strLenCP`, `$substrCP`, `$substrBytes` | ||
- Fix `$indexOfBytes` | ||
- Fix `$stdDevSamp` | ||
- Fix `$in` for aggregation operations | ||
- Removed max and min cursor methods. | ||
- Restrict custom query operator type `OP_QUERY` to return boolean only | ||
@@ -39,4 +45,4 @@ - Rename `OP_AGGREGATE` to `OP_EXPRESSION` | ||
- Fix `$where` operator not executed last. https://github.com/kofrasa/mingo/pull/50 | ||
- Fix matching nested arrays. https://github.com/kofrasa/mingo/issues/51 | ||
- Added `$facet` and `$bucket` operators | ||
- Fix matching nested arrays. https://github.com/kofrasa/mingo/issues/51 | ||
- Added `$facet` and `$bucket` operators | ||
- Added `$bucketAuto` operator without granularity support | ||
@@ -43,0 +49,0 @@ - Added string keys for `$type` operator |
@@ -1,5 +0,5 @@ | ||
// mingo.js 2.0.1 | ||
// mingo.js 2.0.2 | ||
// Copyright (c) 2017 Francis Asante | ||
// MIT | ||
!function(n,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):n.mingo=t()}(this,function(){"use strict";function n(n,t){_(n)&&w(t)}function t(n){switch(u(n)){case Qn:case Wn:return I(n,t);default:return n}}function e(n){switch(u(n)){case Qn:return B([],n);case Wn:return Object.assign({},n);default:return n}}function r(n){return null===n?"Null":void 0===n?"Undefined":n.constructor.name}function u(n){return r(n).toLowerCase()}function i(n){return u(n)===Jn}function o(n){return u(n)===Hn}function a(n){return u(n)===zn}function s(n){return u(n)===Qn}function c(n){return!d(n)&&k(n,"length")}function l(n){return u(n)===Wn}function f(n){return n===Object(n)}function v(n){return u(n)===Vn}function h(n){return u(n)===Kn}function p(n){return u(n)===Gn}function d(n){return $(n)||g(n)}function $(n){return u(n)===Fn}function g(n){return u(n)===Yn}function m(n,t){return n.some(P.bind(null,t))}function y(n,t){return!m(n,t)}function b(n){return!!n}function _(n){return!n}function x(n){return d(n)||s(n)&&0===n.length||l(n)&&0===j(n).length||!n}function O(n){return s(n)?n:[n]}function k(n,t){return n.hasOwnProperty(t)}function w(n){throw new Error(n)}function j(n){return Object.keys(n)}function M(n,t){n[rt]=Object.assign(n[rt]||{},t)}function N(n,t){return k(n,rt)&&l(t)&&P(Object.assign({},n[rt],t),n[rt])}function A(n){k(n,rt)&&delete n[rt]}function E(t,e){var r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:null;if(n(t===Object(t),"Cannot iterate over object of type '"+u(t)+"'"),c(t))for(var i=0,o=t.length;i<o&&!1!==e.call(r,t[i],i,t);i++);else for(var a in t)if(k(t,a)&&!1===e.call(r,t[a],a,t))break}function I(n,t){var e=arguments.length>2&&void 0!==arguments[2]?arguments[2]:null;if(s(n))return n.map(t,e);if(l(n)){var r={};return E(n,function(n,u){return r[u]=t.call(e,n,u)},n),r}}function S(n,t,e){return s(n)?n.reduce(t,e):(E(n,function(r,u){return e=t(e,r,u,n)}),e)}function q(n,t){return n.filter(m.bind(null,t))}function C(n,t){return B(B([],n),t.filter(y.bind(null,n)))}function P(n,t){for(var e=[n],r=[t];e.length>0;)if(n=e.pop(),t=r.pop(),n!==t){var i=u(n);if(i!==u(t)||i===Gn)return!1;switch(i){case Qn:if(n.length!==t.length)return!1;B(e,n),B(r,t);break;case Wn:var o=j(n),a=j(t);if(o.length!==a.length)return!1;o.sort(),a.sort();for(var s=0,c=o.length;s<c;s++){var l=o[s];if(l!==a[s])return!1;e.push(n[l]),r.push(t[l])}break;default:if(R(n)!==R(t))return!1}}return 0===e.length}function T(n){var t={},e=[];return E(n,function(n){var r=U(n);k(t,r)||(e.push(n),t[r]=0)}),e}function R(n){var t=u(n);switch(t){case Jn:case zn:case Kn:return n.toString();case Hn:return JSON.stringify(n);case Vn:return n.toISOString();case Fn:case Yn:return t;case Qn:return"["+I(n,R)+"]";default:var e=t===Wn?"":""+r(n),i=j(n);return i.sort(),e+"{"+I(i,function(t){return R(t)+":"+R(n[t])})+"}"}}function U(n){var t=0,e=void 0,r=void 0,u=void 0,i=R(n);if(0===i.length)return t;for(e=0,u=i.length;e<u;e++)r=i.charCodeAt(e),t=(t<<5)-t+r,t|=0;return t}function D(n,t){for(var e=arguments.length>2&&void 0!==arguments[2]?arguments[2]:null,r={},u=[],i=n.length,o=[],a=0;a<i;a++){var s=n[a],c=t.call(e,s,a);if(d(c))o.push(s);else{var l=U(s);k(r,l)||(r[l]=[c,a]),u.push(s)}}return u.sort(function(n,t){var e=r[U(n)],u=r[U(t)];return e[0]<u[0]?-1:e[0]>u[0]?1:e[1]<u[1]?-1:e[1]>u[1]?1:0}),B(o,u)}function L(n,t,e){var r={keys:[],groups:[]},u={};return E(n,function(n){var i=t.call(e,n),o=U(i),a=-1;g(u[o])&&(a=r.keys.length,u[o]=a,r.keys.push(i),r.groups.push([])),a=u[o],r.groups[a].push(n)}),r}function B(n,t){return Array.prototype.push.apply(n,t),n}function F(n,t){for(var e=0,r=n.length-1;e<=r;){var u=Math.round(e+(r-e)/2);if(t<n[u])r=u-1;else{if(!(t>n[u]))return u;e=u+1}}return e}function Y(n){var t=this;return function(e){return function(){for(var r=arguments.length,u=Array(r),i=0;i<r;i++)u[i]=arguments[i];var o=U(u);return k(e,o)||(e[o]=n.apply(t,u)),e[o]}}({})}function J(n,e){var r=j(e);return 0===r.length?n:I(n,function(n){var u=t(n);return E(r,function(t){var r=Rn(n,e[t]);Cn(u,t,r)}),u})}function z(t,e){var u=e.boundaries,i=e.default,o=u[0],a=u[u.length-1],s=e.output||{count:{$sum:1}};n(u.length>2,"$bucket 'boundaries' expression must have at least 3 elements");for(var c=r(o),l=0,f=u.length-1;l<f;l++)n(c===r(u[l+1]),"$bucket 'boundaries' must all be of the same type"),n(u[l]<u[l+1],"$bucket 'boundaries' must be sorted in ascending order");!d(i)&&r(e.default)===r(o)&&n(o>e.default||a<e.default,"$bucket 'default' expression must be out of boundaries range");var v={};return E(u,function(n){return v[n]=[]}),d(i)||(v[i]=[]),E(t,function(t){var r=Rn(t,e.groupBy);if(d(r)||r<o||r>=a)n(!d(i),"$bucket require a default for out of range values"),v[i].push(t);else{n(r>=o&&r<a,"$bucket 'groupBy' expression must resolve to a value in range of boundaries");var s=F(u,r),c=u[Math.max(0,s-1)];v[c].push(t)}}),u.pop(),d(i)||u.push(i),I(u,function(n){var t=En(v[n],null,s);return Object.assign(t,{_id:n})})}function H(t,e){var r=e.output||{count:{$sum:1}},u=e.groupBy,i=e.buckets;n(i>0,"The $bucketAuto 'buckets' field must be greater than 0, but found: "+i);for(var o=Math.max(1,Math.round(t.length/i)),a=Y(Rn),s={},c=[],l=D(t,function(n){var t=a(n,u);return d(t)?c.push(n):(s[t]||(s[t]=[]),s[t].push(n)),t}),f=Nn(),v=[],h=0,p=0,$=l.length;p<i&&h<$;p++){for(var g={},m=[],y=0;y<o&&h<$;y++){var b=a(l[h],u);if(d(b)&&(b=null),B(m,d(b)?c:s[b]),h+=d(b)?c.length:s[b].length,k(g,"min")||(g.min=b),v.length>0){v[v.length-1][f].max=g.min}}p==i-1&&B(m,l.slice(h)),v.push(Object.assign(En(m,null,r),{_id:g}))}return v.length>0&&(v[v.length-1][f].max=a(l[l.length-1],u)),v}function V(t,e){n(o(e)&&""!==e.trim()&&-1===e.indexOf(".")&&"$"!==e.trim()[0],"Invalid expression value for $count");var r={};return r[e]=t.length,r}function K(n,t){return I(t,function(t){return cn(n,t)})}function Q(n,t){var e=Nn(),r=t[e],u=L(n,function(n){return Rn(n,r,r)}),i=[];return delete t[e],E(u.keys,function(n,r){var o={};g(n)||(o[e]=n),E(t,function(n,t){o[t]=En(u.groups[r],t,n)}),i.push(o)}),i}function W(n,t){return n.slice(0,t)}function G(t,r){function u(n){return U(d(n)?null:n)}var i=r.from,a=r.localField,c=r.foreignField,l=r.as;n(s(i)&&o(c)&&o(a)&&o(l),"$lookup: invalid argument");var f={};return E(i,function(n){var t=u(n[c]);f[t]=f[t]||[],f[t].push(n)}),I(t,function(n){var t=u(n[a]),r=e(n);return r[l]=f[t]||[],r})}function X(n,t){return new pt(t).find(n).all()}function Z(t,e){return n(s(e),"$out: argument must be an array"),B(e,t),t}function nn(e,r){if(x(r))return e;var u=[],i=j(r),s=!1,c=Nn(),f=[!1,!1];if(E(r,function(t,e){e!==c&&(0===t||!1===t?f[0]=!0:f[1]=!0,n(f[0]!==f[1],"Projection cannot have a mix of inclusion and exclusion."))}),m(i,c)){var v=r[c];0!==v&&!1!==v||(i=i.filter(y.bind(null,[c])),n(y(i,c),"Must not contain collections id key"),s=x(i))}else i.push(c);return E(e,function(n){var e={},f=!1,v=!1,h=[];s&&h.push(c),E(i,function(t){var u=r[t],i=void 0;if(t!==c&&m([0,!1],u)&&(v=!0),t===c&&x(u))i=n[t];else if(o(u))i=Rn(n,u,t);else if(m([1,!0],u));else{if(!l(u))return void h.push(t);var s=j(u);s=!(s.length>1)&&s[0],m(wn(tt),s)?"$slice"===s?O(u[s]).every(a)?(i=ut[s](n,u[s],t),f=!0):i=Rn(n,u,t):i=ut[s](n,u[s],t):i=Rn(n,u,t)}var p=Sn(n,t);g(p)||Object.assign(e,p),y([0,1,!1,!0],u)&&(g(i)?Pn(e,t):Cn(e,t,i))}),(f||v||s)&&(e=Object.assign({},n,e),h.length>0&&(e=t(e),E(h,function(n){return Pn(e,n)}))),u.push(e)}),u}function tn(n,e){return I(n,function(n){return Ln(t(n),e)})}function en(t,e){return I(t,function(t){return t=Rn(t,e.newRoot),n(l(t),"$replaceRoot expression must return an object"),t})}function rn(t,e){var r=e.size;n(a(r),"$sample size must be a positive integer");for(var u=[],i=t.length,o=0;o<r;o++){var s=Math.floor(Math.random()*i);u.push(t[s])}return u}function un(n,t){return n.slice(t)}function on(n,t){if(!x(t)&&l(t)){E(j(t).reverse(),function(e){var r=L(n,function(n){return In(n,e)}),u={},i=function(n){return u[U(n)]},o=D(r.keys,function(n,t){return u[U(n)]=t,n});-1===t[e]&&o.reverse(),n=[],E(o,function(t){return B(n,r.groups[i(t)])})})}return n}function an(n,t){var e={count:{$sum:1}};return e[Nn()]=t,this.$sort(this.$group(n,e),{count:-1})}function sn(n,t){o(t)&&(t={path:t});var r=t.path.substr(1),u=t.includeArrayIndex||!1,i=t.preserveNullAndEmptyArrays||!1,a=[],c=function(n,t){!1!==u&&(n[u]=t),a.push(n)};return E(n,function(n){var t=An(n,r);if(s(t))if(0===t.length&&!0===i){var u=e(n);delete u[r],c(u,null)}else E(t,function(t,u){var i=e(n);i[r]=t,c(i,u)});else x(t)&&!0!==i||c(e(n),null)}),a}function cn(t,e){return n(s(e),"Aggregation pipeline must be an array"),new ct(e).run(t)}function ln(n,t){return T(this.$push(n,t))}function fn(n,t){var e=this.$push(n,t).filter(a);return S(e,function(n,t){return n+t},0)/(e.length||1)}function vn(n,t){return n.length>0?Rn(n[0],t):void 0}function hn(n,t){return n.length>0?Rn(n[n.length-1],t):void 0}function pn(n,t){return S(this.$push(n,t),function(n,t){return d(n)||t>n?t:n},void 0)}function dn(n,t){return S(this.$push(n,t),function(n,t){return d(n)||t<n?t:n},void 0)}function $n(n,t){return d(t)?n:I(n,function(n){return Rn(n,t)})}function gn(n,t){return Dn({data:this.$push(n,t).filter(a),sampled:!1})}function mn(n,t){return Dn({data:this.$push(n,t).filter(a),sampled:!0})}function yn(n,t){return s(n)?a(t)?n.length*t:S(this.$push(n,t).filter(a),function(n,t){return n+t},0):0}function bn(n,t,e){return new pt(t).find(n,e)}function _n(n,t){return new pt(t).remove(n)}function xn(n,t){return new Array(Math.max(t-String(n).length+1,0)).join("0")+n}function On(n){if(n<128)return[n];for(var t=n<2048&&1||n<65536&&2||3,e=wt[t-1],r=[(n>>6*t)+e];t>0;){t--;var u=n>>6*t;r.push(128|63&u)}return r}function kn(n){for(var t=[],e=0,r=n.length;e<r;e++)t.push(On(n.codePointAt(e)));return t}function wn(){return S(arguments,function(n,t){return B(n,j(Nt[t]))},[])}function jn(t,e){var r=e(Bn());n(k(Nt,t),"Invalid operator class "+t);var u=Nt[t];E(r,function(e,r){n(/^\$\w+$/.test(r),"Invalid operator name "+r),n(!k(u,r),r+" already exists for '"+t+"' operators")});var o={};switch(t){case et:E(r,function(t,e){o[e]=function(t,r){return function(u,o){return{test:function(a){var s=In(a,u),c=t.call(r,u,s,o);return n(i(c),e+" must return a boolean"),c}}}}(t,r)});break;case tt:E(r,function(n,t){o[t]=function(n,t){return function(e,r,u){var i=In(e,u);return n.call(t,u,i,r)}}(n,r)});break;default:E(r,function(n,t){o[t]=function(n,t){return function(){for(var e=arguments.length,r=Array(e),u=0;u<e;u++)r[u]=arguments[u];return n.apply(t,r)}}(n,r)})}Object.assign(Nt[t],o)}function Mn(n){Object.assign(At,n||{})}function Nn(){return At.key}function An(n,t){return n[t]}function En(t,e,r){if(m(wn(nt),e))return lt[e](t,r);if(l(r)){var u={};return E(r,function(e,i){if(u[i]=En(t,i,r[i]),m(wn(nt),i))return u=u[i],n(1===j(r).length,"Invalid $group expression '"+JSON.stringify(r)+"'"),!1}),u}}function In(n,t){var e=arguments.length>2&&void 0!==arguments[2]&&arguments[2],r=t.split("."),u=n;n:for(var i=0;i<r.length;i++){var o=function(n){if(null===r[n].match(/^\d+$/)&&s(u)){if(!0===e&&0===n)return{v:u};u=u.map(function(t){return In(t,r[n],!0)}),M(u,{isMulti:!0}),1===u.length&&(u=u[0])}else u=An(u,r[n]),e=!1;if(d(u))return"break"}(i);switch(o){case"break":break n;default:if("object"===(void 0===o?"undefined":ot(o)))return o.v}}return u}function Sn(t,e){var r=e.split("."),u=r[0],i=1===r.length||r.slice(1).join("."),o=null!==u.match(/^\d+$/),a=r.length>1,c=void 0,l=void 0;try{s(t)?o?(c=An(t,u),a&&(c=Sn(c,i)),n(!g(c)),c=[c]):(c=[],E(t,function(n){l=Sn(n,e),d(l)||c.push(l)}),n(c.length>0)):(l=An(t,u),a&&(l=Sn(l,i)),n(!g(l)),c={},c[u]=l)}catch(n){c=void 0}return c}function qn(n,t,e){var r=arguments.length>3&&void 0!==arguments[3]&&arguments[3],u=t.split("."),i=u[0],o=1===u.length||u.slice(1).join(".");if(1===u.length)e(n,i);else if(s(n)&&!/^\d+$/.test(i))E(n,function(n){qn(n,t,e,r)});else{if(!0===r){var a=k(n,i);a&&!d(n[i])||(n[i]={})}qn(n[i],o,e,r)}}function Cn(n,t,e){qn(n,t,function(n,t){n[t]=e},!0)}function Pn(n,t){qn(n,t,function(n,t){s(n)&&/^\d+$/.test(t)?n.splice(parseInt(t),1):l(n)&&delete n[t]})}function Tn(n){if(m(Xn,u(n)))return h(n)?{$regex:n}:{$eq:n};if(f(n)){var t=j(n);if(0===q(wn(et),t).length)return{$eq:n};if(m(t,"$regex")){var e=n.$regex,r=n.$options||"",i="";o(e)&&(i+=e.ignoreCase||r.indexOf("i")>=0?"i":"",i+=e.multiline||r.indexOf("m")>=0?"m":"",i+=e.global||r.indexOf("g")>=0?"g":"",e=new RegExp(e,i)),n.$regex=e,delete n.$options}}return n}function Rn(t,e){var r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:null,i=arguments.length>3&&void 0!==arguments[3]?arguments[3]:{};if(i.root=i.root||t,m(wn(Zn),r))return Mt[r](t,e,i);if(m(wn(nt),r))return t=Rn(t,e,null,i),n(s(t),r+" expression must resolve to an array"),lt[r](t,null,i);if(o(e)&&e.length>0&&"$"===e[0]){if(m(St,e))return Et[e](t,null,i);if(m(qt,e))return e;var a=St.filter(function(n){return 0===e.indexOf(n+".")});return 1===a.length&&(a=a[0],"$$ROOT"===a&&(t=i.root),e=e.substr(a.length)),In(t,e.slice(1))}switch(u(e)){case Qn:return e.map(function(n){return Rn(t,n)});case Wn:var c={};return E(e,function(r,u){if(c[u]=Rn(t,r,u,i),m(wn(Zn,nt),u))return n(1===j(e).length,"Invalid aggregation expression '"+JSON.stringify(e)+"'"),c=c[u],!1}),c;default:return e}}function Un(t,e){var r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:null;return d(r)?e<0?(e=Math.max(0,t.length+e),r=t.length-e+1):(r=e,e=0):(e<0&&(e=Math.max(0,t.length+e)),n(r>0,"Invalid argument value for $slice operator. Limit must be a positive number"),r+=e),t.slice(e,r)}function Dn(n){var t=S(n.data,function(n,t){return n+t},0),e=n.data.length||1,r=n.sampled&&1||0,u=t/e;return Math.sqrt(S(n.data,function(n,t){return n+Math.pow(t-u,2)},0)/(e-r))}function Ln(n,t){var e=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};e.root=e.root||n;var r=Rn(n,t,null,e);return m(qt,r)?It[r](n,t,e):r}function Bn(){return{assert:n,computeValue:Rn,clone:e,cloneDeep:t,each:E,err:w,getHash:U,getType:r,has:k,idKey:Nn,includes:m.bind(null),isArray:s,isBoolean:i,isDate:v,isEmpty:x,isEqual:P,isFunction:p,isNil:d,isNull:$,isNumber:a,isObject:l,isRegExp:h,isString:o,isUndefined:g,keys:j,map:I,ops:wn,resolve:In,reduce:S}}var Fn="null",Yn="undefined",Jn="boolean",zn="number",Hn="string",Vn="date",Kn="regexp",Qn="array",Wn="object",Gn="function",Xn=[Fn,Yn,Jn,zn,Hn,Vn,Kn],Zn="expression",nt="group",tt="projection",et="query",rt="__mingo__",ut={$:function(n,t,e){w("$ not implemented")},$elemMatch:function(t,e,r){var u=In(t,r),i=new pt(e);n(s(u),"$elemMatch: invalid argument");for(var o=0;o<u.length;o++)if(i.test(u[o]))return[u[o]]},$slice:function(t,e,r){var u=In(t,r);return s(u)?s(e)?Un(u,e[0],e[1]):(n(a(e),"$slice: invalid arguments for projection"),Un(u,e)):u}},it={$addFields:J,$bucket:z,$bucketAuto:H,$count:V,$facet:K,$group:Q,$limit:W,$lookup:G,$match:X,$out:Z,$project:nn,$redact:tn,$replaceRoot:en,$sample:rn,$skip:un,$sort:on,$sortByCount:an,$unwind:sn},ot="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(n){return typeof n}:function(n){return n&&"function"==typeof Symbol&&n.constructor===Symbol&&n!==Symbol.prototype?"symbol":typeof n},at=function(n,t){if(!(n instanceof t))throw new TypeError("Cannot call a class as a function")},st=function(){function n(n,t){for(var e=0;e<t.length;e++){var r=t[e];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(n,r.key,r)}}return function(t,e,r){return e&&n(t.prototype,e),r&&n(t,r),t}}(),ct=function(){function t(n){at(this,t),this.__operators=n}return st(t,[{key:"run",value:function(t,e){return x(this.__operators)||E(this.__operators,function(r){var u=j(r);n(1===u.length&&m(wn("pipeline"),u[0]),"Invalid aggregation operator "+u),u=u[0],t=e&&e instanceof pt?it[u].call(e,t,r[u]):it[u](t,r[u])}),t}}]),t}(),lt={$addToSet:ln,$avg:fn,$first:vn,$last:hn,$max:pn,$min:dn,$push:$n,$stdDevPop:gn,$stdDevSamp:mn,$sum:yn},ft=function(){function t(n,e,r){at(this,t),this.__query=e,this.__collection=n,this.__projection=r||e.__projection,this.__operators={},this.__result=!1,this.__position=0}return st(t,[{key:"_fetch",value:function(){var t=this;if(!1!==this.__result)return this.__result;l(this.__projection)&&Object.assign(this.__operators,{$project:this.__projection}),n(s(this.__collection),"Input collection is not of valid type. Must be an Array."),this.__result=this.__collection.filter(this.__query.test,this.__query);var e=[];if(E(["$sort","$skip","$limit","$project"],function(n){if(k(t.__operators,n)){var r={};r[n]=t.__operators[n],e.push(r)}}),e.length>0){var r=new ct(e);this.__result=r.run(this.__result,this.__query)}return this.__result}},{key:"all",value:function(){return this._fetch()}},{key:"first",value:function(){return this.count()>0?this._fetch()[0]:null}},{key:"last",value:function(){return this.count()>0?this._fetch()[this.count()-1]:null}},{key:"count",value:function(){return this._fetch().length}},{key:"skip",value:function(n){return Object.assign(this.__operators,{$skip:n}),this}},{key:"limit",value:function(n){return Object.assign(this.__operators,{$limit:n}),this}},{key:"sort",value:function(n){return Object.assign(this.__operators,{$sort:n}),this}},{key:"next",value:function(){return this.hasNext()?this._fetch()[this.__position++]:null}},{key:"hasNext",value:function(){return this.count()>this.__position}},{key:"map",value:function(n){return this._fetch().map(n)}},{key:"forEach",value:function(n){E(this._fetch(),n)}},{key:Symbol.iterator,value:function(){var n=this;return{next:function(){return n.hasNext()?{done:!1,value:n.next()}:{done:!0}}}}}]),t}(),vt={$eq:function(n,t){if(P(n,t))return!0;if(d(n)&&d(t))return!0;if(s(n)){if(!N(n,{isMulti:!0}))return-1!==n.findIndex(P.bind(null,t));try{for(var e=0;e<n.length;e++)if(this.$eq(n[e],t))return!0}finally{A(n)}}return!1},$ne:function(n,t){return!this.$eq(n,t)},$in:function(n,t){return q(O(n),t).length>0},$nin:function(n,t){return d(n)||!this.$in(n,t)},$lt:function(n,t){return!g(O(n).find(function(n){return n<t}))},$lte:function(n,t){return!g(O(n).find(function(n){return n<=t}))},$gt:function(n,t){return!g(O(n).find(function(n){return n>t}))},$gte:function(n,t){return!g(O(n).find(function(n){return n>=t}))},$mod:function(n,t){return!g(O(n).find(function(n){return a(n)&&s(t)&&2===t.length&&n%t[0]===t[1]}))},$regex:function(n,t){return!g(O(n).find(function(n){return o(n)&&h(t)&&!!n.match(t)}))},$exists:function(n,t){return(!1===t||0===t)&&d(n)||(!0===t||1===t)&&!d(n)},$all:function(n,t){var e=!1;if(s(n)&&s(t))for(var r=0,u=t.length;r<u;r++){if(!l(t[r])||!m(j(t[r]),"$elemMatch"))return q(t,n).length===u;e=e||this.$elemMatch(n,t[r].$elemMatch)}return e},$size:function(n,t){return s(n)&&a(t)&&n.length===t},$elemMatch:function(n,t){if(s(n)&&!x(n))for(var e=new pt(t),r=0,u=n.length;r<u;r++)if(e.test(n[r]))return!0;return!1},$type:function(n,t){switch(t){case 1:case"double":return a(n)&&-1!==(n+"").indexOf(".");case 2:case Hn:return o(n);case 3:case Wn:return l(n);case 4:case Qn:return s(n);case 6:case Yn:return d(n);case 8:case"bool":return i(n);case 9:case Vn:return v(n);case 10:case Fn:return $(n);case 11:case"regex":return h(n);case 16:case"int":return a(n)&&n<=2147483647&&-1===(n+"").indexOf(".");case 18:case"long":return a(n)&&n>2147483647&&n<=0x8000000000000000&&-1===(n+"").indexOf(".");case 19:case"decimal":return a(n);default:return!1}}},ht={$and:function(t,e){n(s(e),"Invalid expression: $and expects value to be an Array");var r=[];return E(e,function(n){return r.push(new pt(n))}),{test:function(n){for(var t=0;t<r.length;t++)if(!r[t].test(n))return!1;return!0}}},$or:function(t,e){n(s(e),"Invalid expression. $or expects value to be an Array");var r=[];return E(e,function(n){return r.push(new pt(n))}),{test:function(n){for(var t=0;t<r.length;t++)if(r[t].test(n))return!0;return!1}}},$nor:function(t,e){n(s(e),"Invalid expression. $nor expects value to be an Array");var r=this.$or("$or",e);return{test:function(n){return!r.test(n)}}},$not:function(n,t){var e={};e[n]=Tn(t);var r=new pt(e);return{test:function(n){return!r.test(n)}}},$where:function(n,t){return p(t)||(t=new Function("return "+t+";")),{test:function(n){return!0===t.call(n)}}}};E(vt,function(n,t){ht[t]=function(n,t){return function(e,r){return{test:function(u){var i=In(u,e);return n.call(t,i,r)}}}}(n,vt)});var pt=function(){function t(n){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};at(this,t),this.__criteria=n,this.__projection=e,this.__compiled=[],this._compile()}return st(t,[{key:"_compile",value:function(){var t=this;if(!x(this.__criteria)){n(l(this.__criteria),"Criteria must be of type Object");var e=void 0;E(this.__criteria,function(n,r){"$where"===r?e={field:r,expr:n}:m(["$and","$or","$nor"],r)?t._processOperator(r,r,n):(n=Tn(n),E(n,function(n,e){t._processOperator(r,e,n)})),l(e)&&t._processOperator(e.field,e.field,e.expr)})}}},{key:"_processOperator",value:function(t,e,r){n(m(wn(et),e),"Invalid query operator '"+e+"' detected"),this.__compiled.push(ht[e](t,r))}},{key:"test",value:function(n){for(var t=0,e=this.__compiled.length;t<e;t++)if(!this.__compiled[t].test(n))return!1;return!0}},{key:"find",value:function(n,t){return new ft(n,this,t)}},{key:"remove",value:function(n){var t=this;return S(n,function(n,e){return t.test(e)||n.push(e),n},[])}}]),t}(),dt={$abs:function(n,t){var e=Rn(n,t);return null===e||void 0===e?null:Math.abs(e)},$add:function(n,t){return S(Rn(n,t),function(n,t){return n+t},0)},$ceil:function(t,e){var r=Rn(t,e);return d(r)?null:(n(a(r)||isNaN(r),"$ceil must be a valid expression that resolves to a number."),Math.ceil(r))},$divide:function(n,t){var e=Rn(n,t);return e[0]/e[1]},$exp:function(t,e){var r=Rn(t,e);return d(r)?null:(n(a(r)||isNaN(r),"$exp must be a valid expression that resolves to a number."),Math.exp(r))},$floor:function(t,e){var r=Rn(t,e);return d(r)?null:(n(a(r)||isNaN(r),"$floor must be a valid expression that resolves to a number."),Math.floor(r))},$ln:function(t,e){var r=Rn(t,e);return d(r)?null:(n(a(r)||isNaN(r),"$ln must be a valid expression that resolves to a number."),Math.log(r))},$log:function(t,e){var r=Rn(t,e);return n(s(r)&&2===r.length,"$log must be a valid expression that resolves to an array of 2 items"),r.some(d)?null:(n(r.some(isNaN)||r.every(a),"$log expression must resolve to array of 2 numbers"),Math.log10(r[0])/Math.log10(r[1]))},$log10:function(t,e){var r=Rn(t,e);return d(r)?null:(n(a(r)||isNaN(r),"$log10 must be a valid expression that resolves to a number."),Math.log10(r))},$mod:function(n,t){var e=Rn(n,t);return e[0]%e[1]},$multiply:function(n,t){return S(Rn(n,t),function(n,t){return n*t},1)},$pow:function(t,e){var r=Rn(t,e);return n(s(r)&&2===r.length&&r.every(a),"$pow expression must resolve to an array of 2 numbers"),n(!(0===r[0]&&r[1]<0),"$pow cannot raise 0 to a negative exponent"),Math.pow(r[0],r[1])},$sqrt:function(t,e){var r=Rn(t,e);return d(r)?null:(n(a(r)&&r>0||isNaN(r),"$sqrt expression must resolve to non-negative number."),Math.sqrt(r))},$subtract:function(n,t){var e=Rn(n,t);return e[0]-e[1]},$trunc:function(t,e){var r=Rn(t,e);return d(r)?null:(n(a(r)||isNaN(r),"$trunc expression must resolve to a number."),Math.trunc(r))}},$t={$arrayElemAt:function(t,e){var r=Rn(t,e);n(s(r)&&2===r.length,"$arrayElemAt expression must resolve to an array of 2 elements"),n(s(r[0]),"First operand to $arrayElemAt must resolve to an array"),n(a(r[1]),"Second operand to $arrayElemAt must resolve to an integer");var u=r[1];return r=r[0],u<0&&Math.abs(u)<=r.length?r[u+r.length]:u>=0&&u<r.length?r[u]:void 0},$arrayToObject:function(t,e){var r=Rn(t,e);return n(s(r),"$arrayToObject expression must resolve to an array"),S(r,function(t,e){return s(e)&&2==e.length?t[e[0]]=e[1]:(n(l(e)&&k(e,"k")&&k(e,"v"),"$arrayToObject expression is invalid."),t[e.k]=e.v),t},{})},$concatArrays:function(t,e){var r=Rn(t,e,null);return n(s(r)&&2===r.length,"$concatArrays expression must resolve to an array of 2 elements"),r.some(d)?null:r[0].concat(r[1])},$filter:function(t,e){var r=Rn(t,e.input),u=e.as,i=e.cond;return n(s(r),"$filter 'input' expression must resolve to an array"),r.filter(function(n){var t={};return t["$"+u]=n,!0===Rn(t,i)})},$in:function(t,e){var r=Rn(t,e[0]),u=Rn(t,e[1]);return n(s(u),"$in second argument must be an array"),m(u,r)},$indexOfArray:function(t,e){var r=Rn(t,e);if(d(r))return null;var u=r[0],i=r[1];if(d(u))return null;n(s(u),"$indexOfArray expression must resolve to an array.");var o=r[2]||0,a=r[3];return d(a)&&(a=u.length),o>a?-1:(n(o>=0&&a>=0,"$indexOfArray expression is invalid"),(o>0||a<u.length)&&(u=u.slice(o,a)),u.findIndex(P.bind(null,i))+o)},$isArray:function(n,t){return s(Rn(n,t[0]))},$map:function(t,e){var r=Rn(t,e.input);n(s(r),"$map 'input' expression must resolve to an array");var u=e.as,i=e.in,o="$"+u;return I(r,function(n){return t[o]=n,Rn(t,i)})},$objectToArray:function(t,e){var r=Rn(t,e);n(l(r),"$objectToArray expression must resolve to an object");var u=[];return E(r,function(n,t){return u.push({k:t,v:n})}),u},$range:function(n,t){for(var e=Rn(n,t),r=e[0],u=e[1],i=e[2]||1,o=[];r<u&&i>0||r>u&&i<0;)o.push(r),r+=i;return o},$reduce:function(t,e){var r=Rn(t,e.input),u=Rn(t,e.initialValue),i=e.in;return d(r)?null:(n(s(r),"$reduce 'input' expression must resolve to an array"),S(r,function(n,t){return Rn({$value:n,$this:t},i)},u))},$reverseArray:function(t,e){var r=Rn(t,e);if(d(r))return null;n(s(r),"$reverseArray expression must resolve to an array");var u=[];return B(u,r),u.reverse(),u},$size:function(n,t){var e=Rn(n,t);return s(e)?e.length:void 0},$slice:function(n,t){var e=Rn(n,t);return Un(e[0],e[1],e[2])},$zip:function(t,e){var r=Rn(t,e.inputs),u=e.useLongestLength||!1;n(s(r),"'inputs' expression must resolve to an array"),n(i(u),"'useLongestLength' must be a boolean"),s(e.defaults)&&n(b(u),"'useLongestLength' must be set to true to use 'defaults'");for(var o=0,a=0,c=r.length;a<c;a++){var l=r[a];if(d(l))return null;n(s(l),"'inputs' expression values must resolve to an array or null"),o=u?Math.max(o,l.length):Math.min(o||l.length,l.length)}for(var f=[],v=e.defaults||[],h=0;h<o;h++)!function(n){var t=r.map(function(t,e){return d(t[n])?v[e]||null:t[n]});f.push(t)}(h);return f}},gt={$and:function(n,t){var e=Rn(n,t);return b(e)&&e.every(b)},$or:function(n,t){var e=Rn(n,t);return b(e)&&e.some(b)},$not:function(n,t){return!Rn(n,t[0])}},mt={$cmp:function(n,t){var e=Rn(n,t);return e[0]>e[1]?1:e[0]<e[1]?-1:0}};E(["$eq","$ne","$gt","$gte","$lt","$lte","$nin"],function(n){mt[n]=function(t,e){var r=Rn(t,e);return vt[n](r[0],r[1])}});var yt={$cond:function(t,e){var r=void 0,u=void 0,i=void 0;return s(e)?(n(3===e.length,"$cond: invalid arguments"),r=e[0],u=e[1],i=e[2]):(n(l(e),"$cond: invalid arguments"),r=e.if,u=e.then,i=e.else),Rn(t,r)?Rn(t,u):Rn(t,i)},$switch:function(t,e){var r="Invalid arguments for $switch operator";n(e.branches,r);var u=e.branches.find(function(e){return n(e.case&&e.then,r),Rn(t,e.case)});return u?Rn(t,u.then):(n(e.default,r),Rn(t,e.default))},$ifNull:function(t,e){n(s(e)&&2===e.length,"Invalid arguments for $ifNull operator");var r=Rn(t,e);return d(r[0])?r[1]:r[0]}},bt={"%Y":["$year",4],"%m":["$month",2],"%d":["$dayOfMonth",2],"%H":["$hour",2],"%M":["$minute",2],"%S":["$second",2],"%L":["$millisecond",3],"%j":["$dayOfYear",3],"%w":["$dayOfWeek",1],"%U":["$week",2],"%%":"%"},_t={$dayOfYear:function(n,t){var e=Rn(n,t),r=new Date(e.getFullYear(),0,0),u=e-r;return Math.round(u/864e5)},$dayOfMonth:function(n,t){return Rn(n,t).getDate()},$dayOfWeek:function(n,t){return Rn(n,t).getDay()+1},$year:function(n,t){return Rn(n,t).getFullYear()},$month:function(n,t){return Rn(n,t).getMonth()+1},$week:function(n,t){var e=Rn(n,t);e=new Date(+e),e.setHours(0,0,0),e.setDate(e.getDate()+4-(e.getDay()||7));var r=new Date(e.getFullYear(),0,1);return Math.floor(((e-r)/864e5+1)/7)},$hour:function(n,t){return Rn(n,t).getUTCHours()},$minute:function(n,t){return Rn(n,t).getMinutes()},$second:function(n,t){return Rn(n,t).getSeconds()},$millisecond:function(n,t){return Rn(n,t).getMilliseconds()},$dateToString:function(n,t){for(var e=t.format,r=Rn(n,t.date),u=e.match(/(%%|%Y|%m|%d|%H|%M|%S|%L|%j|%w|%U)/g),i=0,o=u.length;i<o;i++){var a=bt[u[i]],c=a;if(s(a)){var l=this[a[0]],f=a[1];c=xn(l.call(this,n,r),f)}e=e.replace(u[i],c)}return e}},xt={$literal:function(n,t){return t}},Ot={$setEquals:function(n,t){var e=Rn(n,t),r=T(e[0]),u=T(e[1]);return r.length===u.length&&r.length===q(r,u).length},$setIntersection:function(n,t){var e=Rn(n,t);return q(e[0],e[1])},$setDifference:function(n,t){var e=Rn(n,t);return e[0].filter(y.bind(null,e[1]))},$setUnion:function(n,t){var e=Rn(n,t);return C(e[0],e[1])},$setIsSubset:function(n,t){var e=Rn(n,t);return q(e[0],e[1]).length===e[0].length},$anyElementTrue:function(n,t){return Rn(n,t)[0].some(b)},$allElementsTrue:function(n,t){return Rn(n,t)[0].every(b)}},kt={$concat:function(n,t){var e=Rn(n,t);return[null,void 0].some(m.bind(null,e))?null:e.join("")},$indexOfBytes:function(t,e){var r=Rn(t,e),u="$indexOfBytes: expression resolves to invalid arguments";if(d(r[0]))return null;n(o(r[0])&&o(r[1]),u);var i=r[0],s=r[1],c=r[2],l=r[3],f=d(c)||a(c)&&c>=0&&Math.round(c)===c;if(f=f&&(d(l)||a(l)&&l>=0&&Math.round(l)===l),n(f,u),c=c||0,l=l||i.length,c>l)return-1;var v=i.substring(c,l).indexOf(s);return v>-1?v+c:v},$split:function(t,e){var r=Rn(t,e);return d(r[0])?null:(n(r.every(o),"$split: invalid argument"),r[0].split(r[1]))},$strLenBytes:function(n,t){return~-encodeURI(Rn(n,t)).split(/%..|./).length},$strLenCP:function(n,t){return Rn(n,t).length},$strcasecmp:function(t,e){var r=Rn(t,e),u=r[0],i=r[1];return P(u,i)||r.every(d)?0:(n(r.every(o),"$strcasecmp: invalid argument"),u=u.toUpperCase(),i=i.toUpperCase(),u>i&&1||u<i&&-1||0)},$substrBytes:function(t,e){var r=Rn(t,e),u=r[0],i=r[1],s=r[2];n(o(u)&&a(i)&&i>=0&&a(s)&&s>=0,"$substrBytes: invalid arguments");for(var c=kn(u),l=[],f=0,v=0;v<c.length;v++)l.push(f),f+=c[v].length;return i=l.indexOf(i),s=l.indexOf(i+s),n(i>-1&&s>-1,"$substrBytes: Invalid range, start or end index is a UTF-8 continuation byte."),u.substring(i,s)},$substr:function(n,t){var e=Rn(n,t),r=e[0],u=e[1],i=e[2];return o(r)?u<0?"":i<0?r.substr(u):r.substr(u,i):""},$substrCP:function(n,t){return this.$substr(n,t)},$toLower:function(n,t){var e=Rn(n,t);return x(e)?"":e.toLowerCase()},$toUpper:function(n,t){var e=Rn(n,t);return x(e)?"":e.toUpperCase()}},wt=[192,224,240],jt={$let:function(n,t){var e=t.vars,r=t.in;return E(j(e),function(t){var r=Rn(n,e[t]);n["$"+t]=r}),Rn(n,r)}},Mt=Object.assign({},dt,$t,gt,mt,yt,_t,xt,Ot,kt,jt),Nt={expression:Mt,group:lt,pipeline:it,projection:ut,query:ht},At={key:"_id"},Et={$$ROOT:function(n,t,e){return e.root},$$CURRENT:function(n,t,e){return n}},It={$$KEEP:function(n){return n},$$PRUNE:function(){},$$DESCEND:function(n,t,e){if(!k(t,"$cond"))return n;var r=void 0;return E(n,function(u,i){f(u)&&(s(u)?(r=[],E(u,function(n){l(n)&&(n=Ln(n,t,e)),d(n)||r.push(n)})):r=Ln(u,t,e),d(r)?delete n[i]:n[i]=r)}),n}},St=j(Et),qt=j(It);return{_internal:Bn,Aggregator:ct,CollectionMixin:{query:function(n,t){return new pt(n).find(this.toJSON(),t)},aggregate:function(n){return new ct(n).run(this.toJSON())}},Cursor:ft,OP_EXPRESSION:Zn,OP_GROUP:nt,OP_PIPELINE:"pipeline",OP_PROJECTION:tt,OP_QUERY:et,Query:pt,VERSION:"2.0.1",addOperators:jn,aggregate:cn,find:bn,remove:_n,setup:Mn}}); | ||
!function(n,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):n.mingo=t()}(this,function(){"use strict";function n(n,t){_(n)&&w(t)}function t(n){switch(u(n)){case Qn:case Wn:return N(n,t);default:return n}}function r(n){switch(u(n)){case Qn:return L([],n);case Wn:return Object.assign({},n);default:return n}}function e(n){return null===n?"Null":void 0===n?"Undefined":n.constructor.name}function u(n){return e(n).toLowerCase()}function i(n){return u(n)===Jn}function o(n){return u(n)===Hn}function a(n){return u(n)===zn}function s(n){return u(n)===Qn}function c(n){return!d(n)&&k(n,"length")}function l(n){return u(n)===Wn}function f(n){return n===Object(n)}function v(n){return u(n)===Vn}function h(n){return u(n)===Kn}function p(n){return u(n)===Gn}function d(n){return $(n)||g(n)}function $(n){return u(n)===Fn}function g(n){return u(n)===Yn}function m(n,t){return n.some(C.bind(null,t))}function y(n,t){return!m(n,t)}function b(n){return!!n}function _(n){return!n}function x(n){return d(n)||s(n)&&0===n.length||l(n)&&0===j(n).length||!n}function O(n){return s(n)?n:[n]}function k(n,t){return n.hasOwnProperty(t)}function w(n){throw new Error(n)}function j(n){return Object.keys(n)}function M(t,r){var e=arguments.length>2&&void 0!==arguments[2]?arguments[2]:null;if(n(t===Object(t),"Cannot iterate over object of type '"+u(t)+"'"),c(t))for(var i=0,o=t.length;i<o&&!1!==r.call(e,t[i],i,t);i++);else for(var a in t)if(k(t,a)&&!1===r.call(e,t[a],a,t))break}function N(n,t){var r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:null;if(s(n))return n.map(t,r);if(l(n)){var e={};return M(n,function(n,u){return e[u]=t.call(r,n,u)},n),e}}function A(n,t,r){return s(n)?n.reduce(t,r):(M(n,function(e,u){return r=t(r,e,u,n)}),r)}function E(n,t){return n.filter(m.bind(null,t))}function I(n,t){return L(L([],n),t.filter(y.bind(null,n)))}function S(t){function r(n,t){for(var e=0,i=n.length;e<i;e++)s(n[e])&&(t>0||t<0)?r(n[e],Math.max(-1,t-1)):u.push(n[e])}var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:-1;n(s(t),"Input must be an Array");var u=[];return r(t,e),u}function q(n,t){if(t<1)return n;for(;t--&&s(n)&&1===n.length;)n=n[0];return n}function C(n,t){for(var r=[n],e=[t];r.length>0;)if(n=r.pop(),t=e.pop(),n!==t){var i=u(n);if(i!==u(t)||i===Gn)return!1;switch(i){case Qn:if(n.length!==t.length)return!1;L(r,n),L(e,t);break;case Wn:var o=j(n),a=j(t);if(o.length!==a.length)return!1;o.sort(),a.sort();for(var s=0,c=o.length;s<c;s++){var l=o[s];if(l!==a[s])return!1;r.push(n[l]),e.push(t[l])}break;default:if(T(n)!==T(t))return!1}}return 0===r.length}function P(n){var t={},r=[];return M(n,function(n){var e=R(n);k(t,e)||(r.push(n),t[e]=0)}),r}function T(n){var t=u(n);switch(t){case Jn:case zn:case Kn:return n.toString();case Hn:return JSON.stringify(n);case Vn:return n.toISOString();case Fn:case Yn:return t;case Qn:return"["+N(n,T)+"]";default:var r=t===Wn?"":""+e(n),i=j(n);return i.sort(),r+"{"+N(i,function(t){return T(t)+":"+T(n[t])})+"}"}}function R(n){var t=0,r=T(n),e=r.length;if(0===e)return t;for(;e;)t=(t<<5)-t+r.charCodeAt(--e)|0;return t}function U(n,t){for(var r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:null,e={},u=[],i=n.length,o=[],a=0;a<i;a++){var s=n[a],c=t.call(r,s,a);if(d(c))o.push(s);else{var l=R(s);k(e,l)||(e[l]=[c,a]),u.push(s)}}return u.sort(function(n,t){var r=e[R(n)],u=e[R(t)];return r[0]<u[0]?-1:r[0]>u[0]?1:r[1]<u[1]?-1:r[1]>u[1]?1:0}),L(o,u)}function D(n,t,r){var e={keys:[],groups:[]},u={};return M(n,function(n){var i=t.call(r,n),o=R(i),a=-1;g(u[o])&&(a=e.keys.length,u[o]=a,e.keys.push(i),e.groups.push([])),a=u[o],e.groups[a].push(n)}),e}function L(n,t){return Array.prototype.push.apply(n,t),n}function B(n,t){for(var r=0,e=n.length-1;r<=e;){var u=Math.round(r+(e-r)/2);if(t<n[u])e=u-1;else{if(!(t>n[u]))return u;r=u+1}}return r}function F(n){var t=this;return function(r){return function(){for(var e=arguments.length,u=Array(e),i=0;i<e;i++)u[i]=arguments[i];var o=R(u);return k(r,o)||(r[o]=n.apply(t,u)),r[o]}}({})}function Y(n,r){var e=j(r);return 0===e.length?n:N(n,function(n){var u=t(n);return M(e,function(t){var e=Rn(n,r[t]);Cn(u,t,e)}),u})}function J(t,r){var u=r.boundaries,i=r.default,o=u[0],a=u[u.length-1],s=r.output||{count:{$sum:1}};n(u.length>2,"$bucket 'boundaries' expression must have at least 3 elements");for(var c=e(o),l=0,f=u.length-1;l<f;l++)n(c===e(u[l+1]),"$bucket 'boundaries' must all be of the same type"),n(u[l]<u[l+1],"$bucket 'boundaries' must be sorted in ascending order");!d(i)&&e(r.default)===e(o)&&n(o>r.default||a<r.default,"$bucket 'default' expression must be out of boundaries range");var v={};return M(u,function(n){return v[n]=[]}),d(i)||(v[i]=[]),M(t,function(t){var e=Rn(t,r.groupBy);if(d(e)||e<o||e>=a)n(!d(i),"$bucket require a default for out of range values"),v[i].push(t);else{n(e>=o&&e<a,"$bucket 'groupBy' expression must resolve to a value in range of boundaries");var s=B(u,e),c=u[Math.max(0,s-1)];v[c].push(t)}}),u.pop(),d(i)||u.push(i),N(u,function(n){var t=En(v[n],null,s);return Object.assign(t,{_id:n})})}function z(t,r){var e=r.output||{count:{$sum:1}},u=r.groupBy,i=r.buckets;n(i>0,"The $bucketAuto 'buckets' field must be greater than 0, but found: "+i);for(var o=Math.max(1,Math.round(t.length/i)),a=F(Rn),s={},c=[],l=U(t,function(n){var t=a(n,u);return d(t)?c.push(n):(s[t]||(s[t]=[]),s[t].push(n)),t}),f=Nn(),v=[],h=0,p=0,$=l.length;p<i&&h<$;p++){for(var g={},m=[],y=0;y<o&&h<$;y++){var b=a(l[h],u);if(d(b)&&(b=null),L(m,d(b)?c:s[b]),h+=d(b)?c.length:s[b].length,k(g,"min")||(g.min=b),v.length>0){v[v.length-1][f].max=g.min}}p==i-1&&L(m,l.slice(h)),v.push(Object.assign(En(m,null,e),{_id:g}))}return v.length>0&&(v[v.length-1][f].max=a(l[l.length-1],u)),v}function H(t,r){n(o(r)&&""!==r.trim()&&-1===r.indexOf(".")&&"$"!==r.trim()[0],"Invalid expression value for $count");var e={};return e[r]=t.length,e}function V(n,t){return N(t,function(t){return sn(n,t)})}function K(n,t){var r=Nn(),e=t[r],u=D(n,function(n){return Rn(n,e,e)}),i=[];return delete t[r],M(u.keys,function(n,e){var o={};g(n)||(o[r]=n),M(t,function(n,t){o[t]=En(u.groups[e],t,n)}),i.push(o)}),i}function Q(n,t){return n.slice(0,t)}function W(t,e){function u(n){return R(d(n)?null:n)}var i=e.from,a=e.localField,c=e.foreignField,l=e.as;n(s(i)&&o(c)&&o(a)&&o(l),"$lookup: invalid argument");var f={};return M(i,function(n){var t=u(n[c]);f[t]=f[t]||[],f[t].push(n)}),N(t,function(n){var t=u(n[a]),e=r(n);return e[l]=f[t]||[],e})}function G(n,t){return new vt(t).find(n).all()}function X(t,r){return n(s(r),"$out: argument must be an array"),L(r,t),t}function Z(r,e){if(x(e))return r;var u=[],i=j(e),s=!1,c=Nn(),f=[!1,!1];if(M(e,function(t,r){r!==c&&(0===t||!1===t?f[0]=!0:f[1]=!0,n(f[0]!==f[1],"Projection cannot have a mix of inclusion and exclusion."))}),m(i,c)){var v=e[c];0!==v&&!1!==v||(i=i.filter(y.bind(null,[c])),n(y(i,c),"Must not contain collections id key"),s=x(i))}else i.push(c);return M(r,function(n){var r={},f=!1,v=!1,h=[];s&&h.push(c),M(i,function(t){var u=e[t],i=void 0;if(t!==c&&m([0,!1],u)&&(v=!0),t===c&&x(u))i=n[t];else if(o(u))i=Rn(n,u,t);else if(m([1,!0],u));else{if(!l(u))return void h.push(t);var s=j(u);s=!(s.length>1)&&s[0],m(wn(tt),s)?"$slice"===s?O(u[s]).every(a)?(i=et[s](n,u[s],t),f=!0):i=Rn(n,u,t):i=et[s](n,u[s],t):i=Rn(n,u,t)}var p=Sn(n,t);g(p)||Object.assign(r,p),y([0,1,!1,!0],u)&&(g(i)?Pn(r,t):Cn(r,t,i))}),(f||v||s)&&(r=Object.assign({},n,r),h.length>0&&(r=t(r),M(h,function(n){return Pn(r,n)}))),u.push(r)}),u}function nn(n,r){return N(n,function(n){return Ln(t(n),r)})}function tn(t,r){return N(t,function(t){return t=Rn(t,r.newRoot),n(l(t),"$replaceRoot expression must return an object"),t})}function rn(t,r){var e=r.size;n(a(e),"$sample size must be a positive integer");for(var u=[],i=t.length,o=0;o<e;o++){var s=Math.floor(Math.random()*i);u.push(t[s])}return u}function en(n,t){return n.slice(t)}function un(n,t){if(!x(t)&&l(t)){M(j(t).reverse(),function(r){var e=D(n,function(n){return In(n,r)}),u={},i=function(n){return u[R(n)]},o=U(e.keys,function(n,t){return u[R(n)]=t,n});-1===t[r]&&o.reverse(),n=[],M(o,function(t){return L(n,e.groups[i(t)])})})}return n}function on(n,t){var r={count:{$sum:1}};return r[Nn()]=t,this.$sort(this.$group(n,r),{count:-1})}function an(n,t){o(t)&&(t={path:t});var e=t.path.substr(1),u=t.includeArrayIndex||!1,i=t.preserveNullAndEmptyArrays||!1,a=[],c=function(n,t){!1!==u&&(n[u]=t),a.push(n)};return M(n,function(n){var t=An(n,e);if(s(t))if(0===t.length&&!0===i){var u=r(n);delete u[e],c(u,null)}else M(t,function(t,u){var i=r(n);i[e]=t,c(i,u)});else x(t)&&!0!==i||c(r(n),null)}),a}function sn(t,r){return n(s(r),"Aggregation pipeline must be an array"),new at(r).run(t)}function cn(n,t){return P(this.$push(n,t))}function ln(n,t){var r=this.$push(n,t).filter(a);return A(r,function(n,t){return n+t},0)/(r.length||1)}function fn(n,t){return n.length>0?Rn(n[0],t):void 0}function vn(n,t){return n.length>0?Rn(n[n.length-1],t):void 0}function hn(n,t){return A(this.$push(n,t),function(n,t){return d(n)||t>n?t:n},void 0)}function pn(n,t){return A(this.$push(n,t),function(n,t){return d(n)||t<n?t:n},void 0)}function dn(n,t){return d(t)?n:N(n,function(n){return Rn(n,t)})}function $n(n,t){return Dn({data:this.$push(n,t).filter(a),sampled:!1})}function gn(n,t){return Dn({data:this.$push(n,t).filter(a),sampled:!0})}function mn(n,t){return s(n)?a(t)?n.length*t:A(this.$push(n,t).filter(a),function(n,t){return n+t},0):0}function yn(n,t){return e(n)===e(t)}function bn(n,t,r){return new vt(t).find(n,r)}function _n(n,t){return new vt(t).remove(n)}function xn(n,t){return new Array(Math.max(t-String(n).length+1,0)).join("0")+n}function On(n){if(n<128)return[n];for(var t=n<2048&&1||n<65536&&2||3,r=Ot[t-1],e=[(n>>6*t)+r];t>0;)e.push(128|n>>6*--t&63);return e}function kn(n){for(var t=[],r=0,e=n.length;r<e;r++)t.push(On(n.codePointAt(r)));return t}function wn(){return A(arguments,function(n,t){return L(n,j(jt[t]))},[])}function jn(t,r){var e=r(Bn());n(k(jt,t),"Invalid operator class "+t);var u=jt[t];M(e,function(r,e){n(/^\$\w+$/.test(e),"Invalid operator name "+e),n(!k(u,e),e+" already exists for '"+t+"' operators")});var o={};switch(t){case rt:M(e,function(t,r){o[r]=function(t,e){return function(u,o){return{test:function(a){var s=In(a,u),c=t.call(e,u,s,o);return n(i(c),r+" must return a boolean"),c}}}}(t,e)});break;case tt:M(e,function(n,t){o[t]=function(n,t){return function(r,e,u){var i=In(r,u);return n.call(t,u,i,e)}}(n,e)});break;default:M(e,function(n,t){o[t]=function(n,t){return function(){for(var r=arguments.length,e=Array(r),u=0;u<r;u++)e[u]=arguments[u];return n.apply(t,e)}}(n,e)})}Object.assign(jt[t],o)}function Mn(n){Object.assign(Mt,n||{})}function Nn(){return Mt.key}function An(n,t){return f(n)?n[t]:void 0}function En(t,r,e){if(m(wn(nt),r))return st[r](t,e);if(l(e)){var u={};return M(e,function(r,i){if(u[i]=En(t,i,e[i]),m(wn(nt),i))return u=u[i],n(1===j(e).length,"Invalid $group expression '"+JSON.stringify(e)+"'"),!1}),u}}function In(n,t,r){function e(n,t){for(var r=n,i=0;i<t.length;i++){var o=t[i];if(null===o.match(/^\d+$/)&&s(r)){if(0===i&&u>0)break;u+=1,t=t.slice(i),r=A(r,function(n,r){var u=e(r,t);return void 0!==u&&n.push(u),n},[]);break}if(void 0===(r=An(r,o)))break}return r}var u=0;return r=r||{meta:!1},n=e(n,t.split(".")),r.meta?{result:n,depth:u}:n}function Sn(t,r){var e=r.split("."),u=e[0],i=1===e.length||e.slice(1).join("."),o=null!==u.match(/^\d+$/),a=e.length>1,c=void 0,l=void 0;try{s(t)?o?(c=An(t,u),a&&(c=Sn(c,i)),n(!g(c)),c=[c]):(c=[],M(t,function(n){void 0!==(l=Sn(n,r))&&c.push(l)}),n(c.length>0)):(l=An(t,u),a&&(l=Sn(l,i)),n(void 0!==l),c={},c[u]=l)}catch(n){c=void 0}return c}function qn(n,t,r){var e=arguments.length>3&&void 0!==arguments[3]&&arguments[3],u=t.split("."),i=u[0],o=1===u.length||u.slice(1).join(".");if(1===u.length)r(n,i);else if(s(n)&&!/^\d+$/.test(i))M(n,function(n){qn(n,t,r,e)});else{if(!0===e){var a=k(n,i);a&&!d(n[i])||(n[i]={})}qn(n[i],o,r,e)}}function Cn(n,t,r){qn(n,t,function(n,t){n[t]=r},!0)}function Pn(n,t){qn(n,t,function(n,t){s(n)&&/^\d+$/.test(t)?n.splice(parseInt(t),1):l(n)&&delete n[t]})}function Tn(n){if(m(Xn,u(n)))return h(n)?{$regex:n}:{$eq:n};if(f(n)){var t=j(n);if(0===E(wn(rt),t).length)return{$eq:n};if(m(t,"$regex")){var r=n.$regex,e=n.$options||"",i="";o(r)&&(i+=r.ignoreCase||e.indexOf("i")>=0?"i":"",i+=r.multiline||e.indexOf("m")>=0?"m":"",i+=r.global||e.indexOf("g")>=0?"g":"",r=new RegExp(r,i)),n.$regex=r,delete n.$options}}return n}function Rn(t,r){var e=arguments.length>2&&void 0!==arguments[2]?arguments[2]:null,i=arguments.length>3&&void 0!==arguments[3]?arguments[3]:{};if(i.root=i.root||t,m(wn(Zn),e))return wt[e](t,r,i);if(m(wn(nt),e))return t=Rn(t,r,null,i),n(s(t),e+" expression must resolve to an array"),st[e](t,null,i);if(o(r)&&r.length>0&&"$"===r[0]){if(m(Et,r))return Nt[r](t,null,i);if(m(It,r))return r;var a=Et.filter(function(n){return 0===r.indexOf(n+".")});return 1===a.length&&(a=a[0],"$$ROOT"===a&&(t=i.root),r=r.substr(a.length)),In(t,r.slice(1))}switch(u(r)){case Qn:return r.map(function(n){return Rn(t,n)});case Wn:var c={};return M(r,function(e,u){if(c[u]=Rn(t,e,u,i),m(wn(Zn,nt),u))return n(1===j(r).length,"Invalid aggregation expression '"+JSON.stringify(r)+"'"),c=c[u],!1}),c;default:return r}}function Un(t,r){var e=arguments.length>2&&void 0!==arguments[2]?arguments[2]:null;return d(e)?r<0?(r=Math.max(0,t.length+r),e=t.length-r+1):(e=r,r=0):(r<0&&(r=Math.max(0,t.length+r)),n(e>0,"Invalid argument value for $slice operator. Limit must be a positive number"),e+=r),t.slice(r,e)}function Dn(n){var t=A(n.data,function(n,t){return n+t},0),r=n.data.length||1,e=n.sampled&&1||0,u=t/r;return Math.sqrt(A(n.data,function(n,t){return n+Math.pow(t-u,2)},0)/(r-e))}function Ln(n,t){var r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};r.root=r.root||n;var e=Rn(n,t,null,r);return m(It,e)?At[e](n,t,r):e}function Bn(){return{assert:n,computeValue:Rn,clone:r,cloneDeep:t,each:M,err:w,getHash:R,getType:e,has:k,idKey:Nn,includes:m.bind(null),isArray:s,isBoolean:i,isDate:v,isEmpty:x,isEqual:C,isFunction:p,isNil:d,isNull:$,isNumber:a,isObject:l,isRegExp:h,isString:o,isUndefined:g,keys:j,map:N,ops:wn,resolve:In,resolveObj:Sn,reduce:A}}var Fn="null",Yn="undefined",Jn="boolean",zn="number",Hn="string",Vn="date",Kn="regexp",Qn="array",Wn="object",Gn="function",Xn=[Fn,Yn,Jn,zn,Hn,Vn,Kn],Zn="expression",nt="group",tt="projection",rt="query",et={$:function(n,t,r){w("$ not implemented")},$elemMatch:function(t,r,e){var u=In(t,e),i=new vt(r);n(s(u),"$elemMatch: invalid argument");for(var o=0;o<u.length;o++)if(i.test(u[o]))return[u[o]]},$slice:function(t,r,e){var u=In(t,e);return s(u)?s(r)?Un(u,r[0],r[1]):(n(a(r),"$slice: invalid arguments for projection"),Un(u,r)):u}},ut={$addFields:Y,$bucket:J,$bucketAuto:z,$count:H,$facet:V,$group:K,$limit:Q,$lookup:W,$match:G,$out:X,$project:Z,$redact:nn,$replaceRoot:tn,$sample:rn,$skip:en,$sort:un,$sortByCount:on,$unwind:an},it=function(n,t){if(!(n instanceof t))throw new TypeError("Cannot call a class as a function")},ot=function(){function n(n,t){for(var r=0;r<t.length;r++){var e=t[r];e.enumerable=e.enumerable||!1,e.configurable=!0,"value"in e&&(e.writable=!0),Object.defineProperty(n,e.key,e)}}return function(t,r,e){return r&&n(t.prototype,r),e&&n(t,e),t}}(),at=function(){function t(n){it(this,t),this.__operators=n}return ot(t,[{key:"run",value:function(t,r){return x(this.__operators)||M(this.__operators,function(e){var u=j(e);n(1===u.length&&m(wn("pipeline"),u[0]),"Invalid aggregation operator "+u),u=u[0],t=r&&r instanceof vt?ut[u].call(r,t,e[u]):ut[u](t,e[u])}),t}}]),t}(),st={$addToSet:cn,$avg:ln,$first:fn,$last:vn,$max:hn,$min:pn,$push:dn,$stdDevPop:$n,$stdDevSamp:gn,$sum:mn},ct=function(){function t(n,r,e){it(this,t),this.__query=r,this.__collection=n,this.__projection=e||r.__projection,this.__operators={},this.__result=!1,this.__position=0}return ot(t,[{key:"_fetch",value:function(){var t=this;if(!1!==this.__result)return this.__result;l(this.__projection)&&Object.assign(this.__operators,{$project:this.__projection}),n(s(this.__collection),"Input collection is not of valid type. Must be an Array."),this.__result=this.__collection.filter(this.__query.test,this.__query);var r=[];if(M(["$sort","$skip","$limit","$project"],function(n){if(k(t.__operators,n)){var e={};e[n]=t.__operators[n],r.push(e)}}),r.length>0){var e=new at(r);this.__result=e.run(this.__result,this.__query)}return this.__result}},{key:"all",value:function(){return this._fetch()}},{key:"first",value:function(){return this.count()>0?this._fetch()[0]:null}},{key:"last",value:function(){return this.count()>0?this._fetch()[this.count()-1]:null}},{key:"count",value:function(){return this._fetch().length}},{key:"skip",value:function(n){return Object.assign(this.__operators,{$skip:n}),this}},{key:"limit",value:function(n){return Object.assign(this.__operators,{$limit:n}),this}},{key:"sort",value:function(n){return Object.assign(this.__operators,{$sort:n}),this}},{key:"next",value:function(){return this.hasNext()?this._fetch()[this.__position++]:null}},{key:"hasNext",value:function(){return this.count()>this.__position}},{key:"map",value:function(n){return this._fetch().map(n)}},{key:"forEach",value:function(n){M(this._fetch(),n)}},{key:Symbol.iterator,value:function(){var n=this;return{next:function(){return n.hasNext()?{done:!1,value:n.next()}:{done:!0}}}}}]),t}(),lt={$eq:function(n,t){if(C(n,t))return!0;if(d(n)&&d(t))return!0;if(s(n)){var r=C.bind(null,t);return n.some(r)||S(n,1).some(r)}return!1},$ne:function(n,t){return!this.$eq(n,t)},$in:function(n,t){return E(O(n),t).length>0},$nin:function(n,t){return d(n)||!this.$in(n,t)},$lt:function(n,t){return!g(O(n).find(function(n){return yn(n,t)&&n<t}))},$lte:function(n,t){return!g(O(n).find(function(n){return yn(n,t)&&n<=t}))},$gt:function(n,t){return!g(O(n).find(function(n){return yn(n,t)&&n>t}))},$gte:function(n,t){return!g(O(n).find(function(n){return yn(n,t)&&n>=t}))},$mod:function(n,t){return!g(O(n).find(function(n){return a(n)&&s(t)&&2===t.length&&n%t[0]===t[1]}))},$regex:function(n,t){n=O(n);var r=function(n){return o(n)&&!!n.match(t)};return n.some(r)||S(n,1).some(r)},$exists:function(n,t){return(!1===t||0===t)&&d(n)||(!0===t||1===t)&&!d(n)},$all:function(n,t){var r=!1;if(s(n)&&s(t))for(var e=0,u=t.length;e<u;e++){if(!l(t[e])||!m(j(t[e]),"$elemMatch"))return E(t,n).length===u;r=r||this.$elemMatch(n,t[e].$elemMatch)}return r},$size:function(n,t){return s(n)&&a(t)&&n.length===t},$elemMatch:function(n,t){if(s(n)&&!x(n))for(var r=new vt(t),e=0,u=n.length;e<u;e++)if(r.test(n[e]))return!0;return!1},$type:function(n,t){switch(t){case 1:case"double":return a(n)&&-1!==(n+"").indexOf(".");case 2:case Hn:return o(n);case 3:case Wn:return l(n);case 4:case Qn:return s(n);case 6:case Yn:return d(n);case 8:case"bool":return i(n);case 9:case Vn:return v(n);case 10:case Fn:return $(n);case 11:case"regex":return h(n);case 16:case"int":return a(n)&&n<=2147483647&&-1===(n+"").indexOf(".");case 18:case"long":return a(n)&&n>2147483647&&n<=0x8000000000000000&&-1===(n+"").indexOf(".");case 19:case"decimal":return a(n);default:return!1}}},ft={$and:function(t,r){n(s(r),"Invalid expression: $and expects value to be an Array");var e=[];return M(r,function(n){return e.push(new vt(n))}),{test:function(n){for(var t=0;t<e.length;t++)if(!e[t].test(n))return!1;return!0}}},$or:function(t,r){n(s(r),"Invalid expression. $or expects value to be an Array");var e=[];return M(r,function(n){return e.push(new vt(n))}),{test:function(n){for(var t=0;t<e.length;t++)if(e[t].test(n))return!0;return!1}}},$nor:function(t,r){n(s(r),"Invalid expression. $nor expects value to be an Array");var e=this.$or("$or",r);return{test:function(n){return!e.test(n)}}},$not:function(n,t){var r={};r[n]=Tn(t);var e=new vt(r);return{test:function(n){return!e.test(n)}}},$where:function(n,t){return p(t)||(t=new Function("return "+t+";")),{test:function(n){return!0===t.call(n)}}}};M(lt,function(n,t){ft[t]=function(n,t){return function(r,e){return{test:function(u){var i=In(u,r,{meta:!0});return i=q(i.result,i.depth),n.call(t,i,e)}}}}(n,lt)});var vt=function(){function t(n){var r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};it(this,t),this.__criteria=n,this.__projection=r,this.__compiled=[],this._compile()}return ot(t,[{key:"_compile",value:function(){var t=this;if(!x(this.__criteria)){n(l(this.__criteria),"Criteria must be of type Object");var r=void 0;M(this.__criteria,function(n,e){"$where"===e?r={field:e,expr:n}:m(["$and","$or","$nor"],e)?t._processOperator(e,e,n):(n=Tn(n),M(n,function(n,r){t._processOperator(e,r,n)})),l(r)&&t._processOperator(r.field,r.field,r.expr)})}}},{key:"_processOperator",value:function(t,r,e){n(m(wn(rt),r),"Invalid query operator '"+r+"' detected"),this.__compiled.push(ft[r](t,e))}},{key:"test",value:function(n){for(var t=0,r=this.__compiled.length;t<r;t++)if(!this.__compiled[t].test(n))return!1;return!0}},{key:"find",value:function(n,t){return new ct(n,this,t)}},{key:"remove",value:function(n){var t=this;return A(n,function(n,r){return t.test(r)||n.push(r),n},[])}}]),t}(),ht={$abs:function(n,t){var r=Rn(n,t);return null===r||void 0===r?null:Math.abs(r)},$add:function(n,t){return A(Rn(n,t),function(n,t){return n+t},0)},$ceil:function(t,r){var e=Rn(t,r);return d(e)?null:(n(a(e)||isNaN(e),"$ceil must be a valid expression that resolves to a number."),Math.ceil(e))},$divide:function(n,t){var r=Rn(n,t);return r[0]/r[1]},$exp:function(t,r){var e=Rn(t,r);return d(e)?null:(n(a(e)||isNaN(e),"$exp must be a valid expression that resolves to a number."),Math.exp(e))},$floor:function(t,r){var e=Rn(t,r);return d(e)?null:(n(a(e)||isNaN(e),"$floor must be a valid expression that resolves to a number."),Math.floor(e))},$ln:function(t,r){var e=Rn(t,r);return d(e)?null:(n(a(e)||isNaN(e),"$ln must be a valid expression that resolves to a number."),Math.log(e))},$log:function(t,r){var e=Rn(t,r);return n(s(e)&&2===e.length,"$log must be a valid expression that resolves to an array of 2 items"),e.some(d)?null:(n(e.some(isNaN)||e.every(a),"$log expression must resolve to array of 2 numbers"),Math.log10(e[0])/Math.log10(e[1]))},$log10:function(t,r){var e=Rn(t,r);return d(e)?null:(n(a(e)||isNaN(e),"$log10 must be a valid expression that resolves to a number."),Math.log10(e))},$mod:function(n,t){var r=Rn(n,t);return r[0]%r[1]},$multiply:function(n,t){return A(Rn(n,t),function(n,t){return n*t},1)},$pow:function(t,r){var e=Rn(t,r);return n(s(e)&&2===e.length&&e.every(a),"$pow expression must resolve to an array of 2 numbers"),n(!(0===e[0]&&e[1]<0),"$pow cannot raise 0 to a negative exponent"),Math.pow(e[0],e[1])},$sqrt:function(t,r){var e=Rn(t,r);return d(e)?null:(n(a(e)&&e>0||isNaN(e),"$sqrt expression must resolve to non-negative number."),Math.sqrt(e))},$subtract:function(n,t){var r=Rn(n,t);return r[0]-r[1]},$trunc:function(t,r){var e=Rn(t,r);return d(e)?null:(n(a(e)||isNaN(e),"$trunc expression must resolve to a number."),Math.trunc(e))}},pt={$arrayElemAt:function(t,r){var e=Rn(t,r);n(s(e)&&2===e.length,"$arrayElemAt expression must resolve to an array of 2 elements"),n(s(e[0]),"First operand to $arrayElemAt must resolve to an array"),n(a(e[1]),"Second operand to $arrayElemAt must resolve to an integer");var u=e[1];return e=e[0],u<0&&Math.abs(u)<=e.length?e[u+e.length]:u>=0&&u<e.length?e[u]:void 0},$arrayToObject:function(t,r){var e=Rn(t,r);return n(s(e),"$arrayToObject expression must resolve to an array"),A(e,function(t,r){return s(r)&&2==r.length?t[r[0]]=r[1]:(n(l(r)&&k(r,"k")&&k(r,"v"),"$arrayToObject expression is invalid."),t[r.k]=r.v),t},{})},$concatArrays:function(t,r){var e=Rn(t,r,null);return n(s(e),"$concatArrays must resolve to an array"),e.some(d)?null:e.reduce(function(n,t){return L(n,t)},[])},$filter:function(t,r){var e=Rn(t,r.input),u=r.as,i=r.cond;return n(s(e),"$filter 'input' expression must resolve to an array"),e.filter(function(n){var t={};return t["$"+u]=n,!0===Rn(t,i)})},$in:function(t,r){var e=Rn(t,r[0]),u=Rn(t,r[1]);return n(s(u),"$in second argument must be an array"),m(u,e)},$indexOfArray:function(t,r){var e=Rn(t,r);if(d(e))return null;var u=e[0],i=e[1];if(d(u))return null;n(s(u),"$indexOfArray expression must resolve to an array.");var o=e[2]||0,a=e[3];return d(a)&&(a=u.length),o>a?-1:(n(o>=0&&a>=0,"$indexOfArray expression is invalid"),(o>0||a<u.length)&&(u=u.slice(o,a)),u.findIndex(C.bind(null,i))+o)},$isArray:function(n,t){return s(Rn(n,t[0]))},$map:function(t,r){var e=Rn(t,r.input);n(s(e),"$map 'input' expression must resolve to an array");var u=r.as,i=r.in,o="$"+u;return N(e,function(n){return t[o]=n,Rn(t,i)})},$objectToArray:function(t,r){var e=Rn(t,r);n(l(e),"$objectToArray expression must resolve to an object");var u=[];return M(e,function(n,t){return u.push({k:t,v:n})}),u},$range:function(n,t){for(var r=Rn(n,t),e=r[0],u=r[1],i=r[2]||1,o=[];e<u&&i>0||e>u&&i<0;)o.push(e),e+=i;return o},$reduce:function(t,r){var e=Rn(t,r.input),u=Rn(t,r.initialValue),i=r.in;return d(e)?null:(n(s(e),"$reduce 'input' expression must resolve to an array"),A(e,function(n,t){return Rn({$value:n,$this:t},i)},u))},$reverseArray:function(t,r){var e=Rn(t,r);if(d(e))return null;n(s(e),"$reverseArray expression must resolve to an array");var u=[];return L(u,e),u.reverse(),u},$size:function(n,t){var r=Rn(n,t);return s(r)?r.length:void 0},$slice:function(n,t){var r=Rn(n,t);return Un(r[0],r[1],r[2])},$zip:function(t,r){var e=Rn(t,r.inputs),u=r.useLongestLength||!1;n(s(e),"'inputs' expression must resolve to an array"),n(i(u),"'useLongestLength' must be a boolean"),s(r.defaults)&&n(b(u),"'useLongestLength' must be set to true to use 'defaults'");for(var o=0,a=0,c=e.length;a<c;a++){var l=e[a];if(d(l))return null;n(s(l),"'inputs' expression values must resolve to an array or null"),o=u?Math.max(o,l.length):Math.min(o||l.length,l.length)}for(var f=[],v=r.defaults||[],h=0;h<o;h++)!function(n){var t=e.map(function(t,r){return d(t[n])?v[r]||null:t[n]});f.push(t)}(h);return f}},dt={$and:function(n,t){var r=Rn(n,t);return b(r)&&r.every(b)},$or:function(n,t){var r=Rn(n,t);return b(r)&&r.some(b)},$not:function(n,t){return!Rn(n,t[0])}},$t={$cmp:function(n,t){var r=Rn(n,t);return r[0]>r[1]?1:r[0]<r[1]?-1:0}};M(["$eq","$ne","$gt","$gte","$lt","$lte","$nin"],function(n){$t[n]=function(t,r){var e=Rn(t,r);return lt[n](e[0],e[1])}});var gt={$cond:function(t,r){var e=void 0,u=void 0,i=void 0;return s(r)?(n(3===r.length,"$cond: invalid arguments"),e=r[0],u=r[1],i=r[2]):(n(l(r),"$cond: invalid arguments"),e=r.if,u=r.then,i=r.else),Rn(t,e)?Rn(t,u):Rn(t,i)},$switch:function(t,r){var e="Invalid arguments for $switch operator";n(r.branches,e);var u=r.branches.find(function(r){return n(r.case&&r.then,e),Rn(t,r.case)});return u?Rn(t,u.then):(n(r.default,e),Rn(t,r.default))},$ifNull:function(t,r){n(s(r)&&2===r.length,"Invalid arguments for $ifNull operator");var e=Rn(t,r);return d(e[0])?e[1]:e[0]}},mt={"%Y":["$year",4],"%m":["$month",2],"%d":["$dayOfMonth",2],"%H":["$hour",2],"%M":["$minute",2],"%S":["$second",2],"%L":["$millisecond",3],"%j":["$dayOfYear",3],"%w":["$dayOfWeek",1],"%U":["$week",2],"%%":"%"},yt={$dayOfYear:function(n,t){var r=Rn(n,t),e=new Date(r.getFullYear(),0,0),u=r-e;return Math.round(u/864e5)},$dayOfMonth:function(n,t){return Rn(n,t).getDate()},$dayOfWeek:function(n,t){return Rn(n,t).getDay()+1},$year:function(n,t){return Rn(n,t).getFullYear()},$month:function(n,t){return Rn(n,t).getMonth()+1},$week:function(n,t){var r=Rn(n,t);r=new Date(+r),r.setHours(0,0,0),r.setDate(r.getDate()+4-(r.getDay()||7));var e=new Date(r.getFullYear(),0,1);return Math.floor(((r-e)/864e5+1)/7)},$hour:function(n,t){return Rn(n,t).getUTCHours()},$minute:function(n,t){return Rn(n,t).getMinutes()},$second:function(n,t){return Rn(n,t).getSeconds()},$millisecond:function(n,t){return Rn(n,t).getMilliseconds()},$dateToString:function(n,t){for(var r=t.format,e=Rn(n,t.date),u=r.match(/(%%|%Y|%m|%d|%H|%M|%S|%L|%j|%w|%U)/g),i=0,o=u.length;i<o;i++){var a=mt[u[i]],c=a;if(s(a)){var l=this[a[0]],f=a[1];c=xn(l.call(this,n,e),f)}r=r.replace(u[i],c)}return r}},bt={$literal:function(n,t){return t}},_t={$setEquals:function(n,t){var r=Rn(n,t),e=P(r[0]),u=P(r[1]);return e.length===u.length&&e.length===E(e,u).length},$setIntersection:function(n,t){var r=Rn(n,t);return E(r[0],r[1])},$setDifference:function(n,t){var r=Rn(n,t);return r[0].filter(y.bind(null,r[1]))},$setUnion:function(n,t){var r=Rn(n,t);return I(r[0],r[1])},$setIsSubset:function(n,t){var r=Rn(n,t);return E(r[0],r[1]).length===r[0].length},$anyElementTrue:function(n,t){return Rn(n,t)[0].some(b)},$allElementsTrue:function(n,t){return Rn(n,t)[0].every(b)}},xt={$concat:function(n,t){var r=Rn(n,t);return[null,void 0].some(m.bind(null,r))?null:r.join("")},$indexOfBytes:function(t,r){var e=Rn(t,r),u="$indexOfBytes: expression resolves to invalid arguments";if(d(e[0]))return null;n(o(e[0])&&o(e[1]),u);var i=e[0],s=e[1],c=e[2],l=e[3],f=d(c)||a(c)&&c>=0&&Math.round(c)===c;if(f=f&&(d(l)||a(l)&&l>=0&&Math.round(l)===l),n(f,u),c=c||0,l=l||i.length,c>l)return-1;var v=i.substring(c,l).indexOf(s);return v>-1?v+c:v},$split:function(t,r){var e=Rn(t,r);return d(e[0])?null:(n(e.every(o),"$split: invalid argument"),e[0].split(e[1]))},$strLenBytes:function(n,t){return~-encodeURI(Rn(n,t)).split(/%..|./).length},$strLenCP:function(n,t){return Rn(n,t).length},$strcasecmp:function(t,r){var e=Rn(t,r),u=e[0],i=e[1];return C(u,i)||e.every(d)?0:(n(e.every(o),"$strcasecmp: invalid argument"),u=u.toUpperCase(),i=i.toUpperCase(),u>i&&1||u<i&&-1||0)},$substrBytes:function(t,r){var e=Rn(t,r),u=e[0],i=e[1],s=e[2];n(o(u)&&a(i)&&i>=0&&a(s)&&s>=0,"$substrBytes: invalid arguments");for(var c=kn(u),l=[],f=0,v=0;v<c.length;v++)l.push(f),f+=c[v].length;var h=l.indexOf(i),p=l.indexOf(i+s);return n(h>-1&&p>-1,"$substrBytes: Invalid range, start or end index is a UTF-8 continuation byte."),u.substring(h,p)},$substr:function(n,t){var r=Rn(n,t),e=r[0],u=r[1],i=r[2];return o(e)?u<0?"":i<0?e.substr(u):e.substr(u,i):""},$substrCP:function(n,t){return this.$substr(n,t)},$toLower:function(n,t){var r=Rn(n,t);return x(r)?"":r.toLowerCase()},$toUpper:function(n,t){var r=Rn(n,t);return x(r)?"":r.toUpperCase()}},Ot=[192,224,240],kt={$let:function(n,t){var r=t.vars,e=t.in;return M(j(r),function(t){var e=Rn(n,r[t]);n["$"+t]=e}),Rn(n,e)}},wt=Object.assign({},ht,pt,dt,$t,gt,yt,bt,_t,xt,kt),jt={expression:wt,group:st,pipeline:ut,projection:et,query:ft},Mt={key:"_id"},Nt={$$ROOT:function(n,t,r){return r.root},$$CURRENT:function(n,t,r){return n}},At={$$KEEP:function(n){return n},$$PRUNE:function(){},$$DESCEND:function(n,t,r){if(!k(t,"$cond"))return n;var e=void 0;return M(n,function(u,i){f(u)&&(s(u)?(e=[],M(u,function(n){l(n)&&(n=Ln(n,t,r)),d(n)||e.push(n)})):e=Ln(u,t,r),d(e)?delete n[i]:n[i]=e)}),n}},Et=j(Nt),It=j(At);return{_internal:Bn,Aggregator:at,CollectionMixin:{query:function(n,t){return new vt(n).find(this.toJSON(),t)},aggregate:function(n){return new at(n).run(this.toJSON())}},Cursor:ct,OP_EXPRESSION:Zn,OP_GROUP:nt,OP_PIPELINE:"pipeline",OP_PROJECTION:tt,OP_QUERY:rt,Query:vt,VERSION:"2.0.2",addOperators:jn,aggregate:sn,find:bn,remove:_n,setup:Mn}}); | ||
//# sourceMappingURL=dist/mingo.min.map |
@@ -9,3 +9,3 @@ import { OP_EXPRESSION, OP_GROUP, OP_PIPELINE, OP_PROJECTION, OP_QUERY } from './lib/constants' | ||
const VERSION = '2.0.1' | ||
const VERSION = '2.0.2' | ||
@@ -12,0 +12,0 @@ // mingo! |
@@ -8,13 +8,11 @@ import { | ||
import { | ||
addMeta, | ||
assert, | ||
clone, | ||
cloneDeep, | ||
dropMeta, | ||
each, | ||
err, | ||
flatten, | ||
getHash, | ||
getType, | ||
has, | ||
hasMeta, | ||
inArray, | ||
@@ -41,3 +39,4 @@ intersection, | ||
reduce, | ||
truthy | ||
truthy, | ||
unwrap | ||
} from './util' | ||
@@ -143,3 +142,3 @@ import { ops } from './operators/index' | ||
export function getValue (obj, field) { | ||
return obj[field] | ||
return isObjectLike(obj) ? obj[field] : undefined | ||
} | ||
@@ -181,39 +180,39 @@ | ||
* @param selector {String} dot separated path to field | ||
* @param deepFlag {Boolean} flag whether to iterate deeply (default: false) | ||
* @returns {*} | ||
*/ | ||
export function resolve (obj, selector, deepFlag = false) { | ||
let names = selector.split('.') | ||
let value = obj | ||
export function resolve (obj, selector, opt) { | ||
let depth = 0 | ||
function resolve2(o, path) { | ||
let value = o | ||
for (let i = 0; i < path.length; i++) { | ||
let field = path[i] | ||
let isText = field.match(/^\d+$/) === null | ||
for (let i = 0; i < names.length; i++) { | ||
let isText = names[i].match(/^\d+$/) === null | ||
if (isText && isArray(value)) { | ||
// On the first iteration, we check if we received a stop flag. | ||
// If so, we stop to prevent iterating over a nested array value | ||
// on consecutive object keys in the selector. | ||
if (i === 0 && depth > 0) break | ||
if (isText && isArray(value)) { | ||
// On the first iteration, we check if we received a stop flag. | ||
// If so, we stop to prevent iterating over a nested array value | ||
// on consecutive object keys in the selector. | ||
if (deepFlag === true && i === 0) { | ||
return value | ||
} | ||
depth += 1 | ||
path = path.slice(i) | ||
value = value.map((item) => resolve(item, names[i], true)) | ||
// we mark this value as being multi-valued | ||
addMeta(value, { isMulti: true }) | ||
// we unwrap for arrays of unit length | ||
// this avoids excess wrapping when resolving deeply nested arrays | ||
if (value.length === 1) { | ||
value = value[0] | ||
value = reduce(value, (acc, item) => { | ||
let v = resolve2(item, path) | ||
if (v !== undefined) acc.push(v) | ||
return acc | ||
}, []) | ||
break | ||
} else { | ||
value = getValue(value, field) | ||
} | ||
} else { | ||
value = getValue(value, names[i]) | ||
deepFlag = false // reset stop flag when we do a direct lookup | ||
if (value === undefined) break | ||
} | ||
if (isNil(value)) break | ||
return value | ||
} | ||
return value | ||
opt = opt || { meta: false } | ||
obj = resolve2(obj, selector.split('.')) | ||
return opt.meta | ||
? { result: obj, depth: depth } | ||
: obj | ||
} | ||
@@ -251,3 +250,3 @@ | ||
value = resolveObj(item, selector) | ||
if (!isNil(value)) result.push(value) | ||
if (value !== undefined) result.push(value) | ||
}) | ||
@@ -261,3 +260,3 @@ assert(result.length > 0) | ||
} | ||
assert(!isUndefined(value)) | ||
assert(value !== undefined) | ||
result = {} | ||
@@ -374,21 +373,21 @@ result[key] = value | ||
* @param expr the expression for the given field | ||
* @param field the field name (may also be an aggregate operator) | ||
* @param operator the operator to resolve the field with | ||
* @param opt {Object} extra options | ||
* @returns {*} | ||
*/ | ||
export function computeValue (obj, expr, field = null, opt = {}) { | ||
export function computeValue (obj, expr, operator = null, opt = {}) { | ||
opt.root = opt.root || obj | ||
// if the field of the object is a valid operator | ||
if (inArray(ops(OP_EXPRESSION), field)) { | ||
return expressionOperators[field](obj, expr, opt) | ||
if (inArray(ops(OP_EXPRESSION), operator)) { | ||
return expressionOperators[operator](obj, expr, opt) | ||
} | ||
// we also handle $group accumulator operators | ||
if (inArray(ops(OP_GROUP), field)) { | ||
if (inArray(ops(OP_GROUP), operator)) { | ||
// we first fully resolve the expression | ||
obj = computeValue(obj, expr, null, opt) | ||
assert(isArray(obj), field + ' expression must resolve to an array') | ||
assert(isArray(obj), operator + ' expression must resolve to an array') | ||
// we pass a null expression because all values have been resolved | ||
return groupOperators[field](obj, null, opt) | ||
return groupOperators[operator](obj, null, opt) | ||
} | ||
@@ -534,4 +533,5 @@ | ||
resolve, | ||
resolveObj, | ||
reduce | ||
} | ||
} |
@@ -71,5 +71,5 @@ import { | ||
let arr = computeValue(obj, expr, null) | ||
assert(isArray(arr) && arr.length === 2, '$concatArrays expression must resolve to an array of 2 elements') | ||
assert(isArray(arr), '$concatArrays must resolve to an array') | ||
if (arr.some(isNil)) return null | ||
return arr[0].concat(arr[1]) | ||
return arr.reduce((acc, item) => into(acc, item), []) | ||
}, | ||
@@ -76,0 +76,0 @@ |
@@ -132,6 +132,6 @@ import { assert, each, err, getType, isEqual, isString, isNil, isNumber, isEmpty, inArray } from '../../util.js' | ||
} | ||
index = validIndex.indexOf(index) | ||
count = validIndex.indexOf(index + count) | ||
assert(index > -1 && count > -1, '$substrBytes: Invalid range, start or end index is a UTF-8 continuation byte.') | ||
return s.substring(index, count) | ||
let begin = validIndex.indexOf(index) | ||
let end = validIndex.indexOf(index + count) | ||
assert(begin > -1 && end > -1, '$substrBytes: Invalid range, start or end index is a UTF-8 continuation byte.') | ||
return s.substring(begin, end) | ||
}, | ||
@@ -201,7 +201,3 @@ | ||
let utf8 = [(n >> (6 * count)) + offset] | ||
while (count > 0) { | ||
count-- | ||
let t = n >> (6 * count) | ||
utf8.push(0x80 | (t & 0x3F)) | ||
} | ||
while (count > 0) utf8.push(0x80 | ((n >> (6 * --count)) & 0x3F)) | ||
return utf8 | ||
@@ -208,0 +204,0 @@ } |
@@ -21,5 +21,6 @@ /** | ||
assert, | ||
dropMeta, | ||
clone, | ||
each, | ||
hasMeta, | ||
flatten, | ||
getType, | ||
inArray, | ||
@@ -40,3 +41,4 @@ intersection, | ||
isUndefined, | ||
keys | ||
keys, | ||
unwrap, | ||
} from '../util' | ||
@@ -46,2 +48,6 @@ import { computeValue, resolve, normalize } from '../internal.js' | ||
function sameType(a, b) { | ||
return getType(a) === getType(b) | ||
} | ||
export const simpleOperators = { | ||
@@ -63,20 +69,9 @@ | ||
// check | ||
if (isArray(a)) { | ||
// is multi-valued lhs so we check each separately | ||
if (hasMeta(a, { isMulti: true })) { | ||
try { | ||
for (let i = 0; i < a.length; i++) { | ||
if (this.$eq(a[i], b)) { | ||
return true; | ||
} | ||
} | ||
} finally { | ||
dropMeta(a) | ||
} | ||
} else { | ||
// check one level deep | ||
return a.findIndex(isEqual.bind(null, b)) !== -1 | ||
} | ||
let eq = isEqual.bind(null, b) | ||
return a.some(eq) || flatten(a, 1).some(eq) | ||
} | ||
return false; | ||
return false | ||
}, | ||
@@ -125,3 +120,3 @@ | ||
$lt (a, b) { | ||
return !isUndefined(ensureArray(a).find((val) => val < b)) | ||
return !isUndefined(ensureArray(a).find((x) => sameType(x, b) && x < b)) | ||
}, | ||
@@ -137,3 +132,3 @@ | ||
$lte (a, b) { | ||
return !isUndefined(ensureArray(a).find((val) => val <= b)) | ||
return !isUndefined(ensureArray(a).find((x) => sameType(x, b) && x <= b)) | ||
}, | ||
@@ -149,3 +144,3 @@ | ||
$gt (a, b) { | ||
return !isUndefined(ensureArray(a).find((val) => val > b)) | ||
return !isUndefined(ensureArray(a).find((x) => sameType(x, b) && x > b)) | ||
}, | ||
@@ -161,3 +156,3 @@ | ||
$gte (a, b) { | ||
return !isUndefined(ensureArray(a).find((val) => val >= b)) | ||
return !isUndefined(ensureArray(a).find((x) => sameType(x, b) && x >= b)) | ||
}, | ||
@@ -184,3 +179,5 @@ | ||
$regex (a, b) { | ||
return !isUndefined(ensureArray(a).find((val) => isString(val) && isRegExp(b) && (!!val.match(b)))) | ||
a = ensureArray(a) | ||
let match = (x) => isString(x) && !!x.match(b) | ||
return a.some(match) || flatten(a, 1).some(match) | ||
}, | ||
@@ -414,3 +411,4 @@ | ||
// value of field must be fully resolved. | ||
let lhs = resolve(obj, selector) | ||
let lhs = resolve(obj, selector, { meta:true }) | ||
lhs = unwrap(lhs.result, lhs.depth) | ||
return f.call(ctx, lhs, value) | ||
@@ -417,0 +415,0 @@ } |
@@ -87,17 +87,2 @@ /** | ||
// internal constants | ||
const __MINGO_META = '__mingo__' | ||
export function addMeta (obj, value) { | ||
obj[__MINGO_META] = Object.assign(obj[__MINGO_META] || {}, value) | ||
} | ||
export function hasMeta (obj, value) { | ||
return has(obj, __MINGO_META) && isObject(value) && isEqual(Object.assign({}, obj[__MINGO_META], value), obj[__MINGO_META]) | ||
} | ||
export function dropMeta (obj) { | ||
if (has(obj, __MINGO_META)) delete obj[__MINGO_META] | ||
} | ||
/** | ||
@@ -189,6 +174,6 @@ * Iterate over an array or object | ||
let arr = [] | ||
function unwrap(ys, iter) { | ||
function flatten2(ys, iter) { | ||
for (let i = 0, len = ys.length; i < len; i++) { | ||
if (isArray(ys[i]) && (iter > 0 || iter < 0)) { | ||
unwrap(ys[i], Math.max(-1, iter - 1)) | ||
flatten2(ys[i], Math.max(-1, iter - 1)) | ||
} else { | ||
@@ -199,3 +184,3 @@ arr.push(ys[i]) | ||
} | ||
unwrap(xs, depth) | ||
flatten2(xs, depth) | ||
return arr | ||
@@ -205,2 +190,13 @@ } | ||
/** | ||
* Unwrap a single element array to specified depth | ||
* @param {Array} arr | ||
* @param {Number} depth | ||
*/ | ||
export function unwrap(arr, depth) { | ||
if (depth < 1) return arr | ||
while (depth-- && isArray(arr) && arr.length === 1) arr = arr[0] | ||
return arr | ||
} | ||
/** | ||
* Determine whether two values are the same or strictly equivalent | ||
@@ -325,8 +321,8 @@ * | ||
export function getHash (value) { | ||
let hash = 0, i, chr, len, s = encode(value) | ||
if (s.length === 0) return hash | ||
for (i = 0, len = s.length; i < len; i++) { | ||
chr = s.charCodeAt(i) | ||
hash = ((hash << 5) - hash) + chr | ||
hash |= 0 // Convert to 32bit integer | ||
let hash = 0 | ||
let s = encode(value) | ||
let i = s.length | ||
if (i === 0) return hash | ||
while (i) { | ||
hash = (((hash << 5) - hash) + s.charCodeAt(--i)) | 0 // Convert to 32bit integer | ||
} | ||
@@ -333,0 +329,0 @@ return hash |
{ | ||
"name": "mingo", | ||
"version": "2.0.1", | ||
"version": "2.0.2", | ||
"description": "JavaScript implementation of MongoDB query language", | ||
@@ -5,0 +5,0 @@ "main": "dist/mingo.js", |
Sorry, the diff of this file is too big to display
Sorry, the diff of this file is too big to display
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
405276
10561