1515 * limitations under the License.
1616 */
1717
18- import { DEFAULT_BUDGETS } from "../engine/perf" ;
18+ import {
19+ COLUMN_VIRTUALIZATION_THRESHOLD ,
20+ DEFAULT_BUDGETS ,
21+ FEATURE_FLAGS ,
22+ LEGACY_MAX_COLUMN_CARDINALITY ,
23+ } from "../engine/perf" ;
1924
2025export interface BudgetResult {
2126 needsVirtualization : boolean ;
27+ /** True when column count exceeds the threshold where horizontal windowing is recommended. */
28+ needsColumnVirtualization : boolean ;
2229 columnsTruncated : boolean ;
2330 truncatedColumnCount : number ;
2431 warnings : string [ ] ;
2532}
2633
34+ function exceedsCellBudget (
35+ rowCount : number ,
36+ colCount : number ,
37+ valueCount : number ,
38+ ) : boolean {
39+ return (
40+ rowCount * colCount * Math . max ( valueCount , 1 ) >
41+ DEFAULT_BUDGETS . maxVisibleCells
42+ ) ;
43+ }
44+
2745/**
2846 * Check whether the pivot dimensions exceed rendering budgets.
2947 * Returns whether virtualization is needed and any warning messages.
@@ -34,32 +52,83 @@ export function checkRenderBudget(
3452 valueCount : number ,
3553) : BudgetResult {
3654 const warnings : string [ ] = [ ] ;
37- let needsVirtualization = false ;
38- let columnsTruncated = false ;
39- let truncatedColumnCount = colCount ;
55+ const needsColumnVirtualization = colCount > COLUMN_VIRTUALIZATION_THRESHOLD ;
56+
57+ if ( ! FEATURE_FLAGS . wideColumnMode ) {
58+ let columnsTruncated = false ;
59+ let truncatedColumnCount = colCount ;
60+
61+ if ( colCount > LEGACY_MAX_COLUMN_CARDINALITY ) {
62+ columnsTruncated = true ;
63+ truncatedColumnCount = LEGACY_MAX_COLUMN_CARDINALITY ;
64+ warnings . push (
65+ `Column cardinality (${ colCount } ) exceeds limit (${ LEGACY_MAX_COLUMN_CARDINALITY } ). ` +
66+ `Showing first ${ LEGACY_MAX_COLUMN_CARDINALITY } columns.` ,
67+ ) ;
68+ }
4069
41- if ( colCount > DEFAULT_BUDGETS . maxColumnCardinality ) {
42- columnsTruncated = true ;
43- truncatedColumnCount = DEFAULT_BUDGETS . maxColumnCardinality ;
44- warnings . push (
45- `Column cardinality (${ colCount } ) exceeds limit (${ DEFAULT_BUDGETS . maxColumnCardinality } ). ` +
46- `Showing first ${ DEFAULT_BUDGETS . maxColumnCardinality } columns.` ,
70+ const needsVirtualization = exceedsCellBudget (
71+ rowCount ,
72+ truncatedColumnCount ,
73+ valueCount ,
4774 ) ;
75+
76+ if ( needsVirtualization ) {
77+ warnings . push (
78+ `Total cells (${ ( rowCount * truncatedColumnCount * Math . max ( valueCount , 1 ) ) . toLocaleString ( ) } ) exceeds DOM budget ` +
79+ `(${ DEFAULT_BUDGETS . maxVisibleCells . toLocaleString ( ) } ). Virtualization enabled.` ,
80+ ) ;
81+ }
82+
83+ return {
84+ needsVirtualization,
85+ needsColumnVirtualization,
86+ columnsTruncated,
87+ truncatedColumnCount,
88+ warnings,
89+ } ;
4890 }
4991
50- const effectiveCells =
51- rowCount * truncatedColumnCount * Math . max ( valueCount , 1 ) ;
92+ const maxColCap = DEFAULT_BUDGETS . maxColumnCardinality ;
93+ const colsAfterHardCap = Math . min ( colCount , maxColCap ) ;
94+ const exceedsHardCap = colCount > maxColCap ;
5295
53- if ( effectiveCells > DEFAULT_BUDGETS . maxVisibleCells ) {
54- needsVirtualization = true ;
55- warnings . push (
56- `Total cells (${ effectiveCells . toLocaleString ( ) } ) exceeds DOM budget ` +
57- `(${ DEFAULT_BUDGETS . maxVisibleCells . toLocaleString ( ) } ). Virtualization enabled.` ,
58- ) ;
96+ const needsVirtualizationFromCells = exceedsCellBudget (
97+ rowCount ,
98+ colsAfterHardCap ,
99+ valueCount ,
100+ ) ;
101+ const needsVirtualization =
102+ needsVirtualizationFromCells || needsColumnVirtualization ;
103+
104+ let columnsTruncated = false ;
105+ let truncatedColumnCount = colCount ;
106+
107+ if ( needsVirtualization ) {
108+ truncatedColumnCount = colsAfterHardCap ;
109+ columnsTruncated = exceedsHardCap ;
110+
111+ if ( exceedsHardCap ) {
112+ warnings . push (
113+ `Column cardinality (${ colCount } ) exceeds limit (${ maxColCap } ). ` +
114+ `Showing first ${ maxColCap } columns.` ,
115+ ) ;
116+ }
117+
118+ if ( needsVirtualizationFromCells ) {
119+ warnings . push (
120+ `Total cells (${ ( rowCount * colsAfterHardCap * Math . max ( valueCount , 1 ) ) . toLocaleString ( ) } ) exceeds DOM budget ` +
121+ `(${ DEFAULT_BUDGETS . maxVisibleCells . toLocaleString ( ) } ). Virtualization enabled.` ,
122+ ) ;
123+ }
124+ } else {
125+ truncatedColumnCount = colCount ;
126+ columnsTruncated = false ;
59127 }
60128
61129 return {
62130 needsVirtualization,
131+ needsColumnVirtualization,
63132 columnsTruncated,
64133 truncatedColumnCount,
65134 warnings,
0 commit comments