@finos/legend-data-cube 0.1.31 → 0.2.0
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/lib/components/DataCubeStatusBar.d.ts.map +1 -1
- package/lib/components/DataCubeStatusBar.js +4 -2
- package/lib/components/DataCubeStatusBar.js.map +1 -1
- package/lib/components/view/editor/DataCubeEditor.d.ts.map +1 -1
- package/lib/components/view/editor/DataCubeEditor.js +5 -1
- package/lib/components/view/editor/DataCubeEditor.js.map +1 -1
- package/lib/components/view/grid/DataCubeMultidimensionalGrid.d.ts.map +1 -1
- package/lib/components/view/grid/DataCubeMultidimensionalGrid.js +40 -2
- package/lib/components/view/grid/DataCubeMultidimensionalGrid.js.map +1 -1
- package/lib/index.css +1 -1
- package/lib/package.json +1 -1
- package/lib/stores/DataCubeAPI.d.ts +6 -0
- package/lib/stores/DataCubeAPI.d.ts.map +1 -1
- package/lib/stores/DataCubeAPI.js +4 -0
- package/lib/stores/DataCubeAPI.js.map +1 -1
- package/lib/stores/core/DataCubeQueryBuilder.d.ts +12 -0
- package/lib/stores/core/DataCubeQueryBuilder.d.ts.map +1 -1
- package/lib/stores/core/DataCubeQueryBuilder.js +141 -4
- package/lib/stores/core/DataCubeQueryBuilder.js.map +1 -1
- package/lib/stores/core/DataCubeQueryBuilderUtils.d.ts +2 -0
- package/lib/stores/core/DataCubeQueryBuilderUtils.d.ts.map +1 -1
- package/lib/stores/core/DataCubeQueryBuilderUtils.js +18 -1
- package/lib/stores/core/DataCubeQueryBuilderUtils.js.map +1 -1
- package/lib/stores/core/DataCubeQueryEngine.d.ts +5 -0
- package/lib/stores/core/DataCubeQueryEngine.d.ts.map +1 -1
- package/lib/stores/core/DataCubeQueryEngine.js +8 -0
- package/lib/stores/core/DataCubeQueryEngine.js.map +1 -1
- package/lib/stores/core/DataCubeSnapshot.d.ts +2 -0
- package/lib/stores/core/DataCubeSnapshot.d.ts.map +1 -1
- package/lib/stores/core/DataCubeSnapshot.js.map +1 -1
- package/lib/stores/core/DataCubeSnapshotBuilder.d.ts.map +1 -1
- package/lib/stores/core/DataCubeSnapshotBuilder.js +2 -2
- package/lib/stores/core/DataCubeSnapshotBuilder.js.map +1 -1
- package/lib/stores/core/DataCubeSnapshotBuilderUtils.d.ts +2 -1
- package/lib/stores/core/DataCubeSnapshotBuilderUtils.d.ts.map +1 -1
- package/lib/stores/core/DataCubeSnapshotBuilderUtils.js +3 -3
- package/lib/stores/core/DataCubeSnapshotBuilderUtils.js.map +1 -1
- package/lib/stores/view/editor/DataCubeEditorDimensionsPanelState.d.ts.map +1 -1
- package/lib/stores/view/editor/DataCubeEditorDimensionsPanelState.js +7 -4
- package/lib/stores/view/editor/DataCubeEditorDimensionsPanelState.js.map +1 -1
- package/lib/stores/view/grid/DataCubeGridClientEngine.d.ts +163 -1
- package/lib/stores/view/grid/DataCubeGridClientEngine.d.ts.map +1 -1
- package/lib/stores/view/grid/DataCubeGridClientEngine.js +134 -2
- package/lib/stores/view/grid/DataCubeGridClientEngine.js.map +1 -1
- package/lib/stores/view/grid/DataCubeGridConfigurationBuilder.d.ts +155 -1
- package/lib/stores/view/grid/DataCubeGridConfigurationBuilder.d.ts.map +1 -1
- package/lib/stores/view/grid/DataCubeGridConfigurationBuilder.js +170 -2
- package/lib/stores/view/grid/DataCubeGridConfigurationBuilder.js.map +1 -1
- package/lib/stores/view/grid/DataCubeGridControllerState.d.ts.map +1 -1
- package/lib/stores/view/grid/DataCubeGridControllerState.js +5 -3
- package/lib/stores/view/grid/DataCubeGridControllerState.js.map +1 -1
- package/lib/stores/view/grid/DataCubeGridDimensionalTree.d.ts +48 -0
- package/lib/stores/view/grid/DataCubeGridDimensionalTree.d.ts.map +1 -0
- package/lib/stores/view/grid/DataCubeGridDimensionalTree.js +168 -0
- package/lib/stores/view/grid/DataCubeGridDimensionalTree.js.map +1 -0
- package/lib/stores/view/grid/DataCubeGridMenuBuilder.d.ts +1 -0
- package/lib/stores/view/grid/DataCubeGridMenuBuilder.d.ts.map +1 -1
- package/lib/stores/view/grid/DataCubeGridMenuBuilder.js +197 -0
- package/lib/stores/view/grid/DataCubeGridMenuBuilder.js.map +1 -1
- package/lib/stores/view/grid/DataCubeGridQueryBuilder.d.ts +2 -0
- package/lib/stores/view/grid/DataCubeGridQueryBuilder.d.ts.map +1 -1
- package/lib/stores/view/grid/DataCubeGridQueryBuilder.js +7 -1
- package/lib/stores/view/grid/DataCubeGridQueryBuilder.js.map +1 -1
- package/lib/stores/view/grid/DataCubeGridState.d.ts +4 -1
- package/lib/stores/view/grid/DataCubeGridState.d.ts.map +1 -1
- package/lib/stores/view/grid/DataCubeGridState.js +24 -2
- package/lib/stores/view/grid/DataCubeGridState.js.map +1 -1
- package/package.json +4 -4
- package/src/components/DataCubeStatusBar.tsx +9 -2
- package/src/components/view/editor/DataCubeEditor.tsx +8 -1
- package/src/components/view/grid/DataCubeMultidimensionalGrid.tsx +63 -1
- package/src/stores/DataCubeAPI.ts +10 -0
- package/src/stores/core/DataCubeQueryBuilder.ts +256 -2
- package/src/stores/core/DataCubeQueryBuilderUtils.ts +22 -0
- package/src/stores/core/DataCubeQueryEngine.ts +9 -0
- package/src/stores/core/DataCubeSnapshot.ts +2 -0
- package/src/stores/core/DataCubeSnapshotBuilder.ts +2 -0
- package/src/stores/core/DataCubeSnapshotBuilderUtils.ts +6 -2
- package/src/stores/view/editor/DataCubeEditorDimensionsPanelState.ts +8 -7
- package/src/stores/view/grid/DataCubeGridClientEngine.ts +252 -5
- package/src/stores/view/grid/DataCubeGridConfigurationBuilder.tsx +244 -3
- package/src/stores/view/grid/DataCubeGridControllerState.ts +10 -2
- package/src/stores/view/grid/DataCubeGridDimensionalTree.ts +268 -0
- package/src/stores/view/grid/DataCubeGridMenuBuilder.tsx +240 -0
- package/src/stores/view/grid/DataCubeGridQueryBuilder.ts +22 -1
- package/src/stores/view/grid/DataCubeGridState.ts +52 -2
- package/tsconfig.json +1 -0
|
@@ -15,7 +15,7 @@
|
|
|
15
15
|
*/
|
|
16
16
|
import { debounce, guaranteeNonNullable, StopWatch, } from '@finos/legend-shared';
|
|
17
17
|
import { action, makeObservable, observable, runInAction } from 'mobx';
|
|
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';
|
|
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, fetchDimensionalQueryRows, } from './DataCubeGridClientEngine.js';
|
|
19
19
|
import { DataCubeSnapshotController } from '../../services/DataCubeSnapshotService.js';
|
|
20
20
|
import { generateGridOptionsFromSnapshot } from './DataCubeGridConfigurationBuilder.js';
|
|
21
21
|
import { DataCubeConfiguration } from '../../core/model/DataCubeConfiguration.js';
|
|
@@ -24,8 +24,9 @@ import { DataCubeGridClientExportEngine } from './DataCubeGridClientExportEngine
|
|
|
24
24
|
import { DataCubeSettingKey } from '../../../__lib__/DataCubeSetting.js';
|
|
25
25
|
import { DEFAULT_ALERT_WINDOW_CONFIG } from '../../services/DataCubeLayoutService.js';
|
|
26
26
|
import { AlertType } from '../../services/DataCubeAlertService.js';
|
|
27
|
-
import { DataCubeGridMode } from '../../core/DataCubeQueryEngine.js';
|
|
27
|
+
import { DataCubeClientModelOption, DataCubeGridMode, } from '../../core/DataCubeQueryEngine.js';
|
|
28
28
|
import { DataCubeEvent } from '../../../__lib__/DataCubeEvent.js';
|
|
29
|
+
import { hydrateDataCubeDimensionalTree } from './DataCubeGridDimensionalTree.js';
|
|
29
30
|
/**
|
|
30
31
|
* This query editor state is responsible for syncing the internal state of ag-grid
|
|
31
32
|
* server-side row model data source with the data cube query state. When new snapshot
|
|
@@ -188,6 +189,27 @@ export class DataCubeGridState extends DataCubeSnapshotController {
|
|
|
188
189
|
await this.applySnapshot(latestSnapshot, undefined);
|
|
189
190
|
}
|
|
190
191
|
}
|
|
192
|
+
async configureDimensionGridClient(val) {
|
|
193
|
+
this._client = val;
|
|
194
|
+
this.debouncedAutoResizeColumns = debounce(() => val?.autoSizeAllColumns(), 100);
|
|
195
|
+
const latestSnapshot = this.getLatestSnapshot();
|
|
196
|
+
if (latestSnapshot) {
|
|
197
|
+
latestSnapshot.data.tree = hydrateDataCubeDimensionalTree(DataCubeConfiguration.serialization.fromJson(latestSnapshot.data.configuration));
|
|
198
|
+
await this._applyDimensionalSnapshot(latestSnapshot);
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
async retrieveDrilldownData(data) {
|
|
202
|
+
const latestSnapshot = guaranteeNonNullable(this.getLatestSnapshot());
|
|
203
|
+
latestSnapshot.data.tree = hydrateDataCubeDimensionalTree(DataCubeConfiguration.serialization.fromJson(latestSnapshot.data.configuration), data, latestSnapshot.data.tree);
|
|
204
|
+
await this._applyDimensionalSnapshot(latestSnapshot);
|
|
205
|
+
}
|
|
206
|
+
async _applyDimensionalSnapshot(snapshot) {
|
|
207
|
+
//TODO: only trigger when there is an actual change in tree
|
|
208
|
+
const result = await fetchDimensionalQueryRows(snapshot, this._view);
|
|
209
|
+
this._client?.setGridOption(DataCubeClientModelOption.ROW_DATA, result.rowData);
|
|
210
|
+
this._client?.setGridOption(DataCubeClientModelOption.COLUMN_DEFS, result.columnDefs);
|
|
211
|
+
this.publishSnapshot(snapshot);
|
|
212
|
+
}
|
|
191
213
|
getSnapshotSubscriberName() {
|
|
192
214
|
return 'grid';
|
|
193
215
|
}
|
|
@@ -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,EACpB,SAAS,GAEV,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,
|
|
1
|
+
{"version":3,"file":"DataCubeGridState.js","sourceRoot":"","sources":["../../../../src/stores/view/grid/DataCubeGridState.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@finos/legend-data-cube",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.2.0",
|
|
4
4
|
"description": "Legend DataCube",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"legend",
|
|
@@ -42,9 +42,9 @@
|
|
|
42
42
|
"test:watch": "jest --watch"
|
|
43
43
|
},
|
|
44
44
|
"dependencies": {
|
|
45
|
-
"@finos/legend-art": "7.1.
|
|
46
|
-
"@finos/legend-code-editor": "2.0.
|
|
47
|
-
"@finos/legend-graph": "32.1.
|
|
45
|
+
"@finos/legend-art": "7.1.96",
|
|
46
|
+
"@finos/legend-code-editor": "2.0.69",
|
|
47
|
+
"@finos/legend-graph": "32.1.27",
|
|
48
48
|
"@finos/legend-shared": "11.0.11",
|
|
49
49
|
"@types/react": "19.0.10",
|
|
50
50
|
"ag-grid-community": "33.1.1",
|
|
@@ -20,7 +20,10 @@ import type { DataCubeViewState } from '../stores/view/DataCubeViewState.js';
|
|
|
20
20
|
import type { TaskManager } from '../stores/services/DataCubeTaskService.js';
|
|
21
21
|
import { at } from '@finos/legend-shared';
|
|
22
22
|
import { DataCubeEvent } from '../__lib__/DataCubeEvent.js';
|
|
23
|
-
import {
|
|
23
|
+
import {
|
|
24
|
+
DataCubeOpenEditorSource,
|
|
25
|
+
isDimensionalGridMode,
|
|
26
|
+
} from '../stores/core/DataCubeQueryEngine.js';
|
|
24
27
|
|
|
25
28
|
export const DataCubeStatusBar = observer(
|
|
26
29
|
(props: {
|
|
@@ -71,7 +74,11 @@ export const DataCubeStatusBar = observer(
|
|
|
71
74
|
view?.filter.display.open();
|
|
72
75
|
logOpeningFilterEditor();
|
|
73
76
|
}}
|
|
74
|
-
disabled={
|
|
77
|
+
disabled={
|
|
78
|
+
!view ||
|
|
79
|
+
// TODO: add support for filtering in dimensional grid mode
|
|
80
|
+
isDimensionalGridMode(view.info.configuration.gridMode)
|
|
81
|
+
}
|
|
75
82
|
>
|
|
76
83
|
<DataCubeIcon.TableFilter className="text-lg" />
|
|
77
84
|
<div className="pl-0.5 underline">Filter</div>
|
|
@@ -28,6 +28,7 @@ import { FormButton } from '../../core/DataCubeFormUtils.js';
|
|
|
28
28
|
import { useDataCube } from '../../DataCubeProvider.js';
|
|
29
29
|
import { DataCubeEditorDimensionsPanel } from './DataCubeEditorDimensionsPanel.js';
|
|
30
30
|
import { DataCubeEvent } from '../../../__lib__/DataCubeEvent.js';
|
|
31
|
+
import { isDimensionalGridMode } from '../../../stores/core/DataCubeQueryEngine.js';
|
|
31
32
|
|
|
32
33
|
export const DataCubeEditor = observer((props: { view: DataCubeViewState }) => {
|
|
33
34
|
const dataCube = useDataCube();
|
|
@@ -45,6 +46,8 @@ export const DataCubeEditor = observer((props: { view: DataCubeViewState }) => {
|
|
|
45
46
|
DataCubeEditorTab.GENERAL_PROPERTIES,
|
|
46
47
|
DataCubeEditorTab.COLUMN_PROPERTIES,
|
|
47
48
|
];
|
|
49
|
+
//TODO: Add support to make changes to other tabs for dimensional grid mode
|
|
50
|
+
const dimensionTabs = [DataCubeEditorTab.DIMENSIONS];
|
|
48
51
|
|
|
49
52
|
const logApplyChangesFromPropertiesEditor = (): void => {
|
|
50
53
|
view.dataCube.telemetryService.sendTelemetry(
|
|
@@ -61,8 +64,12 @@ export const DataCubeEditor = observer((props: { view: DataCubeViewState }) => {
|
|
|
61
64
|
<button
|
|
62
65
|
key={tab}
|
|
63
66
|
onClick={() => editor.setCurrentTab(tab)}
|
|
67
|
+
disabled={
|
|
68
|
+
isDimensionalGridMode(view.info.configuration.gridMode) &&
|
|
69
|
+
!dimensionTabs.includes(tab)
|
|
70
|
+
}
|
|
64
71
|
className={cn(
|
|
65
|
-
'relative flex h-6 items-center justify-center whitespace-nowrap border border-b-0 border-l-0 border-neutral-300 px-2 first:border-l focus:z-10',
|
|
72
|
+
'relative flex h-6 items-center justify-center whitespace-nowrap border border-b-0 border-l-0 border-neutral-300 px-2 first:border-l focus:z-10 disabled:text-neutral-400',
|
|
66
73
|
{
|
|
67
74
|
'-top-0.5 h-[27px] border-b-0 bg-white': tab === selectedTab,
|
|
68
75
|
},
|
|
@@ -16,11 +16,73 @@
|
|
|
16
16
|
|
|
17
17
|
import { observer } from 'mobx-react-lite';
|
|
18
18
|
import type { DataCubeViewState } from '../../../stores/view/DataCubeViewState.js';
|
|
19
|
+
import { DataCubeGridStyleController } from './DataCubeGrid.js';
|
|
20
|
+
import { AgGridReact } from 'ag-grid-react';
|
|
21
|
+
import { generateDimensionalBaseGridOptions } from '../../../stores/view/grid/DataCubeGridConfigurationBuilder.js';
|
|
22
|
+
import { AllCommunityModule } from 'ag-grid-community';
|
|
23
|
+
import { AllEnterpriseModule } from 'ag-grid-enterprise';
|
|
24
|
+
|
|
25
|
+
const __INTERNAL__original_console_error = console.error; // eslint-disable-line no-console
|
|
26
|
+
|
|
27
|
+
const DataCubeMultidimensionalGridClient = observer(
|
|
28
|
+
(props: { view: DataCubeViewState }) => {
|
|
29
|
+
const { view } = props;
|
|
30
|
+
const grid = view.grid;
|
|
31
|
+
|
|
32
|
+
// eslint-disable-next-line no-process-env
|
|
33
|
+
if (process.env.NODE_ENV !== 'production' && !grid.isClientConfigured) {
|
|
34
|
+
// eslint-disable-next-line no-console
|
|
35
|
+
console.error = (message?: unknown) => {
|
|
36
|
+
console.debug(`%c ${message}`, 'color: silver'); // eslint-disable-line no-console
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
// We use the client row model to showcase multi-dimensionality;
|
|
41
|
+
// Tree Data cannot be used in this case as the aggregation works on multiple columns
|
|
42
|
+
// https://www.ag-grid.com/javascript-data-grid/row-models/#client-side
|
|
43
|
+
return (
|
|
44
|
+
<div className="relative h-[calc(100%_-_20px)] w-full">
|
|
45
|
+
<AgGridReact
|
|
46
|
+
theme="legacy"
|
|
47
|
+
className="data-cube-grid ag-theme-quartz"
|
|
48
|
+
context={{
|
|
49
|
+
view,
|
|
50
|
+
}}
|
|
51
|
+
columnDefs={[]}
|
|
52
|
+
rowData={[]}
|
|
53
|
+
onCellDoubleClicked={(event) => {
|
|
54
|
+
grid
|
|
55
|
+
.retrieveDrilldownData(event)
|
|
56
|
+
.catch((error) => view.alertService.alertUnhandledError(error));
|
|
57
|
+
}}
|
|
58
|
+
onGridReady={(params) => {
|
|
59
|
+
grid
|
|
60
|
+
.configureDimensionGridClient(params.api)
|
|
61
|
+
.catch((error) => view.alertService.alertUnhandledError(error));
|
|
62
|
+
// eslint-disable-next-line no-process-env
|
|
63
|
+
if (process.env.NODE_ENV !== 'production') {
|
|
64
|
+
// restore original error logging
|
|
65
|
+
console.error = __INTERNAL__original_console_error; // eslint-disable-line no-console
|
|
66
|
+
}
|
|
67
|
+
}}
|
|
68
|
+
modules={[AllCommunityModule, AllEnterpriseModule]}
|
|
69
|
+
{...generateDimensionalBaseGridOptions(view)}
|
|
70
|
+
/>
|
|
71
|
+
</div>
|
|
72
|
+
);
|
|
73
|
+
},
|
|
74
|
+
);
|
|
19
75
|
|
|
20
76
|
export const DataCubeMultidimensionalGrid = observer(
|
|
21
77
|
(props: { view: DataCubeViewState }) => {
|
|
78
|
+
const view = props.view;
|
|
79
|
+
const configuration = props.view.grid.configuration;
|
|
80
|
+
|
|
22
81
|
return (
|
|
23
|
-
<div className="
|
|
82
|
+
<div className="h-[calc(100%_-_48px)] w-full">
|
|
83
|
+
<DataCubeGridStyleController configuration={configuration} />
|
|
84
|
+
<DataCubeMultidimensionalGridClient view={view} />
|
|
85
|
+
</div>
|
|
24
86
|
);
|
|
25
87
|
},
|
|
26
88
|
);
|
|
@@ -18,6 +18,7 @@ import type { DataCubeSpecification } from './core/model/DataCubeSpecification.j
|
|
|
18
18
|
import type { DataCubeSource } from './core/model/DataCubeSource.js';
|
|
19
19
|
import type { DataCubeState } from './DataCubeState.js';
|
|
20
20
|
import type { DataCubeViewState } from './view/DataCubeViewState.js';
|
|
21
|
+
import type { DataCubeGridMode } from './core/DataCubeQueryEngine.js';
|
|
21
22
|
|
|
22
23
|
/**
|
|
23
24
|
* This is the API exposed externally by DataCube to restrict access to certain
|
|
@@ -58,6 +59,10 @@ export interface DataCubeAPI {
|
|
|
58
59
|
* Get the caching enabled state of the underlying grid.
|
|
59
60
|
*/
|
|
60
61
|
isCachingEnabled(): boolean;
|
|
62
|
+
/**
|
|
63
|
+
* Get mode for grid
|
|
64
|
+
*/
|
|
65
|
+
getGridMode(): DataCubeGridMode;
|
|
61
66
|
}
|
|
62
67
|
|
|
63
68
|
/**
|
|
@@ -112,4 +117,9 @@ export class INTERNAL__DataCubeAPI implements DataCubeAPI {
|
|
|
112
117
|
isCachingEnabled() {
|
|
113
118
|
return this._dataCube.view.grid.isCachingEnabled;
|
|
114
119
|
}
|
|
120
|
+
|
|
121
|
+
// TODO: remove this method once saving is enabled for dimensional mode
|
|
122
|
+
getGridMode() {
|
|
123
|
+
return this._dataCube.view.info.configuration.gridMode;
|
|
124
|
+
}
|
|
115
125
|
}
|
|
@@ -23,13 +23,21 @@
|
|
|
23
23
|
|
|
24
24
|
import {
|
|
25
25
|
PRIMITIVE_TYPE,
|
|
26
|
+
V1_AppliedProperty,
|
|
27
|
+
V1_CString,
|
|
26
28
|
V1_Lambda,
|
|
29
|
+
V1_Variable,
|
|
27
30
|
type V1_AppliedFunction,
|
|
28
31
|
} from '@finos/legend-graph';
|
|
29
|
-
import {
|
|
32
|
+
import {
|
|
33
|
+
type DataCubeSnapshot,
|
|
34
|
+
type DataCubeSnapshotExtendedColumn,
|
|
35
|
+
type DataCubeSnapshotGroupBy,
|
|
36
|
+
} from './DataCubeSnapshot.js';
|
|
30
37
|
import { at, guaranteeType } from '@finos/legend-shared';
|
|
31
38
|
import {
|
|
32
39
|
DataCubeFunction,
|
|
40
|
+
DataCubeQueryFilterGroupOperator,
|
|
33
41
|
DataCubeQuerySortDirection,
|
|
34
42
|
type DataCubeQueryFunctionMap,
|
|
35
43
|
} from './DataCubeQueryEngine.js';
|
|
@@ -49,10 +57,15 @@ import {
|
|
|
49
57
|
_var,
|
|
50
58
|
_functionCompositionProcessor,
|
|
51
59
|
_extendRootAggregation,
|
|
60
|
+
_flattenFilterSnapshot,
|
|
52
61
|
} from './DataCubeQueryBuilderUtils.js';
|
|
53
62
|
import type { DataCubeSource } from './model/DataCubeSource.js';
|
|
54
|
-
import { _findCol } from './model/DataCubeColumn.js';
|
|
63
|
+
import { _findCol, _toCol } from './model/DataCubeColumn.js';
|
|
55
64
|
import type { DataCubeEngine } from './DataCubeEngine.js';
|
|
65
|
+
import {
|
|
66
|
+
DIMENSIONAL_L0_COLUMN,
|
|
67
|
+
type DataCubeDimensionalNode,
|
|
68
|
+
} from '../view/grid/DataCubeGridDimensionalTree.js';
|
|
56
69
|
|
|
57
70
|
export function buildExecutableQuery(
|
|
58
71
|
snapshot: DataCubeSnapshot,
|
|
@@ -312,3 +325,244 @@ export function buildExecutableQuery(
|
|
|
312
325
|
}
|
|
313
326
|
return at(sequence, sequence.length - 1);
|
|
314
327
|
}
|
|
328
|
+
|
|
329
|
+
export function buildDimensionalExecutableQuery(
|
|
330
|
+
snapshot: DataCubeSnapshot,
|
|
331
|
+
source: DataCubeSource,
|
|
332
|
+
engine: DataCubeEngine,
|
|
333
|
+
nodes: DataCubeDimensionalNode[],
|
|
334
|
+
options?: {
|
|
335
|
+
postProcessor?: (
|
|
336
|
+
snapshot: DataCubeSnapshot,
|
|
337
|
+
sequence: V1_AppliedFunction[],
|
|
338
|
+
funcMap: DataCubeQueryFunctionMap,
|
|
339
|
+
configuration: DataCubeConfiguration,
|
|
340
|
+
engine: DataCubeEngine,
|
|
341
|
+
) => void;
|
|
342
|
+
rootAggregation?:
|
|
343
|
+
| {
|
|
344
|
+
columnName: string;
|
|
345
|
+
}
|
|
346
|
+
| undefined;
|
|
347
|
+
pagination?:
|
|
348
|
+
| {
|
|
349
|
+
start: number;
|
|
350
|
+
end: number;
|
|
351
|
+
}
|
|
352
|
+
| undefined;
|
|
353
|
+
skipExecutionContext?: boolean;
|
|
354
|
+
},
|
|
355
|
+
) {
|
|
356
|
+
const data = snapshot.data;
|
|
357
|
+
const configuration = DataCubeConfiguration.serialization.fromJson(
|
|
358
|
+
data.configuration,
|
|
359
|
+
);
|
|
360
|
+
const sequence: V1_AppliedFunction[] = [];
|
|
361
|
+
const funcMap: DataCubeQueryFunctionMap = {};
|
|
362
|
+
const _process = _functionCompositionProcessor(sequence, funcMap);
|
|
363
|
+
|
|
364
|
+
// ------------------------------ DIMENSIONS -------------------------------------
|
|
365
|
+
|
|
366
|
+
if (data.tree && nodes.length > 0) {
|
|
367
|
+
const dimensionColNames = configuration.dimensions.dimensions.flatMap(
|
|
368
|
+
(col) => col.columns,
|
|
369
|
+
);
|
|
370
|
+
|
|
371
|
+
// removing columns which have been added to represent diimensions
|
|
372
|
+
configuration.columns = configuration.columns.map((col) => {
|
|
373
|
+
if (dimensionColNames.includes(col.name)) {
|
|
374
|
+
col.isSelected = false;
|
|
375
|
+
}
|
|
376
|
+
return col;
|
|
377
|
+
});
|
|
378
|
+
|
|
379
|
+
// Adding dimensions to the extended column
|
|
380
|
+
nodes.forEach((node) => {
|
|
381
|
+
const lambda = new V1_Lambda();
|
|
382
|
+
const parameter = new V1_Variable();
|
|
383
|
+
parameter.name = 'temp';
|
|
384
|
+
if (node.column === DIMENSIONAL_L0_COLUMN) {
|
|
385
|
+
const defaultValue = new V1_CString();
|
|
386
|
+
defaultValue.value = node.column;
|
|
387
|
+
lambda.body = [defaultValue];
|
|
388
|
+
} else {
|
|
389
|
+
const defaultValue = new V1_AppliedProperty();
|
|
390
|
+
defaultValue.parameters = [parameter];
|
|
391
|
+
defaultValue.property = node.column;
|
|
392
|
+
lambda.body = [defaultValue];
|
|
393
|
+
}
|
|
394
|
+
lambda.parameters = [parameter];
|
|
395
|
+
data.leafExtendedColumns.unshift({
|
|
396
|
+
name: node.dimension,
|
|
397
|
+
type: PRIMITIVE_TYPE.STRING,
|
|
398
|
+
mapFn: engine.serializeValueSpecification(lambda),
|
|
399
|
+
} satisfies DataCubeSnapshotExtendedColumn);
|
|
400
|
+
});
|
|
401
|
+
|
|
402
|
+
// Adding dimensions to selected list
|
|
403
|
+
data.selectColumns = data.selectColumns.filter(
|
|
404
|
+
(col) => !dimensionColNames.includes(col.name),
|
|
405
|
+
);
|
|
406
|
+
|
|
407
|
+
const dimensionCols = nodes.map((col) =>
|
|
408
|
+
_toCol({ name: col.dimension, type: PRIMITIVE_TYPE.STRING }),
|
|
409
|
+
);
|
|
410
|
+
data.selectColumns.unshift(...dimensionCols);
|
|
411
|
+
|
|
412
|
+
// Adding filter based on group by nodes
|
|
413
|
+
const groupByNodes = nodes.flatMap((x) => x.groupByNodes);
|
|
414
|
+
if (groupByNodes.length > 0) {
|
|
415
|
+
const filter = [
|
|
416
|
+
_flattenFilterSnapshot(nodes.flatMap((x) => x.groupByNodes)),
|
|
417
|
+
];
|
|
418
|
+
if (data.filter) {
|
|
419
|
+
filter.push(data.filter);
|
|
420
|
+
data.filter = {
|
|
421
|
+
groupOperator: DataCubeQueryFilterGroupOperator.AND,
|
|
422
|
+
conditions: filter,
|
|
423
|
+
};
|
|
424
|
+
} else {
|
|
425
|
+
data.filter = filter.at(0);
|
|
426
|
+
}
|
|
427
|
+
}
|
|
428
|
+
|
|
429
|
+
// Adding dimensions to groupby
|
|
430
|
+
if (data.groupBy) {
|
|
431
|
+
data.groupBy.columns.unshift(...dimensionCols);
|
|
432
|
+
} else {
|
|
433
|
+
data.groupBy = {
|
|
434
|
+
columns: dimensionCols,
|
|
435
|
+
} satisfies DataCubeSnapshotGroupBy;
|
|
436
|
+
}
|
|
437
|
+
}
|
|
438
|
+
|
|
439
|
+
// --------------------------------- LEAF-LEVEL EXTEND ---------------------------------
|
|
440
|
+
|
|
441
|
+
if (data.leafExtendedColumns.length) {
|
|
442
|
+
_process(
|
|
443
|
+
'leafExtend',
|
|
444
|
+
data.leafExtendedColumns.map((col) =>
|
|
445
|
+
_function(DataCubeFunction.EXTEND, [
|
|
446
|
+
_cols([
|
|
447
|
+
_colSpec(
|
|
448
|
+
col.name,
|
|
449
|
+
guaranteeType(
|
|
450
|
+
engine.deserializeValueSpecification(col.mapFn),
|
|
451
|
+
V1_Lambda,
|
|
452
|
+
),
|
|
453
|
+
col.reduceFn
|
|
454
|
+
? guaranteeType(
|
|
455
|
+
engine.deserializeValueSpecification(col.reduceFn),
|
|
456
|
+
V1_Lambda,
|
|
457
|
+
)
|
|
458
|
+
: undefined,
|
|
459
|
+
),
|
|
460
|
+
]),
|
|
461
|
+
]),
|
|
462
|
+
),
|
|
463
|
+
);
|
|
464
|
+
}
|
|
465
|
+
|
|
466
|
+
// --------------------------------- FILTER ---------------------------------
|
|
467
|
+
|
|
468
|
+
if (data.filter) {
|
|
469
|
+
_process(
|
|
470
|
+
'filter',
|
|
471
|
+
_function(DataCubeFunction.FILTER, [
|
|
472
|
+
_lambda([_var()], [_filter(data.filter, engine.filterOperations)]),
|
|
473
|
+
]),
|
|
474
|
+
);
|
|
475
|
+
}
|
|
476
|
+
|
|
477
|
+
// --------------------------------- SELECT ---------------------------------
|
|
478
|
+
|
|
479
|
+
if (data.selectColumns.length) {
|
|
480
|
+
_process(
|
|
481
|
+
'select',
|
|
482
|
+
_function(DataCubeFunction.SELECT, [
|
|
483
|
+
_cols(data.selectColumns.map((col) => _colSpec(col.name))),
|
|
484
|
+
]),
|
|
485
|
+
);
|
|
486
|
+
}
|
|
487
|
+
|
|
488
|
+
// --------------------------------- PIVOT ---------------------------------
|
|
489
|
+
|
|
490
|
+
// TODO: rethink pivots for dimensional grid mode
|
|
491
|
+
|
|
492
|
+
// --------------------------------- GROUP BY ---------------------------------
|
|
493
|
+
|
|
494
|
+
if (data.groupBy) {
|
|
495
|
+
const groupBy = data.groupBy;
|
|
496
|
+
if (configuration.showRootAggregation && options?.rootAggregation) {
|
|
497
|
+
sequence.push(_extendRootAggregation(options.rootAggregation.columnName));
|
|
498
|
+
}
|
|
499
|
+
_process(
|
|
500
|
+
'groupBy',
|
|
501
|
+
_function(DataCubeFunction.GROUP_BY, [
|
|
502
|
+
_cols(groupBy.columns.map((col) => _colSpec(col.name))),
|
|
503
|
+
_cols(
|
|
504
|
+
_groupByAggCols(
|
|
505
|
+
groupBy.columns,
|
|
506
|
+
snapshot,
|
|
507
|
+
configuration,
|
|
508
|
+
engine.aggregateOperations,
|
|
509
|
+
),
|
|
510
|
+
),
|
|
511
|
+
]),
|
|
512
|
+
);
|
|
513
|
+
_process(
|
|
514
|
+
'groupBySort',
|
|
515
|
+
_function(DataCubeFunction.SORT, [
|
|
516
|
+
_collection(
|
|
517
|
+
groupBy.columns.map((col) =>
|
|
518
|
+
_function(
|
|
519
|
+
configuration.treeColumnSortDirection ===
|
|
520
|
+
DataCubeQuerySortDirection.ASCENDING
|
|
521
|
+
? DataCubeFunction.ASCENDING
|
|
522
|
+
: DataCubeFunction.DESCENDING,
|
|
523
|
+
[_col(col.name)],
|
|
524
|
+
),
|
|
525
|
+
),
|
|
526
|
+
),
|
|
527
|
+
]),
|
|
528
|
+
);
|
|
529
|
+
}
|
|
530
|
+
|
|
531
|
+
// --------------------------------- GROUP-LEVEL EXTEND ---------------------------------
|
|
532
|
+
|
|
533
|
+
// TODO: implement group level extends for dimensional grid mode
|
|
534
|
+
|
|
535
|
+
// --------------------------------- SORT ---------------------------------
|
|
536
|
+
|
|
537
|
+
// TODO: implement sort for dimensional grid mode
|
|
538
|
+
|
|
539
|
+
// --------------------------------- LIMIT ---------------------------------
|
|
540
|
+
|
|
541
|
+
// TODO: rethink limits for dimensional grid mode
|
|
542
|
+
|
|
543
|
+
// --------------------------------- SLICE ---------------------------------
|
|
544
|
+
|
|
545
|
+
// TODO: rethink slice for dimensional grid mode
|
|
546
|
+
// slice can lead to incorrect view of data for dimensionality
|
|
547
|
+
|
|
548
|
+
// --------------------------------- FINALIZE ---------------------------------
|
|
549
|
+
|
|
550
|
+
if (!options?.skipExecutionContext) {
|
|
551
|
+
const executionContext = engine.buildExecutionContext(source);
|
|
552
|
+
if (executionContext) {
|
|
553
|
+
sequence.push(executionContext);
|
|
554
|
+
}
|
|
555
|
+
}
|
|
556
|
+
|
|
557
|
+
options?.postProcessor?.(snapshot, sequence, funcMap, configuration, engine);
|
|
558
|
+
|
|
559
|
+
if (sequence.length === 0) {
|
|
560
|
+
return source.query;
|
|
561
|
+
}
|
|
562
|
+
for (let i = 0; i < sequence.length; i++) {
|
|
563
|
+
at(sequence, i).parameters.unshift(
|
|
564
|
+
i === 0 ? source.query : at(sequence, i - 1),
|
|
565
|
+
);
|
|
566
|
+
}
|
|
567
|
+
return at(sequence, sequence.length - 1);
|
|
568
|
+
}
|
|
@@ -81,6 +81,7 @@ import {
|
|
|
81
81
|
isPivotResultColumnName,
|
|
82
82
|
getPivotResultColumnBaseColumnName,
|
|
83
83
|
DEFAULT_ROOT_AGGREGATION_COLUMN_VALUE,
|
|
84
|
+
DataCubeQueryFilterOperator,
|
|
84
85
|
} from './DataCubeQueryEngine.js';
|
|
85
86
|
import type { DataCubeQueryFilterOperation } from './filter/DataCubeQueryFilterOperation.js';
|
|
86
87
|
import type { DataCubeQueryAggregateOperation } from './aggregation/DataCubeQueryAggregateOperation.js';
|
|
@@ -88,6 +89,7 @@ import {
|
|
|
88
89
|
DataCubeColumnConfiguration,
|
|
89
90
|
type DataCubeConfiguration,
|
|
90
91
|
} from './model/DataCubeConfiguration.js';
|
|
92
|
+
import type { DataCubeDimensionalGroupByNode } from '../view/grid/DataCubeGridDimensionalTree.js';
|
|
91
93
|
|
|
92
94
|
// --------------------------------- UTILITIES ---------------------------------
|
|
93
95
|
|
|
@@ -645,3 +647,23 @@ export function _filter(
|
|
|
645
647
|
return filterCondition.not ? _not(condition) : condition;
|
|
646
648
|
}
|
|
647
649
|
}
|
|
650
|
+
|
|
651
|
+
export function _flattenFilterSnapshot(
|
|
652
|
+
groupByNodes: DataCubeDimensionalGroupByNode[],
|
|
653
|
+
): DataCubeSnapshotFilter {
|
|
654
|
+
const filterConditions = groupByNodes.map((node) => {
|
|
655
|
+
return {
|
|
656
|
+
name: node.column,
|
|
657
|
+
type: 'String', // Assuming all filters are strings — update if needed
|
|
658
|
+
operator: DataCubeQueryFilterOperator.EQUAL,
|
|
659
|
+
value: {
|
|
660
|
+
type: 'String',
|
|
661
|
+
value: node.filter,
|
|
662
|
+
} satisfies DataCubeOperationValue,
|
|
663
|
+
} satisfies DataCubeSnapshotFilterCondition;
|
|
664
|
+
});
|
|
665
|
+
return {
|
|
666
|
+
groupOperator: DataCubeQueryFilterGroupOperator.AND,
|
|
667
|
+
conditions: filterConditions,
|
|
668
|
+
} satisfies DataCubeSnapshotFilter;
|
|
669
|
+
}
|
|
@@ -273,6 +273,11 @@ export enum DataCubeGridMode {
|
|
|
273
273
|
MULTIDIMENSIONAL = 'Multidimensional',
|
|
274
274
|
}
|
|
275
275
|
|
|
276
|
+
export enum DataCubeClientModelOption {
|
|
277
|
+
ROW_DATA = 'rowData',
|
|
278
|
+
COLUMN_DEFS = 'columnDefs',
|
|
279
|
+
}
|
|
280
|
+
|
|
276
281
|
export enum DataCubeTitleBarMenuItems {
|
|
277
282
|
VIEW_SOURCE = 'View Source',
|
|
278
283
|
RESET_TO_LATEST_SAVE = 'Reset to Latest Save',
|
|
@@ -409,6 +414,10 @@ export function ofDataType(
|
|
|
409
414
|
return dataTypes.includes(getDataType(type));
|
|
410
415
|
}
|
|
411
416
|
|
|
417
|
+
export function isDimensionalGridMode(gridMode: DataCubeGridMode) {
|
|
418
|
+
return gridMode === DataCubeGridMode.MULTIDIMENSIONAL;
|
|
419
|
+
}
|
|
420
|
+
|
|
412
421
|
export function isPrimitiveType(type: string) {
|
|
413
422
|
return (
|
|
414
423
|
[
|
|
@@ -29,6 +29,7 @@ import type {
|
|
|
29
29
|
DataCubeQuerySortDirection,
|
|
30
30
|
} from './DataCubeQueryEngine.js';
|
|
31
31
|
import type { DataCubeColumn } from './model/DataCubeColumn.js';
|
|
32
|
+
import type { DataCubeDimensionalTree } from '../view/grid/DataCubeGridDimensionalTree.js';
|
|
32
33
|
|
|
33
34
|
export type DataCubeSnapshotFilterCondition = DataCubeColumn & {
|
|
34
35
|
value: DataCubeOperationValue;
|
|
@@ -85,6 +86,7 @@ export type DataCubeSnapshotData = {
|
|
|
85
86
|
groupExtendedColumns: DataCubeSnapshotExtendedColumn[];
|
|
86
87
|
sortColumns: DataCubeSnapshotSortColumn[];
|
|
87
88
|
limit: number | undefined;
|
|
89
|
+
tree?: DataCubeDimensionalTree | undefined;
|
|
88
90
|
};
|
|
89
91
|
|
|
90
92
|
export class DataCubeSnapshot {
|
|
@@ -415,6 +415,7 @@ export async function validateAndBuildSnapshot(
|
|
|
415
415
|
funcMap.leafExtend,
|
|
416
416
|
Array.from(colsMap.values()),
|
|
417
417
|
engine,
|
|
418
|
+
source,
|
|
418
419
|
);
|
|
419
420
|
|
|
420
421
|
// validate
|
|
@@ -548,6 +549,7 @@ export async function validateAndBuildSnapshot(
|
|
|
548
549
|
funcMap.groupExtend,
|
|
549
550
|
Array.from(colsMap.values()),
|
|
550
551
|
engine,
|
|
552
|
+
source,
|
|
551
553
|
);
|
|
552
554
|
|
|
553
555
|
// validate
|
|
@@ -81,7 +81,10 @@ import {
|
|
|
81
81
|
_lambda,
|
|
82
82
|
_synthesizeMinimalSourceQuery,
|
|
83
83
|
} from './DataCubeQueryBuilderUtils.js';
|
|
84
|
-
import {
|
|
84
|
+
import {
|
|
85
|
+
INTERNAL__DataCubeSource,
|
|
86
|
+
type DataCubeSource,
|
|
87
|
+
} from './model/DataCubeSource.js';
|
|
85
88
|
import type { DataCubeQueryAggregateOperation } from './aggregation/DataCubeQueryAggregateOperation.js';
|
|
86
89
|
|
|
87
90
|
// --------------------------------- UTILITIES ---------------------------------
|
|
@@ -305,6 +308,7 @@ export async function _extractExtendedColumns(
|
|
|
305
308
|
funcs: V1_AppliedFunction[],
|
|
306
309
|
currentColumns: DataCubeColumn[],
|
|
307
310
|
engine: DataCubeEngine,
|
|
311
|
+
source?: DataCubeSource,
|
|
308
312
|
) {
|
|
309
313
|
const colSpecs = funcs.map((extendFunc) => {
|
|
310
314
|
// TODO: support extend() with window (OLAP), this assertion will no longer work
|
|
@@ -343,7 +347,7 @@ export async function _extractExtendedColumns(
|
|
|
343
347
|
columns = (
|
|
344
348
|
await engine.getQueryRelationReturnType(
|
|
345
349
|
_lambda([], [query]),
|
|
346
|
-
new INTERNAL__DataCubeSource(),
|
|
350
|
+
source ? source : new INTERNAL__DataCubeSource(),
|
|
347
351
|
)
|
|
348
352
|
).columns;
|
|
349
353
|
} catch (error) {
|