diff --git a/src/legacy/core_plugins/data/public/query/query_bar/components/query_bar_input.tsx b/src/legacy/core_plugins/data/public/query/query_bar/components/query_bar_input.tsx index 50628a316209a..b8a8331b705a9 100644 --- a/src/legacy/core_plugins/data/public/query/query_bar/components/query_bar_input.tsx +++ b/src/legacy/core_plugins/data/public/query/query_bar/components/query_bar_input.tsx @@ -391,6 +391,11 @@ export class QueryBarInputUI extends Component { }; public componentDidMount() { + const parsedQuery = fromUser(toUser(this.props.query.query)); + if (!isEqual(this.props.query.query, parsedQuery)) { + this.onChange({ ...this.props.query, query: parsedQuery }); + } + this.persistedLog = this.props.persistedLog ? this.props.persistedLog : getQueryLog(this.props.uiSettings, this.props.appName, this.props.query.language); @@ -399,6 +404,11 @@ export class QueryBarInputUI extends Component { } public componentDidUpdate(prevProps: Props) { + const parsedQuery = fromUser(toUser(this.props.query.query)); + if (!isEqual(this.props.query.query, parsedQuery)) { + this.onChange({ ...this.props.query, query: parsedQuery }); + } + this.persistedLog = this.props.persistedLog ? this.props.persistedLog : getQueryLog(this.props.uiSettings, this.props.appName, this.props.query.language); diff --git a/src/legacy/core_plugins/data/public/query/query_bar/lib/from_user.ts b/src/legacy/core_plugins/data/public/query/query_bar/lib/from_user.ts index cc13e0afd885c..15eebaa0b9fd6 100644 --- a/src/legacy/core_plugins/data/public/query/query_bar/lib/from_user.ts +++ b/src/legacy/core_plugins/data/public/query/query_bar/lib/from_user.ts @@ -29,10 +29,6 @@ export function fromUser(userInput: object | string) { const matchAll = ''; if (_.isObject(userInput)) { - // If we get an empty object, treat it as a * - if (!Object.keys(userInput).length) { - return matchAll; - } return userInput; } diff --git a/src/legacy/core_plugins/kibana/migrations/migrations.js b/src/legacy/core_plugins/kibana/migrations/migrations.js index bd4340dbadb0f..03b2f5b898345 100644 --- a/src/legacy/core_plugins/kibana/migrations/migrations.js +++ b/src/legacy/core_plugins/kibana/migrations/migrations.js @@ -383,6 +383,39 @@ function migrateSearchSortToNestedArray(doc) { }; } +function migrateFiltersAggQueryStringQueries(doc) { + const visStateJSON = get(doc, 'attributes.visState'); + + if (visStateJSON) { + try { + const visState = JSON.parse(visStateJSON); + if (visState && visState.aggs) { + visState.aggs.forEach(agg => { + if (agg.type !== 'filters') return doc; + + agg.params.filters.forEach(filter => { + if (filter.input.query.query_string) { + filter.input.query = filter.input.query.query_string.query; + } + }); + }); + + return { + ...doc, + attributes: { + ...doc.attributes, + visState: JSON.stringify(visState), + }, + }; + } + } catch (e) { + // Let it go, the data is invalid and we'll leave it as is + } + } + return doc; + +} + const executeMigrations720 = flow( migratePercentileRankAggregation, migrateDateHistogramAggregation @@ -394,6 +427,10 @@ const executeMigrations730 = flow( replaceMovAvgToMovFn ); +const executeVisualizationMigrations731 = flow( + migrateFiltersAggQueryStringQueries, +); + const executeSearchMigrations740 = flow( migrateSearchSortToNestedArray, ); @@ -503,6 +540,7 @@ export const migrations = { '7.0.1': removeDateHistogramTimeZones, '7.2.0': doc => executeMigrations720(doc), '7.3.0': executeMigrations730, + '7.3.1': executeVisualizationMigrations731, }, dashboard: { '7.0.0': doc => { diff --git a/src/legacy/core_plugins/kibana/migrations/migrations.test.js b/src/legacy/core_plugins/kibana/migrations/migrations.test.js index 0776b6028641f..77a4c7eabe86e 100644 --- a/src/legacy/core_plugins/kibana/migrations/migrations.test.js +++ b/src/legacy/core_plugins/kibana/migrations/migrations.test.js @@ -1143,6 +1143,43 @@ Array [ expect(series[0].filter).toEqual(params.series[0].filter); }); }); + + describe('7.3.1', () => { + const migrate = migrations.visualization['7.3.1']; + + it('should migrate filters agg query string queries', () => { + const state = { + aggs: [ + { type: 'count', params: {} }, + { + type: 'filters', + params: { + filters: [{ + input: { + query: { + query_string: { query: 'machine.os.keyword:\"win 8\"' } + } + } + }] + } + } + ], + }; + const expected = { + aggs: [ + { type: 'count', params: {} }, + { + type: 'filters', + params: { + filters: [{ input: { query: 'machine.os.keyword:\"win 8\"' } }] + } + } + ], + }; + const migratedDoc = migrate({ attributes: { visState: JSON.stringify(state) } }); + expect(migratedDoc).toEqual({ attributes: { visState: JSON.stringify(expected) } }); + }); + }); }); describe('dashboard', () => {