@wix/filter-builder 1.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (68) hide show
  1. package/dist/cjs/__tests__/filter.spec.js +378 -0
  2. package/dist/cjs/__tests__/filter.spec.js.map +1 -0
  3. package/dist/cjs/__tests__/query-optimizer.spec.js +152 -0
  4. package/dist/cjs/__tests__/query-optimizer.spec.js.map +1 -0
  5. package/dist/cjs/clone.js +27 -0
  6. package/dist/cjs/clone.js.map +1 -0
  7. package/dist/cjs/filter-builder.js +30 -0
  8. package/dist/cjs/filter-builder.js.map +1 -0
  9. package/dist/cjs/filter-mixin.js +299 -0
  10. package/dist/cjs/filter-mixin.js.map +1 -0
  11. package/dist/cjs/filter-validator.js +101 -0
  12. package/dist/cjs/filter-validator.js.map +1 -0
  13. package/dist/cjs/index.js +25 -0
  14. package/dist/cjs/index.js.map +1 -0
  15. package/dist/cjs/query-optimiser.js +211 -0
  16. package/dist/cjs/query-optimiser.js.map +1 -0
  17. package/dist/cjs/type-utils.js +68 -0
  18. package/dist/cjs/type-utils.js.map +1 -0
  19. package/dist/cjs/validator.js +2 -0
  20. package/dist/cjs/validator.js.map +1 -0
  21. package/dist/esm/__tests__/filter.spec.js +211 -0
  22. package/dist/esm/__tests__/filter.spec.js.map +1 -0
  23. package/dist/esm/__tests__/query-optimizer.spec.js +39 -0
  24. package/dist/esm/__tests__/query-optimizer.spec.js.map +1 -0
  25. package/dist/esm/clone.js +18 -0
  26. package/dist/esm/clone.js.map +1 -0
  27. package/dist/esm/filter-builder.js +25 -0
  28. package/dist/esm/filter-builder.js.map +1 -0
  29. package/dist/esm/filter-mixin.js +298 -0
  30. package/dist/esm/filter-mixin.js.map +1 -0
  31. package/dist/esm/filter-validator.js +78 -0
  32. package/dist/esm/filter-validator.js.map +1 -0
  33. package/dist/esm/index.js +6 -0
  34. package/dist/esm/index.js.map +1 -0
  35. package/dist/esm/query-optimiser.js +171 -0
  36. package/dist/esm/query-optimiser.js.map +1 -0
  37. package/dist/esm/type-utils.js +40 -0
  38. package/dist/esm/type-utils.js.map +1 -0
  39. package/dist/esm/validator.js +2 -0
  40. package/dist/esm/validator.js.map +1 -0
  41. package/dist/statics/filter-builder.umd.js +453 -0
  42. package/dist/statics/filter-builder.umd.js.map +1 -0
  43. package/dist/statics/filter-builder.umd.min.js +2 -0
  44. package/dist/statics/filter-builder.umd.min.js.map +1 -0
  45. package/dist/statics/manifest.json +3 -0
  46. package/dist/statics/manifest.min.json +3 -0
  47. package/dist/tsconfig.tsbuildinfo +1 -0
  48. package/dist/types/__tests__/filter.spec.d.ts +2 -0
  49. package/dist/types/__tests__/filter.spec.d.ts.map +1 -0
  50. package/dist/types/__tests__/query-optimizer.spec.d.ts +2 -0
  51. package/dist/types/__tests__/query-optimizer.spec.d.ts.map +1 -0
  52. package/dist/types/clone.d.ts +2 -0
  53. package/dist/types/clone.d.ts.map +1 -0
  54. package/dist/types/filter-builder.d.ts +46 -0
  55. package/dist/types/filter-builder.d.ts.map +1 -0
  56. package/dist/types/filter-mixin.d.ts +42 -0
  57. package/dist/types/filter-mixin.d.ts.map +1 -0
  58. package/dist/types/filter-validator.d.ts +27 -0
  59. package/dist/types/filter-validator.d.ts.map +1 -0
  60. package/dist/types/index.d.ts +7 -0
  61. package/dist/types/index.d.ts.map +1 -0
  62. package/dist/types/query-optimiser.d.ts +2 -0
  63. package/dist/types/query-optimiser.d.ts.map +1 -0
  64. package/dist/types/type-utils.d.ts +11 -0
  65. package/dist/types/type-utils.d.ts.map +1 -0
  66. package/dist/types/validator.d.ts +14 -0
  67. package/dist/types/validator.d.ts.map +1 -0
  68. package/package.json +93 -0
@@ -0,0 +1,211 @@
1
+ "use strict";
2
+
3
+ exports.__esModule = true;
4
+ exports.optimisedQuery = optimisedQuery;
5
+ const optimisations = [optimisedUnaryAnd, optimisedEmptyAnd, optimisedAndsAsObjects, optimisedNestedAnds, optimisedNestedOrs];
6
+
7
+ function optimisedQuery(query) {
8
+ const _fullyOptimised = fullyOptimised(query),
9
+ newQuery = _fullyOptimised[0];
10
+
11
+ return newQuery;
12
+ }
13
+
14
+ function fullyOptimised(query) {
15
+ if (Array.isArray(query)) {
16
+ return fullyOptimisedArray(query);
17
+ }
18
+
19
+ if (typeof query === 'object' && query !== null && !instanceOfIgnoredType(query)) {
20
+ return fullyOptimisedObject(query);
21
+ }
22
+
23
+ return [query, false];
24
+ }
25
+
26
+ function fullyOptimisedArray(query) {
27
+ const optimisedElements = query.map(fullyOptimised);
28
+ const somethingChanged = 0 < optimisedElements.filter(([, elementChanged]) => elementChanged).length;
29
+ const newElements = optimisedElements.map(([element]) => element);
30
+ return [newElements, somethingChanged];
31
+ }
32
+
33
+ function fullyOptimisedObject(query) {
34
+ const _fullEntriesOptimisat = fullEntriesOptimisation(query),
35
+ queryAfterOptimisingEntries = _fullEntriesOptimisat[0],
36
+ changedStage1 = _fullEntriesOptimisat[1];
37
+
38
+ const _fullObjectOptimisati = fullObjectOptimisation(queryAfterOptimisingEntries),
39
+ queryAfterFullOptimisation = _fullObjectOptimisati[0],
40
+ changedStage2 = _fullObjectOptimisati[1];
41
+
42
+ const changed = changedStage1 || changedStage2;
43
+ return [queryAfterFullOptimisation, changed];
44
+
45
+ function fullObjectOptimisation(query) {
46
+ const updatedQuery = applyFirstOptimisation(query);
47
+
48
+ if (!updatedQuery) {
49
+ return [query, false];
50
+ }
51
+
52
+ const _fullyOptimised2 = fullyOptimised(updatedQuery),
53
+ finalQuery = _fullyOptimised2[0];
54
+
55
+ return [finalQuery, true];
56
+ }
57
+
58
+ function fullEntriesOptimisation(query) {
59
+ const changedEntries = Object.entries(query).map(entryOptimisation).filter(([,, changed]) => changed);
60
+ const newQuery = { ...query,
61
+ ...entriesAsObject(changedEntries)
62
+ };
63
+ const changed = !!changedEntries.length;
64
+ return [newQuery, changed];
65
+ }
66
+
67
+ function entryOptimisation([key, value]) {
68
+ const _fullyOptimised3 = fullyOptimised(value),
69
+ newValue = _fullyOptimised3[0],
70
+ changed = _fullyOptimised3[1];
71
+
72
+ return [key, newValue, changed];
73
+ }
74
+
75
+ function entriesAsObject(entries) {
76
+ return entries.reduce((acc, [key, value]) => ({ ...acc,
77
+ [key]: value
78
+ }), {});
79
+ }
80
+ }
81
+
82
+ function applyFirstOptimisation(node) {
83
+ for (const optimisation of optimisations) {
84
+ const newNode = optimisation(node);
85
+
86
+ if (newNode) {
87
+ return newNode;
88
+ }
89
+ }
90
+ }
91
+
92
+ function optimisedUnaryAnd(node) {
93
+ const args = node.$and;
94
+
95
+ if (Array.isArray(args) && args.length === 1) {
96
+ return args[0];
97
+ }
98
+ }
99
+
100
+ function optimisedEmptyAnd(node) {
101
+ const args = node.$and;
102
+
103
+ if (Array.isArray(args) && args.length === 0) {
104
+ return {};
105
+ }
106
+
107
+ return null;
108
+ }
109
+
110
+ function optimisedAndsAsObjects(node) {
111
+ const args = node.$and;
112
+
113
+ if (!args) {
114
+ return;
115
+ }
116
+
117
+ let basicObjects = [];
118
+ let operatorObjects = [];
119
+ args.forEach(arg => {
120
+ if (isOperator(arg)) {
121
+ operatorObjects = [...operatorObjects, arg];
122
+ } else {
123
+ basicObjects = [...basicObjects, arg];
124
+ }
125
+ });
126
+
127
+ if (basicObjects.length <= 1 || haveOverlappingFields(basicObjects)) {
128
+ return;
129
+ }
130
+
131
+ const combinedBasicObjects = Object.assign({}, ...basicObjects);
132
+ return {
133
+ $and: [combinedBasicObjects, ...operatorObjects]
134
+ };
135
+
136
+ function isOperator(node) {
137
+ const keys = Object.keys(node);
138
+ return keys.every(name => name.startsWith('$')) && keys.length > 0;
139
+ }
140
+
141
+ function haveOverlappingFields(objects) {
142
+ const nonUniqueKeys = objects.map(it => Object.keys(it)).reduce((a, b) => [...a, ...b], []);
143
+ const uniqueKeys = unique(nonUniqueKeys);
144
+ return uniqueKeys.length !== nonUniqueKeys.length;
145
+ }
146
+
147
+ function unique(values) {
148
+ const dict = {};
149
+ values.forEach(v => dict[v] = true);
150
+ return Object.keys(dict);
151
+ }
152
+ }
153
+
154
+ function optimisedNestedAnds(node) {
155
+ const args = node.$and;
156
+
157
+ if (!args) {
158
+ return;
159
+ }
160
+
161
+ const hasNestedAnds = !!args.find(it => it.$and);
162
+
163
+ if (!hasNestedAnds) {
164
+ return;
165
+ }
166
+
167
+ const newArgs = args.reduce((result, current) => {
168
+ const and = current.$and;
169
+
170
+ if (!and) {
171
+ return [...result, current];
172
+ }
173
+
174
+ return [...result, ...and];
175
+ }, []);
176
+ return {
177
+ $and: newArgs
178
+ };
179
+ }
180
+
181
+ function optimisedNestedOrs(node) {
182
+ const args = node.$or;
183
+
184
+ if (!args) {
185
+ return;
186
+ }
187
+
188
+ const hasNestedOrs = !!args.find(it => it.$or);
189
+
190
+ if (!hasNestedOrs) {
191
+ return;
192
+ }
193
+
194
+ const newArgs = args.reduce((result, current) => {
195
+ const or = current.$or;
196
+
197
+ if (!or) {
198
+ return [...result, current];
199
+ }
200
+
201
+ return [...result, ...or];
202
+ }, []);
203
+ return {
204
+ $or: newArgs
205
+ };
206
+ }
207
+
208
+ function instanceOfIgnoredType(obj) {
209
+ return obj instanceof Date;
210
+ }
211
+ //# sourceMappingURL=query-optimiser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/query-optimiser.ts"],"names":["optimisations","optimisedUnaryAnd","optimisedEmptyAnd","optimisedAndsAsObjects","optimisedNestedAnds","optimisedNestedOrs","optimisedQuery","query","fullyOptimised","newQuery","Array","isArray","fullyOptimisedArray","instanceOfIgnoredType","fullyOptimisedObject","optimisedElements","map","somethingChanged","filter","elementChanged","length","newElements","element","fullEntriesOptimisation","queryAfterOptimisingEntries","changedStage1","fullObjectOptimisation","queryAfterFullOptimisation","changedStage2","changed","updatedQuery","applyFirstOptimisation","finalQuery","changedEntries","Object","entries","entryOptimisation","entriesAsObject","key","value","newValue","reduce","acc","node","optimisation","newNode","args","$and","basicObjects","operatorObjects","forEach","arg","isOperator","haveOverlappingFields","combinedBasicObjects","assign","keys","every","name","startsWith","objects","nonUniqueKeys","it","a","b","uniqueKeys","unique","values","dict","v","hasNestedAnds","find","newArgs","result","current","and","$or","hasNestedOrs","or","obj","Date"],"mappings":"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","sourcesContent":["const optimisations = [\n optimisedUnaryAnd,\n optimisedEmptyAnd,\n optimisedAndsAsObjects,\n optimisedNestedAnds,\n optimisedNestedOrs,\n]\n\nexport function optimisedQuery(query) {\n const [newQuery] = fullyOptimised(query)\n return newQuery\n}\n\nfunction fullyOptimised(query) {\n if (Array.isArray(query)) {\n return fullyOptimisedArray(query)\n }\n if (\n typeof query === 'object' &&\n query !== null &&\n !instanceOfIgnoredType(query)\n ) {\n return fullyOptimisedObject(query)\n }\n return [query, false]\n}\n\nfunction fullyOptimisedArray(query) {\n const optimisedElements = query.map(fullyOptimised)\n const somethingChanged =\n 0 < optimisedElements.filter(([, elementChanged]) => elementChanged).length\n const newElements = optimisedElements.map(([element]) => element)\n return [newElements, somethingChanged]\n}\n\nfunction fullyOptimisedObject(query) {\n const [queryAfterOptimisingEntries, changedStage1] =\n fullEntriesOptimisation(query)\n const [queryAfterFullOptimisation, changedStage2] = fullObjectOptimisation(\n queryAfterOptimisingEntries\n )\n const changed = changedStage1 || changedStage2\n return [queryAfterFullOptimisation, changed]\n\n function fullObjectOptimisation(query) {\n const updatedQuery = applyFirstOptimisation(query)\n if (!updatedQuery) {\n return [query, false]\n }\n const [finalQuery] = fullyOptimised(updatedQuery)\n return [finalQuery, true]\n }\n\n function fullEntriesOptimisation(query) {\n const changedEntries = Object.entries(query)\n .map(entryOptimisation)\n .filter(([, , changed]) => changed)\n const newQuery = { ...query, ...entriesAsObject(changedEntries) }\n const changed = !!changedEntries.length\n return [newQuery, changed]\n }\n\n function entryOptimisation([key, value]) {\n const [newValue, changed] = fullyOptimised(value)\n return [key, newValue, changed]\n }\n\n function entriesAsObject(entries) {\n return entries.reduce((acc, [key, value]) => ({ ...acc, [key]: value }), {})\n }\n}\n\nfunction applyFirstOptimisation(node) {\n for (const optimisation of optimisations) {\n const newNode = optimisation(node)\n if (newNode) {\n return newNode\n }\n }\n}\n\nfunction optimisedUnaryAnd(node) {\n const args = node.$and\n if (Array.isArray(args) && args.length === 1) {\n return args[0]\n }\n}\n\nfunction optimisedEmptyAnd(node) {\n const args = node.$and\n if (Array.isArray(args) && args.length === 0) {\n return {}\n }\n return null\n}\n\nfunction optimisedAndsAsObjects(node) {\n const args = node.$and\n if (!args) {\n return\n }\n\n let basicObjects: any[] = []\n let operatorObjects: any[] = []\n\n args.forEach((arg) => {\n if (isOperator(arg)) {\n operatorObjects = [...operatorObjects, arg]\n } else {\n basicObjects = [...basicObjects, arg]\n }\n })\n\n if (basicObjects.length <= 1 || haveOverlappingFields(basicObjects)) {\n return\n }\n const combinedBasicObjects = Object.assign({}, ...basicObjects)\n\n return { $and: [combinedBasicObjects, ...operatorObjects] }\n\n function isOperator(node) {\n const keys = Object.keys(node)\n return keys.every((name) => name.startsWith('$')) && keys.length > 0\n }\n\n function haveOverlappingFields(objects) {\n const nonUniqueKeys = objects\n .map((it) => Object.keys(it))\n .reduce((a, b) => [...a, ...b], [])\n const uniqueKeys = unique(nonUniqueKeys)\n return uniqueKeys.length !== nonUniqueKeys.length\n }\n\n function unique(values) {\n const dict = {}\n values.forEach((v) => (dict[v] = true))\n return Object.keys(dict)\n }\n}\n\nfunction optimisedNestedAnds(node) {\n const args = node.$and\n if (!args) {\n return\n }\n\n const hasNestedAnds = !!args.find((it) => it.$and)\n if (!hasNestedAnds) {\n return\n }\n\n const newArgs = args.reduce((result, current) => {\n const and = current.$and\n if (!and) {\n return [...result, current]\n }\n return [...result, ...and]\n }, [])\n return { $and: newArgs }\n}\n\nfunction optimisedNestedOrs(node) {\n const args = node.$or\n if (!args) {\n return\n }\n\n const hasNestedOrs = !!args.find((it) => it.$or)\n if (!hasNestedOrs) {\n return\n }\n\n const newArgs = args.reduce((result, current) => {\n const or = current.$or\n if (!or) {\n return [...result, current]\n }\n return [...result, ...or]\n }, [])\n return { $or: newArgs }\n}\n\nfunction instanceOfIgnoredType(obj) {\n return obj instanceof Date\n}\n"]}
@@ -0,0 +1,68 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+
5
+ exports.__esModule = true;
6
+ exports.isArray = isArray;
7
+ exports.isBoolean = isBoolean;
8
+ exports.isDate = isDate;
9
+ exports.isFunction = isFunction;
10
+ exports.isNull = isNull;
11
+ exports.isNumber = isNumber;
12
+ exports.isObject = isObject;
13
+ exports.isString = isString;
14
+ exports.isUndefined = isUndefined;
15
+ exports.typeForDisplay = typeForDisplay;
16
+
17
+ var _kindOf = _interopRequireDefault(require("kind-of"));
18
+
19
+ function isObject(obj) {
20
+ return (0, _kindOf.default)(obj) === 'object';
21
+ }
22
+
23
+ function isArray(arr) {
24
+ return (0, _kindOf.default)(arr) === 'array';
25
+ }
26
+
27
+ function isDate(obj) {
28
+ return (0, _kindOf.default)(obj) === 'date';
29
+ }
30
+
31
+ function isNumber(obj) {
32
+ return (0, _kindOf.default)(obj) === 'number';
33
+ }
34
+
35
+ function isBoolean(obj) {
36
+ return (0, _kindOf.default)(obj) === 'boolean';
37
+ }
38
+
39
+ function isString(obj) {
40
+ return (0, _kindOf.default)(obj) === 'string';
41
+ }
42
+
43
+ function isFunction(obj) {
44
+ return (0, _kindOf.default)(obj) === 'function';
45
+ }
46
+
47
+ function typeForDisplay(obj) {
48
+ return upperCaseFirst((0, _kindOf.default)(obj));
49
+ }
50
+
51
+ function isUndefined(obj) {
52
+ return (0, _kindOf.default)(obj) === 'undefined';
53
+ }
54
+
55
+ function isNull(obj) {
56
+ return (0, _kindOf.default)(obj) === 'null';
57
+ }
58
+
59
+ function upperCaseFirst(str) {
60
+ if (!isString(str)) {
61
+ return str;
62
+ }
63
+
64
+ const first = str.slice(0, 1).toUpperCase();
65
+ const rest = str.slice(1, str.length);
66
+ return first + rest;
67
+ }
68
+ //# sourceMappingURL=type-utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/type-utils.ts"],"names":["isObject","obj","isArray","arr","isDate","isNumber","isBoolean","isString","isFunction","typeForDisplay","upperCaseFirst","isUndefined","isNull","str","first","slice","toUpperCase","rest","length"],"mappings":";;;;;;;;;;;;;;;;AAAA;;AAEO,SAASA,QAAT,CAAkBC,GAAlB,EAAuB;AAC5B,SAAO,qBAAQA,GAAR,MAAiB,QAAxB;AACD;;AAEM,SAASC,OAAT,CAAiBC,GAAjB,EAAsB;AAC3B,SAAO,qBAAQA,GAAR,MAAiB,OAAxB;AACD;;AAEM,SAASC,MAAT,CAAgBH,GAAhB,EAAqB;AAC1B,SAAO,qBAAQA,GAAR,MAAiB,MAAxB;AACD;;AAEM,SAASI,QAAT,CAAkBJ,GAAlB,EAAuB;AAC5B,SAAO,qBAAQA,GAAR,MAAiB,QAAxB;AACD;;AAEM,SAASK,SAAT,CAAmBL,GAAnB,EAAwB;AAC7B,SAAO,qBAAQA,GAAR,MAAiB,SAAxB;AACD;;AAEM,SAASM,QAAT,CAAkBN,GAAlB,EAAuB;AAC5B,SAAO,qBAAQA,GAAR,MAAiB,QAAxB;AACD;;AAEM,SAASO,UAAT,CAAoBP,GAApB,EAAyB;AAC9B,SAAO,qBAAQA,GAAR,MAAiB,UAAxB;AACD;;AAEM,SAASQ,cAAT,CAAwBR,GAAxB,EAA6B;AAClC,SAAOS,cAAc,CAAC,qBAAQT,GAAR,CAAD,CAArB;AACD;;AAEM,SAASU,WAAT,CAAqBV,GAArB,EAA0B;AAC/B,SAAO,qBAAQA,GAAR,MAAiB,WAAxB;AACD;;AAEM,SAASW,MAAT,CAAgBX,GAAhB,EAAqB;AAC1B,SAAO,qBAAQA,GAAR,MAAiB,MAAxB;AACD;;AAED,SAASS,cAAT,CAAwBG,GAAxB,EAA6B;AAC3B,MAAI,CAACN,QAAQ,CAACM,GAAD,CAAb,EAAoB;AAClB,WAAOA,GAAP;AACD;;AACD,QAAMC,KAAK,GAAGD,GAAG,CAACE,KAAJ,CAAU,CAAV,EAAa,CAAb,EAAgBC,WAAhB,EAAd;AACA,QAAMC,IAAI,GAAGJ,GAAG,CAACE,KAAJ,CAAU,CAAV,EAAaF,GAAG,CAACK,MAAjB,CAAb;AACA,SAAOJ,KAAK,GAAGG,IAAf;AACD","sourcesContent":["import getKind from 'kind-of'\n\nexport function isObject(obj) {\n return getKind(obj) === 'object'\n}\n\nexport function isArray(arr) {\n return getKind(arr) === 'array'\n}\n\nexport function isDate(obj) {\n return getKind(obj) === 'date'\n}\n\nexport function isNumber(obj) {\n return getKind(obj) === 'number'\n}\n\nexport function isBoolean(obj) {\n return getKind(obj) === 'boolean'\n}\n\nexport function isString(obj) {\n return getKind(obj) === 'string'\n}\n\nexport function isFunction(obj) {\n return getKind(obj) === 'function'\n}\n\nexport function typeForDisplay(obj) {\n return upperCaseFirst(getKind(obj))\n}\n\nexport function isUndefined(obj) {\n return getKind(obj) === 'undefined'\n}\n\nexport function isNull(obj) {\n return getKind(obj) === 'null'\n}\n\nfunction upperCaseFirst(str) {\n if (!isString(str)) {\n return str\n }\n const first = str.slice(0, 1).toUpperCase()\n const rest = str.slice(1, str.length)\n return first + rest\n}\n"]}
@@ -0,0 +1,2 @@
1
+
2
+ //# sourceMappingURL=validator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"names":[],"mappings":"","sourcesContent":[]}
@@ -0,0 +1,211 @@
1
+ import chai from 'chai';
2
+ import { filterBuilder } from '..';
3
+ var expect = chai.expect;
4
+ function inAnd() {
5
+ var args = [];
6
+ for (var _i = 0; _i < arguments.length; _i++) {
7
+ args[_i] = arguments[_i];
8
+ }
9
+ return { $and: args };
10
+ }
11
+ describe('filter', function () {
12
+ var filter = filterBuilder();
13
+ describe('filter comparison operators', function () {
14
+ it('should produce the correct filter tree', function () {
15
+ expect(filter.eq('x', 1).getFilterModel()).to.be.eql({ x: 1 });
16
+ expect(filter.ne('x', 1).getFilterModel()).to.be.eql({ x: { $ne: 1 } });
17
+ expect(filter.gt('x', 1).getFilterModel()).to.be.eql({ x: { $gt: 1 } });
18
+ expect(filter.ge('x', 1).getFilterModel()).to.be.eql({ x: { $gte: 1 } });
19
+ expect(filter.lt('x', 1).getFilterModel()).to.be.eql({ x: { $lt: 1 } });
20
+ expect(filter.le('x', 1).getFilterModel()).to.be.eql({ x: { $lte: 1 } });
21
+ expect(filter.isNotEmpty('x').getFilterModel()).to.be.eql({
22
+ x: { $ne: null },
23
+ });
24
+ expect(filter.isEmpty('x').getFilterModel()).to.be.eql({ x: null });
25
+ expect(filter.startsWith('x', 'A').getFilterModel()).to.be.eql({
26
+ x: { $startsWith: 'A' },
27
+ });
28
+ expect(filter.endsWith('x', 'A').getFilterModel()).to.be.eql({
29
+ x: { $endsWith: 'A' },
30
+ });
31
+ expect(filter.contains('x', 'A').getFilterModel()).to.be.eql({
32
+ x: { $contains: 'A' },
33
+ });
34
+ expect(filter.hasSome('x', [1, 2]).getFilterModel()).to.be.eql({
35
+ x: { $hasSome: [1, 2] },
36
+ });
37
+ expect(filter.hasSome('x', 1, 2).getFilterModel()).to.be.eql({
38
+ x: { $hasSome: [1, 2] },
39
+ });
40
+ expect(filter.hasAll('x', [1, 2]).getFilterModel()).to.be.eql({
41
+ x: { $hasAll: [1, 2] },
42
+ });
43
+ expect(filter.hasAll('x', 1, 2).getFilterModel()).to.be.eql({
44
+ x: { $hasAll: [1, 2] },
45
+ });
46
+ });
47
+ it('should accept valid arguments for all types of queries', function () {
48
+ expect(function () { return filter.eq('x', 0); }).to.not.throw(Error);
49
+ expect(function () { return filter.ne('x', 0); }).to.not.throw(Error);
50
+ expect(function () { return filter.gt('x', 0); }).to.not.throw(Error);
51
+ expect(function () { return filter.ge('x', 0); }).to.not.throw(Error);
52
+ expect(function () { return filter.lt('x', 0); }).to.not.throw(Error);
53
+ expect(function () { return filter.le('x', 0); }).to.not.throw(Error);
54
+ expect(function () { return filter.startsWith('x', ''); }).to.not.throw(Error);
55
+ expect(function () { return filter.endsWith('x', ''); }).to.not.throw(Error);
56
+ expect(function () { return filter.contains('x', ''); }).to.not.throw(Error);
57
+ });
58
+ var filterTreeGetters = ['_build', 'getFilterModel'];
59
+ filterTreeGetters.forEach(function (filterTreeGetter) {
60
+ describe(filterTreeGetter, function () {
61
+ it('should throw error if builder is called with too little arguments', function () {
62
+ expect(function () { return filter.eq('x')._build(); }).to.throw('Invalid .eq usage. .eq requires two parameters.');
63
+ expect(function () { return filter.ne('x')._build(); }).to.throw('Invalid .ne usage. .ne requires two parameters.');
64
+ expect(function () { return filter.gt('x')._build(); }).to.throw('Invalid .gt usage. .gt requires two parameters.');
65
+ expect(function () { return filter.ge('x')._build(); }).to.throw('Invalid .ge usage. .ge requires two parameters.');
66
+ expect(function () { return filter.lt('x')._build(); }).to.throw('Invalid .lt usage. .lt requires two parameters.');
67
+ expect(function () { return filter.le('x')._build(); }).to.throw('Invalid .le usage. .le requires two parameters.');
68
+ expect(function () { return filter.startsWith('x')._build(); }).to.throw('Invalid .startsWith usage. .startsWith requires two parameters.');
69
+ expect(function () { return filter.endsWith('x')._build(); }).to.throw('Invalid .endsWith usage. .endsWith requires two parameters.');
70
+ expect(function () { return filter.contains('x')._build(); }).to.throw('Invalid .contains usage. .contains requires two parameters.');
71
+ expect(function () { return filter.isNotEmpty()._build(); }).to.throw('Invalid .isNotEmpty usage. .isNotEmpty requires one parameter.');
72
+ expect(function () { return filter.isEmpty()._build(); }).to.throw('Invalid .isEmpty usage. .isEmpty requires one parameter.');
73
+ expect(function () { return filter.isNotEmpty(1)._build(); }).to.throw('Invalid .isNotEmpty field value [Number]. .isNotEmpty field must be a String.');
74
+ expect(function () { return filter.isEmpty(1)._build(); }).to.throw('Invalid .isEmpty field value [Number]. .isEmpty field must be a String.');
75
+ expect(function () { return filter.or()._build(); }).to.throw('Invalid .or usage. .or requires one parameter.');
76
+ expect(function () { return filter.and()._build(); }).to.throw('Invalid .and usage. .and requires one parameter.');
77
+ expect(function () { return filter.not()._build(); }).to.throw('Invalid .not usage. .not requires one parameter.');
78
+ expect(function () { return filter.between()._build(); }).to.throw('Invalid .between usage. .between requires three parameters.');
79
+ expect(function () { return filter.between('x')._build(); }).to.throw('Invalid .between usage. .between requires three parameters.');
80
+ expect(function () { return filter.between('x', 'x')._build(); }).to.throw('Invalid .between usage. .between requires three parameters.');
81
+ expect(function () { return filter.hasSome('x')._build(); }).to.throw('Invalid .hasSome usage. .hasSome requires at least two parameters.');
82
+ expect(function () { return filter.hasAll('x')._build(); }).to.throw('Invalid .hasAll usage. .hasAll requires at least two parameters.');
83
+ });
84
+ it('should validate the type of the other query', function () {
85
+ expect(function () { return filter.or(null)._build(); }).to.throw('Invalid .or parameter [Null]. .or expects FilterBuilder only.');
86
+ expect(function () { return filter.or({})._build(); }).to.throw('Invalid .or parameter [Object]. .or expects FilterBuilder only.');
87
+ expect(function () { return filter.or([])._build(); }).to.throw('Invalid .or parameter [Array]. .or expects FilterBuilder only.');
88
+ expect(function () { return filter.not(null)._build(); }).to.throw('Invalid .not parameter [Null]. .not expects FilterBuilder only');
89
+ expect(function () { return filter.not({})._build(); }).to.throw('Invalid .not parameter [Object]. .not expects FilterBuilder only');
90
+ expect(function () { return filter.not([])._build(); }).to.throw('Invalid .not parameter [Array]. .not expects FilterBuilder only');
91
+ });
92
+ it('should return filter tree', function () {
93
+ expect(filter.ge('a', 'b').eq('a', 1).le('a', 4)[filterTreeGetter]()).to.be.eql({
94
+ $and: [{ a: { $gte: 'b' } }, { a: 1 }, { a: { $lte: 4 } }],
95
+ });
96
+ expect(filter
97
+ .eq('a', 1)
98
+ .lt('a', 2)
99
+ .or(filter.ge('a', 'b'))[filterTreeGetter]()).to.be.eql({
100
+ $or: [
101
+ { $and: [{ a: 1 }, { a: { $lt: 2 } }] },
102
+ { a: { $gte: 'b' } },
103
+ ],
104
+ });
105
+ expect(filter.eq('a', 3).ne('a', 2)[filterTreeGetter]()).to.be.eql(inAnd({ a: 3 }, { a: { $ne: 2 } }));
106
+ });
107
+ });
108
+ });
109
+ });
110
+ describe('filter.or', function () {
111
+ it('should produce correct filter tree', function () {
112
+ var f = filter.eq('x', 1).or(filter.eq('y', 2));
113
+ expect(f.getFilterModel()).to.be.eql({ $or: [{ x: 1 }, { y: 2 }] });
114
+ expect(f.eq('z', 3).getFilterModel()).to.be.eql(inAnd({ $or: [{ x: 1 }, { y: 2 }] }, { z: 3 }));
115
+ });
116
+ it('should produce valid query if used directly', function () {
117
+ var f = filter.or(filter.eq('x', 1));
118
+ expect(f.filterTree).to.be.eql(inAnd({ $or: [inAnd({ x: 1 })] }));
119
+ });
120
+ });
121
+ describe('filter.and', function () {
122
+ it('should produce correct filter tree', function () {
123
+ var f = filter.eq('x', 1).and(filter.eq('y', 2));
124
+ expect(f.getFilterModel()).to.be.eql({ x: 1, y: 2 });
125
+ expect(f.eq('x', 3).getFilterModel()).to.be.eql({
126
+ $and: [{ x: 1 }, { y: 2 }, { x: 3 }],
127
+ });
128
+ });
129
+ it('should produce valid query if used directly', function () {
130
+ var f = filter.and(filter.eq('x', 1));
131
+ expect(f.filterTree).to.be.eql(inAnd({ $and: [{ x: 1 }] }));
132
+ });
133
+ });
134
+ describe('filter.not', function () {
135
+ it('should produce the correct filter tree', function () {
136
+ var f = filter.eq('x', 1).not(filter.eq('y', 2).eq('z', 3));
137
+ expect(f.getFilterModel()).to.be.eql(inAnd({ x: 1 }, { $not: [{ y: 2, z: 3 }] }));
138
+ });
139
+ });
140
+ describe('between', function () {
141
+ it('should produce the correct filter tree for numbers', function () {
142
+ var f = filter.between('field', 1, 3);
143
+ expect(f.getFilterModel()).to.be.eql(inAnd({ field: { $gte: 1 } }, { field: { $lt: 3 } }));
144
+ });
145
+ it('should produce the correct filter tree for dates', function () {
146
+ var startDate = new Date();
147
+ var endDate = new Date();
148
+ endDate.setYear(startDate.getYear() + 1);
149
+ var f = filter.between('field', startDate, endDate);
150
+ expect(f.getFilterModel()).to.be.eql(inAnd({ field: { $gte: startDate } }, { field: { $lt: endDate } }));
151
+ });
152
+ it('should produce the correct filter tree for strings', function () {
153
+ var f = filter.between('field', 'start', 'end');
154
+ expect(f.getFilterModel()).to.be.eql(inAnd({ field: { $gte: 'start' } }, { field: { $lt: 'end' } }));
155
+ });
156
+ describe('validation', function () {
157
+ var filterTreeGetters = ['_build', 'getFilterModel'];
158
+ filterTreeGetters.forEach(function (filterTreeGetter) {
159
+ describe(filterTreeGetter, function () {
160
+ var invalidExamples = [
161
+ [1, new Date(), 'Number', 'Date'],
162
+ [1, '2015-02-02', 'Number', 'String'],
163
+ [new Date(), '2015-01-01', 'Date', 'String'],
164
+ [null, new Date(), 'Null', 'Date'],
165
+ [undefined, new Date(), 'Undefined', 'Date'],
166
+ ];
167
+ invalidExamples.forEach(function (_a) {
168
+ var first = _a[0], second = _a[1], firstType = _a[2], secondType = _a[3];
169
+ it("should reject invalid query.between('x'," +
170
+ first +
171
+ ',' +
172
+ second +
173
+ ')', function () {
174
+ expect(function () {
175
+ filter.between('x', first, second)[filterTreeGetter]();
176
+ }).to.throw("Invalid .between parameter values [".concat(firstType, "] and [").concat(secondType, "]. Both parameters must be of the same type."));
177
+ expect(function () {
178
+ filter.between('x', second, first)[filterTreeGetter]();
179
+ }).to.throw("Invalid .between parameter values [".concat(secondType, "] and [").concat(firstType, "]. Both parameters must be of the same type."));
180
+ });
181
+ });
182
+ });
183
+ });
184
+ });
185
+ });
186
+ describe('setFilterModel', function () {
187
+ it('should return a new filter instance with the new filterTree value set', function () {
188
+ var newFilter = filter.setFilterModel(inAnd({ a: { $gte: 'b' } }, { a: 1 }, { a: { $lte: 4 } }));
189
+ expect(newFilter).not.to.equal(filter);
190
+ });
191
+ it('should set filterTree to the filterModel value when the value is a valid filterTree', function () {
192
+ var newFilter = filter.setFilterModel(inAnd({ a: { $gte: 'b' } }, { a: 1 }, { a: { $lte: 4 } }));
193
+ expect(newFilter.getFilterModel()).to.be.eql(inAnd({ a: { $gte: 'b' } }, { a: 1 }, { a: { $lte: 4 } }));
194
+ });
195
+ it('should set filterTree to the filterModel value even when the value is not a valid filterTree', function () {
196
+ var newFilter = filter.setFilterModel(5);
197
+ expect(newFilter.getFilterModel()).to.be.eql(5);
198
+ });
199
+ it('should set invalidArguments to an empty array when the value is a valid filterTree', function () {
200
+ var invalidFilter = filter.eq('x');
201
+ var newFilter = invalidFilter.setFilterModel(inAnd({ a: { $gte: 'b' } }, { a: 1 }, { a: { $lte: 4 } }));
202
+ expect(newFilter.invalidArguments).to.be.eql([]);
203
+ });
204
+ it('should set invalidArguments to an empty array when the value is not a valid filterTree', function () {
205
+ var invalidFilter = filter.eq('x');
206
+ var newFilter = invalidFilter.setFilterModel(5);
207
+ expect(newFilter.invalidArguments).to.be.eql([]);
208
+ });
209
+ });
210
+ });
211
+ //# sourceMappingURL=filter.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"filter.spec.js","sourceRoot":"","sources":["../../../src/__tests__/filter.spec.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,39 @@
1
+ import chai from 'chai';
2
+ import { optimisedQuery as optimised } from '../query-optimiser';
3
+ var expect = chai.expect;
4
+ describe('query optimisations', function () {
5
+ describe('$and with single element', function () {
6
+ testCase('gets unwrapped', { $and: [{ a: 1 }] }, { a: 1 });
7
+ });
8
+ describe('$and with object pieces', function () {
9
+ testCase('gets unwrapped as object', { $and: [{ a: 1 }, { b: 2 }] }, { a: 1, b: 2 });
10
+ testCase('remains if keys overlap', { $and: [{ a: 1 }, { b: 2 }, { a: 1 }] }, { $and: [{ a: 1 }, { b: 2 }, { a: 1 }] });
11
+ testCase("nested operators don't get merged", { $and: [{ a: 1 }, { $lte: 4 }, { b: 2 }] }, { $and: [{ a: 1, b: 2 }, { $lte: 4 }] });
12
+ it('merges empty objects', function () {
13
+ var actualOutput = optimised({ $and: [{}, {}, {}] });
14
+ expect(actualOutput).to.be.eql({});
15
+ });
16
+ });
17
+ describe('empty $and', function () {
18
+ testCase('is removed', { $and: [{ $and: [] }] }, {});
19
+ testCase('is removed when nested', { $and: [{ $and: [] }] }, {});
20
+ });
21
+ describe('nested $and', function () {
22
+ testCase('get flattened', {
23
+ $and: [{ a: 1 }, { $and: [{ a: 1 }] }, { $and: [{ a: 1 }, { a: 1 }] }],
24
+ }, { $and: [{ a: 1 }, { a: 1 }, { a: 1 }, { a: 1 }] });
25
+ });
26
+ describe('nested $or', function () {
27
+ testCase('get flattened', { $or: [{ a: 1 }, { $or: [{ a: 1 }] }, { $or: [{ a: 1 }, { a: 1 }] }] }, { $or: [{ a: 1 }, { a: 1 }, { a: 1 }, { a: 1 }] });
28
+ });
29
+ describe('type compatibility', function () {
30
+ testCase('maintains date objects', { x: [new Date('2020-01-01T00:00:00Z')] }, { x: [new Date('2020-01-01T00:00:00Z')] });
31
+ });
32
+ });
33
+ function testCase(description, input, expectedOutput) {
34
+ it(description, function () {
35
+ var actualOutput = optimised(input);
36
+ expect(actualOutput).to.be.eql(expectedOutput);
37
+ });
38
+ }
39
+ //# sourceMappingURL=query-optimizer.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"query-optimizer.spec.js","sourceRoot":"","sources":["../../../src/__tests__/query-optimizer.spec.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ import { isDate } from './type-utils';
2
+ export default function clone(obj) {
3
+ if (obj == null || typeof obj !== 'object') {
4
+ return obj;
5
+ }
6
+ var temp = null;
7
+ if (isDate(obj)) {
8
+ temp = new Date(obj.getTime());
9
+ }
10
+ else {
11
+ temp = obj.constructor();
12
+ for (var key in obj) {
13
+ temp[key] = clone(obj[key]);
14
+ }
15
+ }
16
+ return temp;
17
+ }
18
+ //# sourceMappingURL=clone.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"clone.js","sourceRoot":"","sources":["../../src/clone.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAA;AAErC,MAAM,CAAC,OAAO,UAAU,KAAK,CAAC,GAAG;IAC/B,IAAI,GAAG,IAAI,IAAI,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE;QAC1C,OAAO,GAAG,CAAA;KACX;IAED,IAAI,IAAI,GAAQ,IAAI,CAAA;IAEpB,IAAI,MAAM,CAAC,GAAG,CAAC,EAAE;QACf,IAAI,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC,CAAA;KAC/B;SAAM;QACL,IAAI,GAAG,GAAG,CAAC,WAAW,EAAE,CAAA;QACxB,KAAK,IAAM,GAAG,IAAI,GAAG,EAAE;YACrB,IAAI,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAA;SAC5B;KACF;IAED,OAAO,IAAI,CAAA;AACb,CAAC"}