@finos/legend-data-cube 0.1.0 → 0.1.2

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 (114) hide show
  1. package/lib/__lib__/DataCubeSetting.d.ts +1 -0
  2. package/lib/__lib__/DataCubeSetting.d.ts.map +1 -1
  3. package/lib/__lib__/DataCubeSetting.js +1 -0
  4. package/lib/__lib__/DataCubeSetting.js.map +1 -1
  5. package/lib/components/DataCubeStatusBar.d.ts.map +1 -1
  6. package/lib/components/DataCubeStatusBar.js +10 -3
  7. package/lib/components/DataCubeStatusBar.js.map +1 -1
  8. package/lib/components/DataCubeTitleBar.js +1 -1
  9. package/lib/components/DataCubeTitleBar.js.map +1 -1
  10. package/lib/components/core/DataCubeAlert.js +1 -1
  11. package/lib/components/core/DataCubeAlert.js.map +1 -1
  12. package/lib/components/view/grid/DataCubeGrid.d.ts.map +1 -1
  13. package/lib/components/view/grid/DataCubeGrid.js +26 -20
  14. package/lib/components/view/grid/DataCubeGrid.js.map +1 -1
  15. package/lib/index.css +1 -1
  16. package/lib/index.d.ts +2 -3
  17. package/lib/index.d.ts.map +1 -1
  18. package/lib/index.js +4 -3
  19. package/lib/index.js.map +1 -1
  20. package/lib/package.json +3 -3
  21. package/lib/stores/DataCubeAPI.d.ts +6 -0
  22. package/lib/stores/DataCubeAPI.d.ts.map +1 -1
  23. package/lib/stores/DataCubeAPI.js +3 -0
  24. package/lib/stores/DataCubeAPI.js.map +1 -1
  25. package/lib/stores/DataCubeOptions.d.ts +1 -1
  26. package/lib/stores/core/DataCubeConfigurationBuilder.js +1 -1
  27. package/lib/stores/core/DataCubeConfigurationBuilder.js.map +1 -1
  28. package/lib/stores/core/DataCubeEngine.d.ts +13 -6
  29. package/lib/stores/core/DataCubeEngine.d.ts.map +1 -1
  30. package/lib/stores/core/DataCubeEngine.js +32 -8
  31. package/lib/stores/core/DataCubeEngine.js.map +1 -1
  32. package/lib/stores/core/DataCubeQueryBuilder.d.ts +3 -4
  33. package/lib/stores/core/DataCubeQueryBuilder.d.ts.map +1 -1
  34. package/lib/stores/core/DataCubeQueryBuilder.js +19 -13
  35. package/lib/stores/core/DataCubeQueryBuilder.js.map +1 -1
  36. package/lib/stores/core/DataCubeQueryBuilderUtils.d.ts +2 -7
  37. package/lib/stores/core/DataCubeQueryBuilderUtils.d.ts.map +1 -1
  38. package/lib/stores/core/DataCubeQueryBuilderUtils.js +34 -46
  39. package/lib/stores/core/DataCubeQueryBuilderUtils.js.map +1 -1
  40. package/lib/stores/core/DataCubeQuerySnapshot.d.ts +11 -4
  41. package/lib/stores/core/DataCubeQuerySnapshot.d.ts.map +1 -1
  42. package/lib/stores/core/DataCubeQuerySnapshot.js +10 -0
  43. package/lib/stores/core/DataCubeQuerySnapshot.js.map +1 -1
  44. package/lib/stores/core/DataCubeQuerySnapshotBuilder.d.ts.map +1 -1
  45. package/lib/stores/core/DataCubeQuerySnapshotBuilder.js +1 -2
  46. package/lib/stores/core/DataCubeQuerySnapshotBuilder.js.map +1 -1
  47. package/lib/stores/core/DataCubeQuerySnapshotBuilderUtils.d.ts.map +1 -1
  48. package/lib/stores/core/DataCubeQuerySnapshotBuilderUtils.js +3 -3
  49. package/lib/stores/core/DataCubeQuerySnapshotBuilderUtils.js.map +1 -1
  50. package/lib/stores/core/model/CachedDataCubeSource.d.ts +4 -0
  51. package/lib/stores/core/model/CachedDataCubeSource.d.ts.map +1 -1
  52. package/lib/stores/core/model/CachedDataCubeSource.js +4 -0
  53. package/lib/stores/core/model/CachedDataCubeSource.js.map +1 -1
  54. package/lib/stores/services/DataCubeQuerySnapshotService.js +1 -1
  55. package/lib/stores/services/DataCubeQuerySnapshotService.js.map +1 -1
  56. package/lib/stores/services/DataCubeSettingService.d.ts.map +1 -1
  57. package/lib/stores/services/DataCubeSettingService.js +8 -0
  58. package/lib/stores/services/DataCubeSettingService.js.map +1 -1
  59. package/lib/stores/services/DataCubeTaskService.d.ts +4 -4
  60. package/lib/stores/services/DataCubeTaskService.d.ts.map +1 -1
  61. package/lib/stores/services/DataCubeTaskService.js +9 -7
  62. package/lib/stores/services/DataCubeTaskService.js.map +1 -1
  63. package/lib/stores/view/DataCubeViewState.d.ts +3 -1
  64. package/lib/stores/view/DataCubeViewState.d.ts.map +1 -1
  65. package/lib/stores/view/DataCubeViewState.js +54 -19
  66. package/lib/stores/view/DataCubeViewState.js.map +1 -1
  67. package/lib/stores/view/editor/DataCubeEditorState.js +1 -1
  68. package/lib/stores/view/editor/DataCubeEditorState.js.map +1 -1
  69. package/lib/stores/view/extend/DataCubeColumnEditorState.d.ts.map +1 -1
  70. package/lib/stores/view/extend/DataCubeColumnEditorState.js +7 -5
  71. package/lib/stores/view/extend/DataCubeColumnEditorState.js.map +1 -1
  72. package/lib/stores/view/extend/DataCubeExtendManagerState.js +2 -2
  73. package/lib/stores/view/extend/DataCubeExtendManagerState.js.map +1 -1
  74. package/lib/stores/view/grid/DataCubeGridClientEngine.d.ts.map +1 -1
  75. package/lib/stores/view/grid/DataCubeGridClientEngine.js +104 -108
  76. package/lib/stores/view/grid/DataCubeGridClientEngine.js.map +1 -1
  77. package/lib/stores/view/grid/DataCubeGridConfigurationBuilder.d.ts.map +1 -1
  78. package/lib/stores/view/grid/DataCubeGridConfigurationBuilder.js +3 -3
  79. package/lib/stores/view/grid/DataCubeGridConfigurationBuilder.js.map +1 -1
  80. package/lib/stores/view/grid/DataCubeGridQueryBuilder.d.ts +3 -4
  81. package/lib/stores/view/grid/DataCubeGridQueryBuilder.d.ts.map +1 -1
  82. package/lib/stores/view/grid/DataCubeGridQueryBuilder.js +5 -5
  83. package/lib/stores/view/grid/DataCubeGridQueryBuilder.js.map +1 -1
  84. package/lib/stores/view/grid/DataCubeGridState.d.ts.map +1 -1
  85. package/lib/stores/view/grid/DataCubeGridState.js +63 -8
  86. package/lib/stores/view/grid/DataCubeGridState.js.map +1 -1
  87. package/package.json +7 -7
  88. package/src/__lib__/DataCubeSetting.ts +1 -0
  89. package/src/components/DataCubeStatusBar.tsx +18 -3
  90. package/src/components/DataCubeTitleBar.tsx +3 -3
  91. package/src/components/core/DataCubeAlert.tsx +1 -1
  92. package/src/components/view/grid/DataCubeGrid.tsx +23 -7
  93. package/src/index.tsx +8 -3
  94. package/src/stores/DataCubeAPI.ts +9 -0
  95. package/src/stores/DataCubeOptions.ts +1 -1
  96. package/src/stores/core/DataCubeConfigurationBuilder.ts +1 -1
  97. package/src/stores/core/DataCubeEngine.tsx +47 -20
  98. package/src/stores/core/DataCubeQueryBuilder.ts +38 -30
  99. package/src/stores/core/DataCubeQueryBuilderUtils.ts +42 -67
  100. package/src/stores/core/DataCubeQuerySnapshot.ts +15 -4
  101. package/src/stores/core/DataCubeQuerySnapshotBuilder.ts +2 -6
  102. package/src/stores/core/DataCubeQuerySnapshotBuilderUtils.ts +2 -3
  103. package/src/stores/core/model/CachedDataCubeSource.ts +4 -0
  104. package/src/stores/services/DataCubeQuerySnapshotService.ts +2 -2
  105. package/src/stores/services/DataCubeSettingService.tsx +8 -0
  106. package/src/stores/services/DataCubeTaskService.ts +9 -7
  107. package/src/stores/view/DataCubeViewState.ts +58 -27
  108. package/src/stores/view/editor/DataCubeEditorState.tsx +1 -1
  109. package/src/stores/view/extend/DataCubeColumnEditorState.tsx +7 -15
  110. package/src/stores/view/extend/DataCubeExtendManagerState.tsx +2 -2
  111. package/src/stores/view/grid/DataCubeGridClientEngine.ts +149 -168
  112. package/src/stores/view/grid/DataCubeGridConfigurationBuilder.tsx +6 -7
  113. package/src/stores/view/grid/DataCubeGridQueryBuilder.ts +19 -32
  114. package/src/stores/view/grid/DataCubeGridState.ts +89 -8
@@ -60,11 +60,10 @@ import {
60
60
  type DataCubeGridClientDataFetchRequest,
61
61
  } from './DataCubeGridClientEngine.js';
62
62
  import { DataCubeConfiguration } from '../../core/model/DataCubeConfiguration.js';
63
- import type { DataCubeQueryFilterOperation } from '../../core/filter/DataCubeQueryFilterOperation.js';
64
- import type { DataCubeQueryAggregateOperation } from '../../core/aggregation/DataCubeQueryAggregateOperation.js';
65
63
  import { _colSpecArrayParam } from '../../core/DataCubeQuerySnapshotBuilderUtils.js';
66
64
  import { buildExecutableQuery } from '../../core/DataCubeQueryBuilder.js';
67
65
  import type { DataCubeSource } from '../../core/model/DataCubeSource.js';
66
+ import type { DataCubeEngine } from '../../core/DataCubeEngine.js';
68
67
 
69
68
  /*****************************************************************************
70
69
  * [GRID]
@@ -148,11 +147,7 @@ export function buildGridDataFetchExecutableQuery(
148
147
  request: DataCubeGridClientDataFetchRequest,
149
148
  snapshot: DataCubeQuerySnapshot,
150
149
  source: DataCubeSource,
151
- executionContextBuilder: (
152
- source: DataCubeSource,
153
- ) => V1_AppliedFunction | undefined,
154
- filterOperations: DataCubeQueryFilterOperation[],
155
- aggregateOperations: DataCubeQueryAggregateOperation[],
150
+ engine: DataCubeEngine,
156
151
  enablePagination: boolean,
157
152
  ) {
158
153
  const processedSnapshot = snapshot.clone();
@@ -170,28 +165,21 @@ export function buildGridDataFetchExecutableQuery(
170
165
  ],
171
166
  };
172
167
  }
173
- return buildExecutableQuery(
174
- processedSnapshot,
175
- source,
176
- executionContextBuilder,
177
- filterOperations,
178
- aggregateOperations,
179
- {
180
- postProcessor: generateGridDataFetchExecutableQueryPostProcessor(request),
181
- rootAggregation: {
182
- columnName: INTERNAL__GRID_CLIENT_ROOT_AGGREGATION_COLUMN_ID,
183
- },
184
- pagination:
185
- enablePagination &&
186
- request.startRow !== undefined &&
187
- request.endRow !== undefined
188
- ? {
189
- start: request.startRow,
190
- end: request.endRow,
191
- }
192
- : undefined,
168
+ return buildExecutableQuery(processedSnapshot, source, engine, {
169
+ postProcessor: generateGridDataFetchExecutableQueryPostProcessor(request),
170
+ rootAggregation: {
171
+ columnName: INTERNAL__GRID_CLIENT_ROOT_AGGREGATION_COLUMN_ID,
193
172
  },
194
- );
173
+ pagination:
174
+ enablePagination &&
175
+ request.startRow !== undefined &&
176
+ request.endRow !== undefined
177
+ ? {
178
+ start: request.startRow,
179
+ end: request.endRow,
180
+ }
181
+ : undefined,
182
+ });
195
183
  }
196
184
 
197
185
  function generateGridDataFetchExecutableQueryPostProcessor(
@@ -202,8 +190,7 @@ function generateGridDataFetchExecutableQueryPostProcessor(
202
190
  sequence: V1_AppliedFunction[],
203
191
  funcMap: DataCubeQueryFunctionMap,
204
192
  configuration: DataCubeConfiguration,
205
- filterOperations: DataCubeQueryFilterOperation[],
206
- aggregateOperations: DataCubeQueryAggregateOperation[],
193
+ engine: DataCubeEngine,
207
194
  ) => {
208
195
  const _unprocess = _functionCompositionUnProcessor(sequence, funcMap);
209
196
  const data = snapshot.data;
@@ -285,7 +272,7 @@ function generateGridDataFetchExecutableQueryPostProcessor(
285
272
  }),
286
273
  groupOperator: DataCubeQueryFilterGroupOperator.AND,
287
274
  },
288
- filterOperations,
275
+ engine.filterOperations,
289
276
  ),
290
277
  ],
291
278
  ),
@@ -312,7 +299,7 @@ function generateGridDataFetchExecutableQueryPostProcessor(
312
299
  groupByColumns,
313
300
  snapshot,
314
301
  configuration,
315
- aggregateOperations,
302
+ engine.aggregateOperations,
316
303
  ),
317
304
 
318
305
  // if pivot is present, add sum aggregation columns for each
@@ -19,7 +19,7 @@ import {
19
19
  guaranteeNonNullable,
20
20
  type DebouncedFunc,
21
21
  } from '@finos/legend-shared';
22
- import { action, makeObservable, observable } from 'mobx';
22
+ import { action, makeObservable, observable, runInAction } from 'mobx';
23
23
  import type { GridApi } from 'ag-grid-community';
24
24
  import type { DataCubeViewState } from '../DataCubeViewState.js';
25
25
  import {
@@ -38,6 +38,8 @@ import { DataCubeConfiguration } from '../../core/model/DataCubeConfiguration.js
38
38
  import { DataCubeGridControllerState } from './DataCubeGridControllerState.js';
39
39
  import { DataCubeGridClientExportEngine } from './DataCubeGridClientExportEngine.js';
40
40
  import { DataCubeSettingKey } from '../../../__lib__/DataCubeSetting.js';
41
+ import { DEFAULT_ALERT_WINDOW_CONFIG } from '../../services/DataCubeLayoutService.js';
42
+ import { AlertType } from '../../services/DataCubeAlertService.js';
41
43
 
42
44
  /**
43
45
  * This query editor state is responsible for syncing the internal state of ag-grid
@@ -125,15 +127,94 @@ export class DataCubeGridState extends DataCubeQuerySnapshotController {
125
127
  }
126
128
 
127
129
  async setCachingEnabled(val: boolean) {
128
- this.isCachingEnabled = val;
129
- if (this.isCachingEnabled) {
130
- this._client?.setGridOption('loading', true);
130
+ if (val === this.isCachingEnabled) {
131
+ return;
132
+ }
133
+
134
+ // disable caching
135
+ if (val === false) {
136
+ await this._view.disposeCache();
137
+
138
+ runInAction(() => {
139
+ this.isCachingEnabled = val;
140
+
141
+ // hard reset the grid, this will force the grid to fetch data again
142
+ this.clientDataSource = new DataCubeGridClientServerSideDataSource(
143
+ this,
144
+ this._view,
145
+ );
146
+ });
147
+
148
+ return;
149
+ }
150
+
151
+ // enable caching
152
+ const run = async () => {
131
153
  await this._view.initializeCache();
132
- this._client?.setGridOption('loading', false);
154
+
155
+ // only update value if cache processing succeeds
156
+ if (this._view.processCacheState.hasSucceeded) {
157
+ runInAction(() => {
158
+ this.isCachingEnabled = val;
159
+
160
+ // hard reset the grid, this will force the grid to fetch data again
161
+ this.clientDataSource = new DataCubeGridClientServerSideDataSource(
162
+ this,
163
+ this._view,
164
+ );
165
+ });
166
+ }
167
+ };
168
+
169
+ // TODO?: we might want to do a quick check here for the amount of data the cache
170
+ // will handle, so maybe fire a COUNT query to check for the number of records
171
+ // and check that against a threshold, we will need to alter the prompt below accordingly.
172
+ if (
173
+ this._settingService.getBooleanValue(
174
+ DataCubeSettingKey.GRID_CLIENT__SHOW_CACHE_PERFORMANCE_WARNING,
175
+ )
176
+ ) {
177
+ this._view.alertService.alert({
178
+ message: `Confirm you want to proceed with caching`,
179
+ text: `When enabled, the source dataset will be cached locally in order to boost query performance. But depending on computational resource available to your environment, sometimes, caching can negatively impact the overall performance, and can even lead to crashes.\nDo you still want to proceed?`,
180
+ type: AlertType.WARNING,
181
+ actions: [
182
+ {
183
+ label: 'Abort',
184
+ handler: () => {},
185
+ },
186
+ {
187
+ label: 'Proceed',
188
+ handler: () => {
189
+ run().catch((error) =>
190
+ this._view.alertService.alertUnhandledError(error),
191
+ );
192
+ },
193
+ },
194
+ {
195
+ label: 'Dismiss Warning and Proceed',
196
+ handler: () => {
197
+ this._view.settingService.updateValue(
198
+ this._view.dataCube.api,
199
+ DataCubeSettingKey.GRID_CLIENT__SHOW_CACHE_PERFORMANCE_WARNING,
200
+ false,
201
+ );
202
+ run().catch((error) =>
203
+ this._view.alertService.alertUnhandledError(error),
204
+ );
205
+ },
206
+ },
207
+ ],
208
+ windowConfig: {
209
+ ...DEFAULT_ALERT_WINDOW_CONFIG,
210
+ width: 600,
211
+ height: 210,
212
+ minWidth: 300,
213
+ minHeight: 150,
214
+ },
215
+ });
133
216
  } else {
134
- this._client?.setGridOption('loading', true);
135
- await this._view.clearCache();
136
- this._client?.setGridOption('loading', false);
217
+ await run();
137
218
  }
138
219
  }
139
220