Skip to content

Commit 98ff523

Browse files
committed
[ML] Fix maximum default enabled columns for data grid. (#62005)
UI Performance could degrade to make a page unusable if a dataset had a very much number of columns to be displayed in data grid (e.g. filebeat based date with 1000+ fields). This PR fixes it by limiting the columns selected by default to a maximum number of 20. The fix gets applied to Transforms Source Table and Pivot Preview as well as the Analytics Outlier Results page.
1 parent 31f08ab commit 98ff523

File tree

6 files changed

+19
-9
lines changed

6 files changed

+19
-9
lines changed

x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_exploration/hooks/use_explore_data/use_explore_data.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ import {
2727
DataFrameAnalyticsConfig,
2828
EsFieldName,
2929
INDEX_STATUS,
30+
MAX_COLUMNS,
3031
defaultSearchQuery,
3132
} from '../../../../common';
3233
import { isKeywordAndTextType } from '../../../../common/fields';
@@ -198,7 +199,7 @@ export const useExploreData = (jobId: string): UseExploreDataReturnType => {
198199

199200
if (selectedFields.length === 0) {
200201
const newSelectedFields = getDefaultSelectableFields(docs, resultsField);
201-
setSelectedFields(newSelectedFields);
202+
setSelectedFields(newSelectedFields.sort().splice(0, MAX_COLUMNS));
202203
}
203204

204205
// Create a version of the doc's source with flattened field names.

x-pack/plugins/transform/public/app/common/data_grid.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@
66

77
import { EuiDataGridStyle } from '@elastic/eui';
88

9+
export const INIT_MAX_COLUMNS = 20;
10+
911
export const euiDataGridStyle: EuiDataGridStyle = {
1012
border: 'all',
1113
fontSize: 's',

x-pack/plugins/transform/public/app/common/index.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
*/
66

77
export { AggName, isAggName } from './aggregations';
8-
export { euiDataGridStyle, euiDataGridToolbarSettings } from './data_grid';
8+
export { euiDataGridStyle, euiDataGridToolbarSettings, INIT_MAX_COLUMNS } from './data_grid';
99
export {
1010
getDefaultSelectableFields,
1111
getFlattenedFields,

x-pack/plugins/transform/public/app/components/pivot_preview/pivot_preview.tsx

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ import {
3737
PivotGroupByConfig,
3838
PivotGroupByConfigDict,
3939
PivotQuery,
40+
INIT_MAX_COLUMNS,
4041
} from '../../common';
4142
import { SearchItems } from '../../hooks/use_search_items';
4243

@@ -131,12 +132,12 @@ export const PivotPreview: FC<PivotPreviewProps> = React.memo(
131132
columnKeys.sort(sortColumns(groupByArr));
132133

133134
// Column visibility
134-
const [visibleColumns, setVisibleColumns] = useState<EsFieldName[]>(columnKeys);
135+
const [visibleColumns, setVisibleColumns] = useState<EsFieldName[]>([]);
135136

136137
useEffect(() => {
137-
setVisibleColumns(columnKeys);
138+
setVisibleColumns(columnKeys.splice(0, INIT_MAX_COLUMNS));
138139
// eslint-disable-next-line react-hooks/exhaustive-deps
139-
}, [JSON.stringify(columnKeys)]);
140+
}, [columnKeys.join()]);
140141

141142
const [pagination, setPagination] = useState(defaultPagination);
142143

x-pack/plugins/transform/public/app/sections/create_transform/components/source_index_preview/source_index_preview.tsx

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
*/
66

77
import moment from 'moment-timezone';
8-
import React, { useCallback, useMemo, useState } from 'react';
8+
import React, { useCallback, useEffect, useMemo, useState } from 'react';
99

1010
import { i18n } from '@kbn/i18n';
1111

@@ -32,6 +32,7 @@ import {
3232
euiDataGridToolbarSettings,
3333
EsFieldName,
3434
PivotQuery,
35+
INIT_MAX_COLUMNS,
3536
} from '../../../../common';
3637
import { SearchItems } from '../../../../hooks/use_search_items';
3738
import { useToastNotifications } from '../../../../app_dependencies';
@@ -76,7 +77,12 @@ export const SourceIndexPreview: React.FC<Props> = React.memo(({ indexPattern, q
7677
});
7778

7879
// Column visibility
79-
const [visibleColumns, setVisibleColumns] = useState<EsFieldName[]>(indexPatternFields);
80+
const [visibleColumns, setVisibleColumns] = useState<EsFieldName[]>([]);
81+
82+
useEffect(() => {
83+
setVisibleColumns(indexPatternFields.splice(0, INIT_MAX_COLUMNS));
84+
// eslint-disable-next-line react-hooks/exhaustive-deps
85+
}, [indexPatternFields.join()]);
8086

8187
const {
8288
errorMessage,

x-pack/test/functional/apps/transform/creation_index_pattern.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,7 @@ export default function({ getService }: FtrProviderContext) {
8989
progress: '100',
9090
},
9191
sourcePreview: {
92-
columns: 45,
92+
columns: 20,
9393
rows: 5,
9494
},
9595
},
@@ -143,7 +143,7 @@ export default function({ getService }: FtrProviderContext) {
143143
progress: '100',
144144
},
145145
sourcePreview: {
146-
columns: 45,
146+
columns: 20,
147147
rows: 5,
148148
},
149149
},

0 commit comments

Comments
 (0)