@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.
Files changed (3) hide show
  1. package/package.json +1 -1
  2. package/server.mjs +45 -18
  3. 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.318",
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
- const index_name = `index_${e.table_id}_${new Date().valueOf().toString()}`;
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
- try {
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.message.includes('Cannot sort on field')) {
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
- // const monitor_indexing = async function () {
659
- // return new Promise((resolve, reject) => {
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.message };
686
+ return { code: -1, data: err?.message || err };
680
687
  }
681
688
  }
682
689
  } catch (err) {
683
- return { code: -1, data: err.message };
690
+ return { code: -1, data: err?.message || err };
684
691
  }
685
692
  };
686
693