@xuda.io/xuda-dbs-plugin-xuda 1.0.318 → 1.0.319
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.mjs +45 -18
- package/studio.mjs +49 -42
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.319",
|
|
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.mjs
CHANGED
|
@@ -515,27 +515,54 @@ const query_db = async function (e, db, app_id_reference, table_obj) {
|
|
|
515
515
|
return raw_data();
|
|
516
516
|
};
|
|
517
517
|
|
|
518
|
+
const get_mango_index_fields = function (selector) {
|
|
519
|
+
const fields = new Set();
|
|
520
|
+
const add_selector_fields = function (obj) {
|
|
521
|
+
if (!obj || typeof obj !== 'object' || Array.isArray(obj)) {
|
|
522
|
+
return;
|
|
523
|
+
}
|
|
524
|
+
for (const [key, val] of Object.entries(obj)) {
|
|
525
|
+
if (['$and', '$or', '$nor'].includes(key)) {
|
|
526
|
+
if (Array.isArray(val)) {
|
|
527
|
+
val.forEach(add_selector_fields);
|
|
528
|
+
}
|
|
529
|
+
continue;
|
|
530
|
+
}
|
|
531
|
+
if (key.startsWith('$')) {
|
|
532
|
+
continue;
|
|
533
|
+
}
|
|
534
|
+
fields.add(key);
|
|
535
|
+
}
|
|
536
|
+
};
|
|
537
|
+
add_selector_fields(selector);
|
|
538
|
+
return [...fields];
|
|
539
|
+
};
|
|
540
|
+
|
|
541
|
+
const create_mango_index_for_selector = async function () {
|
|
542
|
+
const index = get_mango_index_fields(opt.selector);
|
|
543
|
+
if (!index.length) {
|
|
544
|
+
return;
|
|
545
|
+
}
|
|
546
|
+
const index_suffix = index.join('_').replace(/[^a-zA-Z0-9_]+/g, '_').slice(0, 80) || 'selector';
|
|
547
|
+
const mango_index_obj = {
|
|
548
|
+
index: {
|
|
549
|
+
fields: index,
|
|
550
|
+
},
|
|
551
|
+
name: `index_${e.table_id}_${index_suffix}`,
|
|
552
|
+
ddoc: `mango_index_table_${e.table_id}_${index_suffix}`,
|
|
553
|
+
};
|
|
554
|
+
try {
|
|
555
|
+
await db.createIndex(mango_index_obj);
|
|
556
|
+
} catch (err) {
|
|
557
|
+
// The read already succeeded; index creation is only an optimization.
|
|
558
|
+
}
|
|
559
|
+
};
|
|
560
|
+
|
|
518
561
|
try {
|
|
519
562
|
try {
|
|
520
563
|
const doc = await db.find(opt);
|
|
521
|
-
var mango_index_obj;
|
|
522
564
|
if (doc?.warning?.includes('No matching index found')) {
|
|
523
|
-
|
|
524
|
-
var index = [];
|
|
525
|
-
|
|
526
|
-
for (const [key, val] of Object.entries(opt.selector)) {
|
|
527
|
-
index.push(key);
|
|
528
|
-
}
|
|
529
|
-
mango_index_obj = {
|
|
530
|
-
index: {
|
|
531
|
-
fields: index,
|
|
532
|
-
},
|
|
533
|
-
name: index_name,
|
|
534
|
-
ddoc: `mango_index_table_${e.table_id}`,
|
|
535
|
-
};
|
|
536
|
-
db.createIndex(mango_index_obj).then((result) => {
|
|
537
|
-
console.log(result);
|
|
538
|
-
});
|
|
565
|
+
await create_mango_index_for_selector();
|
|
539
566
|
}
|
|
540
567
|
return await done(doc);
|
|
541
568
|
} catch (err) {
|
|
@@ -544,7 +571,7 @@ const query_db = async function (e, db, app_id_reference, table_obj) {
|
|
|
544
571
|
const _selector = _.cloneDeep(opt.selector);
|
|
545
572
|
delete _selector['$and'];
|
|
546
573
|
const _sort = _.cloneDeep(opt.sort);
|
|
547
|
-
mango_index_obj = {
|
|
574
|
+
const mango_index_obj = {
|
|
548
575
|
index: {
|
|
549
576
|
fields: Object.keys(
|
|
550
577
|
_.reduce(
|
package/studio.mjs
CHANGED
|
@@ -587,44 +587,66 @@ const query_db = async function (e, db, table_obj) {
|
|
|
587
587
|
};
|
|
588
588
|
|
|
589
589
|
// xuda
|
|
590
|
+
const get_mango_index_fields = function (selector) {
|
|
591
|
+
const fields = new Set();
|
|
592
|
+
const add_selector_fields = function (obj) {
|
|
593
|
+
if (!obj || typeof obj !== 'object' || Array.isArray(obj)) {
|
|
594
|
+
return;
|
|
595
|
+
}
|
|
596
|
+
for (const [key, val] of Object.entries(obj)) {
|
|
597
|
+
if (['$and', '$or', '$nor'].includes(key)) {
|
|
598
|
+
if (Array.isArray(val)) {
|
|
599
|
+
val.forEach(add_selector_fields);
|
|
600
|
+
}
|
|
601
|
+
continue;
|
|
602
|
+
}
|
|
603
|
+
if (key.startsWith('$')) {
|
|
604
|
+
continue;
|
|
605
|
+
}
|
|
606
|
+
fields.add(key);
|
|
607
|
+
}
|
|
608
|
+
};
|
|
609
|
+
add_selector_fields(selector);
|
|
610
|
+
return [...fields];
|
|
611
|
+
};
|
|
612
|
+
|
|
613
|
+
const create_mango_index_for_selector = async function () {
|
|
614
|
+
const index = get_mango_index_fields(opt.selector);
|
|
615
|
+
if (!index.length) {
|
|
616
|
+
return;
|
|
617
|
+
}
|
|
618
|
+
const index_suffix = index.join('_').replace(/[^a-zA-Z0-9_]+/g, '_').slice(0, 80) || 'selector';
|
|
619
|
+
const mango_index_obj = {
|
|
620
|
+
index: {
|
|
621
|
+
fields: index,
|
|
622
|
+
},
|
|
623
|
+
name: `index_${e.table_id}_${index_suffix}`,
|
|
624
|
+
ddoc: `mango_index_table_${e.table_id}_${index_suffix}`,
|
|
625
|
+
};
|
|
626
|
+
try {
|
|
627
|
+
await db.createIndex(mango_index_obj);
|
|
628
|
+
} catch (err) {
|
|
629
|
+
// The read already succeeded; index creation is only an optimization.
|
|
630
|
+
}
|
|
631
|
+
};
|
|
590
632
|
|
|
591
633
|
try {
|
|
592
634
|
try {
|
|
593
635
|
// console.log("opt", opt);
|
|
594
636
|
|
|
595
637
|
const doc = await db.find(opt);
|
|
596
|
-
var mango_index_obj;
|
|
597
638
|
if (doc?.warning?.includes('No matching index found')) {
|
|
598
|
-
|
|
599
|
-
const index_name = `index_${e.table_id}_${new Date().valueOf().toString()}`;
|
|
600
|
-
var index = [];
|
|
601
|
-
|
|
602
|
-
for (const [key, val] of Object.entries(opt.selector)) {
|
|
603
|
-
index.push(key);
|
|
604
|
-
}
|
|
605
|
-
mango_index_obj = {
|
|
606
|
-
index: {
|
|
607
|
-
fields: index,
|
|
608
|
-
},
|
|
609
|
-
name: index_name,
|
|
610
|
-
ddoc: `mango_index_table_${e.table_id}`,
|
|
611
|
-
};
|
|
612
|
-
const result = await db.createIndex(mango_index_obj);
|
|
613
|
-
// console.log("createIndex", result);
|
|
614
|
-
throw new Error('creating index in progress');
|
|
615
|
-
} catch (err) {
|
|
616
|
-
return { code: -1, data: err.message };
|
|
617
|
-
}
|
|
639
|
+
await create_mango_index_for_selector();
|
|
618
640
|
}
|
|
619
641
|
return await done(doc);
|
|
620
642
|
} catch (err) {
|
|
621
|
-
if (err
|
|
643
|
+
if (err?.message?.includes('Cannot sort on field')) {
|
|
622
644
|
const index_name = `index_${e.table_id}_${new Date().valueOf().toString()}`;
|
|
623
645
|
|
|
624
646
|
// const _selector = _.cloneDeep(opt.selector);
|
|
625
647
|
let _sort = _.cloneDeep(opt.sort);
|
|
626
648
|
|
|
627
|
-
mango_index_obj = {
|
|
649
|
+
const mango_index_obj = {
|
|
628
650
|
index: {
|
|
629
651
|
fields: [],
|
|
630
652
|
},
|
|
@@ -655,32 +677,17 @@ const query_db = async function (e, db, table_obj) {
|
|
|
655
677
|
|
|
656
678
|
try {
|
|
657
679
|
const result = await db.createIndex(mango_index_obj);
|
|
658
|
-
|
|
659
|
-
|
|
660
|
-
// db.on("indexing", function (event) {
|
|
661
|
-
// // called when indexes are updated
|
|
662
|
-
// console.log("indexes event", event);
|
|
663
|
-
// // resolve();
|
|
664
|
-
// });
|
|
665
|
-
// setTimeout(() => {
|
|
666
|
-
// resolve();
|
|
667
|
-
// }, 5000);
|
|
668
|
-
// });
|
|
669
|
-
// };
|
|
670
|
-
// await monitor_indexing();
|
|
671
|
-
// throw new Error({ code: -88, data: "creating index" });
|
|
672
|
-
throw new Error('creating index in progress');
|
|
673
|
-
// const doc = await db.find(opt);
|
|
674
|
-
// return await done(doc);
|
|
680
|
+
const doc = await db.find(opt);
|
|
681
|
+
return await done(doc);
|
|
675
682
|
} catch (err) {
|
|
676
683
|
return { code: -1, data: err.message };
|
|
677
684
|
}
|
|
678
685
|
} else {
|
|
679
|
-
return { code: -1, data: err
|
|
686
|
+
return { code: -1, data: err?.message || err };
|
|
680
687
|
}
|
|
681
688
|
}
|
|
682
689
|
} catch (err) {
|
|
683
|
-
return { code: -1, data: err
|
|
690
|
+
return { code: -1, data: err?.message || err };
|
|
684
691
|
}
|
|
685
692
|
};
|
|
686
693
|
|