Skip to content

Commit 41c35c5

Browse files
committed
build column lookup map on each _processItems to avoid higher complexity
1 parent b9d3751 commit 41c35c5

1 file changed

Lines changed: 82 additions & 16 deletions

File tree

  • packages/devextreme/js/__internal/grids/data_grid/summary

packages/devextreme/js/__internal/grids/data_grid/summary/m_summary.ts

Lines changed: 82 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ import type DataSourceAdapter from '@ts/grids/grid_core/data_source_adapter/m_da
1818
import type { EditingControllerRequired, ModuleType } from '@ts/grids/grid_core/m_types';
1919
import { ColumnsView } from '@ts/grids/grid_core/views/m_columns_view';
2020

21+
import type { Column } from '../../grid_core/columns_controller/types';
2122
import type { EditingController } from '../../grid_core/editing/m_editing';
2223
import type { RowsView } from '../../grid_core/views/m_rows_view';
2324
import AggregateCalculator from '../m_aggregate_calculator';
@@ -471,9 +472,9 @@ const data = (Base: ModuleType<DataController>) => class SummaryDataControllerEx
471472
private _processGroupItem(groupItem, options) {
472473
const that = this;
473474

474-
if (!options.summaryGroupItems) {
475-
options.summaryGroupItems = that.option('summary.groupItems') || [];
476-
}
475+
options.summaryGroupItems ??= that.option('summary.groupItems') || [];
476+
options.summaryColumnMap ??= this._buildColumnLookupMap();
477+
477478
if (groupItem.rowType === 'group') {
478479
let groupColumnIndex = -1;
479480
let afterGroupColumnIndex = -1;
@@ -490,32 +491,97 @@ const data = (Base: ModuleType<DataController>) => class SummaryDataControllerEx
490491
}
491492
});
492493

493-
groupItem.summaryCells = this._calculateSummaryCells(options.summaryGroupItems, getGroupAggregates(groupItem.data), options.visibleColumns, (summaryItem, column) => {
494-
if (summaryItem.showInGroupFooter) {
495-
return -1;
496-
}
494+
groupItem.summaryCells = this._calculateSummaryCells(
495+
options.summaryGroupItems,
496+
getGroupAggregates(groupItem.data),
497+
options.visibleColumns,
498+
(summaryItem, column) => {
499+
if (summaryItem.showInGroupFooter) {
500+
return -1;
501+
}
497502

498-
if (summaryItem.alignByColumn && column && !isDefined(column.groupIndex) && (column.index !== afterGroupColumnIndex)) {
499-
return column.index;
500-
}
501-
return groupColumnIndex;
502-
}, true);
503+
if (summaryItem.alignByColumn
504+
&& column
505+
&& !isDefined(column.groupIndex)
506+
&& (column.index !== afterGroupColumnIndex)
507+
) {
508+
return column.index;
509+
}
510+
511+
return groupColumnIndex;
512+
},
513+
true,
514+
options.summaryColumnMap,
515+
);
503516
}
517+
504518
if (groupItem.rowType === DATAGRID_GROUP_FOOTER_ROW_TYPE) {
505-
groupItem.summaryCells = this._calculateSummaryCells(options.summaryGroupItems, getGroupAggregates(groupItem.data), options.visibleColumns, (summaryItem, column) => (summaryItem.showInGroupFooter && that._isDataColumn(column) ? column.index : -1));
519+
groupItem.summaryCells = this._calculateSummaryCells(
520+
options.summaryGroupItems,
521+
getGroupAggregates(groupItem.data),
522+
options.visibleColumns,
523+
(summaryItem, column) => (
524+
summaryItem.showInGroupFooter && that._isDataColumn(column) ? column.index : -1
525+
),
526+
false,
527+
options.summaryColumnMap,
528+
);
506529
}
507530

508531
return groupItem;
509532
}
510533

511-
private _calculateSummaryCells(summaryItems, aggregates, visibleColumns, calculateTargetColumnIndex, isGroupRow?) {
534+
// The map is built once per _processItems cycle (via options) and discarded after.
535+
private _buildColumnLookupMap(): Map<string | number, Column> {
536+
const columnMap = new Map<string | number, Column>();
537+
const { _columnsController: ctrl } = this;
538+
const allColumns = ctrl.getColumns()
539+
.concat(ctrl._commandColumns ?? []);
540+
541+
for (const column of allColumns) {
542+
const copy = extend({}, column) as Column;
543+
const keys = [
544+
column.index, column.name,
545+
column.dataField, column.caption,
546+
];
547+
for (const key of keys) {
548+
if (key !== undefined && !columnMap.has(key)) {
549+
columnMap.set(key, copy);
550+
}
551+
}
552+
}
553+
554+
return columnMap;
555+
}
556+
557+
private static _getColumnFromMap(
558+
identifier: string | number | undefined,
559+
columnMap: Map<string | number, Column>,
560+
): Column | undefined {
561+
return identifier !== undefined ? columnMap.get(identifier) : undefined;
562+
}
563+
564+
private _calculateSummaryCells(
565+
summaryItems,
566+
aggregates,
567+
visibleColumns,
568+
calculateTargetColumnIndex,
569+
isGroupRow?,
570+
columnMap?: Map<string | number, Column>,
571+
) {
512572
const that = this;
513573
const summaryCells: any = [];
514574
const summaryCellsByColumns = {};
515575

516576
each(summaryItems, (summaryIndex, summaryItem) => {
517-
const column = that._columnsController.columnOption(summaryItem.column);
518-
const showInColumn = summaryItem.showInColumn && that._columnsController.columnOption(summaryItem.showInColumn) || column;
577+
const column = columnMap
578+
? SummaryDataControllerExtender._getColumnFromMap(summaryItem.column, columnMap)
579+
: that._columnsController.columnOption(summaryItem.column);
580+
const showInColumn = (summaryItem.showInColumn
581+
&& (columnMap
582+
? SummaryDataControllerExtender._getColumnFromMap(summaryItem.showInColumn, columnMap)
583+
: that._columnsController.columnOption(summaryItem.showInColumn)))
584+
|| column;
519585
const columnIndex = calculateTargetColumnIndex(summaryItem, showInColumn);
520586

521587
if (columnIndex >= 0) {

0 commit comments

Comments
 (0)