Skip to content

Commit

Permalink
Fix types
Browse files Browse the repository at this point in the history
  • Loading branch information
wylieconlon committed Sep 23, 2020
1 parent 2f438b5 commit 90f26d4
Show file tree
Hide file tree
Showing 8 changed files with 58 additions and 68 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -43,8 +43,7 @@ export const cardinalityOperation: OperationDefinition<CardinalityIndexPatternCo
}
},
isTransferable: (column, newIndexPattern) => {
const c = column as CardinalityIndexPatternColumn;
const newField = newIndexPattern.fields.find((field) => field.name === c.sourceField);
const newField = newIndexPattern.fields.find((field) => field.name === column.sourceField);

return Boolean(
newField &&
Expand Down Expand Up @@ -76,13 +75,13 @@ export const cardinalityOperation: OperationDefinition<CardinalityIndexPatternCo
type: OPERATION_TYPE,
schema: 'metric',
params: {
field: (column as CardinalityIndexPatternColumn).sourceField,
field: column.sourceField,
missing: 0,
},
}),
onFieldChange: (oldColumn, indexPattern, field) => {
return {
...(oldColumn as CardinalityIndexPatternColumn),
...oldColumn,
label: ofName(field.displayName),
sourceField: field.name,
};
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ export const countOperation: OperationDefinition<CountIndexPatternColumn, 'field
input: 'field',
onFieldChange: (oldColumn, indexPattern, field) => {
return {
...(oldColumn as CountIndexPatternColumn),
...oldColumn,
label: field.displayName,
sourceField: field.name,
};
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -81,8 +81,7 @@ export const dateHistogramOperation: OperationDefinition<
};
},
isTransferable: (column, newIndexPattern) => {
const c = column as DateHistogramIndexPatternColumn;
const newField = newIndexPattern.fields.find((field) => field.name === c.sourceField);
const newField = newIndexPattern.fields.find((field) => field.name === column.sourceField);

return Boolean(
newField &&
Expand All @@ -92,8 +91,7 @@ export const dateHistogramOperation: OperationDefinition<
);
},
transfer: (column, newIndexPattern) => {
const col = column as DateHistogramIndexPatternColumn;
const newField = newIndexPattern.fields.find((field) => field.name === col.sourceField);
const newField = newIndexPattern.fields.find((field) => field.name === column.sourceField);
if (
newField &&
newField.aggregationRestrictions &&
Expand All @@ -102,9 +100,9 @@ export const dateHistogramOperation: OperationDefinition<
const restrictions = newField.aggregationRestrictions.date_histogram;

return {
...col,
...column,
params: {
...col.params,
...column.params,
timeZone: restrictions.time_zone,
// TODO this rewrite logic is simplified - if the current interval is a multiple of
// the restricted interval, we could carry it over directly. However as the current
Expand All @@ -115,45 +113,43 @@ export const dateHistogramOperation: OperationDefinition<
};
}

return col;
return column;
},
onFieldChange: (oldColumn, indexPattern, field) => {
return {
...(oldColumn as DateHistogramIndexPatternColumn),
...oldColumn,
label: field.displayName,
sourceField: field.name,
};
},
toEsAggsConfig: (column, columnId, indexPattern) => {
const c = column as DateHistogramIndexPatternColumn;
const usedField = indexPattern.fields.find((field) => field.name === c.sourceField);
const usedField = indexPattern.fields.find((field) => field.name === column.sourceField);
return {
id: columnId,
enabled: true,
type: 'date_histogram',
schema: 'segment',
params: {
field: c.sourceField,
time_zone: c.params.timeZone,
field: column.sourceField,
time_zone: column.params.timeZone,
useNormalizedEsInterval: !usedField || !usedField.aggregationRestrictions?.date_histogram,
interval: c.params.interval,
interval: column.params.interval,
drop_partials: false,
min_doc_count: 0,
extended_bounds: {},
},
};
},
paramEditor: ({ state, setState, currentColumn, layerId, dateRange, data }) => {
const column = currentColumn as DateHistogramIndexPatternColumn;
const field =
column &&
currentColumn &&
state.indexPatterns[state.layers[layerId].indexPatternId].fields.find(
(currentField) => currentField.name === column.sourceField
(currentField) => currentField.name === currentColumn.sourceField
);
const intervalIsRestricted =
field!.aggregationRestrictions && field!.aggregationRestrictions.date_histogram;

const interval = parseInterval(column.params.interval);
const interval = parseInterval(currentColumn.params.interval);

// We force the interval value to 1 if it's empty, since that is the ES behavior,
// and the isValidInterval function doesn't handle the empty case properly. Fixing
Expand Down Expand Up @@ -194,13 +190,13 @@ export const dateHistogramOperation: OperationDefinition<
label={i18n.translate('xpack.lens.indexPattern.dateHistogram.autoInterval', {
defaultMessage: 'Customize time interval',
})}
checked={column.params.interval !== autoInterval}
checked={currentColumn.params.interval !== autoInterval}
onChange={onChangeAutoInterval}
compressed
/>
</EuiFormRow>
)}
{column.params.interval !== autoInterval && (
{currentColumn.params.interval !== autoInterval && (
<EuiFormRow
label={i18n.translate('xpack.lens.indexPattern.dateHistogram.minimumInterval', {
defaultMessage: 'Minimum interval',
Expand All @@ -213,7 +209,7 @@ export const dateHistogramOperation: OperationDefinition<
id="xpack.lens.indexPattern.dateHistogram.restrictedInterval"
defaultMessage="Interval fixed to {intervalValue} due to aggregation restrictions."
values={{
intervalValue: column.params.interval,
intervalValue: currentColumn.params.interval,
}}
/>
) : (
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -112,7 +112,7 @@ export const filtersOperation: OperationDefinition<FiltersIndexPatternColumn, 'n
},

toEsAggsConfig: (column, columnId, indexPattern) => {
const validFilters = (column as FiltersIndexPatternColumn).params.filters?.filter((f: Filter) =>
const validFilters = column.params.filters?.filter((f: Filter) =>
isQueryValid(f.input, indexPattern)
);
return {
Expand All @@ -128,7 +128,7 @@ export const filtersOperation: OperationDefinition<FiltersIndexPatternColumn, 'n

paramEditor: ({ state, setState, currentColumn, layerId, data }) => {
const indexPattern = state.indexPatterns[state.layers[layerId].indexPatternId];
const filters = (currentColumn as FiltersIndexPatternColumn).params.filters;
const filters = currentColumn.params.filters;

const setFilters = (newFilters: Filter[]) =>
setState(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -73,8 +73,8 @@ export { countOperation } from './count';
/**
* Properties passed to the operation-specific part of the popover editor
*/
export interface ParamEditorProps {
currentColumn: IndexPatternColumn;
export interface ParamEditorProps<C> {
currentColumn: C;
state: IndexPatternPrivateState;
setState: StateSetter<IndexPatternPrivateState>;
columnId: string;
Expand Down Expand Up @@ -107,34 +107,30 @@ interface BaseOperationDefinitionProps<C extends BaseIndexPatternColumn> {
* return an updated column. If not implemented, the `id` function is used instead.
*/
onOtherColumnChanged?: (
currentColumn: IndexPatternColumn,
currentColumn: C,
columns: Partial<Record<string, IndexPatternColumn>>
) => C;
/**
* React component for operation specific settings shown in the popover editor
*/
paramEditor?: React.ComponentType<ParamEditorProps>;
paramEditor?: React.ComponentType<ParamEditorProps<C>>;
/**
* Function turning a column into an agg config passed to the `esaggs` function
* together with the agg configs returned from other columns.
*/
toEsAggsConfig: (
column: IndexPatternColumn,
columnId: string,
indexPattern: IndexPattern
) => unknown;
toEsAggsConfig: (column: C, columnId: string, indexPattern: IndexPattern) => unknown;
/**
* Returns true if the `column` can also be used on `newIndexPattern`.
* If this function returns false, the column is removed when switching index pattern
* for a layer
*/
isTransferable: (column: IndexPatternColumn, newIndexPattern: IndexPattern) => boolean;
isTransferable: (column: C, newIndexPattern: IndexPattern) => boolean;
/**
* Transfering a column to another index pattern. This can be used to
* adjust operation specific settings such as reacting to aggregation restrictions
* present on the new index pattern.
*/
transfer?: (column: IndexPatternColumn, newIndexPattern: IndexPattern) => C;
transfer?: (column: C, newIndexPattern: IndexPattern) => C;
}

interface BaseBuildColumnArgs {
Expand Down Expand Up @@ -174,7 +170,8 @@ interface FieldBasedOperationDefinition<C extends BaseIndexPatternColumn> {
buildColumn: (
arg: BaseBuildColumnArgs & {
field: IndexPatternField;
previousColumn?: IndexPatternColumn;
// previousColumn?: IndexPatternColumn;
previousColumn?: C;
}
) => C;
/**
Expand All @@ -194,7 +191,8 @@ interface FieldBasedOperationDefinition<C extends BaseIndexPatternColumn> {
* @param field The field that the user changed to.
*/
onFieldChange: (
oldColumn: FieldBasedIndexPatternColumn,
// oldColumn: FieldBasedIndexPatternColumn,
oldColumn: C,
indexPattern: IndexPattern,
field: IndexPatternField
) => C;
Expand Down Expand Up @@ -229,10 +227,6 @@ export type GenericOperationDefinition =
| OperationDefinition<IndexPatternColumn, 'field'>
| OperationDefinition<IndexPatternColumn, 'none'>;

export type OperationTypeFromDefinition<
GenericOperationDefinition
> = GenericOperationDefinition extends BaseOperationDefinitionProps<infer P> ? P : never;

/**
* List of all available operation definitions
*/
Expand All @@ -249,7 +243,11 @@ export const operationDefinitions = internalOperationDefinitions as GenericOpera
* (e.g. `import { termsOperation } from './operations/definitions'`). This map is
* intended to be used in situations where the operation type is not known during compile time.
*/
export const operationDefinitionMap = internalOperationDefinitions.reduce(
export const operationDefinitionMap: Record<
string,
GenericOperationDefinition
> = internalOperationDefinitions.reduce(
(definitionMap, definition) => ({ ...definitionMap, [definition.type]: definition }),
{} as Record<OperationType, typeof internalOperationDefinitions[number]>
// {} as Record<OperationType, typeof internalOperationDefinitions[number]>
{}
);
Original file line number Diff line number Diff line change
Expand Up @@ -43,8 +43,7 @@ function buildMetricOperation<T extends MetricColumn<string>>({
}
},
isTransferable: (column, newIndexPattern) => {
const c = column as T;
const newField = newIndexPattern.fields.find((field) => field.name === c.sourceField);
const newField = newIndexPattern.fields.find((field) => field.name === column.sourceField);

return Boolean(
newField &&
Expand Down Expand Up @@ -77,7 +76,7 @@ function buildMetricOperation<T extends MetricColumn<string>>({
type: column.operationType,
schema: 'metric',
params: {
field: (column as T).sourceField,
field: column.sourceField,
missing: 0,
},
}),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -76,12 +76,13 @@ function getEsAggsParams({ sourceField, params }: RangeIndexPatternColumn) {
};
}

export const rangeOperation: OperationDefinition<RangeIndexPatternColumn> = {
export const rangeOperation: OperationDefinition<RangeIndexPatternColumn, 'field'> = {
type: 'range',
displayName: i18n.translate('xpack.lens.indexPattern.ranges', {
defaultMessage: 'Ranges',
}),
priority: 4, // Higher than terms, so numbers get histogram
input: 'field',
getPossibleOperationForField: ({ aggregationRestrictions, aggregatable, type }) => {
if (
type === 'number' &&
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -65,8 +65,7 @@ export const termsOperation: OperationDefinition<TermsIndexPatternColumn, 'field
}
},
isTransferable: (column, newIndexPattern) => {
const c = column as TermsIndexPatternColumn;
const newField = newIndexPattern.fields.find((field) => field.name === c.sourceField);
const newField = newIndexPattern.fields.find((field) => field.name === column.sourceField);

return Boolean(
newField &&
Expand Down Expand Up @@ -98,17 +97,17 @@ export const termsOperation: OperationDefinition<TermsIndexPatternColumn, 'field
};
},
toEsAggsConfig: (column, columnId, _indexPattern) => {
const c = column as TermsIndexPatternColumn;
return {
id: columnId,
enabled: true,
type: 'terms',
schema: 'segment',
params: {
field: c.sourceField,
orderBy: c.params.orderBy.type === 'alphabetical' ? '_key' : c.params.orderBy.columnId,
order: c.params.orderDirection,
size: c.params.size,
field: column.sourceField,
orderBy:
column.params.orderBy.type === 'alphabetical' ? '_key' : column.params.orderBy.columnId,
order: column.params.orderDirection,
size: column.params.size,
otherBucket: false,
otherBucketLabel: 'Other',
missingBucket: false,
Expand All @@ -118,31 +117,29 @@ export const termsOperation: OperationDefinition<TermsIndexPatternColumn, 'field
},
onFieldChange: (oldColumn, indexPattern, field) => {
return {
...(oldColumn as TermsIndexPatternColumn),
...oldColumn,
label: ofName(field.displayName),
sourceField: field.name,
};
},
onOtherColumnChanged: (currentColumn, columns) => {
const column = currentColumn as TermsIndexPatternColumn;
if (column.params.orderBy.type === 'column') {
if (currentColumn.params.orderBy.type === 'column') {
// check whether the column is still there and still a metric
const columnSortedBy = columns[column.params.orderBy.columnId];
const columnSortedBy = columns[currentColumn.params.orderBy.columnId];
if (!columnSortedBy || !isSortableByColumn(columnSortedBy)) {
return {
...column,
...currentColumn,
params: {
...column.params,
...currentColumn.params,
orderBy: { type: 'alphabetical' },
orderDirection: 'asc',
},
};
}
}
return column;
return currentColumn;
},
paramEditor: ({ state, setState, currentColumn, layerId }) => {
const col = currentColumn as TermsIndexPatternColumn;
const SEPARATOR = '$$$';
function toValue(orderBy: TermsIndexPatternColumn['params']['orderBy']) {
if (orderBy.type === 'alphabetical') {
Expand Down Expand Up @@ -189,7 +186,7 @@ export const termsOperation: OperationDefinition<TermsIndexPatternColumn, 'field
min={1}
max={20}
step={1}
value={col.params.size}
value={currentColumn.params.size}
showInput
showLabels
compressed
Expand Down Expand Up @@ -222,7 +219,7 @@ export const termsOperation: OperationDefinition<TermsIndexPatternColumn, 'field
compressed
data-test-subj="indexPattern-terms-orderBy"
options={orderOptions}
value={toValue(col.params.orderBy)}
value={toValue(currentColumn.params.orderBy)}
onChange={(e: React.ChangeEvent<HTMLSelectElement>) =>
setState(
updateColumnParam({
Expand Down Expand Up @@ -263,7 +260,7 @@ export const termsOperation: OperationDefinition<TermsIndexPatternColumn, 'field
}),
},
]}
value={col.params.orderDirection}
value={currentColumn.params.orderDirection}
onChange={(e: React.ChangeEvent<HTMLSelectElement>) =>
setState(
updateColumnParam({
Expand Down

0 comments on commit 90f26d4

Please sign in to comment.