mirror of
https://github.com/elastic/kibana.git
synced 2025-04-24 17:59:23 -04:00
* Bug fix:Adds a migration for transforming TSVB visualization split_filters from strings to query:language objects to 7.5 * Changes hard coded migration version to get the version number from the saved object's migrationVersion in failing functional test * Changes migration number from '7.5.0' to '7.4.2', fixes typo, changes test expectations to more explicit ones
This commit is contained in:
parent
273fba9998
commit
21fc6c45fa
2 changed files with 167 additions and 0 deletions
|
@ -285,6 +285,50 @@ function transformFilterStringToQueryObject(doc) {
|
||||||
}
|
}
|
||||||
return newDoc;
|
return newDoc;
|
||||||
}
|
}
|
||||||
|
function transformSplitFiltersStringToQueryObject(doc) {
|
||||||
|
// Migrate split_filters in TSVB objects that weren't migrated in 7.3
|
||||||
|
// If any filters exist and they are a string, we assume them to be lucene syntax and transform the filter into an object accordingly
|
||||||
|
const newDoc = cloneDeep(doc);
|
||||||
|
const visStateJSON = get(doc, 'attributes.visState');
|
||||||
|
if (visStateJSON) {
|
||||||
|
let visState;
|
||||||
|
try {
|
||||||
|
visState = JSON.parse(visStateJSON);
|
||||||
|
} catch (e) {
|
||||||
|
// let it go, the data is invalid and we'll leave it as is
|
||||||
|
}
|
||||||
|
if (visState) {
|
||||||
|
const visType = get(visState, 'params.type');
|
||||||
|
const tsvbTypes = ['metric', 'markdown', 'top_n', 'gauge', 'table', 'timeseries'];
|
||||||
|
if (tsvbTypes.indexOf(visType) === -1) {
|
||||||
|
// skip
|
||||||
|
return doc;
|
||||||
|
}
|
||||||
|
// migrate the series split_filter filters
|
||||||
|
const series = get(visState, 'params.series') || [];
|
||||||
|
series.forEach(item => {
|
||||||
|
// series item split filters filter
|
||||||
|
if (item.split_filters) {
|
||||||
|
const splitFilters = get(item, 'split_filters') || [];
|
||||||
|
if (splitFilters.length > 0) {
|
||||||
|
// only transform split_filter filters if we have filters
|
||||||
|
splitFilters.forEach(filter => {
|
||||||
|
if (typeof filter.filter === 'string') {
|
||||||
|
const filterfilterObject = {
|
||||||
|
query: filter.filter,
|
||||||
|
language: 'lucene',
|
||||||
|
};
|
||||||
|
filter.filter = filterfilterObject;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
newDoc.attributes.visState = JSON.stringify(visState);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return newDoc;
|
||||||
|
}
|
||||||
|
|
||||||
function migrateFiltersAggQuery(doc) {
|
function migrateFiltersAggQuery(doc) {
|
||||||
const visStateJSON = get(doc, 'attributes.visState');
|
const visStateJSON = get(doc, 'attributes.visState');
|
||||||
|
@ -435,6 +479,10 @@ const executeSearchMigrations740 = flow(
|
||||||
migrateSearchSortToNestedArray,
|
migrateSearchSortToNestedArray,
|
||||||
);
|
);
|
||||||
|
|
||||||
|
const executeMigrations742 = flow(
|
||||||
|
transformSplitFiltersStringToQueryObject
|
||||||
|
);
|
||||||
|
|
||||||
export const migrations = {
|
export const migrations = {
|
||||||
'index-pattern': {
|
'index-pattern': {
|
||||||
'6.5.0': doc => {
|
'6.5.0': doc => {
|
||||||
|
@ -541,6 +589,8 @@ export const migrations = {
|
||||||
'7.2.0': doc => executeMigrations720(doc),
|
'7.2.0': doc => executeMigrations720(doc),
|
||||||
'7.3.0': executeMigrations730,
|
'7.3.0': executeMigrations730,
|
||||||
'7.3.1': executeVisualizationMigrations731,
|
'7.3.1': executeVisualizationMigrations731,
|
||||||
|
// migrate split_filters that were not migrated in 7.3.0 (transformFilterStringToQueryObject).
|
||||||
|
'7.4.2': executeMigrations742,
|
||||||
},
|
},
|
||||||
dashboard: {
|
dashboard: {
|
||||||
'7.0.0': doc => {
|
'7.0.0': doc => {
|
||||||
|
|
|
@ -1180,6 +1180,123 @@ Array [
|
||||||
expect(migratedDoc).toEqual({ attributes: { visState: JSON.stringify(expected) } });
|
expect(migratedDoc).toEqual({ attributes: { visState: JSON.stringify(expected) } });
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
describe('7.4.2 tsvb split_filters migration', () => {
|
||||||
|
const migrate = doc => migrations.visualization['7.4.2'](doc);
|
||||||
|
const generateDoc = ({ params }) => ({
|
||||||
|
attributes: {
|
||||||
|
title: 'My Vis',
|
||||||
|
description: 'This is my super cool vis.',
|
||||||
|
visState: JSON.stringify({ params }),
|
||||||
|
uiStateJSON: '{}',
|
||||||
|
version: 1,
|
||||||
|
kibanaSavedObjectMeta: {
|
||||||
|
searchSourceJSON: '{}',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
});
|
||||||
|
it('should change series item filters from a string into an object for all filters', () => {
|
||||||
|
const params = {
|
||||||
|
type: 'timeseries',
|
||||||
|
filter: {
|
||||||
|
query: 'bytes:>1000',
|
||||||
|
language: 'lucene'
|
||||||
|
},
|
||||||
|
series: [
|
||||||
|
{
|
||||||
|
split_filters: [{ filter: 'bytes:>1000' }],
|
||||||
|
},
|
||||||
|
]
|
||||||
|
};
|
||||||
|
const timeSeriesDoc = generateDoc({ params: params });
|
||||||
|
const migratedtimeSeriesDoc = migrate(timeSeriesDoc);
|
||||||
|
const timeSeriesParams = JSON.parse(migratedtimeSeriesDoc.attributes.visState).params;
|
||||||
|
expect(Object.keys(timeSeriesParams.filter)).toEqual(
|
||||||
|
expect.arrayContaining(['query', 'language'])
|
||||||
|
);
|
||||||
|
expect(timeSeriesParams.series[0].split_filters[0].filter).toEqual(
|
||||||
|
{ query: 'bytes:>1000', language: 'lucene' }
|
||||||
|
);
|
||||||
|
});
|
||||||
|
it('should change series item split filters when there is no filter item', () => {
|
||||||
|
const params = {
|
||||||
|
type: 'timeseries',
|
||||||
|
filter: {
|
||||||
|
query: 'bytes:>1000',
|
||||||
|
language: 'lucene'
|
||||||
|
},
|
||||||
|
series: [
|
||||||
|
{
|
||||||
|
split_filters: [{ filter: 'bytes:>1000' }],
|
||||||
|
},
|
||||||
|
],
|
||||||
|
annotations: [
|
||||||
|
{
|
||||||
|
query_string: {
|
||||||
|
query: 'bytes:>1000',
|
||||||
|
language: 'lucene'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
],
|
||||||
|
};
|
||||||
|
const timeSeriesDoc = generateDoc({ params: params });
|
||||||
|
const migratedtimeSeriesDoc = migrate(timeSeriesDoc);
|
||||||
|
const timeSeriesParams = JSON.parse(migratedtimeSeriesDoc.attributes.visState).params;
|
||||||
|
expect(timeSeriesParams.series[0].split_filters[0].filter).toEqual(
|
||||||
|
{ query: 'bytes:>1000', language: 'lucene' }
|
||||||
|
);
|
||||||
|
});
|
||||||
|
it('should not convert split_filters to objects if there are no split filter filters', () => {
|
||||||
|
const params = {
|
||||||
|
type: 'timeseries',
|
||||||
|
filter: {
|
||||||
|
query: 'bytes:>1000',
|
||||||
|
language: 'lucene'
|
||||||
|
},
|
||||||
|
series: [
|
||||||
|
{
|
||||||
|
split_filters: [],
|
||||||
|
},
|
||||||
|
]
|
||||||
|
};
|
||||||
|
const timeSeriesDoc = generateDoc({ params: params });
|
||||||
|
const migratedtimeSeriesDoc = migrate(timeSeriesDoc);
|
||||||
|
const timeSeriesParams = JSON.parse(migratedtimeSeriesDoc.attributes.visState).params;
|
||||||
|
expect(timeSeriesParams.series[0].split_filters).not.toHaveProperty('query');
|
||||||
|
});
|
||||||
|
it('should do nothing if a split_filter is already a query:language object', () => {
|
||||||
|
const params = {
|
||||||
|
type: 'timeseries',
|
||||||
|
filter: {
|
||||||
|
query: 'bytes:>1000',
|
||||||
|
language: 'lucene'
|
||||||
|
},
|
||||||
|
series: [
|
||||||
|
{
|
||||||
|
split_filters: [{
|
||||||
|
filter: {
|
||||||
|
query: 'bytes:>1000',
|
||||||
|
language: 'lucene',
|
||||||
|
}
|
||||||
|
}],
|
||||||
|
},
|
||||||
|
],
|
||||||
|
annotations: [
|
||||||
|
{
|
||||||
|
query_string: {
|
||||||
|
query: 'bytes:>1000',
|
||||||
|
language: 'lucene'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
],
|
||||||
|
};
|
||||||
|
const timeSeriesDoc = generateDoc({ params: params });
|
||||||
|
const migratedtimeSeriesDoc = migrate(timeSeriesDoc);
|
||||||
|
const timeSeriesParams = JSON.parse(migratedtimeSeriesDoc.attributes.visState).params;
|
||||||
|
expect(timeSeriesParams.series[0].split_filters[0].filter.query).toEqual('bytes:>1000');
|
||||||
|
expect(timeSeriesParams.series[0].split_filters[0].filter.language).toEqual('lucene');
|
||||||
|
|
||||||
|
});
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
describe('dashboard', () => {
|
describe('dashboard', () => {
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue