diff --git a/x-pack/plugins/lens/public/indexpattern_datasource/operations/definitions/cardinality.tsx b/x-pack/plugins/lens/public/indexpattern_datasource/operations/definitions/cardinality.tsx index 36ca0aed31a9a1..95672d82e8561e 100644 --- a/x-pack/plugins/lens/public/indexpattern_datasource/operations/definitions/cardinality.tsx +++ b/x-pack/plugins/lens/public/indexpattern_datasource/operations/definitions/cardinality.tsx @@ -51,7 +51,7 @@ export const cardinalityOperation: OperationDefinition = { }, buildColumn({ suggestedPriority, field, previousColumn }) { let params; - if (previousColumn?.dataType === 'number' && 'params' in previousColumn) { + if (previousColumn?.dataType === 'number' && previousColumn.operationType === 'count') { params = previousColumn.params; } return { diff --git a/x-pack/plugins/lens/public/indexpattern_datasource/operations/definitions/filters/filters.tsx b/x-pack/plugins/lens/public/indexpattern_datasource/operations/definitions/filters/filters.tsx index a0635d36846cb5..ef5cf19a11c5d1 100644 --- a/x-pack/plugins/lens/public/indexpattern_datasource/operations/definitions/filters/filters.tsx +++ b/x-pack/plugins/lens/public/indexpattern_datasource/operations/definitions/filters/filters.tsx @@ -125,11 +125,7 @@ export const filtersOperation: OperationDefinition = }, ], }; - } else if ( - previousColumn?.operationType === 'filters' && - 'params' in previousColumn && - previousColumn.params?.filters - ) { + } else if (previousColumn?.operationType === 'filters' && previousColumn.params?.filters) { params = previousColumn.params; } diff --git a/x-pack/plugins/lens/public/indexpattern_datasource/operations/definitions/index.ts b/x-pack/plugins/lens/public/indexpattern_datasource/operations/definitions/index.ts index f41c150c4447a2..3dd8b659fe0a5e 100644 --- a/x-pack/plugins/lens/public/indexpattern_datasource/operations/definitions/index.ts +++ b/x-pack/plugins/lens/public/indexpattern_datasource/operations/definitions/index.ts @@ -6,12 +6,21 @@ import { IUiSettingsClient, SavedObjectsClientContract, HttpSetup } from 'kibana/public'; import { IStorageWrapper } from 'src/plugins/kibana_utils/public'; -import { termsOperation } from './terms'; -import { filtersOperation } from './filters'; -import { cardinalityOperation } from './cardinality'; -import { minOperation, averageOperation, sumOperation, maxOperation } from './metrics'; -import { dateHistogramOperation } from './date_histogram'; -import { countOperation } from './count'; +import { termsOperation, TermsIndexPatternColumn } from './terms'; +import { filtersOperation, FiltersIndexPatternColumn } from './filters'; +import { cardinalityOperation, CardinalityIndexPatternColumn } from './cardinality'; +import { + minOperation, + MinIndexPatternColumn, + averageOperation, + AvgIndexPatternColumn, + sumOperation, + SumIndexPatternColumn, + maxOperation, + MaxIndexPatternColumn, +} from './metrics'; +import { dateHistogramOperation, DateHistogramIndexPatternColumn } from './date_histogram'; +import { countOperation, CountIndexPatternColumn } from './count'; import { DimensionPriority, StateSetter, OperationMetadata } from '../../../types'; import { BaseIndexPatternColumn } from './column_types'; import { IndexPatternPrivateState, IndexPattern, IndexPatternField } from '../../types'; @@ -19,8 +28,8 @@ import { DateRange } from '../../../../common'; import { DataPublicPluginStart } from '../../../../../../../src/plugins/data/public'; // List of all operation definitions registered to this data source. -// If you want to implement a new operation, add it to this array and -// its type will get propagated to everything else +// If you want to implement a new operation, add the definition to this array and +// the column type to the `IndexPatternColumn` union type below. const internalOperationDefinitions = [ filtersOperation, termsOperation, @@ -33,6 +42,22 @@ const internalOperationDefinitions = [ countOperation, ]; +/** + * A union type of all available column types. If a column is of an unknown type somewhere + * withing the indexpattern data source it should be typed as `IndexPatternColumn` to make + * typeguards possible that consider all available column types. + */ +export type IndexPatternColumn = + | FiltersIndexPatternColumn + | TermsIndexPatternColumn + | DateHistogramIndexPatternColumn + | MinIndexPatternColumn + | MaxIndexPatternColumn + | AvgIndexPatternColumn + | CardinalityIndexPatternColumn + | SumIndexPatternColumn + | CountIndexPatternColumn; + export { termsOperation } from './terms'; export { filtersOperation } from './filters'; export { dateHistogramOperation } from './date_histogram'; @@ -109,7 +134,12 @@ interface BaseBuildColumnArgs { indexPattern: IndexPattern; } -interface FieldBasedOperationDefinition +/** + * Shape of an operation definition. If the type parameter of the definition + * indicates a field based column, `getPossibleOperationForField` has to be + * specified, otherwise `getPossibleOperationForDocument` has to be defined. + */ +export interface OperationDefinition extends BaseOperationDefinitionProps { /** * Returns the meta data of the operation if applied to the given field. Undefined @@ -122,7 +152,7 @@ interface FieldBasedOperationDefinition buildColumn: ( arg: BaseBuildColumnArgs & { field: IndexPatternField; - previousColumn?: C | BaseIndexPatternColumn; + previousColumn?: IndexPatternColumn; } ) => C; /** @@ -144,29 +174,6 @@ interface FieldBasedOperationDefinition onFieldChange: (oldColumn: C, indexPattern: IndexPattern, field: IndexPatternField) => C; } -/** - * Shape of an operation definition. If the type parameter of the definition - * indicates a field based column, `getPossibleOperationForField` has to be - * specified, otherwise `getPossibleOperationForDocument` has to be defined. - */ -export type OperationDefinition = FieldBasedOperationDefinition< - C ->; - -// Helper to to infer the column type out of the operation definition. -// This is done to avoid it to have to list out the column types along with -// the operation definition types -type ColumnFromOperationDefinition = D extends OperationDefinition ? C : never; - -/** - * A union type of all available column types. If a column is of an unknown type somewhere - * withing the indexpattern data source it should be typed as `IndexPatternColumn` to make - * typeguards possible that consider all available column types. - */ -export type IndexPatternColumn = ColumnFromOperationDefinition< - typeof internalOperationDefinitions[number] ->; - /** * A union type of all available operation types. The operation type is a unique id of an operation. * Each column is assigned to exactly one operation type. @@ -177,7 +184,7 @@ export type OperationType = typeof internalOperationDefinitions[number]['type']; * This is an operation definition of an unspecified column out of all possible * column types. */ -export type GenericOperationDefinition = FieldBasedOperationDefinition; +export type GenericOperationDefinition = OperationDefinition; /** * List of all available operation definitions diff --git a/x-pack/plugins/lens/public/indexpattern_datasource/operations/definitions/metrics.tsx b/x-pack/plugins/lens/public/indexpattern_datasource/operations/definitions/metrics.tsx index b723e4c9182d93..e1f9ed2f87855c 100644 --- a/x-pack/plugins/lens/public/indexpattern_datasource/operations/definitions/metrics.tsx +++ b/x-pack/plugins/lens/public/indexpattern_datasource/operations/definitions/metrics.tsx @@ -52,7 +52,7 @@ function buildMetricOperation>({ }, buildColumn: ({ suggestedPriority, field, previousColumn }) => { let params; - if (previousColumn?.dataType === 'number' && 'params' in previousColumn) { + if (previousColumn?.dataType === 'number' && previousColumn.operationType === type) { params = previousColumn.params; } return {