@finos/legend-data-cube 0.1.0 → 0.1.1

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 (84) hide show
  1. package/lib/components/view/grid/DataCubeGrid.d.ts.map +1 -1
  2. package/lib/components/view/grid/DataCubeGrid.js +20 -20
  3. package/lib/components/view/grid/DataCubeGrid.js.map +1 -1
  4. package/lib/index.css +1 -1
  5. package/lib/index.d.ts +2 -3
  6. package/lib/index.d.ts.map +1 -1
  7. package/lib/index.js +4 -3
  8. package/lib/index.js.map +1 -1
  9. package/lib/package.json +3 -3
  10. package/lib/stores/DataCubeAPI.d.ts +6 -0
  11. package/lib/stores/DataCubeAPI.d.ts.map +1 -1
  12. package/lib/stores/DataCubeAPI.js +3 -0
  13. package/lib/stores/DataCubeAPI.js.map +1 -1
  14. package/lib/stores/DataCubeOptions.d.ts +1 -1
  15. package/lib/stores/core/DataCubeConfigurationBuilder.js +1 -1
  16. package/lib/stores/core/DataCubeConfigurationBuilder.js.map +1 -1
  17. package/lib/stores/core/DataCubeEngine.d.ts +8 -5
  18. package/lib/stores/core/DataCubeEngine.d.ts.map +1 -1
  19. package/lib/stores/core/DataCubeEngine.js +31 -7
  20. package/lib/stores/core/DataCubeEngine.js.map +1 -1
  21. package/lib/stores/core/DataCubeQueryBuilder.d.ts +3 -4
  22. package/lib/stores/core/DataCubeQueryBuilder.d.ts.map +1 -1
  23. package/lib/stores/core/DataCubeQueryBuilder.js +19 -13
  24. package/lib/stores/core/DataCubeQueryBuilder.js.map +1 -1
  25. package/lib/stores/core/DataCubeQueryBuilderUtils.d.ts +2 -7
  26. package/lib/stores/core/DataCubeQueryBuilderUtils.d.ts.map +1 -1
  27. package/lib/stores/core/DataCubeQueryBuilderUtils.js +34 -46
  28. package/lib/stores/core/DataCubeQueryBuilderUtils.js.map +1 -1
  29. package/lib/stores/core/DataCubeQuerySnapshot.d.ts +11 -4
  30. package/lib/stores/core/DataCubeQuerySnapshot.d.ts.map +1 -1
  31. package/lib/stores/core/DataCubeQuerySnapshot.js +10 -0
  32. package/lib/stores/core/DataCubeQuerySnapshot.js.map +1 -1
  33. package/lib/stores/core/DataCubeQuerySnapshotBuilder.d.ts.map +1 -1
  34. package/lib/stores/core/DataCubeQuerySnapshotBuilder.js +1 -2
  35. package/lib/stores/core/DataCubeQuerySnapshotBuilder.js.map +1 -1
  36. package/lib/stores/core/DataCubeQuerySnapshotBuilderUtils.d.ts.map +1 -1
  37. package/lib/stores/core/DataCubeQuerySnapshotBuilderUtils.js +3 -3
  38. package/lib/stores/core/DataCubeQuerySnapshotBuilderUtils.js.map +1 -1
  39. package/lib/stores/core/model/CachedDataCubeSource.d.ts +4 -0
  40. package/lib/stores/core/model/CachedDataCubeSource.d.ts.map +1 -1
  41. package/lib/stores/core/model/CachedDataCubeSource.js +4 -0
  42. package/lib/stores/core/model/CachedDataCubeSource.js.map +1 -1
  43. package/lib/stores/services/DataCubeQuerySnapshotService.js +1 -1
  44. package/lib/stores/services/DataCubeQuerySnapshotService.js.map +1 -1
  45. package/lib/stores/services/DataCubeTaskService.d.ts.map +1 -1
  46. package/lib/stores/services/DataCubeTaskService.js +2 -0
  47. package/lib/stores/services/DataCubeTaskService.js.map +1 -1
  48. package/lib/stores/view/DataCubeViewState.d.ts +3 -1
  49. package/lib/stores/view/DataCubeViewState.d.ts.map +1 -1
  50. package/lib/stores/view/DataCubeViewState.js +46 -18
  51. package/lib/stores/view/DataCubeViewState.js.map +1 -1
  52. package/lib/stores/view/extend/DataCubeColumnEditorState.d.ts.map +1 -1
  53. package/lib/stores/view/extend/DataCubeColumnEditorState.js +7 -5
  54. package/lib/stores/view/extend/DataCubeColumnEditorState.js.map +1 -1
  55. package/lib/stores/view/grid/DataCubeGridClientEngine.d.ts.map +1 -1
  56. package/lib/stores/view/grid/DataCubeGridClientEngine.js +7 -4
  57. package/lib/stores/view/grid/DataCubeGridClientEngine.js.map +1 -1
  58. package/lib/stores/view/grid/DataCubeGridQueryBuilder.d.ts +3 -4
  59. package/lib/stores/view/grid/DataCubeGridQueryBuilder.d.ts.map +1 -1
  60. package/lib/stores/view/grid/DataCubeGridQueryBuilder.js +5 -5
  61. package/lib/stores/view/grid/DataCubeGridQueryBuilder.js.map +1 -1
  62. package/lib/stores/view/grid/DataCubeGridState.d.ts.map +1 -1
  63. package/lib/stores/view/grid/DataCubeGridState.js +18 -8
  64. package/lib/stores/view/grid/DataCubeGridState.js.map +1 -1
  65. package/package.json +7 -7
  66. package/src/components/view/grid/DataCubeGrid.tsx +8 -5
  67. package/src/index.tsx +8 -3
  68. package/src/stores/DataCubeAPI.ts +9 -0
  69. package/src/stores/DataCubeOptions.ts +1 -1
  70. package/src/stores/core/DataCubeConfigurationBuilder.ts +1 -1
  71. package/src/stores/core/DataCubeEngine.tsx +41 -20
  72. package/src/stores/core/DataCubeQueryBuilder.ts +38 -30
  73. package/src/stores/core/DataCubeQueryBuilderUtils.ts +42 -67
  74. package/src/stores/core/DataCubeQuerySnapshot.ts +15 -4
  75. package/src/stores/core/DataCubeQuerySnapshotBuilder.ts +2 -6
  76. package/src/stores/core/DataCubeQuerySnapshotBuilderUtils.ts +2 -3
  77. package/src/stores/core/model/CachedDataCubeSource.ts +4 -0
  78. package/src/stores/services/DataCubeQuerySnapshotService.ts +2 -2
  79. package/src/stores/services/DataCubeTaskService.ts +2 -0
  80. package/src/stores/view/DataCubeViewState.ts +46 -26
  81. package/src/stores/view/extend/DataCubeColumnEditorState.tsx +7 -15
  82. package/src/stores/view/grid/DataCubeGridClientEngine.ts +20 -26
  83. package/src/stores/view/grid/DataCubeGridQueryBuilder.ts +19 -32
  84. package/src/stores/view/grid/DataCubeGridState.ts +24 -8
@@ -14,7 +14,7 @@
14
14
  * limitations under the License.
15
15
  */
16
16
  import { debounce, guaranteeNonNullable, } from '@finos/legend-shared';
17
- import { action, makeObservable, observable } from 'mobx';
17
+ import { action, makeObservable, observable, runInAction } from 'mobx';
18
18
  import { DataCubeGridClientServerSideDataSource, INTERNAL__GRID_CLIENT_DEFAULT_CACHE_BLOCK_SIZE, INTERNAL__GRID_CLIENT_DATA_FETCH_MANUAL_TRIGGER_COLUMN_ID, INTERNAL__GRID_CLIENT_MAX_CACHE_BLOCK_SIZE, INTERNAL__GRID_CLIENT_DEFAULT_ENABLE_PAGINATION, computeHashCodeForDataFetchManualTrigger, INTERNAL__GRID_CLIENT_DEFAULT_ENABLE_CACHING, } from './DataCubeGridClientEngine.js';
19
19
  import { DataCubeQuerySnapshotController } from '../../services/DataCubeQuerySnapshotService.js';
20
20
  import { generateGridOptionsFromSnapshot } from './DataCubeGridConfigurationBuilder.js';
@@ -87,17 +87,27 @@ export class DataCubeGridState extends DataCubeQuerySnapshotController {
87
87
  });
88
88
  }
89
89
  async setCachingEnabled(val) {
90
- this.isCachingEnabled = val;
91
- if (this.isCachingEnabled) {
92
- this._client?.setGridOption('loading', true);
90
+ const currentVal = this.isCachingEnabled;
91
+ if (val === currentVal) {
92
+ return;
93
+ }
94
+ runInAction(() => {
95
+ this.isCachingEnabled = val;
96
+ });
97
+ if (val) {
93
98
  await this._view.initializeCache();
94
- this._client?.setGridOption('loading', false);
99
+ if (this._view.processCacheState.hasFailed) {
100
+ this.isCachingEnabled = currentVal;
101
+ return;
102
+ }
95
103
  }
96
104
  else {
97
- this._client?.setGridOption('loading', true);
98
- await this._view.clearCache();
99
- this._client?.setGridOption('loading', false);
105
+ await this._view.disposeCache();
100
106
  }
107
+ runInAction(() => {
108
+ // hard reset the grid, this will force the grid to fetch data again
109
+ this.clientDataSource = new DataCubeGridClientServerSideDataSource(this, this._view);
110
+ });
101
111
  }
102
112
  setScrollHintText(val) {
103
113
  this.scrollHintText = val;
@@ -1 +1 @@
1
- {"version":3,"file":"DataCubeGridState.js","sourceRoot":"","sources":["../../../../src/stores/view/grid/DataCubeGridState.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EACL,QAAQ,EACR,oBAAoB,GAErB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,MAAM,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,MAAM,CAAC;AAG1D,OAAO,EACL,sCAAsC,EACtC,8CAA8C,EAC9C,yDAAyD,EACzD,0CAA0C,EAC1C,+CAA+C,EAC/C,wCAAwC,EACxC,4CAA4C,GAC7C,MAAM,+BAA+B,CAAC;AACvC,OAAO,EAAE,+BAA+B,EAAE,MAAM,gDAAgD,CAAC;AAEjG,OAAO,EAAE,+BAA+B,EAAE,MAAM,uCAAuC,CAAC;AACxF,OAAO,EAAE,qBAAqB,EAAE,MAAM,2CAA2C,CAAC;AAClF,OAAO,EAAE,2BAA2B,EAAE,MAAM,kCAAkC,CAAC;AAC/E,OAAO,EAAE,8BAA8B,EAAE,MAAM,qCAAqC,CAAC;AACrF,OAAO,EAAE,kBAAkB,EAAE,MAAM,qCAAqC,CAAC;AAEzE;;;;;;;;;;;;;;GAcG;AACH,MAAM,OAAO,iBAAkB,SAAQ,+BAA+B;IACnD,KAAK,CAAoB;IAEjC,UAAU,CAA8B;IAExC,YAAY,CAAiC;IAC9C,OAAO,CAAuB;IACtC,gBAAgB,CAAyC;IAEzD,kBAAkB,CAAwB;IAC1C,QAAQ,CAAsB;IAC9B,mBAAmB,GAAG,+CAA+C,CAAC;IACtE,gBAAgB,GAAG,4CAA4C,CAAC;IAChE,cAAc,CAAsB;IACpC,4FAA4F;IAC5F,+FAA+F;IAC/F,0BAA0B,CAA6B;IAEvD,YAAY,IAAuB;QACjC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,cAAc,EAAE,IAAI,CAAC,eAAe,CAAC,CAAC;QAE9D,cAAc,CAAC,IAAI,EAAE;YACnB,gBAAgB,EAAE,UAAU;YAE5B,kBAAkB,EAAE,UAAU;YAE9B,QAAQ,EAAE,UAAU;YAEpB,mBAAmB,EAAE,UAAU;YAC/B,oBAAoB,EAAE,MAAM;YAE5B,gBAAgB,EAAE,UAAU;YAC5B,iBAAiB,EAAE,MAAM;YAEzB,cAAc,EAAE,UAAU;YAC1B,iBAAiB,EAAE,MAAM;YAEzB,aAAa,EAAE,MAAM;SACtB,CAAC,CAAC;QAEH,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;QAClB,IAAI,CAAC,UAAU,GAAG,IAAI,2BAA2B,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC9D,IAAI,CAAC,YAAY,GAAG,IAAI,8BAA8B,CAAC,IAAI,CAAC,CAAC;QAC7D,IAAI,CAAC,kBAAkB,GAAG,IAAI,qBAAqB,EAAE,CAAC;QACtD,IAAI,CAAC,gBAAgB,GAAG,IAAI,sCAAsC,CAChE,IAAI,EACJ,IAAI,CAAC,KAAK,CACX,CAAC;IACJ,CAAC;IAED,oBAAoB,CAAC,GAAY;QAC/B,IAAI,CAAC,mBAAmB,GAAG,GAAG,CAAC;QAE/B,oEAAoE;QACpE,sFAAsF;QACtF,0EAA0E;QAC1E,gEAAgE;QAChE,IAAI,CAAC,gBAAgB,GAAG,IAAI,sCAAsC,CAChE,IAAI,EACJ,IAAI,CAAC,KAAK,CACX,CAAC;QACF,sFAAsF;QACtF,gGAAgG;QAChG,IAAI,CAAC,MAAM,CAAC,iBAAiB,CAAC;YAC5B,cAAc,EAAE,GAAG;gBACjB,CAAC,CAAC,8CAA8C;gBAChD,CAAC,CAAC,0CAA0C;SAC/C,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,iBAAiB,CAAC,GAAY;QAClC,IAAI,CAAC,gBAAgB,GAAG,GAAG,CAAC;QAC5B,IAAI,IAAI,CAAC,gBAAgB,EAAE,CAAC;YAC1B,IAAI,CAAC,OAAO,EAAE,aAAa,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;YAC7C,MAAM,IAAI,CAAC,KAAK,CAAC,eAAe,EAAE,CAAC;YACnC,IAAI,CAAC,OAAO,EAAE,aAAa,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;QAChD,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,OAAO,EAAE,aAAa,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;YAC7C,MAAM,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE,CAAC;YAC9B,IAAI,CAAC,OAAO,EAAE,aAAa,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;QAChD,CAAC;IACH,CAAC;IAED,iBAAiB,CAAC,GAAuB;QACvC,IAAI,CAAC,cAAc,GAAG,GAAG,CAAC;IAC5B,CAAC;IAED,IAAI,kBAAkB;QACpB,OAAO,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAC/B,CAAC;IAED,IAAI,MAAM;QACR,OAAO,oBAAoB,CAAC,IAAI,CAAC,OAAO,EAAE,+BAA+B,CAAC,CAAC;IAC7E,CAAC;IAED,eAAe,CAAC,GAAwB;QACtC,IAAI,CAAC,OAAO,GAAG,GAAG,CAAC;QACnB,IAAI,CAAC,0BAA0B,GAAG,QAAQ,CACxC,GAAG,EAAE,CAAC,GAAG,EAAE,kBAAkB,EAAE,EAC/B,GAAG,CACJ,CAAC;IACJ,CAAC;IAEQ,yBAAyB;QAChC,OAAO,MAAM,CAAC;IAChB,CAAC;IAEQ,KAAK,CAAC,aAAa,CAC1B,QAA+B,EAC/B,gBAAmD;QAEnD,MAAM,aAAa,GAAG,qBAAqB,CAAC,aAAa,CAAC,QAAQ,CAChE,QAAQ,CAAC,IAAI,CAAC,aAAa,CAC5B,CAAC;QACF,IAAI,CAAC,kBAAkB,GAAG,aAAa,CAAC;QACxC,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC;QAEpC,MAAM,WAAW,GAAG,+BAA+B,CACjD,QAAQ,EACR,aAAa,EACb,IAAI,CAAC,KAAK,CACX,CAAC;QACF,IACE,IAAI,CAAC,eAAe,CAAC,eAAe,CAClC,kBAAkB,CAAC,2BAA2B,CAC/C,EACD,CAAC;YACD,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,kBAAkB,EAAE;gBAC5C,cAAc;gBACd,WAAW;aACZ,CAAC,CAAC;QACL,CAAC;QACD,IAAI,CAAC,MAAM,CAAC,iBAAiB,CAAC;YAC5B,GAAG,WAAW;YACd,SAAS,EAAE,IAAI,CAAC,eAAe,CAAC,eAAe,CAC7C,kBAAkB,CAAC,uBAAuB,CAC3C;YACD,mBAAmB,EAAE,IAAI,CAAC,eAAe,CAAC,eAAe,CACvD,kBAAkB,CAAC,mCAAmC,CACvD;YACD,sFAAsF;YACtF,gGAAgG;YAChG,cAAc,EAAE,IAAI,CAAC,mBAAmB;gBACtC,CAAC,CAAC,8CAA8C;gBAChD,CAAC,CAAC,0CAA0C;SAC/C,CAAC,CAAC;QAEH,+FAA+F;QAC/F,6FAA6F;QAC7F,gGAAgG;QAChG,sGAAsG;QACtG,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC;YACzB,CAAC,yDAAyD,CAAC,EAAE;gBAC3D,IAAI,EAAE,QAAQ;gBACd,MAAM,EAAE,wCAAwC,CAC9C,QAAQ,EACR,aAAa,CACd;aACF;SACF,CAAC,CAAC;IACL,CAAC;CACF"}
1
+ {"version":3,"file":"DataCubeGridState.js","sourceRoot":"","sources":["../../../../src/stores/view/grid/DataCubeGridState.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EACL,QAAQ,EACR,oBAAoB,GAErB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,MAAM,EAAE,cAAc,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,MAAM,CAAC;AAGvE,OAAO,EACL,sCAAsC,EACtC,8CAA8C,EAC9C,yDAAyD,EACzD,0CAA0C,EAC1C,+CAA+C,EAC/C,wCAAwC,EACxC,4CAA4C,GAC7C,MAAM,+BAA+B,CAAC;AACvC,OAAO,EAAE,+BAA+B,EAAE,MAAM,gDAAgD,CAAC;AAEjG,OAAO,EAAE,+BAA+B,EAAE,MAAM,uCAAuC,CAAC;AACxF,OAAO,EAAE,qBAAqB,EAAE,MAAM,2CAA2C,CAAC;AAClF,OAAO,EAAE,2BAA2B,EAAE,MAAM,kCAAkC,CAAC;AAC/E,OAAO,EAAE,8BAA8B,EAAE,MAAM,qCAAqC,CAAC;AACrF,OAAO,EAAE,kBAAkB,EAAE,MAAM,qCAAqC,CAAC;AAEzE;;;;;;;;;;;;;;GAcG;AACH,MAAM,OAAO,iBAAkB,SAAQ,+BAA+B;IACnD,KAAK,CAAoB;IAEjC,UAAU,CAA8B;IAExC,YAAY,CAAiC;IAC9C,OAAO,CAAuB;IACtC,gBAAgB,CAAyC;IAEzD,kBAAkB,CAAwB;IAC1C,QAAQ,CAAsB;IAC9B,mBAAmB,GAAG,+CAA+C,CAAC;IACtE,gBAAgB,GAAG,4CAA4C,CAAC;IAChE,cAAc,CAAsB;IACpC,4FAA4F;IAC5F,+FAA+F;IAC/F,0BAA0B,CAA6B;IAEvD,YAAY,IAAuB;QACjC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,cAAc,EAAE,IAAI,CAAC,eAAe,CAAC,CAAC;QAE9D,cAAc,CAAC,IAAI,EAAE;YACnB,gBAAgB,EAAE,UAAU;YAE5B,kBAAkB,EAAE,UAAU;YAE9B,QAAQ,EAAE,UAAU;YAEpB,mBAAmB,EAAE,UAAU;YAC/B,oBAAoB,EAAE,MAAM;YAE5B,gBAAgB,EAAE,UAAU;YAC5B,iBAAiB,EAAE,MAAM;YAEzB,cAAc,EAAE,UAAU;YAC1B,iBAAiB,EAAE,MAAM;YAEzB,aAAa,EAAE,MAAM;SACtB,CAAC,CAAC;QAEH,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;QAClB,IAAI,CAAC,UAAU,GAAG,IAAI,2BAA2B,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC9D,IAAI,CAAC,YAAY,GAAG,IAAI,8BAA8B,CAAC,IAAI,CAAC,CAAC;QAC7D,IAAI,CAAC,kBAAkB,GAAG,IAAI,qBAAqB,EAAE,CAAC;QACtD,IAAI,CAAC,gBAAgB,GAAG,IAAI,sCAAsC,CAChE,IAAI,EACJ,IAAI,CAAC,KAAK,CACX,CAAC;IACJ,CAAC;IAED,oBAAoB,CAAC,GAAY;QAC/B,IAAI,CAAC,mBAAmB,GAAG,GAAG,CAAC;QAE/B,oEAAoE;QACpE,sFAAsF;QACtF,0EAA0E;QAC1E,gEAAgE;QAChE,IAAI,CAAC,gBAAgB,GAAG,IAAI,sCAAsC,CAChE,IAAI,EACJ,IAAI,CAAC,KAAK,CACX,CAAC;QACF,sFAAsF;QACtF,gGAAgG;QAChG,IAAI,CAAC,MAAM,CAAC,iBAAiB,CAAC;YAC5B,cAAc,EAAE,GAAG;gBACjB,CAAC,CAAC,8CAA8C;gBAChD,CAAC,CAAC,0CAA0C;SAC/C,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,iBAAiB,CAAC,GAAY;QAClC,MAAM,UAAU,GAAG,IAAI,CAAC,gBAAgB,CAAC;QACzC,IAAI,GAAG,KAAK,UAAU,EAAE,CAAC;YACvB,OAAO;QACT,CAAC;QAED,WAAW,CAAC,GAAG,EAAE;YACf,IAAI,CAAC,gBAAgB,GAAG,GAAG,CAAC;QAC9B,CAAC,CAAC,CAAC;QAEH,IAAI,GAAG,EAAE,CAAC;YACR,MAAM,IAAI,CAAC,KAAK,CAAC,eAAe,EAAE,CAAC;YACnC,IAAI,IAAI,CAAC,KAAK,CAAC,iBAAiB,CAAC,SAAS,EAAE,CAAC;gBAC3C,IAAI,CAAC,gBAAgB,GAAG,UAAU,CAAC;gBACnC,OAAO;YACT,CAAC;QACH,CAAC;aAAM,CAAC;YACN,MAAM,IAAI,CAAC,KAAK,CAAC,YAAY,EAAE,CAAC;QAClC,CAAC;QAED,WAAW,CAAC,GAAG,EAAE;YACf,oEAAoE;YACpE,IAAI,CAAC,gBAAgB,GAAG,IAAI,sCAAsC,CAChE,IAAI,EACJ,IAAI,CAAC,KAAK,CACX,CAAC;QACJ,CAAC,CAAC,CAAC;IACL,CAAC;IAED,iBAAiB,CAAC,GAAuB;QACvC,IAAI,CAAC,cAAc,GAAG,GAAG,CAAC;IAC5B,CAAC;IAED,IAAI,kBAAkB;QACpB,OAAO,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAC/B,CAAC;IAED,IAAI,MAAM;QACR,OAAO,oBAAoB,CAAC,IAAI,CAAC,OAAO,EAAE,+BAA+B,CAAC,CAAC;IAC7E,CAAC;IAED,eAAe,CAAC,GAAwB;QACtC,IAAI,CAAC,OAAO,GAAG,GAAG,CAAC;QACnB,IAAI,CAAC,0BAA0B,GAAG,QAAQ,CACxC,GAAG,EAAE,CAAC,GAAG,EAAE,kBAAkB,EAAE,EAC/B,GAAG,CACJ,CAAC;IACJ,CAAC;IAEQ,yBAAyB;QAChC,OAAO,MAAM,CAAC;IAChB,CAAC;IAEQ,KAAK,CAAC,aAAa,CAC1B,QAA+B,EAC/B,gBAAmD;QAEnD,MAAM,aAAa,GAAG,qBAAqB,CAAC,aAAa,CAAC,QAAQ,CAChE,QAAQ,CAAC,IAAI,CAAC,aAAa,CAC5B,CAAC;QACF,IAAI,CAAC,kBAAkB,GAAG,aAAa,CAAC;QACxC,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC;QAEpC,MAAM,WAAW,GAAG,+BAA+B,CACjD,QAAQ,EACR,aAAa,EACb,IAAI,CAAC,KAAK,CACX,CAAC;QACF,IACE,IAAI,CAAC,eAAe,CAAC,eAAe,CAClC,kBAAkB,CAAC,2BAA2B,CAC/C,EACD,CAAC;YACD,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,kBAAkB,EAAE;gBAC5C,cAAc;gBACd,WAAW;aACZ,CAAC,CAAC;QACL,CAAC;QACD,IAAI,CAAC,MAAM,CAAC,iBAAiB,CAAC;YAC5B,GAAG,WAAW;YACd,SAAS,EAAE,IAAI,CAAC,eAAe,CAAC,eAAe,CAC7C,kBAAkB,CAAC,uBAAuB,CAC3C;YACD,mBAAmB,EAAE,IAAI,CAAC,eAAe,CAAC,eAAe,CACvD,kBAAkB,CAAC,mCAAmC,CACvD;YACD,sFAAsF;YACtF,gGAAgG;YAChG,cAAc,EAAE,IAAI,CAAC,mBAAmB;gBACtC,CAAC,CAAC,8CAA8C;gBAChD,CAAC,CAAC,0CAA0C;SAC/C,CAAC,CAAC;QAEH,+FAA+F;QAC/F,6FAA6F;QAC7F,gGAAgG;QAChG,sGAAsG;QACtG,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC;YACzB,CAAC,yDAAyD,CAAC,EAAE;gBAC3D,IAAI,EAAE,QAAQ;gBACd,MAAM,EAAE,wCAAwC,CAC9C,QAAQ,EACR,aAAa,CACd;aACF;SACF,CAAC,CAAC;IACL,CAAC;CACF"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@finos/legend-data-cube",
3
- "version": "0.1.0",
3
+ "version": "0.1.1",
4
4
  "description": "Legend DataCube",
5
5
  "keywords": [
6
6
  "legend",
@@ -42,16 +42,16 @@
42
42
  "test:watch": "jest --watch"
43
43
  },
44
44
  "dependencies": {
45
- "@finos/legend-art": "7.1.79",
46
- "@finos/legend-code-editor": "2.0.42",
47
- "@finos/legend-graph": "32.1.0",
48
- "@finos/legend-shared": "11.0.1",
45
+ "@finos/legend-art": "7.1.80",
46
+ "@finos/legend-code-editor": "2.0.43",
47
+ "@finos/legend-graph": "32.1.1",
48
+ "@finos/legend-shared": "11.0.2",
49
49
  "@types/react": "19.0.8",
50
50
  "ag-grid-community": "33.0.4",
51
51
  "ag-grid-enterprise": "33.0.4",
52
52
  "ag-grid-react": "33.0.4",
53
- "mathjs": "14.1.0",
54
- "mobx": "6.13.5",
53
+ "mathjs": "14.2.1",
54
+ "mobx": "6.13.6",
55
55
  "mobx-react-lite": "4.1.0",
56
56
  "monaco-editor": "0.52.2",
57
57
  "react": "19.0.0",
@@ -44,6 +44,7 @@ import type {
44
44
  } from '../../../stores/core/model/DataCubeConfiguration.js';
45
45
  import { generateBaseGridOptions } from '../../../stores/view/grid/DataCubeGridConfigurationBuilder.js';
46
46
  import type { DataCubeViewState } from '../../../stores/view/DataCubeViewState.js';
47
+ import { FormBadge_WIP } from '../../core/DataCubeFormUtils.js';
47
48
 
48
49
  // NOTE: This is a workaround to prevent ag-grid license key check from flooding the console screen
49
50
  // with its stack trace in Chrome.
@@ -318,8 +319,9 @@ const DataCubeGridStatusBar = observer((props: { view: DataCubeViewState }) => {
318
319
  Pagination
319
320
  </div>
320
321
  </button>
321
- {view.dataCube.options?.enableCache !== undefined &&
322
- view.dataCube.options.enableCache && (
322
+ {view.dataCube.options?.enableCache && (
323
+ <>
324
+ <div className="h-3 w-[1px] bg-neutral-200" />
323
325
  <button
324
326
  className="flex h-full items-center p-2"
325
327
  // eslint-disable-next-line @typescript-eslint/no-misused-promises
@@ -347,15 +349,16 @@ const DataCubeGridStatusBar = observer((props: { view: DataCubeViewState }) => {
347
349
  disableFocusRipple={true}
348
350
  />
349
351
  <div
350
- className={cn('text-sm', {
352
+ className={cn('flex items-center text-sm', {
351
353
  'text-sky-600': grid.isCachingEnabled,
352
354
  'text-neutral-500': !grid.isCachingEnabled,
353
355
  })}
354
356
  >
355
- Cache (BETA)
357
+ Cache <FormBadge_WIP />
356
358
  </div>
357
359
  </button>
358
- )}
360
+ </>
361
+ )}
359
362
  </div>
360
363
  </div>
361
364
  );
package/src/index.tsx CHANGED
@@ -19,12 +19,11 @@ export * from './stores/core/model/DataCubeSource.js';
19
19
  export { type DataCubeColumn } from './stores/core/model/DataCubeColumn.js';
20
20
  export * from './stores/core/model/DataCubeConfiguration.js';
21
21
  export * from './stores/core/model/AdhocQueryDataCubeSource.js';
22
+ export { CachedDataCubeSource } from './stores/core/model/CachedDataCubeSource.js';
22
23
 
23
24
  export * from './stores/core/DataCubeEngine.js';
24
25
  export * from './stores/core/DataCubeQueryEngine.js';
25
- export * from './stores/core/DataCubeQueryBuilderUtils.js';
26
26
  export { DataCubeQuerySnapshot } from './stores/core/DataCubeQuerySnapshot.js';
27
- export * from './stores/core/filter/DataCubeQueryFilterOperation.js';
28
27
 
29
28
  export {
30
29
  type DataCubeSetting,
@@ -54,4 +53,10 @@ export * from './components/DataCube.js';
54
53
  export * from './components/core/DataCubeFormUtils.js';
55
54
  export * from './components/DataCubePlaceholder.js';
56
55
 
57
- export { CachedDataCubeSource } from './stores/core/model/CachedDataCubeSource.js';
56
+ // some low-level/core utilities we expose for building DataCube extensions
57
+ // or implementing DataCube engine
58
+ export {
59
+ _function,
60
+ _lambda,
61
+ _elementPtr,
62
+ } from './stores/core/DataCubeQueryBuilderUtils.js';
@@ -15,6 +15,7 @@
15
15
  */
16
16
 
17
17
  import type { DataCubeQuery } from './core/model/DataCubeQuery.js';
18
+ import type { DataCubeSource } from './core/model/DataCubeSource.js';
18
19
  import type { DataCubeState } from './DataCubeState.js';
19
20
  import type { DataCubeViewState } from './view/DataCubeViewState.js';
20
21
 
@@ -23,6 +24,10 @@ import type { DataCubeViewState } from './view/DataCubeViewState.js';
23
24
  * internal components and functionalities.
24
25
  */
25
26
  export interface DataCubeAPI {
27
+ /**
28
+ * Get the processed source of the DataCube.
29
+ */
30
+ getProcessedSource(): DataCubeSource | undefined;
26
31
  /**
27
32
  * Generates the data cube query (including the query, configuration, and source)
28
33
  * from the latest state of the DataCube.
@@ -61,6 +66,10 @@ export class INTERNAL__DataCubeAPI implements DataCubeAPI {
61
66
 
62
67
  // ----------------------------- API -----------------------------
63
68
 
69
+ getProcessedSource() {
70
+ return this._dataCube.view.getOriginalSource();
71
+ }
72
+
64
73
  generateDataCubeQuery() {
65
74
  return this._dataCube.view.generateDataCubeQuery();
66
75
  }
@@ -127,7 +127,7 @@ export type DataCubeOptions = {
127
127
  */
128
128
  documentationUrl?: string | undefined;
129
129
  /**
130
- * Enable/Disable caching of data for the application.
130
+ * Enables caching to suppport local query execution.
131
131
  */
132
132
  enableCache?: boolean | undefined;
133
133
  };
@@ -133,7 +133,7 @@ export function newConfiguration(
133
133
  //
134
134
  // since we have made sure all groupBy sort columns must be of the same direction
135
135
  // we simply retrieve the direction from the one of the column provided
136
- if (groupBySortColumns.length) {
136
+ if (groupBySortColumns?.length) {
137
137
  configuration.treeColumnSortDirection = at(groupBySortColumns, 0).direction;
138
138
  }
139
139
 
@@ -20,6 +20,8 @@ import {
20
20
  type TDSExecutionResult,
21
21
  type V1_AppliedFunction,
22
22
  PRIMITIVE_TYPE,
23
+ V1_deserializeValueSpecification,
24
+ V1_serializeValueSpecification,
23
25
  } from '@finos/legend-graph';
24
26
  import {
25
27
  getFilterOperation,
@@ -65,20 +67,25 @@ import { DataCubeQueryFilterOperation__EndWithCaseInsensitive } from './filter/D
65
67
  import { DataCubeQueryFilterOperation__NotEndWith } from './filter/DataCubeQueryFilterOperation__NotEndWith.js';
66
68
  import { DataCubeQueryFilterOperation__IsNull } from './filter/DataCubeQueryFilterOperation__IsNull.js';
67
69
  import { DataCubeQueryFilterOperation__IsNotNull } from './filter/DataCubeQueryFilterOperation__IsNotNull.js';
68
- import type { DataCubeQuerySnapshot } from './DataCubeQuerySnapshot.js';
70
+ import { DataCubeQuerySnapshot } from './DataCubeQuerySnapshot.js';
69
71
  import { buildExecutableQuery } from './DataCubeQueryBuilder.js';
70
- import type { DataCubeColumn } from './model/DataCubeColumn.js';
72
+ import { _toCol, type DataCubeColumn } from './model/DataCubeColumn.js';
71
73
  import {
72
74
  type DataCubeSource,
73
75
  INTERNAL__DataCubeSource,
74
76
  } from './model/DataCubeSource.js';
75
- import { _primitiveValue } from './DataCubeQueryBuilderUtils.js';
77
+ import {
78
+ _primitiveValue,
79
+ _selectFunction,
80
+ } from './DataCubeQueryBuilderUtils.js';
76
81
  import {
77
82
  type DocumentationEntry,
78
83
  type LogEvent,
79
84
  type PlainObject,
80
85
  } from '@finos/legend-shared';
81
86
  import type { CachedDataCubeSource } from './model/CachedDataCubeSource.js';
87
+ import { DataCubeQuery } from './model/DataCubeQuery.js';
88
+ import { newConfiguration } from './DataCubeConfigurationBuilder.js';
82
89
 
83
90
  export type CompletionItem = {
84
91
  completion: string;
@@ -168,6 +175,14 @@ export abstract class DataCubeEngine {
168
175
  return getAggregateOperation(value, this.aggregateOperations);
169
176
  }
170
177
 
178
+ deserializeValueSpecification(json: PlainObject<V1_ValueSpecification>) {
179
+ return V1_deserializeValueSpecification(json, []);
180
+ }
181
+
182
+ serializeValueSpecification(protocol: V1_ValueSpecification) {
183
+ return V1_serializeValueSpecification(protocol, []);
184
+ }
185
+
171
186
  /**
172
187
  * By default, for a function chain, Pure grammar composer will extract the first parameter of the first function
173
188
  * and render it as the caller of that function rather than a parameter
@@ -184,21 +199,34 @@ export abstract class DataCubeEngine {
184
199
  source.query = _primitiveValue(PRIMITIVE_TYPE.STRING, '');
185
200
  return (
186
201
  await this.getValueSpecificationCode(
187
- buildExecutableQuery(
188
- snapshot,
189
- source,
190
- () => undefined,
191
- this.filterOperations,
192
- this.aggregateOperations,
193
- ),
202
+ buildExecutableQuery(snapshot, source, this, {
203
+ skipExecutionContext: true,
204
+ }),
194
205
  pretty,
195
206
  )
196
207
  ).substring(`''->`.length);
197
208
  }
198
209
 
210
+ async generateBaseQuery(sourceData: PlainObject) {
211
+ const source = await this.processQuerySource(sourceData);
212
+ const query = new DataCubeQuery();
213
+ query.source = sourceData;
214
+ query.query = await this.getValueSpecificationCode(
215
+ _selectFunction(source.columns),
216
+ );
217
+ const snapshot = DataCubeQuerySnapshot.create({});
218
+ snapshot.data.sourceColumns = source.columns.map(_toCol);
219
+ snapshot.data.selectColumns = source.columns.map(_toCol);
220
+ const configuration = newConfiguration({
221
+ snapshot,
222
+ });
223
+ query.configuration = configuration;
224
+ return query;
225
+ }
226
+
199
227
  // ---------------------------------- PROCESSOR ----------------------------------
200
228
 
201
- abstract processQuerySource(value: PlainObject): Promise<DataCubeSource>;
229
+ abstract processQuerySource(sourceData: PlainObject): Promise<DataCubeSource>;
202
230
 
203
231
  abstract parseValueSpecification(
204
232
  code: string,
@@ -237,12 +265,7 @@ export abstract class DataCubeEngine {
237
265
  source: DataCubeSource,
238
266
  ): V1_AppliedFunction | undefined;
239
267
 
240
- processInitialSnapshot?(
241
- source: DataCubeSource,
242
- snapshot: DataCubeQuerySnapshot,
243
- ): DataCubeQuerySnapshot;
244
-
245
- // ---------------------------------- CACHING --------------------------------------
268
+ // ---------------------------------- CACHING ----------------------------------
246
269
 
247
270
  async initializeCache(
248
271
  source: DataCubeSource,
@@ -250,9 +273,7 @@ export abstract class DataCubeEngine {
250
273
  return undefined;
251
274
  }
252
275
 
253
- async clearCache() {
254
- // do nothing
255
- }
276
+ async disposeCache(source: CachedDataCubeSource) {}
256
277
 
257
278
  // ---------------------------------- APPLICATION ----------------------------------
258
279
 
@@ -21,22 +21,24 @@
21
21
  * the query snapshot. The executable query is then used to fetch data.
22
22
  ***************************************************************************************/
23
23
 
24
- import { PRIMITIVE_TYPE, type V1_AppliedFunction } from '@finos/legend-graph';
24
+ import {
25
+ PRIMITIVE_TYPE,
26
+ V1_Lambda,
27
+ type V1_AppliedFunction,
28
+ } from '@finos/legend-graph';
25
29
  import { type DataCubeQuerySnapshot } from './DataCubeQuerySnapshot.js';
26
- import { at } from '@finos/legend-shared';
30
+ import { at, guaranteeType } from '@finos/legend-shared';
27
31
  import {
28
32
  DataCubeFunction,
29
33
  DataCubeQuerySortDirection,
30
34
  type DataCubeQueryFunctionMap,
31
35
  } from './DataCubeQueryEngine.js';
32
36
  import { DataCubeConfiguration } from './model/DataCubeConfiguration.js';
33
- import type { DataCubeQueryFilterOperation } from './filter/DataCubeQueryFilterOperation.js';
34
37
  import {
35
38
  _col,
36
39
  _collection,
37
40
  _cols,
38
41
  _colSpec,
39
- _deserializeLambda,
40
42
  _filter,
41
43
  _function,
42
44
  _groupByAggCols,
@@ -48,26 +50,21 @@ import {
48
50
  _functionCompositionProcessor,
49
51
  _extendRootAggregation,
50
52
  } from './DataCubeQueryBuilderUtils.js';
51
- import type { DataCubeQueryAggregateOperation } from './aggregation/DataCubeQueryAggregateOperation.js';
52
53
  import type { DataCubeSource } from './model/DataCubeSource.js';
53
54
  import { _findCol } from './model/DataCubeColumn.js';
55
+ import type { DataCubeEngine } from './DataCubeEngine.js';
54
56
 
55
57
  export function buildExecutableQuery(
56
58
  snapshot: DataCubeQuerySnapshot,
57
59
  source: DataCubeSource,
58
- executionContextBuilder: (
59
- source: DataCubeSource,
60
- ) => V1_AppliedFunction | undefined,
61
- filterOperations: DataCubeQueryFilterOperation[],
62
- aggregateOperations: DataCubeQueryAggregateOperation[],
60
+ engine: DataCubeEngine,
63
61
  options?: {
64
62
  postProcessor?: (
65
63
  snapshot: DataCubeQuerySnapshot,
66
64
  sequence: V1_AppliedFunction[],
67
65
  funcMap: DataCubeQueryFunctionMap,
68
66
  configuration: DataCubeConfiguration,
69
- filterOperations: DataCubeQueryFilterOperation[],
70
- aggregateOperations: DataCubeQueryAggregateOperation[],
67
+ engine: DataCubeEngine,
71
68
  ) => void;
72
69
  rootAggregation?:
73
70
  | {
@@ -101,8 +98,16 @@ export function buildExecutableQuery(
101
98
  _cols([
102
99
  _colSpec(
103
100
  col.name,
104
- _deserializeLambda(col.mapFn),
105
- col.reduceFn ? _deserializeLambda(col.reduceFn) : undefined,
101
+ guaranteeType(
102
+ engine.deserializeValueSpecification(col.mapFn),
103
+ V1_Lambda,
104
+ ),
105
+ col.reduceFn
106
+ ? guaranteeType(
107
+ engine.deserializeValueSpecification(col.reduceFn),
108
+ V1_Lambda,
109
+ )
110
+ : undefined,
106
111
  ),
107
112
  ]),
108
113
  ]),
@@ -116,7 +121,7 @@ export function buildExecutableQuery(
116
121
  _process(
117
122
  'filter',
118
123
  _function(DataCubeFunction.FILTER, [
119
- _lambda([_var()], [_filter(data.filter, filterOperations)]),
124
+ _lambda([_var()], [_filter(data.filter, engine.filterOperations)]),
120
125
  ]),
121
126
  );
122
127
  }
@@ -164,7 +169,7 @@ export function buildExecutableQuery(
164
169
  pivot.columns,
165
170
  snapshot,
166
171
  configuration,
167
- aggregateOperations,
172
+ engine.aggregateOperations,
168
173
  ),
169
174
  ),
170
175
  ]),
@@ -194,7 +199,7 @@ export function buildExecutableQuery(
194
199
  groupBy.columns,
195
200
  snapshot,
196
201
  configuration,
197
- aggregateOperations,
202
+ engine.aggregateOperations,
198
203
  ),
199
204
  ),
200
205
  ]),
@@ -227,8 +232,16 @@ export function buildExecutableQuery(
227
232
  _cols([
228
233
  _colSpec(
229
234
  col.name,
230
- _deserializeLambda(col.mapFn),
231
- col.reduceFn ? _deserializeLambda(col.reduceFn) : undefined,
235
+ guaranteeType(
236
+ engine.deserializeValueSpecification(col.mapFn),
237
+ V1_Lambda,
238
+ ),
239
+ col.reduceFn
240
+ ? guaranteeType(
241
+ engine.deserializeValueSpecification(col.reduceFn),
242
+ V1_Lambda,
243
+ )
244
+ : undefined,
232
245
  ),
233
246
  ]),
234
247
  ]),
@@ -280,19 +293,14 @@ export function buildExecutableQuery(
280
293
 
281
294
  // --------------------------------- FINALIZE ---------------------------------
282
295
 
283
- const executionContext = executionContextBuilder(source);
284
- if (executionContext) {
285
- sequence.push(executionContext);
296
+ if (!options?.skipExecutionContext) {
297
+ const executionContext = engine.buildExecutionContext(source);
298
+ if (executionContext) {
299
+ sequence.push(executionContext);
300
+ }
286
301
  }
287
302
 
288
- options?.postProcessor?.(
289
- snapshot,
290
- sequence,
291
- funcMap,
292
- configuration,
293
- filterOperations,
294
- aggregateOperations,
295
- );
303
+ options?.postProcessor?.(snapshot, sequence, funcMap, configuration, engine);
296
304
 
297
305
  if (sequence.length === 0) {
298
306
  return source.query;
@@ -43,7 +43,6 @@ import {
43
43
  V1_PackageableElementPtr,
44
44
  type V1_PrimitiveValueSpecification,
45
45
  V1_Variable,
46
- V1_deserializeValueSpecification,
47
46
  extractElementNameFromPath,
48
47
  type V1_ValueSpecification,
49
48
  extractPackagePathFromPath,
@@ -53,7 +52,6 @@ import {
53
52
  V1_createGenericTypeWithRawType,
54
53
  V1_createRelationType,
55
54
  V1_createRelationTypeColumn,
56
- V1_serializeValueSpecification,
57
55
  } from '@finos/legend-graph';
58
56
  import {
59
57
  type DataCubeQuerySnapshotFilterCondition,
@@ -67,8 +65,6 @@ import {
67
65
  guaranteeIsBoolean,
68
66
  guaranteeIsNumber,
69
67
  UnsupportedOperationError,
70
- guaranteeType,
71
- type PlainObject,
72
68
  } from '@finos/legend-shared';
73
69
  import {
74
70
  DataCubeFunction,
@@ -91,69 +87,6 @@ import {
91
87
 
92
88
  // --------------------------------- UTILITIES ---------------------------------
93
89
 
94
- export function _functionCompositionProcessor(
95
- sequence: V1_AppliedFunction[],
96
- funcMap: DataCubeQueryFunctionMap,
97
- ) {
98
- return (
99
- key: keyof DataCubeQueryFunctionMap,
100
- data: V1_AppliedFunction | V1_AppliedFunction[],
101
- ) => {
102
- switch (key) {
103
- case 'leafExtend':
104
- case 'groupExtend': {
105
- if (Array.isArray(data)) {
106
- data.forEach((func) => sequence.push(func));
107
- funcMap[key] = data;
108
- }
109
- break;
110
- }
111
- default: {
112
- funcMap[key] = data as V1_AppliedFunction;
113
- sequence.push(data as V1_AppliedFunction);
114
- }
115
- }
116
- };
117
- }
118
-
119
- export function _functionCompositionUnProcessor(
120
- sequence: V1_AppliedFunction[],
121
- funcMap: DataCubeQueryFunctionMap,
122
- ) {
123
- return (key: keyof DataCubeQueryFunctionMap) => {
124
- const data = funcMap[key];
125
- if (data) {
126
- if (Array.isArray(data)) {
127
- data.forEach((func) => sequence.splice(sequence.indexOf(func), 1));
128
- } else {
129
- sequence.splice(sequence.indexOf(data), 1);
130
- }
131
- funcMap[key] = undefined;
132
- }
133
- };
134
- }
135
-
136
- export function _deserializeLambda(json: PlainObject<V1_Lambda>) {
137
- return guaranteeType(V1_deserializeValueSpecification(json, []), V1_Lambda);
138
- }
139
-
140
- export function _deserializeValueSpecification(
141
- json: PlainObject<V1_ValueSpecification>,
142
- ) {
143
- return V1_deserializeValueSpecification(json, []);
144
- }
145
-
146
- export function _serializeValueSpecification(protocol: V1_ValueSpecification) {
147
- return V1_serializeValueSpecification(protocol, []);
148
- }
149
-
150
- export function _deserializeFunction(json: PlainObject<V1_Lambda>) {
151
- return guaranteeType(
152
- V1_deserializeValueSpecification(json, []),
153
- V1_AppliedFunction,
154
- );
155
- }
156
-
157
90
  export function _var() {
158
91
  const variable = new V1_Variable();
159
92
  // NOTE: we simplify processing logic by forcing all variable names to default value, i.e. x
@@ -356,6 +289,48 @@ export function _cols(colSpecs: V1_ColSpec[]) {
356
289
 
357
290
  // --------------------------------- BUILDING BLOCKS ---------------------------------
358
291
 
292
+ export function _functionCompositionProcessor(
293
+ sequence: V1_AppliedFunction[],
294
+ funcMap: DataCubeQueryFunctionMap,
295
+ ) {
296
+ return (
297
+ key: keyof DataCubeQueryFunctionMap,
298
+ data: V1_AppliedFunction | V1_AppliedFunction[],
299
+ ) => {
300
+ switch (key) {
301
+ case 'leafExtend':
302
+ case 'groupExtend': {
303
+ if (Array.isArray(data)) {
304
+ data.forEach((func) => sequence.push(func));
305
+ funcMap[key] = data;
306
+ }
307
+ break;
308
+ }
309
+ default: {
310
+ funcMap[key] = data as V1_AppliedFunction;
311
+ sequence.push(data as V1_AppliedFunction);
312
+ }
313
+ }
314
+ };
315
+ }
316
+
317
+ export function _functionCompositionUnProcessor(
318
+ sequence: V1_AppliedFunction[],
319
+ funcMap: DataCubeQueryFunctionMap,
320
+ ) {
321
+ return (key: keyof DataCubeQueryFunctionMap) => {
322
+ const data = funcMap[key];
323
+ if (data) {
324
+ if (Array.isArray(data)) {
325
+ data.forEach((func) => sequence.splice(sequence.indexOf(func), 1));
326
+ } else {
327
+ sequence.splice(sequence.indexOf(data), 1);
328
+ }
329
+ funcMap[key] = undefined;
330
+ }
331
+ };
332
+ }
333
+
359
334
  export function _selectFunction(columns: DataCubeColumn[]) {
360
335
  return _function(DataCubeFunction.SELECT, [
361
336
  _cols(columns.map((col) => _colSpec(col.name))),
@@ -71,10 +71,10 @@ export type DataCubeQuerySnapshotPivot = {
71
71
 
72
72
  export type DataCubeQuerySnapshotProcessingContext = {
73
73
  snapshot: DataCubeQuerySnapshot;
74
- pivotAggColumns: DataCubeQuerySnapshotAggregateColumn[];
75
- pivotSortColumns: DataCubeQuerySnapshotSortColumn[];
76
- groupByAggColumns: DataCubeQuerySnapshotAggregateColumn[];
77
- groupBySortColumns: DataCubeQuerySnapshotSortColumn[];
74
+ pivotAggColumns?: DataCubeQuerySnapshotAggregateColumn[] | undefined;
75
+ pivotSortColumns?: DataCubeQuerySnapshotSortColumn[] | undefined;
76
+ groupByAggColumns?: DataCubeQuerySnapshotAggregateColumn[] | undefined;
77
+ groupBySortColumns?: DataCubeQuerySnapshotSortColumn[] | undefined;
78
78
  };
79
79
 
80
80
  export type DataCubeQuerySnapshotData = {
@@ -185,4 +185,15 @@ export class DataCubeQuerySnapshot {
185
185
  clone._hashCode = this._hashCode;
186
186
  return clone;
187
187
  }
188
+
189
+ serialize() {
190
+ const clone = this.clone();
191
+ return {
192
+ uuid: clone.uuid,
193
+ data: clone.data,
194
+ _isPatchChange: clone._isPatchChange,
195
+ _finalized: clone._finalized,
196
+ _hashCode: clone._hashCode,
197
+ };
198
+ }
188
199
  }