UNPKG

@finos/legend-data-cube

Version:
90 lines 5.26 kB
/** * Copyright (c) 2020-present, Goldman Sachs * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ /*************************************************************************************** * [GRID] * * These are utilities used to build the snapshot from the internal state of the grid * client, AG Grid. ***************************************************************************************/ import {} from '../../core/DataCubeSnapshot.js'; import { _toCol } from '../../core/model/DataCubeColumn.js'; import { DataCubeGridClientSortDirection, INTERNAL__GRID_CLIENT_ROOT_AGGREGATION_COLUMN_ID, INTERNAL__GRID_CLIENT_TREE_COLUMN_ID, } from './DataCubeGridClientEngine.js'; import { DataCubeQuerySortDirection, getPivotResultColumnBaseColumnName, isPivotResultColumnName, } from '../../core/DataCubeQueryEngine.js'; import { DataCubeConfiguration } from '../../core/model/DataCubeConfiguration.js'; import { guaranteeNonNullable, uniqBy } from '@finos/legend-shared'; import { _pruneExpandedPaths } from '../../core/DataCubeSnapshotBuilderUtils.js'; export function getColumnConfiguration(colName, configuration) { return guaranteeNonNullable(configuration.getColumn(colName), `Can't find configuration for column '${colName}'`); } // --------------------------------- MAIN --------------------------------- export function buildSnapshotFromGridState(request, baseSnapshot) { const snapshot = baseSnapshot.clone(); const configuration = DataCubeConfiguration.serialization.fromJson(snapshot.data.configuration); const rowGroupColumns = request.rowGroupColumns.filter((col) => col !== INTERNAL__GRID_CLIENT_ROOT_AGGREGATION_COLUMN_ID); // --------------------------------- SELECT --------------------------------- snapshot.data.selectColumns = uniqBy([ ...snapshot.data.selectColumns, ...request.pivotColumns.map((col) => getColumnConfiguration(col, configuration)), ...rowGroupColumns.map((col) => getColumnConfiguration(col, configuration)), ], (col) => col.name).map(_toCol); // --------------------------------- PIVOT --------------------------------- snapshot.data.pivot = request.pivotColumns.length ? { columns: request.pivotColumns.map((col) => _toCol(getColumnConfiguration(col, configuration))), // NOTE: since we re-fetch the cast columns anyway in this flow, we just // reuse the current cast columns castColumns: baseSnapshot.data.pivot?.castColumns ?? [], } : undefined; // --------------------------------- GROUP BY --------------------------------- snapshot.data.groupBy = rowGroupColumns.length ? { columns: rowGroupColumns.map((col) => _toCol(getColumnConfiguration(col, configuration))), } : undefined; // --------------------------------- SORT --------------------------------- snapshot.data.sortColumns = request.sortColumns // Make sure the tree column is not being sorted since it's a synthetic column // the sorting state of this special column is `synthesized` by ag-grid // so when all group by columns are sorted in the same direction, the tree group // column will be sorted in that direction, and vice versa, when user sorts // the tree column, all groupBy columns will be sorted in that direction .filter((item) => ![ INTERNAL__GRID_CLIENT_TREE_COLUMN_ID, INTERNAL__GRID_CLIENT_ROOT_AGGREGATION_COLUMN_ID, ].includes(item.name)) .map((item) => ({ name: item.name, type: getColumnConfiguration(isPivotResultColumnName(item.name) ? getPivotResultColumnBaseColumnName(item.name) : item.name, configuration).type, direction: item.direction === DataCubeGridClientSortDirection.ASCENDING ? DataCubeQuerySortDirection.ASCENDING : DataCubeQuerySortDirection.DESCENDING, })); // --------------------------------- CONFIGURATION --------------------------------- configuration.pivotLayout.expandedPaths = _pruneExpandedPaths(baseSnapshot.data.groupBy?.columns ?? [], snapshot.data.groupBy?.columns ?? [], configuration.pivotLayout.expandedPaths); // if root aggregation synthetic column has been removed // pdate the configuration to disable root aggregation if (!request.rowGroupColumns.includes(INTERNAL__GRID_CLIENT_ROOT_AGGREGATION_COLUMN_ID) && configuration.showRootAggregation) { configuration.showRootAggregation = false; } snapshot.data.configuration = configuration.serialize(); // --------------------------------- FINALIZE --------------------------------- return snapshot; } //# sourceMappingURL=DataCubeGridSnapshotBuilder.js.map