Skip to content

Commit

Permalink
Update lens datasource to build aggs as subexpressions.
Browse files Browse the repository at this point in the history
  • Loading branch information
lukeelmers committed Dec 4, 2020
1 parent 3e07e3f commit ad36054
Show file tree
Hide file tree
Showing 17 changed files with 261 additions and 185 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -324,8 +324,65 @@ describe('IndexPattern Data Source', () => {
"chain": Array [
Object {
"arguments": Object {
"aggConfigs": Array [
"[{\\"id\\":\\"col1\\",\\"enabled\\":true,\\"type\\":\\"count\\",\\"schema\\":\\"metric\\",\\"params\\":{}},{\\"id\\":\\"col2\\",\\"enabled\\":true,\\"type\\":\\"date_histogram\\",\\"schema\\":\\"segment\\",\\"params\\":{\\"field\\":\\"timestamp\\",\\"useNormalizedEsInterval\\":true,\\"interval\\":\\"1d\\",\\"drop_partials\\":false,\\"min_doc_count\\":0,\\"extended_bounds\\":{}}}]",
"aggs": Array [
Object {
"chain": Array [
Object {
"arguments": Object {
"enabled": Array [
true,
],
"id": Array [
"col1",
],
"schema": Array [
"metric",
],
},
"function": "aggCount",
"type": "function",
},
],
"type": "expression",
},
Object {
"chain": Array [
Object {
"arguments": Object {
"drop_partials": Array [
false,
],
"enabled": Array [
true,
],
"extended_bounds": Array [
"{}",
],
"field": Array [
"timestamp",
],
"id": Array [
"col2",
],
"interval": Array [
"1d",
],
"min_doc_count": Array [
0,
],
"schema": Array [
"segment",
],
"useNormalizedEsInterval": Array [
true,
],
},
"function": "aggDateHistogram",
"type": "function",
},
],
"type": "expression",
},
],
"index": Array [
Object {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,8 @@
*/

import { i18n } from '@kbn/i18n';
import { AggFunctionsMapping } from '../../../../../../../src/plugins/data/public';
import { buildExpressionFunction } from '../../../../../../../src/plugins/expressions/public';
import { OperationDefinition } from './index';
import { FormattedIndexPatternColumn, FieldBasedIndexPatternColumn } from './column_types';

Expand Down Expand Up @@ -75,16 +77,14 @@ export const cardinalityOperation: OperationDefinition<CardinalityIndexPatternCo
: undefined,
};
},
toEsAggsConfig: (column, columnId) => ({
id: columnId,
enabled: true,
type: OPERATION_TYPE,
schema: 'metric',
params: {
toEsAggsFn: (column, columnId) => {
return buildExpressionFunction<AggFunctionsMapping['aggCardinality']>('aggCardinality', {
id: columnId,
enabled: true,
schema: 'metric',
field: column.sourceField,
missing: 0,
},
}),
}).toAst();
},
onFieldChange: (oldColumn, field) => {
return {
...oldColumn,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,8 @@
*/

import { i18n } from '@kbn/i18n';
import { AggFunctionsMapping } from '../../../../../../../src/plugins/data/public';
import { buildExpressionFunction } from '../../../../../../../src/plugins/expressions/public';
import { OperationDefinition } from './index';
import { FormattedIndexPatternColumn, FieldBasedIndexPatternColumn } from './column_types';
import { IndexPatternField } from '../../types';
Expand Down Expand Up @@ -68,13 +70,13 @@ export const countOperation: OperationDefinition<CountIndexPatternColumn, 'field
};
},
onOtherColumnChanged: adjustTimeScaleOnOtherColumnChange,
toEsAggsConfig: (column, columnId) => ({
id: columnId,
enabled: true,
type: 'count',
schema: 'metric',
params: {},
}),
toEsAggsFn: (column, columnId) => {
return buildExpressionFunction<AggFunctionsMapping['aggCount']>('aggCount', {
id: columnId,
enabled: true,
schema: 'metric',
}).toAst();
},
isTransferable: () => {
return true;
},
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -243,26 +243,26 @@ describe('date_histogram', () => {
});
});

describe('toEsAggsConfig', () => {
describe('toEsAggsFn', () => {
it('should reflect params correctly', () => {
const esAggsConfig = dateHistogramOperation.toEsAggsConfig(
const esAggsFn = dateHistogramOperation.toEsAggsFn(
state.layers.first.columns.col1 as DateHistogramIndexPatternColumn,
'col1',
state.indexPatterns['1']
);
expect(esAggsConfig).toEqual(
expect(esAggsFn).toEqual(
expect.objectContaining({
params: expect.objectContaining({
interval: '42w',
field: 'timestamp',
useNormalizedEsInterval: true,
arguments: expect.objectContaining({
interval: ['42w'],
field: ['timestamp'],
useNormalizedEsInterval: [true],
}),
})
);
});

it('should not use normalized es interval for rollups', () => {
const esAggsConfig = dateHistogramOperation.toEsAggsConfig(
const esAggsFn = dateHistogramOperation.toEsAggsFn(
state.layers.first.columns.col1 as DateHistogramIndexPatternColumn,
'col1',
{
Expand Down Expand Up @@ -301,12 +301,12 @@ describe('date_histogram', () => {
]),
}
);
expect(esAggsConfig).toEqual(
expect(esAggsFn).toEqual(
expect.objectContaining({
params: expect.objectContaining({
interval: '42w',
field: 'timestamp',
useNormalizedEsInterval: false,
arguments: expect.objectContaining({
interval: ['42w'],
field: ['timestamp'],
useNormalizedEsInterval: [false],
}),
})
);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,12 @@ import {
import { updateColumnParam } from '../layer_helpers';
import { OperationDefinition } from './index';
import { FieldBasedIndexPatternColumn } from './column_types';
import { IndexPatternAggRestrictions, search } from '../../../../../../../src/plugins/data/public';
import {
AggFunctionsMapping,
IndexPatternAggRestrictions,
search,
} from '../../../../../../../src/plugins/data/public';
import { buildExpressionFunction } from '../../../../../../../src/plugins/expressions/public';
import { getInvalidFieldMessage } from './helpers';

const { isValidInterval } = search.aggs;
Expand Down Expand Up @@ -123,23 +128,20 @@ export const dateHistogramOperation: OperationDefinition<
sourceField: field.name,
};
},
toEsAggsConfig: (column, columnId, indexPattern) => {
toEsAggsFn: (column, columnId, indexPattern) => {
const usedField = indexPattern.getFieldByName(column.sourceField);
return {
return buildExpressionFunction<AggFunctionsMapping['aggDateHistogram']>('aggDateHistogram', {
id: columnId,
enabled: true,
type: 'date_histogram',
schema: 'segment',
params: {
field: column.sourceField,
time_zone: column.params.timeZone,
useNormalizedEsInterval: !usedField?.aggregationRestrictions?.date_histogram,
interval: column.params.interval,
drop_partials: false,
min_doc_count: 0,
extended_bounds: {},
},
};
field: column.sourceField,
time_zone: column.params.timeZone,
useNormalizedEsInterval: !usedField?.aggregationRestrictions?.date_histogram,
interval: column.params.interval,
drop_partials: false,
min_doc_count: 0,
extended_bounds: JSON.stringify({}),
}).toAst();
},
paramEditor: ({ state, setState, currentColumn, layerId, dateRange, data }) => {
const field =
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -85,25 +85,27 @@ describe('filters', () => {
};
});

describe('toEsAggsConfig', () => {
describe('toEsAggsFn', () => {
it('should reflect params correctly', () => {
const esAggsConfig = filtersOperation.toEsAggsConfig(
const esAggsFn = filtersOperation.toEsAggsFn(
state.layers.first.columns.col1 as FiltersIndexPatternColumn,
'col1',
state.indexPatterns['1']
);
expect(esAggsConfig).toEqual(
expect(esAggsFn).toEqual(
expect.objectContaining({
params: expect.objectContaining({
arguments: expect.objectContaining({
filters: [
{
input: { query: 'bytes >= 1', language: 'kuery' },
label: 'More than one',
},
{
input: { query: 'src : 2', language: 'kuery' },
label: '',
},
JSON.stringify([
{
input: { query: 'bytes >= 1', language: 'kuery' },
label: 'More than one',
},
{
input: { query: 'src : 2', language: 'kuery' },
label: '',
},
]),
],
}),
})
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,13 @@ import { OperationDefinition } from '../index';
import { BaseIndexPatternColumn } from '../column_types';
import { FilterPopover } from './filter_popover';
import { IndexPattern } from '../../../types';
import { Query, esKuery, esQuery } from '../../../../../../../../src/plugins/data/public';
import {
AggFunctionsMapping,
Query,
esKuery,
esQuery,
} from '../../../../../../../../src/plugins/data/public';
import { buildExpressionFunction } from '../../../../../../../../src/plugins/expressions/public';
import { NewBucketButton, DragDropBuckets, DraggableBucketContainer } from '../shared_components';

const generateId = htmlIdGenerator();
Expand Down Expand Up @@ -110,19 +116,16 @@ export const filtersOperation: OperationDefinition<FiltersIndexPatternColumn, 'n
};
},

toEsAggsConfig: (column, columnId, indexPattern) => {
toEsAggsFn: (column, columnId, indexPattern) => {
const validFilters = column.params.filters?.filter((f: Filter) =>
isQueryValid(f.input, indexPattern)
);
return {
return buildExpressionFunction<AggFunctionsMapping['aggFilters']>('aggFilters', {
id: columnId,
enabled: true,
type: 'filters',
schema: 'segment',
params: {
filters: validFilters?.length > 0 ? validFilters : [defaultFilter],
},
};
filters: JSON.stringify(validFilters?.length > 0 ? validFilters : [defaultFilter]),
}).toAst();
},

paramEditor: ({ state, setState, currentColumn, layerId, data }) => {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@
* you may not use this file except in compliance with the Elastic License.
*/

import { ExpressionFunctionAST } from '@kbn/interpreter/common';
import { IUiSettingsClient, SavedObjectsClientContract, HttpSetup } from 'kibana/public';
import { IStorageWrapper } from 'src/plugins/kibana_utils/public';
import { termsOperation, TermsIndexPatternColumn } from './terms';
Expand Down Expand Up @@ -44,6 +43,7 @@ import {
IndexPatternLayer,
} from '../../types';
import { DateRange } from '../../../../common';
import { ExpressionAstFunction } from '../../../../../../../src/plugins/expressions/public';
import { DataPublicPluginStart } from '../../../../../../../src/plugins/data/public';
import { RangeIndexPatternColumn, rangeOperation } from './ranges';

Expand Down Expand Up @@ -227,7 +227,7 @@ interface FieldlessOperationDefinition<C extends BaseIndexPatternColumn> {
* Function turning a column into an agg config passed to the `esaggs` function
* together with the agg configs returned from other columns.
*/
toEsAggsConfig: (column: C, columnId: string, indexPattern: IndexPattern) => unknown;
toEsAggsFn: (column: C, columnId: string, indexPattern: IndexPattern) => ExpressionAstFunction;
}

interface FieldBasedOperationDefinition<C extends BaseIndexPatternColumn> {
Expand Down Expand Up @@ -266,7 +266,7 @@ interface FieldBasedOperationDefinition<C extends BaseIndexPatternColumn> {
* Function turning a column into an agg config passed to the `esaggs` function
* together with the agg configs returned from other columns.
*/
toEsAggsConfig: (column: C, columnId: string, indexPattern: IndexPattern) => unknown;
toEsAggsFn: (column: C, columnId: string, indexPattern: IndexPattern) => ExpressionAstFunction;
/**
* Validate that the operation has the right preconditions in the state. For example:
*
Expand Down Expand Up @@ -329,7 +329,7 @@ interface FullReferenceOperationDefinition<C extends BaseIndexPatternColumn> {
layer: IndexPatternLayer,
columnId: string,
indexPattern: IndexPattern
) => ExpressionFunctionAST[];
) => ExpressionAstFunction[];
}

interface OperationDefinitionMap<C extends BaseIndexPatternColumn> {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -74,22 +74,22 @@ describe('last_value', () => {
};
});

describe('toEsAggsConfig', () => {
describe('toEsAggsFn', () => {
it('should reflect params correctly', () => {
const lastValueColumn = state.layers.first.columns.col2 as LastValueIndexPatternColumn;
const esAggsConfig = lastValueOperation.toEsAggsConfig(
const esAggsFn = lastValueOperation.toEsAggsFn(
{ ...lastValueColumn, params: { ...lastValueColumn.params } },
'col1',
{} as IndexPattern
);
expect(esAggsConfig).toEqual(
expect(esAggsFn).toEqual(
expect.objectContaining({
params: expect.objectContaining({
aggregate: 'concat',
field: 'a',
size: 1,
sortField: 'datefield',
sortOrder: 'desc',
arguments: expect.objectContaining({
aggregate: ['concat'],
field: ['a'],
size: [1],
sortField: ['datefield'],
sortOrder: ['desc'],
}),
})
);
Expand Down
Loading

0 comments on commit ad36054

Please sign in to comment.