total5 0.0.1 → 0.0.2

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.
@@ -0,0 +1,440 @@
1
+ // Total.js NoSQL Builder
2
+ // The MIT License
3
+ // Copyright 2020-2023 (c) Peter Širka <petersirka@gmail.com>
4
+
5
+ var PROPCACHE = {};
6
+ var FUNCCACHE = {};
7
+
8
+ F.on('service', function(counter) {
9
+ if (counter % 5 === 0) {
10
+ PROPCACHE = {};
11
+ FUNCCACHE = {};
12
+ }
13
+ });
14
+
15
+ var func = {};
16
+
17
+ func.in = function(a, b) {
18
+ if (a instanceof Array) {
19
+ for (var i = 0; i < a.length; i++) {
20
+ if (b instanceof Array) {
21
+ for (var j = 0; j < b.length; j++) {
22
+ if (a[i] === b[j])
23
+ return true;
24
+ }
25
+ } else if (a[i] === b)
26
+ return true;
27
+ }
28
+ } else {
29
+ if (b instanceof Array)
30
+ return b.indexOf(a) !== -1;
31
+ else if (a === b)
32
+ return true;
33
+ }
34
+ return false;
35
+ };
36
+
37
+ function search(a, b, pos) {
38
+ switch (pos) {
39
+ case 'beg':
40
+ case 1:
41
+ return a.substring(0, b.length) === b;
42
+ case 'end':
43
+ case 2:
44
+ return a.substring(a.length - b.length) === b;
45
+ default:
46
+ return a.indexOf(b) !== -1;
47
+ }
48
+ }
49
+
50
+ func.search = function(a, b, pos) {
51
+
52
+ if (!a || !b)
53
+ return false;
54
+
55
+ if (a instanceof Array) {
56
+ for (var i = 0; i < a.length; i++) {
57
+ if (!a[i])
58
+ continue;
59
+ var av = (a[i] + '').toLowerCase();
60
+ if (b instanceof Array) {
61
+ for (var j = 0; j < b.length; j++) {
62
+ if (!b[j])
63
+ continue;
64
+ var bv = (b[j] + '').toLowerCase();
65
+ if (search(av, bv, pos))
66
+ return true;
67
+ }
68
+ } else if (search(av, (b + '').toLowerCase(), pos))
69
+ return true;
70
+ }
71
+ } else {
72
+ if (b instanceof Array) {
73
+ for (var i = 0; i < b.length; i++) {
74
+ if (!b[i])
75
+ continue;
76
+ var bv = (b[j] + '').toLowerCase();
77
+ if (search(a, bv, pos))
78
+ return true;
79
+ }
80
+ return b.indexOf(a) !== -1;
81
+ } else {
82
+ if (search((a + '').toLowerCase(), (b + '').toLowerCase(), pos))
83
+ return true;
84
+ }
85
+ }
86
+ return false;
87
+ };
88
+
89
+ // Dependencies
90
+ function NoSQLQueryBuilder(db) {
91
+
92
+ var t = this;
93
+ t.tmp = {};
94
+ t.db = db;
95
+ t.response = [];
96
+ t.count = 0;
97
+ t.counter = 0;
98
+ t.scanned = 0;
99
+ t.$take = 9999999;
100
+ t.$skip = 0;
101
+
102
+ t.func = func;
103
+
104
+ // t.$fields
105
+ // t.$sort
106
+ }
107
+
108
+ NoSQLQueryBuilder.prototype.assign = function(meta) {
109
+ var self = this;
110
+ self.cid = meta.cid;
111
+ self.$first = meta.first;
112
+ meta.fields && self.fields(meta.fields);
113
+ meta.sort && self.sort(meta.sort);
114
+ meta.take && self.take(meta.take);
115
+ meta.skip && self.skip(meta.skip);
116
+
117
+ if (meta.paginate)
118
+ self.$paginate = 1;
119
+
120
+ meta.modify && self.modify(meta.modify, meta.modifyarg);
121
+ meta.filter && self.filter(meta.filter, meta.filterarg);
122
+ meta.scalar && self.scalar(meta.scalar, meta.scalararg);
123
+ meta.payload && (self.payload = meta.payload);
124
+ meta.log && self.log(meta.log);
125
+
126
+ if (meta.filter)
127
+ self.filterid = meta.filter;
128
+
129
+ return self;
130
+ };
131
+
132
+ NoSQLQueryBuilder.prototype.fields = function(value) {
133
+ var self = this;
134
+ var tmp = PROPCACHE[value];
135
+ if (!tmp) {
136
+ self.$fieldsremove = [];
137
+ self.$fields = [];
138
+ self.$fieldsall = {};
139
+ var keys = value.split(',').trim();
140
+ for (var i = 0; i < keys.length; i++) {
141
+ var key = keys[i];
142
+ var rename = key.split(' as ');
143
+ if (rename[1]) {
144
+ key = rename[0];
145
+ if (!self.$fieldsrename)
146
+ self.$fieldsrename = {};
147
+ self.$fieldsrename[i] = rename[1].trim();
148
+ self.$fieldsall[self.$fieldsrename[i]] = 1;
149
+ } else if (key[0] !== '-')
150
+ self.$fieldsall[key] = 1;
151
+
152
+ if (key[0] === '-')
153
+ self.$fieldsremove.push(key.substring(1));
154
+ else
155
+ self.$fields.push(key);
156
+ }
157
+ tmp = { rename: self.$fieldsrename, all: self.$fieldsall, map: self.$fields.length ? self.$fields : null, rem: self.$fieldsremove.length ? self.$fieldsremove : null };
158
+ PROPCACHE[value] = tmp;
159
+ if (!self.$fields.length)
160
+ self.$fields = null;
161
+ if (!self.$fieldsremove.length)
162
+ self.$fieldsremove = null;
163
+ } else {
164
+ self.$fields = tmp.map;
165
+ self.$fieldsall = tmp.all;
166
+ self.$fieldsremove = tmp.rem;
167
+ }
168
+ return self;
169
+ };
170
+
171
+ NoSQLQueryBuilder.prototype.transform = function(rule, arg) {
172
+ var self = this;
173
+ if (arg)
174
+ self.transformarg = arg;
175
+
176
+ var key = 'T' + rule;
177
+ var tmp = FUNCCACHE[key];
178
+ if (tmp)
179
+ self.transformrule = tmp;
180
+ else {
181
+ if (isdangerous(rule))
182
+ rule = 'doc';
183
+ FUNCCACHE[key] = self.transformrule = new Function('doc', 'arg', 'tmp', 'func', 'return ' + rule);
184
+ }
185
+
186
+ return self;
187
+ };
188
+
189
+ NoSQLQueryBuilder.prototype.prepare = function(doc) {
190
+
191
+ var self = this;
192
+ var obj;
193
+
194
+ if (self.$fields) {
195
+ obj = {};
196
+ for (var i = 0; i < self.$fields.length; i++) {
197
+ var a = self.$fields[i];
198
+ var b = self.$fields[i];
199
+ if (self.$fieldsrename && self.$fieldsrename[i])
200
+ a = self.$fieldsrename[i];
201
+ obj[a] = doc[b];
202
+ }
203
+
204
+ } else if (self.$fieldsremove) {
205
+
206
+ obj = {};
207
+
208
+ for (var key in doc)
209
+ obj[key] = doc[key];
210
+
211
+ for (var i = 0; i < self.$fieldsremove.length; i++)
212
+ obj[self.$fieldsremove[i]] = undefined;
213
+ }
214
+
215
+ if (self.transformrule) {
216
+
217
+ // Clone data
218
+ if (!obj) {
219
+ obj = {};
220
+ for (var key in doc)
221
+ obj[key] = doc[key];
222
+ }
223
+
224
+ self.transformrule(obj, self.transformarg);
225
+ }
226
+
227
+ return obj || doc;
228
+ };
229
+
230
+ NoSQLQueryBuilder.prototype.push = function(item) {
231
+ var self = this;
232
+ if (self.$sort)
233
+ return sort(self, item);
234
+ self.response.push(item);
235
+ return true;
236
+ };
237
+
238
+ NoSQLQueryBuilder.prototype.take = function(take) {
239
+ this.$take = take;
240
+ return this;
241
+ };
242
+
243
+ NoSQLQueryBuilder.prototype.skip = function(skip) {
244
+ this.$skip = skip;
245
+ return this;
246
+ };
247
+
248
+ NoSQLQueryBuilder.prototype.sort = function(sort) {
249
+
250
+ var self = this;
251
+
252
+ self.$sort = F.TUtils.sortcomparer(sort);
253
+
254
+ if (self.$fields && self.$fields.length) {
255
+ // Internal hack
256
+ var meta = F.temporary.utils['sort_' + sort];
257
+ for (var i = 0; i < meta.length; i++) {
258
+ var sort = meta[i];
259
+ if (!self.$fieldsall[sort.name]) {
260
+ self.$fieldsall[sort.name] = 1;
261
+ if (self.$fields2)
262
+ self.$fields2.push(sort.name);
263
+ else
264
+ self.$fields2 = [sort.name];
265
+ }
266
+ }
267
+ }
268
+
269
+ return self;
270
+ };
271
+
272
+ NoSQLQueryBuilder.prototype.filter = function(rule, arg) {
273
+
274
+ var self = this;
275
+
276
+ self.filterarg = arg || {};
277
+
278
+ var tmp = FUNCCACHE[rule];
279
+ if (tmp)
280
+ self.filterrule = tmp;
281
+ else {
282
+ if (isdangerous(rule))
283
+ rule = 'false';
284
+ try {
285
+ FUNCCACHE[rule] = self.filterrule = new Function('doc', 'arg', 'tmp', 'func', (rule.indexOf('return ') === -1 ? 'return ' : '') + rule);
286
+ } catch (e) {
287
+ self.$sort = null;
288
+ self.error = e + '';
289
+ self.filterrule = filterrule;
290
+ }
291
+ }
292
+
293
+ return self;
294
+ };
295
+
296
+ function modifyrule(doc) {
297
+ return doc;
298
+ }
299
+
300
+ function scalarrule() {
301
+ }
302
+
303
+ function filterrule() {
304
+ return false;
305
+ }
306
+
307
+ NoSQLQueryBuilder.prototype.modify = function(rule, arg) {
308
+
309
+ var self = this;
310
+ var tmp = FUNCCACHE[rule];
311
+
312
+ self.modifyarg = arg || {};
313
+
314
+ if (tmp)
315
+ self.modifyrule = tmp;
316
+ else {
317
+ if (isdangerous(rule, true))
318
+ rule = '';
319
+ try {
320
+ FUNCCACHE[rule] = self.modifyrule = rule ? new Function('doc', 'arg', 'tmp', 'func', rule) : modifyrule;
321
+ } catch (e) {
322
+ self.modifyrule = modifyrule;
323
+ self.error = e + '';
324
+ }
325
+ }
326
+
327
+ return self;
328
+ };
329
+
330
+ NoSQLQueryBuilder.prototype.scalar = function(rule, arg) {
331
+ var self = this;
332
+ var tmp = FUNCCACHE[rule];
333
+
334
+ self.scalararg = arg || {};
335
+
336
+ if (tmp)
337
+ self.scalarrule = tmp;
338
+ else {
339
+ if (isdangerous(rule))
340
+ rule = '';
341
+ try {
342
+ FUNCCACHE[rule] = self.scalarrule = new Function('doc', 'arg', 'tmp', 'func', rule);
343
+ } catch (e) {
344
+ self.scalarrule = scalarrule;
345
+ self.error = e + '';
346
+ }
347
+ }
348
+
349
+ return self;
350
+ };
351
+
352
+ NoSQLQueryBuilder.prototype.done = function() {
353
+
354
+ var self = this;
355
+
356
+ if (!self.$callback && !self.$callback2 && !self.$resolve)
357
+ return;
358
+
359
+ var meta = {};
360
+
361
+ if (self.error)
362
+ meta.error = self.error;
363
+
364
+ meta.cid = self.cid;
365
+ meta.count = self.count;
366
+ meta.counter = self.counter;
367
+ meta.scanned = self.scanned;
368
+ meta.duration = self.duration;
369
+
370
+ if (self.canceled)
371
+ meta.canceled = true;
372
+
373
+ if (!self.$NoSQLReader || self.$NoSQLReader.type === 'update' || self.$NoSQLReader.type === 'remove')
374
+ self.response = meta.counter;
375
+ else if (self.$first)
376
+ self.response = self.response instanceof Array ? self.response[0] : self.response;
377
+ else if (self.scalararg)
378
+ self.response = self.scalararg;
379
+
380
+ self.$callback && self.$callback(null, self.response, meta);
381
+ self.$callback2 && self.$callback2(null, self.response, meta);
382
+ self.$resolve && self.$resolve(self.response);
383
+ };
384
+
385
+ NoSQLQueryBuilder.prototype.prepareresponse = function(response) {
386
+ for (var i = 0; i < response.length; i++)
387
+ response[i] = this.prepare(response[i]);
388
+ };
389
+
390
+ NoSQLQueryBuilder.prototype.callback = function(fn) {
391
+ var self = this;
392
+ self.$callback = fn;
393
+ return self;
394
+ };
395
+
396
+ function isdangerous(rule) {
397
+ return (/require|global/).test(rule);
398
+ }
399
+
400
+ function sort(builder, item) {
401
+ var length = builder.response.length;
402
+ if (length <= builder.$take2) {
403
+ length = builder.response.push(item);
404
+ if (length >= builder.$take2) {
405
+ builder.response.sort(builder.$sort);
406
+ builder.$sorted = true;
407
+ }
408
+ return true;
409
+ } else
410
+ return chunkysort(builder, item);
411
+ }
412
+
413
+ function chunkysort(builder, item) {
414
+
415
+ var beg = 0;
416
+ var length = builder.response.length;
417
+ var tmp = length - 1;
418
+
419
+ var sort = builder.$sort(item, builder.response[tmp]);
420
+ if (sort !== -1)
421
+ return;
422
+
423
+ tmp = length / 2 >> 0;
424
+ sort = builder.$sort(item, builder.response[tmp]);
425
+ if (sort !== -1)
426
+ beg = tmp + 1;
427
+
428
+ for (var i = beg; i < length; i++) {
429
+ var old = builder.response[i];
430
+ var sort = builder.$sort(item, old);
431
+ if (sort !== 1) {
432
+ for (var j = length - 1; j > i; j--)
433
+ builder.response[j] = builder.response[j - 1];
434
+ builder.response[i] = item;
435
+ return true;
436
+ }
437
+ }
438
+ }
439
+
440
+ exports.NoSQLQueryBuilder = NoSQLQueryBuilder;