diff --git a/src/plugins/visualizations/server/embeddable/visualize_embeddable_factory.ts b/src/plugins/visualizations/server/embeddable/visualize_embeddable_factory.ts index 043f6195cf7b4..43a8ab3d507d8 100644 --- a/src/plugins/visualizations/server/embeddable/visualize_embeddable_factory.ts +++ b/src/plugins/visualizations/server/embeddable/visualize_embeddable_factory.ts @@ -16,6 +16,7 @@ import { commonMigrateVislibPie, commonAddEmptyValueColorRule, commonMigrateTagCloud, + commonAddDropLastBucketIntoTSVBModel, } from '../migrations/visualization_common_migrations'; const byValueAddSupportOfDualIndexSelectionModeInTSVB = (state: SerializableRecord) => { @@ -32,6 +33,13 @@ const byValueHideTSVBLastValueIndicator = (state: SerializableRecord) => { }; }; +const byValueAddDropLastBucketIntoTSVBModel = (state: SerializableRecord) => { + return { + ...state, + savedVis: commonAddDropLastBucketIntoTSVBModel(state.savedVis), + }; +}; + const byValueRemoveDefaultIndexPatternAndTimeFieldFromTSVBModel = (state: SerializableRecord) => { return { ...state, @@ -72,7 +80,12 @@ export const visualizeEmbeddableFactory = (): EmbeddableRegistryDefinition => { byValueRemoveDefaultIndexPatternAndTimeFieldFromTSVBModel )(state), '7.14.0': (state) => - flow(byValueAddEmptyValueColorRule, byValueMigrateVislibPie, byValueMigrateTagcloud)(state), + flow( + byValueAddEmptyValueColorRule, + byValueMigrateVislibPie, + byValueMigrateTagcloud, + byValueAddDropLastBucketIntoTSVBModel + )(state), }, }; }; diff --git a/src/plugins/visualizations/server/migrations/visualization_common_migrations.ts b/src/plugins/visualizations/server/migrations/visualization_common_migrations.ts index 17b1470a40062..2503ac2c54b12 100644 --- a/src/plugins/visualizations/server/migrations/visualization_common_migrations.ts +++ b/src/plugins/visualizations/server/migrations/visualization_common_migrations.ts @@ -20,6 +20,27 @@ export const commonAddSupportOfDualIndexSelectionModeInTSVB = (visState: any) => return visState; }; +export const commonAddDropLastBucketIntoTSVBModel = (visState: any) => { + if (visState && visState.type === 'metrics') { + return { + ...visState, + params: { + ...visState.params, + series: visState.params?.series?.map((s: any) => + s.override_index_pattern + ? { + ...s, + series_drop_last_bucket: s.series_drop_last_bucket ?? 1, + } + : s + ), + drop_last_bucket: visState.params.drop_last_bucket ?? 1, + }, + }; + } + return visState; +}; + export const commonHideTSVBLastValueIndicator = (visState: any) => { if (visState && visState.type === 'metrics' && visState.params.type !== 'timeseries') { return { diff --git a/src/plugins/visualizations/server/migrations/visualization_saved_object_migrations.test.ts b/src/plugins/visualizations/server/migrations/visualization_saved_object_migrations.test.ts index 869a9add89066..00c7e26715e6c 100644 --- a/src/plugins/visualizations/server/migrations/visualization_saved_object_migrations.test.ts +++ b/src/plugins/visualizations/server/migrations/visualization_saved_object_migrations.test.ts @@ -2115,6 +2115,87 @@ describe('migration visualization', () => { }); }); + describe('7.14.0 tsvb - add drop last bucket into TSVB model', () => { + const migrate = (doc: any) => + visualizationSavedObjectTypeMigrations['7.14.0']( + doc as Parameters[0], + savedObjectMigrationContext + ); + + const createTestDocWithType = (params: any) => ({ + attributes: { + title: 'My Vis', + description: 'This is my super cool vis.', + visState: `{ + "type":"metrics", + "params": ${JSON.stringify(params)} + }`, + }, + }); + + it('should add "drop_last_bucket" into model if it not exist', () => { + const params = {}; + const migratedTestDoc = migrate(createTestDocWithType(params)); + const { params: migratedParams } = JSON.parse(migratedTestDoc.attributes.visState); + + expect(migratedParams).toMatchInlineSnapshot(` + Object { + "drop_last_bucket": 1, + } + `); + }); + + it('should add "series_drop_last_bucket" into model if it not exist', () => { + const params = { + series: [ + { + override_index_pattern: 1, + }, + { + override_index_pattern: 1, + }, + { override_index_pattern: 0 }, + {}, + { + override_index_pattern: 1, + series_drop_last_bucket: 0, + }, + { + override_index_pattern: 1, + series_drop_last_bucket: 1, + }, + ], + }; + const migratedTestDoc = migrate(createTestDocWithType(params)); + const { params: migratedParams } = JSON.parse(migratedTestDoc.attributes.visState); + + expect(migratedParams.series).toMatchInlineSnapshot(` + Array [ + Object { + "override_index_pattern": 1, + "series_drop_last_bucket": 1, + }, + Object { + "override_index_pattern": 1, + "series_drop_last_bucket": 1, + }, + Object { + "override_index_pattern": 0, + }, + Object {}, + Object { + "override_index_pattern": 1, + "series_drop_last_bucket": 0, + }, + Object { + "override_index_pattern": 1, + "series_drop_last_bucket": 1, + }, + ] + `); + }); + }); + describe('7.14.0 update pie visualization defaults', () => { const migrate = (doc: any) => visualizationSavedObjectTypeMigrations['7.14.0']( diff --git a/src/plugins/visualizations/server/migrations/visualization_saved_object_migrations.ts b/src/plugins/visualizations/server/migrations/visualization_saved_object_migrations.ts index 1f50e26ea9ec1..fd08ecd748668 100644 --- a/src/plugins/visualizations/server/migrations/visualization_saved_object_migrations.ts +++ b/src/plugins/visualizations/server/migrations/visualization_saved_object_migrations.ts @@ -18,6 +18,7 @@ import { commonMigrateVislibPie, commonAddEmptyValueColorRule, commonMigrateTagCloud, + commonAddDropLastBucketIntoTSVBModel, } from './visualization_common_migrations'; const migrateIndexPattern: SavedObjectMigrationFn = (doc) => { @@ -945,6 +946,23 @@ const hideTSVBLastValueIndicator: SavedObjectMigrationFn = (doc) => { return doc; }; +const addDropLastBucketIntoTSVBModel: SavedObjectMigrationFn = (doc) => { + try { + const visState = JSON.parse(doc.attributes.visState); + const newVisState = commonAddDropLastBucketIntoTSVBModel(visState); + return { + ...doc, + attributes: { + ...doc.attributes, + visState: JSON.stringify(newVisState), + }, + }; + } catch (e) { + // Let it go, the data is invalid and we'll leave it as is + } + return doc; +}; + const removeDefaultIndexPatternAndTimeFieldFromTSVBModel: SavedObjectMigrationFn = ( doc ) => { @@ -1100,6 +1118,7 @@ export const visualizationSavedObjectTypeMigrations = { addEmptyValueColorRule, migrateVislibPie, migrateTagCloud, - replaceIndexPatternReference + replaceIndexPatternReference, + addDropLastBucketIntoTSVBModel ), };