Fix spatial filters when Kuery is in use (#14158)

In https://github.com/elastic/kibana/pull/13912/files#r137840240 I updated the filter_bar_click_handler to create Kuery filters directly instead of relying on $newFilters watchers in every app. I forgot tile_map manipulates $newFilters directly instead of using the filter_bar_click_handler. So if Kuery was selected as the query language and you attempted to create a spatial filter, nothing would happen. I've updated tile_map to use vis.API instead of modifying $newFilters. This fixed the Kuery issue, as well as a strange lag time I was seeing between mouse click and actual filter creation with the lucene filters.
This commit is contained in:
Matt Bargar 2017-10-02 14:04:11 -04:00 committed by GitHub
parent 34250a81e8
commit e0dce5ffbb
3 changed files with 40 additions and 9 deletions

View file

@ -272,10 +272,40 @@ export function MapsVisualizationProvider(serviceSettings, Notifier, getAppState
const indexPatternName = agg.vis.indexPattern.id;
const field = agg.fieldName();
const filter = { meta: { negate: false, index: indexPatternName } };
filter[filterName] = { ignore_unmapped: true };
filter[filterName][field] = filterData;
getAppState().$newFilters = [filter];
const query = this.vis.API.queryManager.getQuery();
const language = query.language;
if (language === 'lucene') {
const filter = { meta: { negate: false, index: indexPatternName } };
filter[filterName] = { ignore_unmapped: true };
filter[filterName][field] = filterData;
this.vis.API.queryFilter.addFilters([filter]);
}
else if (language === 'kuery') {
const { fromKueryExpression, toKueryExpression, nodeTypes } = this.vis.API.kuery;
let newQuery;
if (filterName === 'geo_bounding_box') {
newQuery = nodeTypes.function.buildNode('geoBoundingBox', field, _.mapKeys(filterData, (value, key) => _.camelCase(key)));
}
else if (filterName === 'geo_polygon') {
newQuery = nodeTypes.function.buildNode('geoPolygon', field, filterData.points);
}
else {
throw new Error(`Kuery does not support ${filterName} queries`);
}
const allQueries = _.isEmpty(query.query)
? [newQuery]
: [fromKueryExpression(query.query), newQuery];
this.vis.API.queryManager.setQuery({
query: toKueryExpression(nodeTypes.function.buildNode('and', allQueries, 'implicit')),
language: 'kuery'
});
}
this.vis.updateState();
}

View file

@ -1,14 +1,15 @@
import _ from 'lodash';
export function queryManagerFactory(state) {
export function queryManagerFactory(getState) {
function getQuery() {
return {
...state.query
...getState().query
};
}
function updateQuery(newQuery) {
function setQuery(newQuery) {
const state = getState();
state.query = newQuery;
if (_.isFunction(state.save)) {
@ -18,7 +19,7 @@ export function queryManagerFactory(state) {
return {
getQuery,
updateQuery,
setQuery,
};
}

View file

@ -61,7 +61,7 @@ export function VisProvider(Private, indexPatterns, timefilter, getAppState) {
indexPatterns: indexPatterns,
timeFilter: timefilter,
queryFilter: queryFilter,
queryManager: queryManagerFactory(getAppState()),
queryManager: queryManagerFactory(getAppState),
kuery: kueryAPI,
events: {
filter: (event) => {