@xuda.io/xuda-dbs-plugin-xuda 1.0.312 → 1.0.314
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 +1 -1
- package/studio.mjs +102 -209
package/package.json
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
{
|
2
2
|
"name": "@xuda.io/xuda-dbs-plugin-xuda",
|
3
|
-
"version": "1.0.
|
3
|
+
"version": "1.0.314",
|
4
4
|
"description": "Xuda Database Socket for Xuda's proprietary structure powered by CouchDB",
|
5
5
|
"scripts": {
|
6
6
|
"pub": "npm version patch --force && npm publish --access public"
|
package/server.js
CHANGED
@@ -337,7 +337,7 @@ const get_opt = function (e, table_obj) {
|
|
337
337
|
}
|
338
338
|
|
339
339
|
if (e.dataSourceFilterModelType === 'query' && e.filterModelMongo) {
|
340
|
-
selector_new['$and'] = [replaceRegexOptions(replaceKeysInQuery(JSON.parse(e.filterModelMongo)))];
|
340
|
+
selector_new['$and'] = [replaceRegexOptions(replaceKeysInQuery(e.filterModelMongo === 'string' ? JSON.parse(e.filterModelMongo) : e.filterModelMongo))];
|
341
341
|
}
|
342
342
|
|
343
343
|
const _filterModelUserMongo = typeof e.filterModelUserMongo === 'string' ? JSON.parse(e.filterModelUserMongo) : e.filterModelUserMongo;
|
package/studio.mjs
CHANGED
@@ -12,46 +12,37 @@ const check_unique = async function (e, docP, table_obj, db) {
|
|
12
12
|
|
13
13
|
if (
|
14
14
|
validate_unique_index_exist() &&
|
15
|
-
(typeof func ===
|
15
|
+
(typeof func === 'undefined' || // call from studio
|
16
16
|
!e.full_table_downloaded)
|
17
17
|
) {
|
18
18
|
const SESSION_ID = Object.keys(SESSION_OBJ)[0];
|
19
|
-
const ret = await func.common.perform_rpi_request(
|
20
|
-
SESSION_ID,
|
21
|
-
"dbs_check_unique",
|
22
|
-
{},
|
23
|
-
{ ...e, doc: docP }
|
24
|
-
);
|
19
|
+
const ret = await func.common.perform_rpi_request(SESSION_ID, 'dbs_check_unique', {}, { ...e, doc: docP });
|
25
20
|
return ret || { code: -1, data: {} };
|
26
21
|
}
|
27
22
|
|
28
23
|
const local = async function () {
|
29
24
|
var len = docP.udfIndex.length;
|
30
25
|
if (!len) {
|
31
|
-
return { code: -11, data:
|
26
|
+
return { code: -11, data: 'table must have primary index' };
|
32
27
|
}
|
33
28
|
var found_unique = undefined;
|
34
|
-
var ret = { code: 1, data:
|
29
|
+
var ret = { code: 1, data: 'ok' };
|
35
30
|
|
36
31
|
for await (var val of docP.udfIndex) {
|
37
32
|
if (!table_obj.tableIndexes) {
|
38
33
|
ret = {
|
39
34
|
code: -14,
|
40
|
-
data:
|
35
|
+
data: 'table definition missing for: ' + val.fileId,
|
41
36
|
};
|
42
37
|
break;
|
43
38
|
}
|
44
39
|
|
45
|
-
const table_index = find_item_by_key_root(
|
46
|
-
table_obj.tableIndexes,
|
47
|
-
"id",
|
48
|
-
val.indexId
|
49
|
-
);
|
40
|
+
const table_index = find_item_by_key_root(table_obj.tableIndexes, 'id', val.indexId);
|
50
41
|
|
51
42
|
if (!table_index) {
|
52
43
|
ret = {
|
53
44
|
code: -13,
|
54
|
-
data:
|
45
|
+
data: 'keys definition missing for Table: ' + val.fileId,
|
55
46
|
};
|
56
47
|
break;
|
57
48
|
}
|
@@ -62,7 +53,7 @@ const check_unique = async function (e, docP, table_obj, db) {
|
|
62
53
|
if (!table_index?.data?.keys || _.isEmpty(table_index.data.keys)) {
|
63
54
|
ret = {
|
64
55
|
code: -14,
|
65
|
-
data:
|
56
|
+
data: 'keys definition missing for index: ' + val.indexId,
|
66
57
|
};
|
67
58
|
break;
|
68
59
|
}
|
@@ -72,30 +63,14 @@ const check_unique = async function (e, docP, table_obj, db) {
|
|
72
63
|
|
73
64
|
for await (const [keySegment, valSegment] of Object.entries(keysArr)) {
|
74
65
|
// run on key segment
|
75
|
-
let _fieldType = find_item_by_key(
|
76
|
-
|
77
|
-
"field_id",
|
78
|
-
valSegment
|
79
|
-
).props.fieldType;
|
80
|
-
let _val = await get_cast_val(
|
81
|
-
"check_unique",
|
82
|
-
valSegment,
|
83
|
-
_fieldType,
|
84
|
-
val.keyValue[Number(keySegment)]
|
85
|
-
);
|
66
|
+
let _fieldType = find_item_by_key(table_obj.tableFields, 'field_id', valSegment).props.fieldType;
|
67
|
+
let _val = await get_cast_val('check_unique', valSegment, _fieldType, val.keyValue[Number(keySegment)]);
|
86
68
|
keyValue.push(_val);
|
87
69
|
}
|
88
70
|
|
89
|
-
var key =
|
90
|
-
'["' +
|
91
|
-
val.fileId +
|
92
|
-
'","' +
|
93
|
-
val.indexId +
|
94
|
-
'",[' +
|
95
|
-
keyValue.join(",") +
|
96
|
-
"]]";
|
71
|
+
var key = '["' + val.fileId + '","' + val.indexId + '",[' + keyValue.join(',') + ']]';
|
97
72
|
try {
|
98
|
-
e.view =
|
73
|
+
e.view = 'db_index';
|
99
74
|
const ret = await query_db(e, db, table_obj);
|
100
75
|
const json = ret.data;
|
101
76
|
|
@@ -110,12 +85,12 @@ const check_unique = async function (e, docP, table_obj, db) {
|
|
110
85
|
}
|
111
86
|
}
|
112
87
|
if (found_unique) {
|
113
|
-
throw
|
88
|
+
throw 'error checking unique:' + key;
|
114
89
|
}
|
115
90
|
}
|
116
91
|
}
|
117
92
|
// throw json.data;
|
118
|
-
return { code: 1, data:
|
93
|
+
return { code: 1, data: 'ok' };
|
119
94
|
} catch (msg) {
|
120
95
|
console.error(msg);
|
121
96
|
ret = { code: -22, data: msg };
|
@@ -151,21 +126,12 @@ const get_index_json = async function (docInP, table_obj) {
|
|
151
126
|
}
|
152
127
|
// put the value
|
153
128
|
// debugger;
|
154
|
-
const field_obj = find_item_by_key(
|
155
|
-
table_obj.tableFields,
|
156
|
-
"field_id",
|
157
|
-
valSegment
|
158
|
-
);
|
129
|
+
const field_obj = find_item_by_key(table_obj.tableFields, 'field_id', valSegment);
|
159
130
|
if (!field_obj) {
|
160
|
-
throw
|
131
|
+
throw 'field not found in key: ' + valSegment;
|
161
132
|
}
|
162
133
|
|
163
|
-
let _val = await get_cast_val(
|
164
|
-
"get_index_json",
|
165
|
-
field_obj.id,
|
166
|
-
field_obj.props.fieldType,
|
167
|
-
null
|
168
|
-
);
|
134
|
+
let _val = await get_cast_val('get_index_json', field_obj.id, field_obj.props.fieldType, null);
|
169
135
|
key_val.push(_val);
|
170
136
|
}
|
171
137
|
|
@@ -207,11 +173,8 @@ const get_cast_val = async function (source, attributeP, typeP, valP) {
|
|
207
173
|
console.warn(source, msg);
|
208
174
|
};
|
209
175
|
|
210
|
-
if (typeof xu_cast ===
|
211
|
-
const xu_cast = await func.common.get_module(
|
212
|
-
Object.keys(SESSION_OBJ)[0],
|
213
|
-
`xuda-get-cast-util-module.mjs`
|
214
|
-
);
|
176
|
+
if (typeof xu_cast === 'undefined') {
|
177
|
+
const xu_cast = await func.common.get_module(Object.keys(SESSION_OBJ)[0], `xuda-get-cast-util-module.mjs`);
|
215
178
|
return xu_cast.cast(typeP, valP, success, fail);
|
216
179
|
}
|
217
180
|
return xu_cast(typeP, valP, success, fail);
|
@@ -231,9 +194,7 @@ const get_opt = function (e, table_obj) {
|
|
231
194
|
|
232
195
|
var fields = [];
|
233
196
|
if (e.fields) {
|
234
|
-
for (const [key, val] of Object.entries(
|
235
|
-
typeof e.fields === "string" ? e.fields.split(",") : e.fields
|
236
|
-
)) {
|
197
|
+
for (const [key, val] of Object.entries(typeof e.fields === 'string' ? e.fields.split(',') : e.fields)) {
|
237
198
|
fields.push(val);
|
238
199
|
}
|
239
200
|
} else {
|
@@ -262,7 +223,7 @@ const get_opt = function (e, table_obj) {
|
|
262
223
|
var field_name = key;
|
263
224
|
|
264
225
|
if (val !== from[key]) {
|
265
|
-
data[field_name][
|
226
|
+
data[field_name]['$lte'] = val;
|
266
227
|
}
|
267
228
|
}
|
268
229
|
|
@@ -284,7 +245,7 @@ const get_opt = function (e, table_obj) {
|
|
284
245
|
}
|
285
246
|
|
286
247
|
let _sortModel = e?.sortModel || [];
|
287
|
-
if (typeof _sortModel ===
|
248
|
+
if (typeof _sortModel === 'string') {
|
288
249
|
_sortModel = JSON.parse(e.sortModel);
|
289
250
|
}
|
290
251
|
|
@@ -294,7 +255,7 @@ const get_opt = function (e, table_obj) {
|
|
294
255
|
for (const [key, val] of Object.entries(opt.sort)) {
|
295
256
|
var field_name = val.field_id;
|
296
257
|
opt.sort[key] = {
|
297
|
-
[
|
258
|
+
['udfData.data.' + field_name]: val.sort_dir,
|
298
259
|
};
|
299
260
|
}
|
300
261
|
}
|
@@ -324,7 +285,7 @@ const get_opt = function (e, table_obj) {
|
|
324
285
|
// fix names
|
325
286
|
|
326
287
|
for (const [key, val] of Object.entries(opt.fields)) {
|
327
|
-
opt.fields[key] =
|
288
|
+
opt.fields[key] = 'udfData.data.' + val;
|
328
289
|
}
|
329
290
|
|
330
291
|
if (!e?.sortModel || !JSON.parse(e.sortModel).length) {
|
@@ -332,7 +293,7 @@ const get_opt = function (e, table_obj) {
|
|
332
293
|
if (opt.sort) {
|
333
294
|
for (const [key, val] of Object.entries(opt.sort)) {
|
334
295
|
opt.sort[key] = {
|
335
|
-
[
|
296
|
+
['udfData.data.' + val]: e.sortOrder === 'des' ? 'desc' : 'asc',
|
336
297
|
};
|
337
298
|
}
|
338
299
|
}
|
@@ -347,7 +308,7 @@ const get_opt = function (e, table_obj) {
|
|
347
308
|
|
348
309
|
// Helper function to recursively process the query object
|
349
310
|
function recursiveReplace(obj) {
|
350
|
-
if (typeof obj ===
|
311
|
+
if (typeof obj === 'object' && obj !== null) {
|
351
312
|
// Create a new object to store the modified query
|
352
313
|
let newObj = Array.isArray(obj) ? [] : {};
|
353
314
|
|
@@ -355,9 +316,7 @@ const get_opt = function (e, table_obj) {
|
|
355
316
|
for (let key in obj) {
|
356
317
|
if (obj.hasOwnProperty(key)) {
|
357
318
|
// If the key is in the keys_to_replace array, replace it
|
358
|
-
let newKey = keys_to_replace.includes(key)
|
359
|
-
? `udfData.data.${key}`
|
360
|
-
: key;
|
319
|
+
let newKey = keys_to_replace.includes(key) ? `udfData.data.${key}` : key;
|
361
320
|
|
362
321
|
// Recursively process nested objects
|
363
322
|
newObj[newKey] = recursiveReplace(obj[key]);
|
@@ -378,7 +337,7 @@ const get_opt = function (e, table_obj) {
|
|
378
337
|
function replaceRegexOptions(query) {
|
379
338
|
// Helper function to recursively process the query object
|
380
339
|
function recursiveReplace(obj) {
|
381
|
-
if (typeof obj ===
|
340
|
+
if (typeof obj === 'object' && obj !== null) {
|
382
341
|
// Create a new object to store the modified query
|
383
342
|
let newObj = Array.isArray(obj) ? [] : {};
|
384
343
|
|
@@ -390,7 +349,7 @@ const get_opt = function (e, table_obj) {
|
|
390
349
|
// ? `udfData.data.${key}`
|
391
350
|
// : key;
|
392
351
|
|
393
|
-
if (key ===
|
352
|
+
if (key === '$regex') {
|
394
353
|
newObj[key] = obj[key]; // RegExp(obj[key], obj.$options);
|
395
354
|
return newObj;
|
396
355
|
}
|
@@ -413,31 +372,25 @@ const get_opt = function (e, table_obj) {
|
|
413
372
|
return recursiveReplace(query);
|
414
373
|
}
|
415
374
|
|
416
|
-
if (e.dataSourceFilterModelType ===
|
417
|
-
selector_new[
|
418
|
-
replaceRegexOptions(replaceKeysInQuery(JSON.parse(e.filterModelMongo))),
|
419
|
-
];
|
375
|
+
if (e.dataSourceFilterModelType === 'query' && e.filterModelMongo) {
|
376
|
+
selector_new['$and'] = [replaceRegexOptions(replaceKeysInQuery(JSON.parse(e.filterModelMongo)))];
|
420
377
|
}
|
421
378
|
if (e.filterModelUserMongo) {
|
422
|
-
if (!selector_new[
|
423
|
-
selector_new[
|
379
|
+
if (!selector_new['$and']) {
|
380
|
+
selector_new['$and'] = [];
|
424
381
|
}
|
425
|
-
selector_new[
|
426
|
-
replaceRegexOptions(
|
427
|
-
replaceKeysInQuery(JSON.parse(e.filterModelUserMongo))
|
428
|
-
)
|
429
|
-
);
|
382
|
+
selector_new['$and'].push(replaceRegexOptions(replaceKeysInQuery(JSON.parse(e.filterModelUserMongo))));
|
430
383
|
}
|
431
384
|
|
432
|
-
if (e.dataSourceFilterModelType ===
|
385
|
+
if (e.dataSourceFilterModelType === 'index') {
|
433
386
|
for (const [key, val] of Object.entries(opt.selector)) {
|
434
|
-
selector_new[
|
387
|
+
selector_new['udfData.data.' + key] = val;
|
435
388
|
}
|
436
389
|
}
|
437
390
|
|
438
391
|
opt.selector = selector_new;
|
439
|
-
opt.selector[
|
440
|
-
opt.selector[
|
392
|
+
opt.selector['udfData.udffileid'] = e.table_id;
|
393
|
+
opt.selector['docType'] = 'database';
|
441
394
|
opt.selector.stat = e.archived ? 4 : 3;
|
442
395
|
|
443
396
|
// fill selector with sort field if not exist
|
@@ -449,8 +402,8 @@ const get_opt = function (e, table_obj) {
|
|
449
402
|
}
|
450
403
|
}
|
451
404
|
}
|
452
|
-
opt.fields.push(
|
453
|
-
opt.fields.push(
|
405
|
+
opt.fields.push('_id');
|
406
|
+
opt.fields.push('_rev');
|
454
407
|
|
455
408
|
if (e.selector) {
|
456
409
|
opt.selector = { ...e.selector, ...opt.selector };
|
@@ -470,11 +423,9 @@ const query_db = async function (e, db, table_obj) {
|
|
470
423
|
for (var val of body.docs) {
|
471
424
|
var data = {};
|
472
425
|
if (e.fields) {
|
473
|
-
for (const [key2, val2] of Object.entries(
|
474
|
-
typeof e.fields === "string" ? e.fields.split(",") : e.fields
|
475
|
-
)) {
|
426
|
+
for (const [key2, val2] of Object.entries(typeof e.fields === 'string' ? e.fields.split(',') : e.fields)) {
|
476
427
|
if (val.udfData) {
|
477
|
-
data[val2] = val[
|
428
|
+
data[val2] = val['udfData']['data'][val2];
|
478
429
|
} else {
|
479
430
|
data[val2] = null;
|
480
431
|
}
|
@@ -482,8 +433,7 @@ const query_db = async function (e, db, table_obj) {
|
|
482
433
|
} else {
|
483
434
|
for (const [key2, val2] of Object.entries(table_obj.tableFields)) {
|
484
435
|
if (val.udfData) {
|
485
|
-
data[val2.data.field_id] =
|
486
|
-
val["udfData"]["data"][val2.data.field_id];
|
436
|
+
data[val2.data.field_id] = val['udfData']['data'][val2.data.field_id];
|
487
437
|
} else {
|
488
438
|
data[val2.data.field_id] = null;
|
489
439
|
}
|
@@ -501,26 +451,17 @@ const query_db = async function (e, db, table_obj) {
|
|
501
451
|
const count_data = async function () {
|
502
452
|
var rows = [];
|
503
453
|
var keys_obj = {};
|
504
|
-
const table_index = find_item_by_key_root(
|
505
|
-
table_obj.tableIndexes,
|
506
|
-
"id",
|
507
|
-
e.indexId
|
508
|
-
);
|
454
|
+
const table_index = find_item_by_key_root(table_obj.tableIndexes, 'id', e.indexId);
|
509
455
|
if (e.indexId && table_index) {
|
510
456
|
var index_keys = table_index.data.keys;
|
511
457
|
var index_id = e.indexId;
|
512
458
|
|
513
459
|
for (var val of body.docs) {
|
514
460
|
var data = {};
|
515
|
-
const _tableFieldsObj = find_item_by_key(
|
516
|
-
table_obj.tableFields,
|
517
|
-
"field_id",
|
518
|
-
e.field_id
|
519
|
-
);
|
461
|
+
const _tableFieldsObj = find_item_by_key(table_obj.tableFields, 'field_id', e.field_id);
|
520
462
|
|
521
463
|
for (const [key2, val2] of Object.entries(table_obj.tableFields)) {
|
522
|
-
data[val2.data.field_id] =
|
523
|
-
val["udfData"]["data"][val2.data.field_id];
|
464
|
+
data[val2.data.field_id] = val['udfData']['data'][val2.data.field_id];
|
524
465
|
}
|
525
466
|
|
526
467
|
var key_arr = [];
|
@@ -539,7 +480,7 @@ const query_db = async function (e, db, table_obj) {
|
|
539
480
|
}
|
540
481
|
} else {
|
541
482
|
// no index
|
542
|
-
rows.push({ key:
|
483
|
+
rows.push({ key: '', value: body.docs.length });
|
543
484
|
}
|
544
485
|
return { code: 1, data: { rows: rows, total_rows: rows.length, opt } };
|
545
486
|
};
|
@@ -548,9 +489,7 @@ const query_db = async function (e, db, table_obj) {
|
|
548
489
|
const median = (arr) => {
|
549
490
|
const mid = Math.floor(arr.length / 2),
|
550
491
|
nums = [...arr].sort((a, b) => a - b);
|
551
|
-
return arr.length % 2 !== 0
|
552
|
-
? nums[mid]
|
553
|
-
: (nums[mid - 1] + nums[mid]) / 2;
|
492
|
+
return arr.length % 2 !== 0 ? nums[mid] : (nums[mid - 1] + nums[mid]) / 2;
|
554
493
|
};
|
555
494
|
|
556
495
|
var total_fields_info = JSON.parse(e.total_fields_info);
|
@@ -576,62 +515,55 @@ const query_db = async function (e, db, table_obj) {
|
|
576
515
|
totals_counts[field_id]++;
|
577
516
|
|
578
517
|
switch (totals_prop[field_id].sum_type) {
|
579
|
-
case
|
580
|
-
if (typeof totals_obj[field_id] ===
|
518
|
+
case 'sum':
|
519
|
+
if (typeof totals_obj[field_id] === 'undefined') {
|
581
520
|
totals_obj[field_id] = value;
|
582
521
|
} else {
|
583
522
|
totals_obj[field_id] += value;
|
584
523
|
}
|
585
524
|
break;
|
586
525
|
|
587
|
-
case
|
526
|
+
case 'average':
|
588
527
|
totals_sums[field_id] += value;
|
589
|
-
totals_obj[field_id] =
|
590
|
-
totals_sums[field_id] / totals_counts[field_id];
|
528
|
+
totals_obj[field_id] = totals_sums[field_id] / totals_counts[field_id];
|
591
529
|
break;
|
592
530
|
|
593
|
-
case
|
531
|
+
case 'median':
|
594
532
|
if (!totals_arr[field_id].includes(value)) {
|
595
533
|
totals_arr[field_id].push(value);
|
596
534
|
}
|
597
535
|
totals_obj[field_id] = median(totals_arr[field_id]);
|
598
536
|
break;
|
599
|
-
case
|
600
|
-
if (
|
601
|
-
typeof totals_obj[field_id] === "undefined" ||
|
602
|
-
value < totals_obj[field_id]
|
603
|
-
) {
|
537
|
+
case 'min':
|
538
|
+
if (typeof totals_obj[field_id] === 'undefined' || value < totals_obj[field_id]) {
|
604
539
|
totals_obj[field_id] = value;
|
605
540
|
}
|
606
541
|
break;
|
607
|
-
case
|
608
|
-
if (
|
609
|
-
typeof totals_obj[field_id] === "undefined" ||
|
610
|
-
value > totals_obj[field_id]
|
611
|
-
) {
|
542
|
+
case 'max':
|
543
|
+
if (typeof totals_obj[field_id] === 'undefined' || value > totals_obj[field_id]) {
|
612
544
|
totals_obj[field_id] = value;
|
613
545
|
}
|
614
546
|
break;
|
615
|
-
case
|
616
|
-
if (typeof totals_obj[field_id] ===
|
547
|
+
case 'count':
|
548
|
+
if (typeof totals_obj[field_id] === 'undefined') {
|
617
549
|
totals_obj[field_id] = 1;
|
618
550
|
} else {
|
619
551
|
totals_obj[field_id]++;
|
620
552
|
}
|
621
553
|
break;
|
622
|
-
case
|
554
|
+
case 'distinct':
|
623
555
|
if (!totals_arr[field_id].includes(value)) {
|
624
556
|
totals_arr[field_id].push(value);
|
625
557
|
}
|
626
558
|
totals_obj[field_id] = totals_arr[field_id].length;
|
627
559
|
break;
|
628
560
|
|
629
|
-
case
|
561
|
+
case 'group':
|
630
562
|
if (!totals_obj[field_id]) {
|
631
563
|
totals_obj[field_id] = {};
|
632
564
|
}
|
633
565
|
|
634
|
-
if (typeof totals_obj[field_id][value] ===
|
566
|
+
if (typeof totals_obj[field_id][value] === 'undefined') {
|
635
567
|
totals_obj[field_id][value] = 1; //value;
|
636
568
|
} else {
|
637
569
|
totals_obj[field_id][value]++; //+= value;
|
@@ -662,11 +594,9 @@ const query_db = async function (e, db, table_obj) {
|
|
662
594
|
|
663
595
|
const doc = await db.find(opt);
|
664
596
|
var mango_index_obj;
|
665
|
-
if (doc?.warning?.includes(
|
597
|
+
if (doc?.warning?.includes('No matching index found')) {
|
666
598
|
try {
|
667
|
-
const index_name = `index_${e.table_id}_${new Date()
|
668
|
-
.valueOf()
|
669
|
-
.toString()}`;
|
599
|
+
const index_name = `index_${e.table_id}_${new Date().valueOf().toString()}`;
|
670
600
|
var index = [];
|
671
601
|
|
672
602
|
for (const [key, val] of Object.entries(opt.selector)) {
|
@@ -681,20 +611,19 @@ const query_db = async function (e, db, table_obj) {
|
|
681
611
|
};
|
682
612
|
const result = await db.createIndex(mango_index_obj);
|
683
613
|
// console.log("createIndex", result);
|
684
|
-
throw new Error(
|
614
|
+
throw new Error('creating index in progress');
|
685
615
|
} catch (err) {
|
686
616
|
return { code: -1, data: err.message };
|
687
617
|
}
|
688
618
|
}
|
689
619
|
return await done(doc);
|
690
620
|
} catch (err) {
|
691
|
-
if (err.message.includes(
|
692
|
-
const index_name = `index_${e.table_id}_${new Date()
|
693
|
-
.valueOf()
|
694
|
-
.toString()}`;
|
621
|
+
if (err.message.includes('Cannot sort on field')) {
|
622
|
+
const index_name = `index_${e.table_id}_${new Date().valueOf().toString()}`;
|
695
623
|
|
696
624
|
// const _selector = _.cloneDeep(opt.selector);
|
697
|
-
|
625
|
+
let _sort = _.cloneDeep(opt.sort);
|
626
|
+
|
698
627
|
mango_index_obj = {
|
699
628
|
index: {
|
700
629
|
fields: [],
|
@@ -702,7 +631,7 @@ const query_db = async function (e, db, table_obj) {
|
|
702
631
|
name: index_name,
|
703
632
|
ddoc: `mango_index_table_${e.table_id}`,
|
704
633
|
};
|
705
|
-
|
634
|
+
delete _sort['$and'];
|
706
635
|
for (let val of _sort) {
|
707
636
|
let field_id = Object.keys(val)[0];
|
708
637
|
mango_index_obj.index.fields.push(field_id);
|
@@ -740,7 +669,7 @@ const query_db = async function (e, db, table_obj) {
|
|
740
669
|
// };
|
741
670
|
// await monitor_indexing();
|
742
671
|
// throw new Error({ code: -88, data: "creating index" });
|
743
|
-
throw new Error(
|
672
|
+
throw new Error('creating index in progress');
|
744
673
|
// const doc = await db.find(opt);
|
745
674
|
// return await done(doc);
|
746
675
|
} catch (err) {
|
@@ -771,15 +700,15 @@ const query_db = async function (e, db, table_obj) {
|
|
771
700
|
if (key) {
|
772
701
|
view_opt = {
|
773
702
|
key,
|
774
|
-
include_docs: !e.ids && view !==
|
703
|
+
include_docs: !e.ids && view !== 'db_index_reduce',
|
775
704
|
limit,
|
776
705
|
skip,
|
777
706
|
};
|
778
707
|
} else {
|
779
708
|
if (e.reduce) {
|
780
709
|
view_opt = {
|
781
|
-
startkey: e.startkey ? JSON.parse(e.startkey) :
|
782
|
-
endkey: e.endkey ? JSON.parse(e.endkey) :
|
710
|
+
startkey: e.startkey ? JSON.parse(e.startkey) : '',
|
711
|
+
endkey: e.endkey ? JSON.parse(e.endkey) : '',
|
783
712
|
include_docs: false,
|
784
713
|
reduce: true,
|
785
714
|
group_level: 3,
|
@@ -788,8 +717,8 @@ const query_db = async function (e, db, table_obj) {
|
|
788
717
|
};
|
789
718
|
} else {
|
790
719
|
view_opt = {
|
791
|
-
startkey: e.startkey ? JSON.parse(e.startkey) :
|
792
|
-
endkey: e.endkey ? JSON.parse(e.endkey) :
|
720
|
+
startkey: e.startkey ? JSON.parse(e.startkey) : '',
|
721
|
+
endkey: e.endkey ? JSON.parse(e.endkey) : '',
|
793
722
|
include_docs: !e.ids,
|
794
723
|
limit,
|
795
724
|
skip,
|
@@ -803,11 +732,7 @@ const query_db = async function (e, db, table_obj) {
|
|
803
732
|
if (e.reduce) {
|
804
733
|
let rows = [];
|
805
734
|
|
806
|
-
const table_index = find_item_by_key_root(
|
807
|
-
table_obj.tableIndexes,
|
808
|
-
"id",
|
809
|
-
e.indexId
|
810
|
-
);
|
735
|
+
const table_index = find_item_by_key_root(table_obj.tableIndexes, 'id', e.indexId);
|
811
736
|
|
812
737
|
for await (var val of body.rows) {
|
813
738
|
const arr = val.key[2];
|
@@ -816,22 +741,13 @@ const query_db = async function (e, db, table_obj) {
|
|
816
741
|
for await (const [arr_key, arr_val] of Object.entries(arr)) {
|
817
742
|
let field_id = table_index.data.keys[Number(arr_key)];
|
818
743
|
|
819
|
-
const _tableFieldsObj = find_item_by_key(
|
820
|
-
table_obj.tableFields,
|
821
|
-
"field_id",
|
822
|
-
field_id
|
823
|
-
);
|
744
|
+
const _tableFieldsObj = find_item_by_key(table_obj.tableFields, 'field_id', field_id);
|
824
745
|
|
825
|
-
let field_value = await get_cast_val(
|
826
|
-
"dbs_update",
|
827
|
-
e.field_id,
|
828
|
-
_tableFieldsObj.props.fieldType,
|
829
|
-
arr_val
|
830
|
-
);
|
746
|
+
let field_value = await get_cast_val('dbs_update', e.field_id, _tableFieldsObj.props.fieldType, arr_val);
|
831
747
|
|
832
748
|
obj[field_id] = field_value;
|
833
749
|
}
|
834
|
-
obj[
|
750
|
+
obj['REDUCE_VALUE'] = val.value;
|
835
751
|
|
836
752
|
rows.push({ id: crypto.randomUUID(), value: obj });
|
837
753
|
}
|
@@ -892,16 +808,16 @@ const query_db = async function (e, db, table_obj) {
|
|
892
808
|
opt.key = e.table_id;
|
893
809
|
}
|
894
810
|
|
895
|
-
const body = await db.query(
|
811
|
+
const body = await db.query('xuda/db_table_counts', opt);
|
896
812
|
|
897
813
|
return { code: 1, data: body };
|
898
814
|
};
|
899
815
|
var view;
|
900
816
|
if (e.reduce && JSON.parse(e.reduce)) {
|
901
|
-
view =
|
817
|
+
view = 'db_index_reduce';
|
902
818
|
return await runtime_get_query_data();
|
903
819
|
}
|
904
|
-
if (e.view ===
|
820
|
+
if (e.view === 'db_index') {
|
905
821
|
key = e.key;
|
906
822
|
view = e.view;
|
907
823
|
return await runtime_get_query_data();
|
@@ -924,18 +840,13 @@ export const create = async (params, resolve, reject) => {
|
|
924
840
|
const create_data_obj = async function (table_data) {
|
925
841
|
var doc = {};
|
926
842
|
for await (const val of table_obj.tableFields) {
|
927
|
-
doc[val.data.field_id] = await get_cast_val(
|
928
|
-
"dbs_create",
|
929
|
-
val.data.field_id,
|
930
|
-
val.props.fieldType,
|
931
|
-
table_data[val.data.field_id]
|
932
|
-
);
|
843
|
+
doc[val.data.field_id] = await get_cast_val('dbs_create', val.data.field_id, val.props.fieldType, table_data[val.data.field_id]);
|
933
844
|
}
|
934
845
|
|
935
846
|
return doc;
|
936
847
|
};
|
937
848
|
const get_uuid = function (table_id) {
|
938
|
-
return
|
849
|
+
return 'dbs-' + table_id + '_' + crypto.randomUUID();
|
939
850
|
};
|
940
851
|
const batch = async function () {
|
941
852
|
var docs = [];
|
@@ -943,11 +854,11 @@ export const create = async (params, resolve, reject) => {
|
|
943
854
|
for await (var val of e.table_data) {
|
944
855
|
var doc = {
|
945
856
|
_id: get_uuid(e.table_id),
|
946
|
-
docType:
|
857
|
+
docType: 'database',
|
947
858
|
user: e.uid,
|
948
859
|
app_id: e.app_id,
|
949
860
|
stat: 3,
|
950
|
-
source:
|
861
|
+
source: 'dbs',
|
951
862
|
udfData: {
|
952
863
|
udffileid: e.table_id,
|
953
864
|
data: await create_data_obj(val),
|
@@ -980,11 +891,11 @@ export const create = async (params, resolve, reject) => {
|
|
980
891
|
const single = async function () {
|
981
892
|
var doc = {
|
982
893
|
_id: get_uuid(e.table_id),
|
983
|
-
docType:
|
894
|
+
docType: 'database',
|
984
895
|
user: e.uid,
|
985
896
|
app_id: e.app_id,
|
986
897
|
stat: 3,
|
987
|
-
source:
|
898
|
+
source: 'dbs',
|
988
899
|
udfData: {
|
989
900
|
udffileid: e.table_id,
|
990
901
|
data: await create_data_obj(e.table_data),
|
@@ -1034,55 +945,37 @@ export const update = async (params, resolve, reject) => {
|
|
1034
945
|
|
1035
946
|
const table_obj = params.table_obj;
|
1036
947
|
try {
|
1037
|
-
if (e.row_id ===
|
948
|
+
if (e.row_id === 'newRecord') {
|
1038
949
|
return this.create(params, resolve, reject);
|
1039
950
|
}
|
1040
951
|
var doc = await db.get(e.row_id, {});
|
1041
952
|
// let data = doc.udfData.data;
|
1042
953
|
var error = undefined;
|
1043
954
|
if (!e.field_id && !e.table_data) {
|
1044
|
-
error =
|
955
|
+
error = 'Invalid field_id or table_data object to save';
|
1045
956
|
return reject(error);
|
1046
957
|
}
|
1047
958
|
// single value save
|
1048
959
|
if (e.field_id) {
|
1049
|
-
let _tableFieldsObj = find_item_by_key(
|
1050
|
-
table_obj.tableFields,
|
1051
|
-
"field_id",
|
1052
|
-
e.field_id
|
1053
|
-
);
|
960
|
+
let _tableFieldsObj = find_item_by_key(table_obj.tableFields, 'field_id', e.field_id);
|
1054
961
|
if (!_tableFieldsObj || _.isEmpty(_tableFieldsObj)) {
|
1055
|
-
return reject(
|
962
|
+
return reject('Error: ' + e.field_id + ' - field not found');
|
1056
963
|
}
|
1057
964
|
|
1058
|
-
doc.udfData.data[e.field_id] = await get_cast_val(
|
1059
|
-
"dbs_update",
|
1060
|
-
e.field_id,
|
1061
|
-
_tableFieldsObj.props.fieldType,
|
1062
|
-
e.field_value
|
1063
|
-
);
|
965
|
+
doc.udfData.data[e.field_id] = await get_cast_val('dbs_update', e.field_id, _tableFieldsObj.props.fieldType, e.field_value);
|
1064
966
|
}
|
1065
967
|
|
1066
968
|
// object value save
|
1067
969
|
if (e.table_data) {
|
1068
970
|
// data = {};
|
1069
971
|
for await (const [key, val] of Object.entries(e.table_data)) {
|
1070
|
-
let _tableFieldsObj = find_item_by_key(
|
1071
|
-
table_obj.tableFields,
|
1072
|
-
"field_id",
|
1073
|
-
key
|
1074
|
-
);
|
972
|
+
let _tableFieldsObj = find_item_by_key(table_obj.tableFields, 'field_id', key);
|
1075
973
|
if (!_tableFieldsObj || _.isEmpty(_tableFieldsObj)) {
|
1076
|
-
reject(
|
974
|
+
reject('Error: ' + key + ' - field not found');
|
1077
975
|
break;
|
1078
976
|
}
|
1079
977
|
|
1080
|
-
doc.udfData.data[key] = await get_cast_val(
|
1081
|
-
"dbs_update",
|
1082
|
-
key,
|
1083
|
-
_tableFieldsObj.props.fieldType,
|
1084
|
-
val
|
1085
|
-
);
|
978
|
+
doc.udfData.data[key] = await get_cast_val('dbs_update', key, _tableFieldsObj.props.fieldType, val);
|
1086
979
|
}
|
1087
980
|
}
|
1088
981
|
|
@@ -1162,11 +1055,11 @@ export const create_design = async (params, resolve, reject) => {
|
|
1162
1055
|
const db = params.db;
|
1163
1056
|
|
1164
1057
|
const ddoc = {
|
1165
|
-
_id:
|
1058
|
+
_id: '_design/xuda',
|
1166
1059
|
views: {
|
1167
1060
|
db_index_reduce: {
|
1168
1061
|
map: 'function(doc) {\r\n if (doc.docType=="database" && doc.stat===3) {\r\n if (doc.udfIndex) {\r\n for (var i = 0; i < doc.udfIndex.length; i++)\r\n {\r\n var val = doc.udfIndex[i]; \r\n emit([val.fileId, val.indexId, val.keyValue],1);\r\n }\r\n }\r\n }\r\n \r\n}',
|
1169
|
-
reduce:
|
1062
|
+
reduce: 'function(keys, values) {\n return sum(values);\n}',
|
1170
1063
|
},
|
1171
1064
|
db_index: {
|
1172
1065
|
map: 'function(doc) {\r\n if (doc.docType=="database" && doc.stat===3) {\r\n if (doc.udfIndex) {\r\n for (var i = 0; i < doc.udfIndex.length; i++)\r\n {\r\n var val = doc.udfIndex[i]; \r\n emit([val.fileId, val.indexId, val.keyValue],{_id: doc._id});\r\n }\r\n }\r\n }\r\n \r\n}',
|
@@ -1174,11 +1067,11 @@ export const create_design = async (params, resolve, reject) => {
|
|
1174
1067
|
|
1175
1068
|
db_table_counts: {
|
1176
1069
|
map: 'function(doc) {\r\n\r\nif (doc.docType=="database" && doc.stat===3) {\r\n if(doc.udfData && doc.udfData.udffileid) \r\n emit(doc.udfData.udffileid, 1); \r\n }\r\n}',
|
1177
|
-
reduce:
|
1070
|
+
reduce: '_count',
|
1178
1071
|
},
|
1179
1072
|
stat_3_doc_counts: {
|
1180
|
-
reduce:
|
1181
|
-
map:
|
1073
|
+
reduce: '_count',
|
1074
|
+
map: 'function (doc) {\n if(doc.stat===3){\n emit(doc.docType, 1);\n }\n}',
|
1182
1075
|
},
|
1183
1076
|
},
|
1184
1077
|
};
|