Skip to content

Commit 3f4fde5

Browse files
committed
⚡ Migrate to Set from array to speed up dnd lookups
1 parent 881e95e commit 3f4fde5

4 files changed

Lines changed: 28 additions & 30 deletions

File tree

x-pack/plugins/lens/public/indexpattern_datasource/dimension_panel/dimension_editor.tsx

Lines changed: 9 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -103,9 +103,7 @@ export function DimensionEditor(props: DimensionEditorProps) {
103103
return op1.displayName.localeCompare(op2.displayName);
104104
})
105105
.map((def) => def.type)
106-
.filter(
107-
(type) => fieldByOperation[type]?.length || operationWithoutField.indexOf(type) !== -1
108-
);
106+
.filter((type) => fieldByOperation[type]?.size || operationWithoutField.has(type));
109107
}, [fieldByOperation, operationWithoutField]);
110108

111109
// Operations are compatible if they match inputs. They are always compatible in
@@ -120,7 +118,7 @@ export function DimensionEditor(props: DimensionEditorProps) {
120118
(selectedColumn &&
121119
hasField(selectedColumn) &&
122120
definition.input === 'field' &&
123-
fieldByOperation[operationType]?.indexOf(selectedColumn.sourceField) !== -1) ||
121+
fieldByOperation[operationType]?.has(selectedColumn.sourceField)) ||
124122
(selectedColumn && !hasField(selectedColumn) && definition.input !== 'field'),
125123
};
126124
});
@@ -190,9 +188,9 @@ export function DimensionEditor(props: DimensionEditorProps) {
190188
trackUiEvent(`indexpattern_dimension_operation_${operationType}`);
191189
return;
192190
} else if (!selectedColumn || !compatibleWithCurrentField) {
193-
const possibleFields = fieldByOperation[operationType] || [];
191+
const possibleFields = fieldByOperation[operationType] || new Set();
194192

195-
if (possibleFields.length === 1) {
193+
if (possibleFields.size === 1) {
196194
setState(
197195
changeColumn({
198196
state,
@@ -204,7 +202,7 @@ export function DimensionEditor(props: DimensionEditorProps) {
204202
layerId: props.layerId,
205203
op: operationType,
206204
indexPattern: currentIndexPattern,
207-
field: currentIndexPattern.getFieldByName(possibleFields[0]),
205+
field: currentIndexPattern.getFieldByName(possibleFields.values().next().value),
208206
previousColumn: selectedColumn,
209207
}),
210208
})
@@ -325,14 +323,14 @@ export function DimensionEditor(props: DimensionEditorProps) {
325323
// Otherwise we'll use the buildColumn method to calculate a new column
326324
const compatibleOperations =
327325
('field' in choice && operationSupportMatrix.operationByField[choice.field]) ||
328-
[];
326+
new Set();
329327
let operation;
330-
if (compatibleOperations.length > 0) {
328+
if (compatibleOperations.size > 0) {
331329
operation =
332330
incompatibleSelectedOperationType &&
333-
compatibleOperations.includes(incompatibleSelectedOperationType)
331+
compatibleOperations.has(incompatibleSelectedOperationType)
334332
? incompatibleSelectedOperationType
335-
: compatibleOperations[0];
333+
: compatibleOperations.values().next().value;
336334
} else if ('field' in choice) {
337335
operation = choice.operationType;
338336
}

x-pack/plugins/lens/public/indexpattern_datasource/dimension_panel/droppable.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -137,9 +137,9 @@ export function onDrop(props: DatasourceDimensionDropHandlerProps<IndexPatternPr
137137
hasField(selectedColumn) &&
138138
selectedColumn.sourceField !== droppedItem.field.name &&
139139
operationsForNewField &&
140-
operationsForNewField.includes(selectedColumn.operationType);
140+
operationsForNewField.has(selectedColumn.operationType);
141141

142-
if (!operationsForNewField || operationsForNewField.length === 0) {
142+
if (!operationsForNewField || operationsForNewField.size === 0) {
143143
return false;
144144
}
145145

@@ -148,7 +148,7 @@ export function onDrop(props: DatasourceDimensionDropHandlerProps<IndexPatternPr
148148
const newColumn = hasFieldChanged
149149
? changeField(selectedColumn, currentIndexPattern, droppedItem.field)
150150
: buildColumn({
151-
op: operationsForNewField[0],
151+
op: operationsForNewField.values().next().value,
152152
columns: state.layers[layerId].columns,
153153
indexPattern: currentIndexPattern,
154154
layerId,

x-pack/plugins/lens/public/indexpattern_datasource/dimension_panel/field_select.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -61,11 +61,11 @@ export function FieldSelect({
6161

6262
function isCompatibleWithCurrentOperation(fieldName: string) {
6363
if (incompatibleSelectedOperationType) {
64-
return operationByField[fieldName]!.includes(incompatibleSelectedOperationType);
64+
return operationByField[fieldName]!.has(incompatibleSelectedOperationType);
6565
}
6666
return (
6767
!selectedColumnOperationType ||
68-
operationByField[fieldName]!.includes(selectedColumnOperationType)
68+
operationByField[fieldName]!.has(selectedColumnOperationType)
6969
);
7070
}
7171

x-pack/plugins/lens/public/indexpattern_datasource/dimension_panel/operation_support.ts

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,9 @@ import { getAvailableOperationsByMetadata } from '../operations';
1111
import { IndexPatternPrivateState } from '../types';
1212

1313
export interface OperationSupportMatrix {
14-
operationByField: Partial<Record<string, OperationType[]>>;
15-
operationWithoutField: OperationType[];
16-
fieldByOperation: Partial<Record<OperationType, string[]>>;
14+
operationByField: Partial<Record<string, Set<OperationType>>>;
15+
operationWithoutField: Set<OperationType>;
16+
fieldByOperation: Partial<Record<OperationType, Set<string>>>;
1717
}
1818

1919
type Props = Pick<
@@ -31,30 +31,30 @@ export const getOperationSupportMatrix = (props: Props): OperationSupportMatrix
3131
currentIndexPattern
3232
).filter((operation) => props.filterOperations(operation.operationMetaData));
3333

34-
const supportedOperationsByField: Partial<Record<string, OperationType[]>> = {};
35-
const supportedOperationsWithoutField: OperationType[] = [];
36-
const supportedFieldsByOperation: Partial<Record<OperationType, string[]>> = {};
34+
const supportedOperationsByField: Partial<Record<string, Set<OperationType>>> = {};
35+
const supportedOperationsWithoutField: Set<OperationType> = new Set();
36+
const supportedFieldsByOperation: Partial<Record<OperationType, Set<string>>> = {};
3737

3838
filteredOperationsByMetadata.forEach(({ operations }) => {
3939
operations.forEach((operation) => {
4040
if (operation.type === 'field') {
4141
if (!supportedOperationsByField[operation.field]) {
42-
supportedOperationsByField[operation.field] = [];
42+
supportedOperationsByField[operation.field] = new Set();
4343
}
44-
supportedOperationsByField[operation.field]?.push(operation.operationType);
44+
supportedOperationsByField[operation.field]?.add(operation.operationType);
4545

4646
if (!supportedFieldsByOperation[operation.operationType]) {
47-
supportedFieldsByOperation[operation.operationType] = [];
47+
supportedFieldsByOperation[operation.operationType] = new Set();
4848
}
49-
supportedFieldsByOperation[operation.operationType]?.push(operation.field);
49+
supportedFieldsByOperation[operation.operationType]?.add(operation.field);
5050
} else if (operation.type === 'none') {
51-
supportedOperationsWithoutField.push(operation.operationType);
51+
supportedOperationsWithoutField.add(operation.operationType);
5252
}
5353
});
5454
});
5555
return {
56-
operationByField: _.mapValues(supportedOperationsByField, _.uniq),
57-
operationWithoutField: _.uniq(supportedOperationsWithoutField),
58-
fieldByOperation: _.mapValues(supportedFieldsByOperation, _.uniq),
56+
operationByField: supportedOperationsByField,
57+
operationWithoutField: supportedOperationsWithoutField,
58+
fieldByOperation: supportedFieldsByOperation,
5959
};
6060
};

0 commit comments

Comments
 (0)