@xuda.io/xuda-dbs-plugin-xuda 1.0.46 → 1.0.48
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +1 -1
- package/server.js +740 -21
- package/index.mjs +0 -1061
package/server.js
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
const _ = require("lodash");
|
2
2
|
|
3
|
-
const check_unique = async function (e, docP, table_obj) {
|
3
|
+
const check_unique = async function (e, docP, table_obj, db, app_id_reference) {
|
4
4
|
var len = docP.udfIndex.length;
|
5
5
|
if (!len) {
|
6
6
|
return { code: -11, data: "table must have primary index" };
|
@@ -70,9 +70,9 @@ const check_unique = async function (e, docP, table_obj) {
|
|
70
70
|
keyValue.join(",") +
|
71
71
|
"]]";
|
72
72
|
try {
|
73
|
-
// const json = await _this.runtime_xuda_driver("runtime_get_index", e);
|
74
73
|
e.view = "db_index";
|
75
|
-
const
|
74
|
+
const ret = await query_db(e, db, app_id_reference, table_obj);
|
75
|
+
const json = ret.data;
|
76
76
|
|
77
77
|
// var data;
|
78
78
|
|
@@ -186,6 +186,690 @@ const get_cast_val = async function (source, attributeP, typeP, valP) {
|
|
186
186
|
}
|
187
187
|
);
|
188
188
|
};
|
189
|
+
const query_db = async function (e, db, app_id_reference, table_obj) {
|
190
|
+
var key;
|
191
|
+
|
192
|
+
const runtime_get_mango_data = async function () {
|
193
|
+
const done = async function (body) {
|
194
|
+
const raw_data = async function () {
|
195
|
+
var rows = [];
|
196
|
+
|
197
|
+
for await (var val of body.docs) {
|
198
|
+
var data = {};
|
199
|
+
if (e.fields) {
|
200
|
+
for await (const [key2, val2] of Object.entries(
|
201
|
+
typeof e.fields === "string" ? e.fields.split(",") : e.fields
|
202
|
+
)) {
|
203
|
+
if (val.udfData) {
|
204
|
+
data[val2] = val["udfData"]["data"][val2];
|
205
|
+
} else {
|
206
|
+
data[val2] = null;
|
207
|
+
}
|
208
|
+
}
|
209
|
+
} else {
|
210
|
+
for await (const [key2, val2] of Object.entries(
|
211
|
+
table_obj.tableFields
|
212
|
+
)) {
|
213
|
+
if (val.udfData) {
|
214
|
+
data[val2.data.field_id] =
|
215
|
+
val["udfData"]["data"][val2.data.field_id];
|
216
|
+
} else {
|
217
|
+
data[val2.data.field_id] = null;
|
218
|
+
}
|
219
|
+
}
|
220
|
+
}
|
221
|
+
|
222
|
+
rows.push({
|
223
|
+
id: val._id,
|
224
|
+
value: {
|
225
|
+
udfData: { data: data },
|
226
|
+
_id: val._id,
|
227
|
+
_rev: val._rev,
|
228
|
+
},
|
229
|
+
});
|
230
|
+
}
|
231
|
+
|
232
|
+
return { code: 1, data: { rows: rows, total_rows: rows.length } };
|
233
|
+
};
|
234
|
+
const count_data = async function () {
|
235
|
+
var rows = [];
|
236
|
+
var keys_obj = {};
|
237
|
+
const table_index = find_item_by_key_root(
|
238
|
+
table_obj.tableIndexes,
|
239
|
+
"id",
|
240
|
+
e.indexId
|
241
|
+
);
|
242
|
+
if (e.indexId && table_index) {
|
243
|
+
var index_keys = table_index.data.keys;
|
244
|
+
var index_id = e.indexId;
|
245
|
+
|
246
|
+
for await (var val of body.docs) {
|
247
|
+
var data = {};
|
248
|
+
const _tableFieldsObj = find_item_by_key(
|
249
|
+
table_obj.tableFields,
|
250
|
+
"field_id",
|
251
|
+
e.field_id
|
252
|
+
);
|
253
|
+
|
254
|
+
for await (const [key2, val2] of Object.entries(
|
255
|
+
table_obj.tableFields
|
256
|
+
)) {
|
257
|
+
data[val2.data.field_id] =
|
258
|
+
val["udfData"]["data"][val2.data.field_id];
|
259
|
+
}
|
260
|
+
|
261
|
+
var key_arr = [];
|
262
|
+
|
263
|
+
for await (const [key_idx, key_name] of Object.entries(
|
264
|
+
index_keys
|
265
|
+
)) {
|
266
|
+
key_arr.push(data[key_name]);
|
267
|
+
}
|
268
|
+
keys_obj[key_arr]++;
|
269
|
+
}
|
270
|
+
|
271
|
+
for await (const [key_arr, key_count] of Object.entries(keys_obj)) {
|
272
|
+
rows.push({
|
273
|
+
key: [e.key, index_id, key_arr],
|
274
|
+
value: body.docs.length,
|
275
|
+
});
|
276
|
+
}
|
277
|
+
} else {
|
278
|
+
// no index
|
279
|
+
rows.push({ key: "", value: body.docs.length });
|
280
|
+
}
|
281
|
+
return { code: 1, data: { rows: rows, total_rows: rows.length } };
|
282
|
+
};
|
283
|
+
|
284
|
+
const totals = async function () {
|
285
|
+
const median = (arr) => {
|
286
|
+
const mid = Math.floor(arr.length / 2),
|
287
|
+
nums = [...arr].sort((a, b) => a - b);
|
288
|
+
return arr.length % 2 !== 0
|
289
|
+
? nums[mid]
|
290
|
+
: (nums[mid - 1] + nums[mid]) / 2;
|
291
|
+
};
|
292
|
+
|
293
|
+
var total_fields_info = JSON.parse(e.total_fields_info);
|
294
|
+
var totals_prop = {};
|
295
|
+
var totals_obj = {};
|
296
|
+
var totals_counts = {};
|
297
|
+
var totals_arr = {};
|
298
|
+
var totals_sums = {};
|
299
|
+
var totals_group_obj = {};
|
300
|
+
|
301
|
+
for await (const [key, val] of Object.entries(total_fields_info)) {
|
302
|
+
totals_counts[val.field_id] = 0;
|
303
|
+
totals_prop[val.field_id] = val;
|
304
|
+
totals_arr[val.field_id] = [];
|
305
|
+
totals_sums[val.field_id] = 0;
|
306
|
+
totals_group_obj[val.field_id] = {};
|
307
|
+
}
|
308
|
+
|
309
|
+
for await (var row_data of body.docs) {
|
310
|
+
for await (const [key, val] of Object.entries(
|
311
|
+
row_data.udfData.data
|
312
|
+
)) {
|
313
|
+
var field_id = key;
|
314
|
+
var value = val;
|
315
|
+
totals_counts[field_id]++;
|
316
|
+
|
317
|
+
switch (totals_prop[field_id].sum_type) {
|
318
|
+
case "sum":
|
319
|
+
if (typeof totals_obj[field_id] === "undefined") {
|
320
|
+
totals_obj[field_id] = value;
|
321
|
+
} else {
|
322
|
+
totals_obj[field_id] += value;
|
323
|
+
}
|
324
|
+
break;
|
325
|
+
|
326
|
+
case "average":
|
327
|
+
totals_sums[field_id] += value;
|
328
|
+
totals_obj[field_id] =
|
329
|
+
totals_sums[field_id] / totals_counts[field_id];
|
330
|
+
break;
|
331
|
+
|
332
|
+
case "median":
|
333
|
+
if (!totals_arr[field_id].includes(value)) {
|
334
|
+
totals_arr[field_id].push(value);
|
335
|
+
}
|
336
|
+
totals_obj[field_id] = median(totals_arr[field_id]);
|
337
|
+
break;
|
338
|
+
case "min":
|
339
|
+
if (
|
340
|
+
typeof totals_obj[field_id] === "undefined" ||
|
341
|
+
value < totals_obj[field_id]
|
342
|
+
) {
|
343
|
+
totals_obj[field_id] = value;
|
344
|
+
}
|
345
|
+
break;
|
346
|
+
case "max":
|
347
|
+
if (
|
348
|
+
typeof totals_obj[field_id] === "undefined" ||
|
349
|
+
value > totals_obj[field_id]
|
350
|
+
) {
|
351
|
+
totals_obj[field_id] = value;
|
352
|
+
}
|
353
|
+
break;
|
354
|
+
case "count":
|
355
|
+
if (typeof totals_obj[field_id] === "undefined") {
|
356
|
+
totals_obj[field_id] = 1;
|
357
|
+
} else {
|
358
|
+
totals_obj[field_id]++;
|
359
|
+
}
|
360
|
+
break;
|
361
|
+
case "distinct":
|
362
|
+
if (!totals_arr[field_id].includes(value)) {
|
363
|
+
totals_arr[field_id].push(value);
|
364
|
+
}
|
365
|
+
totals_obj[field_id] = totals_arr[field_id].length;
|
366
|
+
break;
|
367
|
+
|
368
|
+
case "group":
|
369
|
+
if (!totals_obj[field_id]) {
|
370
|
+
totals_obj[field_id] = {};
|
371
|
+
}
|
372
|
+
|
373
|
+
if (typeof totals_obj[field_id][value] === "undefined") {
|
374
|
+
totals_obj[field_id][value] = 1; //value;
|
375
|
+
} else {
|
376
|
+
totals_obj[field_id][value]++; //+= value;
|
377
|
+
}
|
378
|
+
|
379
|
+
break;
|
380
|
+
default:
|
381
|
+
totals_obj[field_id] = null;
|
382
|
+
}
|
383
|
+
}
|
384
|
+
}
|
385
|
+
return { code: 1, data: totals_obj };
|
386
|
+
};
|
387
|
+
if (e.count === "true" || e.count === true) {
|
388
|
+
return count_data();
|
389
|
+
}
|
390
|
+
if (e.total_fields_info) {
|
391
|
+
return totals();
|
392
|
+
}
|
393
|
+
return raw_data();
|
394
|
+
};
|
395
|
+
|
396
|
+
var limit = 99999;
|
397
|
+
var skip = 0;
|
398
|
+
|
399
|
+
if (e.limit) {
|
400
|
+
limit = parseInt(e.limit);
|
401
|
+
}
|
402
|
+
|
403
|
+
if (e.skip) {
|
404
|
+
skip = JSON.parse(e.skip);
|
405
|
+
}
|
406
|
+
|
407
|
+
var fields = [];
|
408
|
+
if (e.fields) {
|
409
|
+
for await (const [key, val] of Object.entries(
|
410
|
+
typeof e.fields === "string" ? e.fields.split(",") : e.fields
|
411
|
+
)) {
|
412
|
+
fields.push(val);
|
413
|
+
}
|
414
|
+
} else {
|
415
|
+
for await (const [key, val] of Object.entries(table_obj.tableFields)) {
|
416
|
+
fields.push(val.data.field_id);
|
417
|
+
}
|
418
|
+
}
|
419
|
+
|
420
|
+
var data = {};
|
421
|
+
var from = e.filter_from ? JSON.parse(e.filter_from) : {};
|
422
|
+
var to = e.filter_to ? JSON.parse(e.filter_to) : {};
|
423
|
+
var sort = [];
|
424
|
+
for await (const [key, val] of Object.entries(from)) {
|
425
|
+
var field_name = key;
|
426
|
+
|
427
|
+
sort.push(field_name);
|
428
|
+
|
429
|
+
if (val === to[key]) {
|
430
|
+
data[field_name] = val;
|
431
|
+
} else {
|
432
|
+
data[field_name] = { $gte: val };
|
433
|
+
}
|
434
|
+
}
|
435
|
+
|
436
|
+
for await (const [key, val] of Object.entries(to)) {
|
437
|
+
var field_name = key;
|
438
|
+
|
439
|
+
if (val !== from[key]) {
|
440
|
+
data[field_name]["$lte"] = val;
|
441
|
+
}
|
442
|
+
}
|
443
|
+
|
444
|
+
var selector = {};
|
445
|
+
|
446
|
+
if (from && !_.isEmpty(from)) {
|
447
|
+
selector = data;
|
448
|
+
}
|
449
|
+
|
450
|
+
var opt = {
|
451
|
+
selector: selector,
|
452
|
+
limit: limit,
|
453
|
+
skip: skip,
|
454
|
+
fields: fields,
|
455
|
+
};
|
456
|
+
|
457
|
+
if (sort.length) {
|
458
|
+
opt.sort = sort;
|
459
|
+
}
|
460
|
+
|
461
|
+
if (e.sort_fields && JSON.parse(e.sort_fields).length) {
|
462
|
+
opt.sort = JSON.parse(e.sort_fields);
|
463
|
+
if (opt.sort) {
|
464
|
+
for await (const [key, val] of Object.entries(opt.sort)) {
|
465
|
+
var field_name = val.colId;
|
466
|
+
opt.sort[key] = {
|
467
|
+
["udfData.data." + field_name]: val.sort,
|
468
|
+
};
|
469
|
+
}
|
470
|
+
}
|
471
|
+
}
|
472
|
+
|
473
|
+
if (e.grid_filter_info) {
|
474
|
+
for await (const [key, val] of Object.entries(
|
475
|
+
JSON.parse(e.grid_filter_info)
|
476
|
+
)) {
|
477
|
+
var field_name = key;
|
478
|
+
var condition = "$and";
|
479
|
+
const make_selector = function (val) {
|
480
|
+
var value = "";
|
481
|
+
var operator = "";
|
482
|
+
var value_to = "";
|
483
|
+
var operator_to = "";
|
484
|
+
|
485
|
+
if (val.filterType === "date") {
|
486
|
+
var date = val.dateFrom.substr(0, 10);
|
487
|
+
switch (val.type) {
|
488
|
+
case "equals":
|
489
|
+
operator = "$regex";
|
490
|
+
value = `^${date}`;
|
491
|
+
break;
|
492
|
+
|
493
|
+
case "greaterThan":
|
494
|
+
operator = "$gt";
|
495
|
+
value = `${date}`;
|
496
|
+
break;
|
497
|
+
|
498
|
+
case "lessThan":
|
499
|
+
operator = "$lt";
|
500
|
+
value = `${date}`;
|
501
|
+
break;
|
502
|
+
|
503
|
+
case "blank":
|
504
|
+
operator = "$eq";
|
505
|
+
value = "";
|
506
|
+
break;
|
507
|
+
|
508
|
+
case "inRange":
|
509
|
+
operator = "$gte";
|
510
|
+
value = date;
|
511
|
+
operator_to = "$lte";
|
512
|
+
value_to = val.dateTo.substr(0, 10);
|
513
|
+
break;
|
514
|
+
|
515
|
+
case "notEqual":
|
516
|
+
operator = "$regex";
|
517
|
+
value = `^((?!${date}).)*$`;
|
518
|
+
break;
|
519
|
+
|
520
|
+
case "notBlank":
|
521
|
+
operator = "$ne";
|
522
|
+
value = "";
|
523
|
+
break;
|
524
|
+
|
525
|
+
default:
|
526
|
+
operator = "$regex";
|
527
|
+
value = `^${date}`;
|
528
|
+
}
|
529
|
+
}
|
530
|
+
|
531
|
+
if (val.filterType === "text") {
|
532
|
+
switch (val.type) {
|
533
|
+
case "contains":
|
534
|
+
operator = "$regex";
|
535
|
+
value = `${val.filter}`;
|
536
|
+
break;
|
537
|
+
|
538
|
+
case "notContains":
|
539
|
+
operator = "$regex";
|
540
|
+
value = `^((?!${val.filter}).)*$`;
|
541
|
+
break;
|
542
|
+
|
543
|
+
case "equals":
|
544
|
+
operator = "$eq";
|
545
|
+
value = `${val.filter}`;
|
546
|
+
break;
|
547
|
+
|
548
|
+
case "notEqual":
|
549
|
+
operator = "$ne";
|
550
|
+
value = `${val.filter}`;
|
551
|
+
break;
|
552
|
+
|
553
|
+
case "startsWith":
|
554
|
+
operator = "$regex";
|
555
|
+
value = `^${val.filter}`;
|
556
|
+
break;
|
557
|
+
|
558
|
+
case "endsWith":
|
559
|
+
operator = "$regex";
|
560
|
+
value = `${val.filter}$`;
|
561
|
+
break;
|
562
|
+
|
563
|
+
case "blank":
|
564
|
+
operator = "$eq";
|
565
|
+
value = "";
|
566
|
+
break;
|
567
|
+
|
568
|
+
case "notBlank":
|
569
|
+
operator = "$ne";
|
570
|
+
value = "";
|
571
|
+
break;
|
572
|
+
|
573
|
+
default:
|
574
|
+
value = "^" + val.filter;
|
575
|
+
}
|
576
|
+
}
|
577
|
+
|
578
|
+
if (val.filterType === "number") {
|
579
|
+
switch (val.type) {
|
580
|
+
case "equals":
|
581
|
+
operator = "$eq";
|
582
|
+
value = val.filter;
|
583
|
+
break;
|
584
|
+
|
585
|
+
case "notEqual":
|
586
|
+
operator = "$ne";
|
587
|
+
value = val.filter;
|
588
|
+
break;
|
589
|
+
|
590
|
+
case "lessThanOrEqual":
|
591
|
+
operator = "$lte";
|
592
|
+
value = val.filter;
|
593
|
+
break;
|
594
|
+
|
595
|
+
case "greaterThanOrEqual":
|
596
|
+
operator = "$gte";
|
597
|
+
value = val.filter;
|
598
|
+
break;
|
599
|
+
|
600
|
+
case "lessThan":
|
601
|
+
operator = "$lt";
|
602
|
+
value = val.filter;
|
603
|
+
break;
|
604
|
+
|
605
|
+
case "greaterThan":
|
606
|
+
operator = "$gt";
|
607
|
+
value = val.filter;
|
608
|
+
break;
|
609
|
+
|
610
|
+
case "blank":
|
611
|
+
operator = "$eq";
|
612
|
+
value = 0;
|
613
|
+
break;
|
614
|
+
|
615
|
+
case "notBlank":
|
616
|
+
operator = "$ne";
|
617
|
+
value = 0;
|
618
|
+
break;
|
619
|
+
|
620
|
+
case "inRange":
|
621
|
+
operator = "$gte";
|
622
|
+
value = val.filter;
|
623
|
+
operator_to = "$lte";
|
624
|
+
value_to = val.filterTo;
|
625
|
+
break;
|
626
|
+
|
627
|
+
default:
|
628
|
+
operator = "$eq";
|
629
|
+
value = val.filter;
|
630
|
+
}
|
631
|
+
}
|
632
|
+
if (!opt.selector[field_name]) {
|
633
|
+
opt.selector[field_name] = {};
|
634
|
+
}
|
635
|
+
if (!opt.selector[field_name][condition]) {
|
636
|
+
opt.selector[field_name][condition] = [];
|
637
|
+
}
|
638
|
+
opt.selector[field_name][condition].push({
|
639
|
+
[operator]: value,
|
640
|
+
});
|
641
|
+
|
642
|
+
if (operator_to) {
|
643
|
+
opt.selector[field_name][condition].push({
|
644
|
+
[operator_to]: value_to,
|
645
|
+
});
|
646
|
+
}
|
647
|
+
};
|
648
|
+
|
649
|
+
if (!val.condition1) {
|
650
|
+
make_selector(val);
|
651
|
+
} else {
|
652
|
+
condition = "$" + val.operator.toLowerCase();
|
653
|
+
make_selector(val.condition1);
|
654
|
+
make_selector(val.condition2);
|
655
|
+
}
|
656
|
+
}
|
657
|
+
}
|
658
|
+
|
659
|
+
if (e.total_fields_info) {
|
660
|
+
fields = [];
|
661
|
+
for await (const [key, val] of Object.entries(
|
662
|
+
JSON.parse(e.total_fields_info)
|
663
|
+
)) {
|
664
|
+
var field_name = val.field_id;
|
665
|
+
|
666
|
+
fields.push(field_name);
|
667
|
+
}
|
668
|
+
opt.fields = fields;
|
669
|
+
}
|
670
|
+
// fix names
|
671
|
+
|
672
|
+
for await (const [key, val] of Object.entries(opt.fields)) {
|
673
|
+
opt.fields[key] = "udfData.data." + val;
|
674
|
+
}
|
675
|
+
if (!e.sort_fields || !JSON.parse(e.sort_fields).length) {
|
676
|
+
// added 2021 09 10
|
677
|
+
if (opt.sort) {
|
678
|
+
for await (const [key, val] of Object.entries(opt.sort)) {
|
679
|
+
opt.sort[key] = {
|
680
|
+
["udfData.data." + val]: e.sortOrder === "des" ? "desc" : "asc",
|
681
|
+
};
|
682
|
+
}
|
683
|
+
}
|
684
|
+
}
|
685
|
+
|
686
|
+
var selector_new = {};
|
687
|
+
|
688
|
+
for await (const [key, val] of Object.entries(opt.selector)) {
|
689
|
+
selector_new["udfData.data." + key] = val;
|
690
|
+
}
|
691
|
+
|
692
|
+
if (e.viewDbQuery) {
|
693
|
+
for await (const [key, val] of Object.entries(table_obj.tableFields)) {
|
694
|
+
if (e.viewDbQuery.includes(val.id)) {
|
695
|
+
const replacer = new RegExp(val.id, "g");
|
696
|
+
e.viewDbQuery = e.viewDbQuery.replace(
|
697
|
+
replacer,
|
698
|
+
"udfData.data." + val.data.field_id
|
699
|
+
);
|
700
|
+
}
|
701
|
+
}
|
702
|
+
|
703
|
+
let viewDbQuery = JSON.parse(e.viewDbQuery.replace(/\\/g, ""));
|
704
|
+
|
705
|
+
for await (const [key, val] of Object.entries(viewDbQuery)) {
|
706
|
+
selector_new[key] = val;
|
707
|
+
}
|
708
|
+
}
|
709
|
+
|
710
|
+
opt.selector = selector_new;
|
711
|
+
opt.selector["udfData.udffileid"] = e.table_id;
|
712
|
+
opt.selector.stat = e.archived ? 4 : 3;
|
713
|
+
|
714
|
+
opt.fields.push("_id");
|
715
|
+
opt.fields.push("_rev");
|
716
|
+
|
717
|
+
// xuda
|
718
|
+
var cache_string = JSON.stringify(opt);
|
719
|
+
|
720
|
+
if (__.CACHE_QUERY_REQ?.[app_id_reference]?.[e.table_id]?.[cache_string]) {
|
721
|
+
return await done(
|
722
|
+
__.CACHE_QUERY_REQ[app_id_reference][e.table_id][cache_string].doc
|
723
|
+
);
|
724
|
+
}
|
725
|
+
|
726
|
+
try {
|
727
|
+
try {
|
728
|
+
const doc = await db.find(opt);
|
729
|
+
if (!__.CACHE_QUERY_REQ[app_id_reference]) {
|
730
|
+
__.CACHE_QUERY_REQ[app_id_reference] = {};
|
731
|
+
}
|
732
|
+
|
733
|
+
if (!__.CACHE_QUERY_REQ[app_id_reference][e.table_id]) {
|
734
|
+
__.CACHE_QUERY_REQ[app_id_reference][e.table_id] = {};
|
735
|
+
}
|
736
|
+
|
737
|
+
__.CACHE_QUERY_REQ[app_id_reference][e.table_id][cache_string] = {
|
738
|
+
doc: doc,
|
739
|
+
ts: Date.now(),
|
740
|
+
};
|
741
|
+
|
742
|
+
if (doc?.warning?.includes("No matching index found")) {
|
743
|
+
const index_name = `index_${e.table_id}_${new Date()
|
744
|
+
.valueOf()
|
745
|
+
.toString()}`;
|
746
|
+
var index = [];
|
747
|
+
|
748
|
+
for await (const [key, val] of Object.entries(opt.selector)) {
|
749
|
+
index.push(key);
|
750
|
+
}
|
751
|
+
mango_index_obj = {
|
752
|
+
index: {
|
753
|
+
fields: index,
|
754
|
+
},
|
755
|
+
name: index_name,
|
756
|
+
ddoc: `mango_index_table_${e.table_id}`,
|
757
|
+
};
|
758
|
+
db.createIndex(mango_index_obj).then((result) => {
|
759
|
+
console.log(result);
|
760
|
+
});
|
761
|
+
}
|
762
|
+
return await done(doc);
|
763
|
+
} catch (err) {
|
764
|
+
if (err.error === "no_usable_index") {
|
765
|
+
const index_name = `index_${e.table_id}_${new Date()
|
766
|
+
.valueOf()
|
767
|
+
.toString()}`;
|
768
|
+
|
769
|
+
mango_index_obj = {
|
770
|
+
index: {
|
771
|
+
fields: opt.sort,
|
772
|
+
},
|
773
|
+
name: index_name,
|
774
|
+
ddoc: `mango_index_table_${e.table_id}`,
|
775
|
+
};
|
776
|
+
|
777
|
+
try {
|
778
|
+
const result = await db.createIndex(mango_index_obj);
|
779
|
+
|
780
|
+
const doc = await db.find(opt);
|
781
|
+
return await done(doc);
|
782
|
+
} catch (error) {
|
783
|
+
return { code: -1, data: error };
|
784
|
+
}
|
785
|
+
} else {
|
786
|
+
return { code: -1, data: err.message };
|
787
|
+
}
|
788
|
+
}
|
789
|
+
} catch (err) {
|
790
|
+
return { code: -1, data: err.error };
|
791
|
+
}
|
792
|
+
};
|
793
|
+
|
794
|
+
const runtime_get_query_data = async function () {
|
795
|
+
var limit = 99999;
|
796
|
+
var skip = 0;
|
797
|
+
|
798
|
+
if (e.limit) {
|
799
|
+
limit = e.limitP;
|
800
|
+
}
|
801
|
+
|
802
|
+
if (e.skipP) {
|
803
|
+
skip = e.skipP;
|
804
|
+
}
|
805
|
+
|
806
|
+
var desc = e.desc === "true" ? true : false;
|
807
|
+
|
808
|
+
var opt;
|
809
|
+
if (key) {
|
810
|
+
opt = {
|
811
|
+
key: key,
|
812
|
+
include_docs: !e.ids && view !== "db_index_reduce",
|
813
|
+
limit: limit,
|
814
|
+
skip: skip,
|
815
|
+
};
|
816
|
+
} else {
|
817
|
+
if (e.reduce == "true") {
|
818
|
+
opt = {
|
819
|
+
startkey: e.startkey ? JSON.parse(e.startkey) : "",
|
820
|
+
endkey: e.endkey ? JSON.parse(e.endkey) : "",
|
821
|
+
include_docs: false,
|
822
|
+
reduce: true,
|
823
|
+
group_level: 3,
|
824
|
+
|
825
|
+
descending: desc,
|
826
|
+
};
|
827
|
+
} else {
|
828
|
+
opt = {
|
829
|
+
startkey: e.startkey ? JSON.parse(e.startkey) : "",
|
830
|
+
endkey: e.endkey ? JSON.parse(e.endkey) : "",
|
831
|
+
include_docs: !e.ids,
|
832
|
+
limit: limit,
|
833
|
+
skip: skip,
|
834
|
+
descending: desc,
|
835
|
+
};
|
836
|
+
}
|
837
|
+
}
|
838
|
+
|
839
|
+
try {
|
840
|
+
const body = db.view(`xuda`, view, opt);
|
841
|
+
if (e.reduce) {
|
842
|
+
return { code: 1, data: body };
|
843
|
+
}
|
844
|
+
var rows = [];
|
845
|
+
|
846
|
+
for await (var val of body.rows) {
|
847
|
+
if (e.ids) {
|
848
|
+
rows.push({ id: val.id, value: val.value._id });
|
849
|
+
return true;
|
850
|
+
}
|
851
|
+
rows.push({
|
852
|
+
id: val.id,
|
853
|
+
value: { udfData: val.doc.udfData, _id: val.id },
|
854
|
+
});
|
855
|
+
}
|
856
|
+
return { code: 1, data: { rows: rows, total_rows: rows.length } };
|
857
|
+
} catch (error) {
|
858
|
+
return { code: -1, data: error };
|
859
|
+
}
|
860
|
+
};
|
861
|
+
|
862
|
+
if (e.reduce && JSON.parse(e.reduce)) {
|
863
|
+
view = "db_index_reduce";
|
864
|
+
return await runtime_get_query_data();
|
865
|
+
}
|
866
|
+
if (e.view === "db_index") {
|
867
|
+
key = e.key;
|
868
|
+
view = e.view;
|
869
|
+
return await runtime_get_query_data();
|
870
|
+
}
|
871
|
+
return await runtime_get_mango_data();
|
872
|
+
};
|
189
873
|
|
190
874
|
exports.create = async (params, setup_doc, resolve, reject) => {
|
191
875
|
const e = params.e;
|
@@ -215,7 +899,7 @@ exports.create = async (params, setup_doc, resolve, reject) => {
|
|
215
899
|
if (index_ret < 0) throw index_ret.data;
|
216
900
|
doc.udfIndex = index_ret.data;
|
217
901
|
|
218
|
-
const ret = await check_unique(e, doc, table_obj);
|
902
|
+
const ret = await check_unique(e, doc, table_obj, db, app_id_reference);
|
219
903
|
if (ret.code < 0) {
|
220
904
|
throw ret;
|
221
905
|
}
|
@@ -251,7 +935,7 @@ exports.create = async (params, setup_doc, resolve, reject) => {
|
|
251
935
|
return index_ret;
|
252
936
|
}
|
253
937
|
doc.udfIndex = index_ret.data;
|
254
|
-
const ret = await check_unique(e, doc, table_obj);
|
938
|
+
const ret = await check_unique(e, doc, table_obj, db, app_id_reference);
|
255
939
|
if (ret.code < 0) {
|
256
940
|
return ret;
|
257
941
|
}
|
@@ -273,6 +957,13 @@ exports.read = async (params, setup_doc, resolve, reject) => {
|
|
273
957
|
const app_id_reference = params.app_id_reference;
|
274
958
|
const table_obj = params.table_obj;
|
275
959
|
|
960
|
+
const ret = await query_db(e, db, app_id_reference, table_obj);
|
961
|
+
if (ret.code < 0) {
|
962
|
+
return reject(ret.data);
|
963
|
+
}
|
964
|
+
|
965
|
+
return resolve(ret.data);
|
966
|
+
|
276
967
|
var key;
|
277
968
|
|
278
969
|
const runtime_get_mango_data = async function () {
|
@@ -965,33 +1656,59 @@ exports.update = async (params, setup_doc, resolve, reject) => {
|
|
965
1656
|
const doc = await db.get(e.row_id, {});
|
966
1657
|
let data = doc.udfData.data;
|
967
1658
|
var error;
|
1659
|
+
if (!e.field_id && e.data) {
|
1660
|
+
error = "Invalid field_id or data object to save";
|
1661
|
+
}
|
1662
|
+
// single value save
|
1663
|
+
if (e.field_id) {
|
1664
|
+
let _tableFieldsObj = find_item_by_key(
|
1665
|
+
table_obj.tableFields,
|
1666
|
+
"field_id",
|
1667
|
+
e.field_id
|
1668
|
+
);
|
1669
|
+
if (!_tableFieldsObj || _.isEmpty(_tableFieldsObj)) {
|
1670
|
+
return reject("Error:" + e.field_id + " - field not found");
|
1671
|
+
}
|
968
1672
|
|
969
|
-
|
970
|
-
|
971
|
-
|
972
|
-
|
973
|
-
|
974
|
-
|
975
|
-
|
1673
|
+
data[e.field_id] = await get_cast_val(
|
1674
|
+
"dbs_update",
|
1675
|
+
e.field_id,
|
1676
|
+
_tableFieldsObj.props.fieldType,
|
1677
|
+
e.field_value
|
1678
|
+
);
|
1679
|
+
}
|
1680
|
+
if (e.data) {
|
1681
|
+
data = {};
|
1682
|
+
for await (const [key, val] of Object.entries(e.data)) {
|
1683
|
+
let _tableFieldsObj = find_item_by_key(
|
1684
|
+
table_obj.tableFields,
|
1685
|
+
"field_id",
|
1686
|
+
key
|
1687
|
+
);
|
1688
|
+
if (!_tableFieldsObj || _.isEmpty(_tableFieldsObj)) {
|
1689
|
+
reject("Error:" + key + " - field not found");
|
1690
|
+
break;
|
1691
|
+
}
|
1692
|
+
|
1693
|
+
data[key] = await get_cast_val(
|
1694
|
+
"dbs_update",
|
1695
|
+
key,
|
1696
|
+
_tableFieldsObj.props.fieldType,
|
1697
|
+
val
|
1698
|
+
);
|
1699
|
+
}
|
976
1700
|
}
|
977
1701
|
|
978
|
-
data[e.field_id] = await get_cast_val(
|
979
|
-
"runtime_update_data",
|
980
|
-
e.field_id,
|
981
|
-
_tableFieldsObj.props.fieldType,
|
982
|
-
e.field_value
|
983
|
-
);
|
984
1702
|
if (error) {
|
985
1703
|
return reject(error);
|
986
1704
|
}
|
987
|
-
|
988
1705
|
doc.ts = Date.now();
|
989
1706
|
const index_ret = await get_index_json(doc, table_obj);
|
990
1707
|
if (index_ret.code < 0) {
|
991
1708
|
return index_ret;
|
992
1709
|
}
|
993
1710
|
doc.udfIndex = index_ret.data;
|
994
|
-
const ret = await check_unique(e, doc, table_obj);
|
1711
|
+
const ret = await check_unique(e, doc, table_obj, db, app_id_reference);
|
995
1712
|
if (ret.code < 0) {
|
996
1713
|
return ret;
|
997
1714
|
}
|
@@ -1011,6 +1728,8 @@ exports.delete = async (params, setup_doc, resolve, reject) => {
|
|
1011
1728
|
const app_id_reference = params.app_id_reference;
|
1012
1729
|
const table_obj = params.table_obj;
|
1013
1730
|
const data = await db.fetch({ keys: e.ids });
|
1731
|
+
var docs_to_delete = [];
|
1732
|
+
|
1014
1733
|
for await (var val of data.rows) {
|
1015
1734
|
var doc = val.doc;
|
1016
1735
|
|
@@ -1073,6 +1792,6 @@ exports.test_connection = async (params, setup_doc, resolve, reject) => {
|
|
1073
1792
|
await nano.get("_design/xuda");
|
1074
1793
|
resolve(nano);
|
1075
1794
|
} catch (err) {
|
1076
|
-
return reject(err);
|
1795
|
+
return reject(err.message);
|
1077
1796
|
}
|
1078
1797
|
};
|