mirror of
https://github.com/elastic/kibana.git
synced 2025-04-24 09:48:58 -04:00
* Explicit namespaces for esQuery and esQuery * Remove unnecessary file from siem * remove jsonvalue definition from siem * esFilters refactor O_O * Delete IFilterType * import fixes * Fix merge Co-authored-by: Elastic Machine <elasticmachine@users.noreply.github.com> Co-authored-by: Elastic Machine <elasticmachine@users.noreply.github.com>
This commit is contained in:
parent
ebb49b7171
commit
0b0f0fa1f0
214 changed files with 1191 additions and 1335 deletions
|
@ -26,12 +26,10 @@ import {
|
|||
// @ts-ignore
|
||||
import { onBrushEvent } from './filters/brush_event';
|
||||
import {
|
||||
esFilters,
|
||||
Filter,
|
||||
FilterManager,
|
||||
TimefilterContract,
|
||||
changeTimeFilter,
|
||||
extractTimeFilter,
|
||||
mapAndFlattenFilters,
|
||||
esFilters,
|
||||
} from '../../../../../plugins/data/public';
|
||||
// eslint-disable-next-line @kbn/eslint/no-restricted-paths
|
||||
import { getIndexPatterns } from '../../../../../plugins/data/public/services';
|
||||
|
@ -45,7 +43,7 @@ interface ActionContext {
|
|||
|
||||
async function isCompatible(context: ActionContext) {
|
||||
try {
|
||||
const filters: esFilters.Filter[] = (await onBrushEvent(context.data, getIndexPatterns)) || [];
|
||||
const filters: Filter[] = (await onBrushEvent(context.data, getIndexPatterns)) || [];
|
||||
return filters.length > 0;
|
||||
} catch {
|
||||
return false;
|
||||
|
@ -70,18 +68,18 @@ export function selectRangeAction(
|
|||
throw new IncompatibleActionError();
|
||||
}
|
||||
|
||||
const filters: esFilters.Filter[] = (await onBrushEvent(data, getIndexPatterns)) || [];
|
||||
const filters: Filter[] = (await onBrushEvent(data, getIndexPatterns)) || [];
|
||||
|
||||
const selectedFilters: esFilters.Filter[] = mapAndFlattenFilters(filters);
|
||||
const selectedFilters: Filter[] = esFilters.mapAndFlattenFilters(filters);
|
||||
|
||||
if (timeFieldName) {
|
||||
const { timeRangeFilter, restOfFilters } = extractTimeFilter(
|
||||
const { timeRangeFilter, restOfFilters } = esFilters.extractTimeFilter(
|
||||
timeFieldName,
|
||||
selectedFilters
|
||||
);
|
||||
filterManager.addFilters(restOfFilters);
|
||||
if (timeRangeFilter) {
|
||||
changeTimeFilter(timeFilter, timeRangeFilter);
|
||||
esFilters.changeTimeFilter(timeFilter, timeRangeFilter);
|
||||
}
|
||||
} else {
|
||||
filterManager.addFilters(selectedFilters);
|
||||
|
|
|
@ -31,12 +31,10 @@ import { applyFiltersPopover } from '../../../../../plugins/data/public/ui/apply
|
|||
// @ts-ignore
|
||||
import { createFiltersFromEvent } from './filters/create_filters_from_event';
|
||||
import {
|
||||
esFilters,
|
||||
Filter,
|
||||
FilterManager,
|
||||
TimefilterContract,
|
||||
changeTimeFilter,
|
||||
extractTimeFilter,
|
||||
mapAndFlattenFilters,
|
||||
esFilters,
|
||||
} from '../../../../../plugins/data/public';
|
||||
|
||||
export const VALUE_CLICK_ACTION = 'VALUE_CLICK_ACTION';
|
||||
|
@ -48,7 +46,7 @@ interface ActionContext {
|
|||
|
||||
async function isCompatible(context: ActionContext) {
|
||||
try {
|
||||
const filters: esFilters.Filter[] = (await createFiltersFromEvent(context.data)) || [];
|
||||
const filters: Filter[] = (await createFiltersFromEvent(context.data)) || [];
|
||||
return filters.length > 0;
|
||||
} catch {
|
||||
return false;
|
||||
|
@ -73,9 +71,9 @@ export function valueClickAction(
|
|||
throw new IncompatibleActionError();
|
||||
}
|
||||
|
||||
const filters: esFilters.Filter[] = (await createFiltersFromEvent(data)) || [];
|
||||
const filters: Filter[] = (await createFiltersFromEvent(data)) || [];
|
||||
|
||||
let selectedFilters: esFilters.Filter[] = mapAndFlattenFilters(filters);
|
||||
let selectedFilters: Filter[] = esFilters.mapAndFlattenFilters(filters);
|
||||
|
||||
if (selectedFilters.length > 1) {
|
||||
const indexPatterns = await Promise.all(
|
||||
|
@ -84,7 +82,7 @@ export function valueClickAction(
|
|||
})
|
||||
);
|
||||
|
||||
const filterSelectionPromise: Promise<esFilters.Filter[]> = new Promise(resolve => {
|
||||
const filterSelectionPromise: Promise<Filter[]> = new Promise(resolve => {
|
||||
const overlay = getOverlays().openModal(
|
||||
toMountPoint(
|
||||
applyFiltersPopover(
|
||||
|
@ -94,7 +92,7 @@ export function valueClickAction(
|
|||
overlay.close();
|
||||
resolve([]);
|
||||
},
|
||||
(filterSelection: esFilters.Filter[]) => {
|
||||
(filterSelection: Filter[]) => {
|
||||
overlay.close();
|
||||
resolve(filterSelection);
|
||||
}
|
||||
|
@ -110,13 +108,13 @@ export function valueClickAction(
|
|||
}
|
||||
|
||||
if (timeFieldName) {
|
||||
const { timeRangeFilter, restOfFilters } = extractTimeFilter(
|
||||
const { timeRangeFilter, restOfFilters } = esFilters.extractTimeFilter(
|
||||
timeFieldName,
|
||||
selectedFilters
|
||||
);
|
||||
filterManager.addFilters(restOfFilters);
|
||||
if (timeRangeFilter) {
|
||||
changeTimeFilter(timeFilter, timeRangeFilter);
|
||||
esFilters.changeTimeFilter(timeFilter, timeRangeFilter);
|
||||
}
|
||||
} else {
|
||||
filterManager.addFilters(selectedFilters);
|
||||
|
|
|
@ -20,10 +20,9 @@
|
|||
import _ from 'lodash';
|
||||
import { Subscription } from 'rxjs';
|
||||
import { State } from 'ui/state_management/state';
|
||||
import { FilterManager, esFilters } from '../../../../../../plugins/data/public';
|
||||
import { compareFilters, COMPARE_ALL_OPTIONS } from '../../../../../../plugins/data/public';
|
||||
import { FilterManager, esFilters, Filter } from '../../../../../../plugins/data/public';
|
||||
|
||||
type GetAppStateFunc = () => { filters?: esFilters.Filter[]; save?: () => void } | undefined | null;
|
||||
type GetAppStateFunc = () => { filters?: Filter[]; save?: () => void } | undefined | null;
|
||||
|
||||
/**
|
||||
* FilterStateManager is responsible for watching for filter changes
|
||||
|
@ -68,15 +67,15 @@ export class FilterStateManager {
|
|||
const globalFilters = this.globalState.filters || [];
|
||||
const appFilters = (appState && appState.filters) || [];
|
||||
|
||||
const globalFilterChanged = !compareFilters(
|
||||
const globalFilterChanged = !esFilters.compareFilters(
|
||||
this.filterManager.getGlobalFilters(),
|
||||
globalFilters,
|
||||
COMPARE_ALL_OPTIONS
|
||||
esFilters.COMPARE_ALL_OPTIONS
|
||||
);
|
||||
const appFilterChanged = !compareFilters(
|
||||
const appFilterChanged = !esFilters.compareFilters(
|
||||
this.filterManager.getAppFilters(),
|
||||
appFilters,
|
||||
COMPARE_ALL_OPTIONS
|
||||
esFilters.COMPARE_ALL_OPTIONS
|
||||
);
|
||||
const filterStateChanged = globalFilterChanged || appFilterChanged;
|
||||
|
||||
|
|
|
@ -17,15 +17,15 @@
|
|||
* under the License.
|
||||
*/
|
||||
|
||||
import { esFilters } from '../../../../../../../plugins/data/public';
|
||||
import { Filter } from '../../../../../../../plugins/data/public';
|
||||
|
||||
export function getFilter(
|
||||
store: esFilters.FilterStateStore,
|
||||
store: any, // I don't want to export only for this, as it should move to data plugin
|
||||
disabled: boolean,
|
||||
negated: boolean,
|
||||
queryKey: string,
|
||||
queryValue: any
|
||||
): esFilters.Filter {
|
||||
): Filter {
|
||||
return {
|
||||
$state: {
|
||||
store,
|
||||
|
|
|
@ -20,10 +20,10 @@
|
|||
import sinon from 'sinon';
|
||||
|
||||
import { State } from 'ui/state_management/state';
|
||||
import { esFilters } from '../../../../../../../plugins/data/public';
|
||||
import { Filter } from '../../../../../../../plugins/data/public';
|
||||
|
||||
export class StubState implements State {
|
||||
filters: esFilters.Filter[];
|
||||
filters: Filter[];
|
||||
save: sinon.SinonSpy<any[], any>;
|
||||
|
||||
constructor() {
|
||||
|
|
|
@ -23,14 +23,14 @@ import { intervalOptions } from '../_interval_options';
|
|||
import { AggConfigs } from '../../agg_configs';
|
||||
import { IBucketDateHistogramAggConfig } from '../date_histogram';
|
||||
import { BUCKET_TYPES } from '../bucket_agg_types';
|
||||
import { esFilters } from '../../../../../../../../plugins/data/public';
|
||||
import { RangeFilter } from '../../../../../../../../plugins/data/public';
|
||||
|
||||
jest.mock('ui/new_platform');
|
||||
|
||||
describe('AggConfig Filters', () => {
|
||||
describe('date_histogram', () => {
|
||||
let agg: IBucketDateHistogramAggConfig;
|
||||
let filter: esFilters.RangeFilter;
|
||||
let filter: RangeFilter;
|
||||
let bucketStart: any;
|
||||
let field: any;
|
||||
|
||||
|
|
|
@ -20,10 +20,10 @@
|
|||
import moment from 'moment';
|
||||
import { IBucketAggConfig } from '../_bucket_agg_type';
|
||||
import { DateRangeKey } from '../date_range';
|
||||
import { esFilters } from '../../../../../../../../plugins/data/public';
|
||||
import { esFilters, RangeFilterParams } from '../../../../../../../../plugins/data/public';
|
||||
|
||||
export const createFilterDateRange = (agg: IBucketAggConfig, { from, to }: DateRangeKey) => {
|
||||
const filter: esFilters.RangeFilterParams = {};
|
||||
const filter: RangeFilterParams = {};
|
||||
if (from) filter.gte = moment(from).toISOString();
|
||||
if (to) filter.lt = moment(to).toISOString();
|
||||
if (to && from) filter.format = 'strict_date_optional_time';
|
||||
|
|
|
@ -18,11 +18,11 @@
|
|||
*/
|
||||
|
||||
import { IBucketAggConfig } from '../_bucket_agg_type';
|
||||
import { esFilters } from '../../../../../../../../plugins/data/public';
|
||||
import { esFilters, RangeFilterParams } from '../../../../../../../../plugins/data/public';
|
||||
|
||||
export const createFilterHistogram = (aggConfig: IBucketAggConfig, key: string) => {
|
||||
const value = parseInt(key, 10);
|
||||
const params: esFilters.RangeFilterParams = { gte: value, lt: value + aggConfig.params.interval };
|
||||
const params: RangeFilterParams = { gte: value, lt: value + aggConfig.params.interval };
|
||||
|
||||
return esFilters.buildRangeFilter(
|
||||
aggConfig.params.field,
|
||||
|
|
|
@ -20,10 +20,10 @@
|
|||
import { CidrMask } from '../lib/cidr_mask';
|
||||
import { IBucketAggConfig } from '../_bucket_agg_type';
|
||||
import { IpRangeKey } from '../ip_range';
|
||||
import { esFilters } from '../../../../../../../../plugins/data/public';
|
||||
import { esFilters, RangeFilterParams } from '../../../../../../../../plugins/data/public';
|
||||
|
||||
export const createFilterIpRange = (aggConfig: IBucketAggConfig, key: IpRangeKey) => {
|
||||
let range: esFilters.RangeFilterParams;
|
||||
let range: RangeFilterParams;
|
||||
|
||||
if (key.type === 'mask') {
|
||||
range = new CidrMask(key.mask).getRange();
|
||||
|
|
|
@ -21,7 +21,7 @@ import { createFilterTerms } from './terms';
|
|||
import { AggConfigs } from '../../agg_configs';
|
||||
import { BUCKET_TYPES } from '../bucket_agg_types';
|
||||
import { IBucketAggConfig } from '../_bucket_agg_type';
|
||||
import { esFilters } from '../../../../../../../../plugins/data/public';
|
||||
import { Filter, ExistsFilter } from '../../../../../../../../plugins/data/public';
|
||||
|
||||
jest.mock('ui/new_platform');
|
||||
|
||||
|
@ -54,7 +54,7 @@ describe('AggConfig Filters', () => {
|
|||
aggConfigs.aggs[0] as IBucketAggConfig,
|
||||
'apache',
|
||||
{}
|
||||
) as esFilters.Filter;
|
||||
) as Filter;
|
||||
|
||||
expect(filter).toHaveProperty('query');
|
||||
expect(filter.query).toHaveProperty('match_phrase');
|
||||
|
@ -73,7 +73,7 @@ describe('AggConfig Filters', () => {
|
|||
aggConfigs.aggs[0] as IBucketAggConfig,
|
||||
'',
|
||||
{}
|
||||
) as esFilters.Filter;
|
||||
) as Filter;
|
||||
|
||||
expect(filterFalse).toHaveProperty('query');
|
||||
expect(filterFalse.query).toHaveProperty('match_phrase');
|
||||
|
@ -84,7 +84,7 @@ describe('AggConfig Filters', () => {
|
|||
aggConfigs.aggs[0] as IBucketAggConfig,
|
||||
'1',
|
||||
{}
|
||||
) as esFilters.Filter;
|
||||
) as Filter;
|
||||
|
||||
expect(filterTrue).toHaveProperty('query');
|
||||
expect(filterTrue.query).toHaveProperty('match_phrase');
|
||||
|
@ -100,7 +100,7 @@ describe('AggConfig Filters', () => {
|
|||
aggConfigs.aggs[0] as IBucketAggConfig,
|
||||
'__missing__',
|
||||
{}
|
||||
) as esFilters.ExistsFilter;
|
||||
) as ExistsFilter;
|
||||
|
||||
expect(filter).toHaveProperty('exists');
|
||||
expect(filter.exists).toHaveProperty('field', 'field');
|
||||
|
@ -116,7 +116,7 @@ describe('AggConfig Filters', () => {
|
|||
|
||||
const [filter] = createFilterTerms(aggConfigs.aggs[0] as IBucketAggConfig, '__other__', {
|
||||
terms: ['apache'],
|
||||
}) as esFilters.Filter[];
|
||||
}) as Filter[];
|
||||
|
||||
expect(filter).toHaveProperty('query');
|
||||
expect(filter.query).toHaveProperty('bool');
|
||||
|
|
|
@ -18,7 +18,7 @@
|
|||
*/
|
||||
|
||||
import { IBucketAggConfig } from '../_bucket_agg_type';
|
||||
import { esFilters } from '../../../../../../../../plugins/data/public';
|
||||
import { esFilters, Filter } from '../../../../../../../../plugins/data/public';
|
||||
|
||||
export const createFilterTerms = (aggConfig: IBucketAggConfig, key: string, params: any) => {
|
||||
const field = aggConfig.params.field;
|
||||
|
@ -30,7 +30,7 @@ export const createFilterTerms = (aggConfig: IBucketAggConfig, key: string, para
|
|||
const phraseFilter = esFilters.buildPhrasesFilter(field, terms, indexPattern);
|
||||
phraseFilter.meta.negate = true;
|
||||
|
||||
const filters: esFilters.Filter[] = [phraseFilter];
|
||||
const filters: Filter[] = [phraseFilter];
|
||||
|
||||
if (terms.some((term: string) => term === '__missing__')) {
|
||||
filters.push(esFilters.buildExistsFilter(field, indexPattern));
|
||||
|
|
|
@ -32,7 +32,7 @@ import {
|
|||
SearchSource,
|
||||
Query,
|
||||
TimeRange,
|
||||
esFilters,
|
||||
Filter,
|
||||
getTime,
|
||||
FilterManager,
|
||||
} from '../../../../../../plugins/data/public';
|
||||
|
@ -53,7 +53,7 @@ export interface RequestHandlerParams {
|
|||
aggs: IAggConfigs;
|
||||
timeRange?: TimeRange;
|
||||
query?: Query;
|
||||
filters?: esFilters.Filter[];
|
||||
filters?: Filter[];
|
||||
forceFetch: boolean;
|
||||
filterManager: FilterManager;
|
||||
uiState?: PersistedState;
|
||||
|
|
|
@ -22,7 +22,7 @@
|
|||
import _ from 'lodash';
|
||||
import { i18n } from '@kbn/i18n';
|
||||
|
||||
import { esFilters } from '../../../../../plugins/data/public';
|
||||
import { Filter } from '../../../../../plugins/data/public';
|
||||
import { SearchSource as SearchSourceClass } from '../legacy_imports';
|
||||
import { ControlParams, ControlParamsOptions, CONTROL_TYPES } from '../editor_utils';
|
||||
import { RangeFilterManager } from './filter_manager/range_filter_manager';
|
||||
|
@ -46,7 +46,7 @@ export function noIndexPatternMsg(indexPatternId: string) {
|
|||
}
|
||||
|
||||
export abstract class Control<FilterManager extends BaseFilterManager> {
|
||||
private kbnFilter: esFilters.Filter | null = null;
|
||||
private kbnFilter: Filter | null = null;
|
||||
|
||||
enable: boolean = false;
|
||||
disabledReason: string = '';
|
||||
|
|
|
@ -17,7 +17,7 @@
|
|||
* under the License.
|
||||
*/
|
||||
|
||||
import { esFilters, IndexPattern, TimefilterSetup } from '../../../../../plugins/data/public';
|
||||
import { PhraseFilter, IndexPattern, TimefilterSetup } from '../../../../../plugins/data/public';
|
||||
import { SearchSource as SearchSourceClass, SearchSourceFields } from '../legacy_imports';
|
||||
|
||||
export function createSearchSource(
|
||||
|
@ -26,7 +26,7 @@ export function createSearchSource(
|
|||
indexPattern: IndexPattern,
|
||||
aggs: any,
|
||||
useTimeFilter: boolean,
|
||||
filters: esFilters.PhraseFilter[] = [],
|
||||
filters: PhraseFilter[] = [],
|
||||
timefilter: TimefilterSetup['timefilter']
|
||||
) {
|
||||
const searchSource = initialState ? new SearchSource(initialState) : new SearchSource();
|
||||
|
|
|
@ -22,7 +22,7 @@ import expect from '@kbn/expect';
|
|||
import { FilterManager } from './filter_manager';
|
||||
import { coreMock } from '../../../../../../core/public/mocks';
|
||||
import {
|
||||
esFilters,
|
||||
Filter,
|
||||
IndexPattern,
|
||||
FilterManager as QueryFilterManager,
|
||||
} from '../../../../../../plugins/data/public';
|
||||
|
@ -31,7 +31,7 @@ const setupMock = coreMock.createSetup();
|
|||
|
||||
class FilterManagerTest extends FilterManager {
|
||||
createFilter() {
|
||||
return {} as esFilters.Filter;
|
||||
return {} as Filter;
|
||||
}
|
||||
|
||||
getValueFromFilterBar() {
|
||||
|
@ -44,7 +44,7 @@ describe('FilterManager', function() {
|
|||
|
||||
describe('findFilters', function() {
|
||||
const indexPatternMock = {} as IndexPattern;
|
||||
let kbnFilters: esFilters.Filter[];
|
||||
let kbnFilters: Filter[];
|
||||
const queryFilterMock = new QueryFilterManager(setupMock.uiSettings);
|
||||
queryFilterMock.getAppFilters = () => kbnFilters;
|
||||
queryFilterMock.getGlobalFilters = () => [];
|
||||
|
@ -56,7 +56,7 @@ describe('FilterManager', function() {
|
|||
});
|
||||
|
||||
test('should not find filters that are not controlled by any visualization', function() {
|
||||
kbnFilters.push({} as esFilters.Filter);
|
||||
kbnFilters.push({} as Filter);
|
||||
const foundFilters = filterManager.findFilters();
|
||||
expect(foundFilters.length).to.be(0);
|
||||
});
|
||||
|
@ -66,7 +66,7 @@ describe('FilterManager', function() {
|
|||
meta: {
|
||||
controlledBy: 'anotherControl',
|
||||
},
|
||||
} as esFilters.Filter);
|
||||
} as Filter);
|
||||
const foundFilters = filterManager.findFilters();
|
||||
expect(foundFilters.length).to.be(0);
|
||||
});
|
||||
|
@ -76,7 +76,7 @@ describe('FilterManager', function() {
|
|||
meta: {
|
||||
controlledBy: controlId,
|
||||
},
|
||||
} as esFilters.Filter);
|
||||
} as Filter);
|
||||
const foundFilters = filterManager.findFilters();
|
||||
expect(foundFilters.length).to.be(1);
|
||||
});
|
||||
|
|
|
@ -22,7 +22,7 @@ import _ from 'lodash';
|
|||
import {
|
||||
FilterManager as QueryFilterManager,
|
||||
IndexPattern,
|
||||
esFilters,
|
||||
Filter,
|
||||
} from '../../../../../../plugins/data/public';
|
||||
|
||||
export abstract class FilterManager {
|
||||
|
@ -41,7 +41,7 @@ export abstract class FilterManager {
|
|||
* single phrase: match query
|
||||
* multiple phrases: bool query with should containing list of match_phrase queries
|
||||
*/
|
||||
abstract createFilter(phrases: any): esFilters.Filter;
|
||||
abstract createFilter(phrases: any): Filter;
|
||||
|
||||
abstract getValueFromFilterBar(): any;
|
||||
|
||||
|
@ -53,7 +53,7 @@ export abstract class FilterManager {
|
|||
return this.indexPattern.fields.getByName(this.fieldName);
|
||||
}
|
||||
|
||||
findFilters(): esFilters.Filter[] {
|
||||
findFilters(): Filter[] {
|
||||
const kbnFilters = _.flatten([
|
||||
this.queryFilter.getAppFilters(),
|
||||
this.queryFilter.getGlobalFilters(),
|
||||
|
|
|
@ -20,7 +20,7 @@
|
|||
import expect from '@kbn/expect';
|
||||
|
||||
import {
|
||||
esFilters,
|
||||
Filter,
|
||||
IndexPattern,
|
||||
FilterManager as QueryFilterManager,
|
||||
} from '../../../../../../plugins/data/public';
|
||||
|
@ -88,7 +88,7 @@ describe('PhraseFilterManager', function() {
|
|||
|
||||
describe('getValueFromFilterBar', function() {
|
||||
class MockFindFiltersPhraseFilterManager extends PhraseFilterManager {
|
||||
mockFilters: esFilters.Filter[];
|
||||
mockFilters: Filter[];
|
||||
|
||||
constructor(
|
||||
id: string,
|
||||
|
@ -104,7 +104,7 @@ describe('PhraseFilterManager', function() {
|
|||
return this.mockFilters;
|
||||
}
|
||||
|
||||
setMockFilters(mockFilters: esFilters.Filter[]) {
|
||||
setMockFilters(mockFilters: Filter[]) {
|
||||
this.mockFilters = mockFilters;
|
||||
}
|
||||
}
|
||||
|
@ -133,7 +133,7 @@ describe('PhraseFilterManager', function() {
|
|||
},
|
||||
},
|
||||
},
|
||||
] as esFilters.Filter[]);
|
||||
] as Filter[]);
|
||||
expect(filterManager.getValueFromFilterBar()).to.eql(['ios']);
|
||||
});
|
||||
|
||||
|
@ -159,7 +159,7 @@ describe('PhraseFilterManager', function() {
|
|||
},
|
||||
},
|
||||
},
|
||||
] as esFilters.Filter[]);
|
||||
] as Filter[]);
|
||||
expect(filterManager.getValueFromFilterBar()).to.eql(['ios', 'win xp']);
|
||||
});
|
||||
|
||||
|
@ -183,7 +183,7 @@ describe('PhraseFilterManager', function() {
|
|||
},
|
||||
},
|
||||
},
|
||||
] as esFilters.Filter[]);
|
||||
] as Filter[]);
|
||||
expect(filterManager.getValueFromFilterBar()).to.eql(['ios', 'win xp']);
|
||||
});
|
||||
|
||||
|
@ -199,7 +199,7 @@ describe('PhraseFilterManager', function() {
|
|||
},
|
||||
},
|
||||
},
|
||||
] as esFilters.Filter[]);
|
||||
] as Filter[]);
|
||||
expect(filterManager.getValueFromFilterBar()).to.eql(undefined);
|
||||
});
|
||||
});
|
||||
|
|
|
@ -21,6 +21,7 @@ import _ from 'lodash';
|
|||
|
||||
import { FilterManager } from './filter_manager';
|
||||
import {
|
||||
PhraseFilter,
|
||||
esFilters,
|
||||
IndexPattern,
|
||||
FilterManager as QueryFilterManager,
|
||||
|
@ -36,8 +37,8 @@ export class PhraseFilterManager extends FilterManager {
|
|||
super(controlId, fieldName, indexPattern, queryFilter);
|
||||
}
|
||||
|
||||
createFilter(phrases: any): esFilters.PhraseFilter {
|
||||
let newFilter: esFilters.PhraseFilter;
|
||||
createFilter(phrases: any): PhraseFilter {
|
||||
let newFilter: PhraseFilter;
|
||||
const value = this.indexPattern.fields.getByName(this.fieldName);
|
||||
|
||||
if (!value) {
|
||||
|
@ -79,13 +80,13 @@ export class PhraseFilterManager extends FilterManager {
|
|||
/**
|
||||
* Extract filtering value from kibana filters
|
||||
*
|
||||
* @param {esFilters.PhraseFilter} kbnFilter
|
||||
* @param {PhraseFilter} kbnFilter
|
||||
* @return {Array.<string>} array of values pulled from filter
|
||||
*/
|
||||
private getValueFromFilter(kbnFilter: esFilters.PhraseFilter): any {
|
||||
private getValueFromFilter(kbnFilter: PhraseFilter): any {
|
||||
// bool filter - multiple phrase filters
|
||||
if (_.has(kbnFilter, 'query.bool.should')) {
|
||||
return _.get<esFilters.PhraseFilter[]>(kbnFilter, 'query.bool.should')
|
||||
return _.get<PhraseFilter[]>(kbnFilter, 'query.bool.should')
|
||||
.map(kbnQueryFilter => {
|
||||
return this.getValueFromFilter(kbnQueryFilter);
|
||||
})
|
||||
|
|
|
@ -21,7 +21,8 @@ import expect from '@kbn/expect';
|
|||
|
||||
import { RangeFilterManager } from './range_filter_manager';
|
||||
import {
|
||||
esFilters,
|
||||
RangeFilter,
|
||||
RangeFilterMeta,
|
||||
IndexPattern,
|
||||
FilterManager as QueryFilterManager,
|
||||
} from '../../../../../../plugins/data/public';
|
||||
|
@ -69,7 +70,7 @@ describe('RangeFilterManager', function() {
|
|||
|
||||
describe('getValueFromFilterBar', function() {
|
||||
class MockFindFiltersRangeFilterManager extends RangeFilterManager {
|
||||
mockFilters: esFilters.RangeFilter[];
|
||||
mockFilters: RangeFilter[];
|
||||
|
||||
constructor(
|
||||
id: string,
|
||||
|
@ -85,7 +86,7 @@ describe('RangeFilterManager', function() {
|
|||
return this.mockFilters;
|
||||
}
|
||||
|
||||
setMockFilters(mockFilters: esFilters.RangeFilter[]) {
|
||||
setMockFilters(mockFilters: RangeFilter[]) {
|
||||
this.mockFilters = mockFilters;
|
||||
}
|
||||
}
|
||||
|
@ -111,9 +112,9 @@ describe('RangeFilterManager', function() {
|
|||
lt: 3,
|
||||
},
|
||||
},
|
||||
meta: {} as esFilters.RangeFilterMeta,
|
||||
meta: {} as RangeFilterMeta,
|
||||
},
|
||||
] as esFilters.RangeFilter[]);
|
||||
] as RangeFilter[]);
|
||||
const value = filterManager.getValueFromFilterBar();
|
||||
expect(value).to.be.a('object');
|
||||
expect(value).to.have.property('min');
|
||||
|
@ -131,9 +132,9 @@ describe('RangeFilterManager', function() {
|
|||
lte: 3,
|
||||
},
|
||||
},
|
||||
meta: {} as esFilters.RangeFilterMeta,
|
||||
meta: {} as RangeFilterMeta,
|
||||
},
|
||||
] as esFilters.RangeFilter[]);
|
||||
] as RangeFilter[]);
|
||||
expect(filterManager.getValueFromFilterBar()).to.eql(undefined);
|
||||
});
|
||||
});
|
||||
|
|
|
@ -20,7 +20,12 @@
|
|||
import _ from 'lodash';
|
||||
|
||||
import { FilterManager } from './filter_manager';
|
||||
import { esFilters, IFieldType } from '../../../../../../plugins/data/public';
|
||||
import {
|
||||
esFilters,
|
||||
RangeFilter,
|
||||
RangeFilterParams,
|
||||
IFieldType,
|
||||
} from '../../../../../../plugins/data/public';
|
||||
|
||||
interface SliderValue {
|
||||
min?: string | number;
|
||||
|
@ -36,7 +41,7 @@ function toRange(sliderValue: SliderValue) {
|
|||
}
|
||||
|
||||
// Convert ES range filter into slider value
|
||||
function fromRange(range: esFilters.RangeFilterParams): SliderValue {
|
||||
function fromRange(range: RangeFilterParams): SliderValue {
|
||||
const sliderValue: SliderValue = {};
|
||||
if (_.has(range, 'gte')) {
|
||||
sliderValue.min = _.get(range, 'gte');
|
||||
|
@ -60,7 +65,7 @@ export class RangeFilterManager extends FilterManager {
|
|||
* @param {object} react-input-range value - POJO with `min` and `max` properties
|
||||
* @return {object} range filter
|
||||
*/
|
||||
createFilter(value: SliderValue): esFilters.RangeFilter {
|
||||
createFilter(value: SliderValue): RangeFilter {
|
||||
const newFilter = esFilters.buildRangeFilter(
|
||||
// TODO: Fix type to be required
|
||||
this.indexPattern.fields.getByName(this.fieldName) as IFieldType,
|
||||
|
@ -78,7 +83,7 @@ export class RangeFilterManager extends FilterManager {
|
|||
return;
|
||||
}
|
||||
|
||||
let range: esFilters.RangeFilterParams;
|
||||
let range: RangeFilterParams;
|
||||
if (_.has(kbnFilters[0], 'script')) {
|
||||
range = _.get(kbnFilters[0], 'script.script.params');
|
||||
} else {
|
||||
|
|
|
@ -30,7 +30,7 @@ import { ControlParams } from './editor_utils';
|
|||
import { RangeControl } from './control/range_control_factory';
|
||||
import { ListControl } from './control/list_control_factory';
|
||||
import { InputControlVisDependencies } from './plugin';
|
||||
import { FilterManager, esFilters } from '../../../../plugins/data/public';
|
||||
import { FilterManager, Filter } from '../../../../plugins/data/public';
|
||||
import { VisParams, Vis } from '../../visualizations/public';
|
||||
|
||||
export const createInputControlVisController = (deps: InputControlVisDependencies) => {
|
||||
|
@ -155,7 +155,7 @@ export const createInputControlVisController = (deps: InputControlVisDependencie
|
|||
|
||||
const newFilters = stagedControls
|
||||
.map(control => control.getKbnFilter())
|
||||
.filter((filter): filter is esFilters.Filter => {
|
||||
.filter((filter): filter is Filter => {
|
||||
return filter !== null;
|
||||
});
|
||||
|
||||
|
|
|
@ -18,9 +18,9 @@
|
|||
*/
|
||||
|
||||
import { moveFiltersToQuery, Pre600FilterQuery } from './move_filters_to_query';
|
||||
import { esFilters } from '../../../../../../plugins/data/public';
|
||||
import { esFilters, Filter } from '../../../../../../plugins/data/public';
|
||||
|
||||
const filter: esFilters.Filter = {
|
||||
const filter: Filter = {
|
||||
meta: { disabled: false, negate: false, alias: '' },
|
||||
query: {},
|
||||
$state: { store: esFilters.FilterStateStore.APP_STATE },
|
||||
|
|
|
@ -17,7 +17,7 @@
|
|||
* under the License.
|
||||
*/
|
||||
|
||||
import { esFilters, Query } from '../../../../../../plugins/data/public';
|
||||
import { Filter, Query } from '../../../../../../plugins/data/public';
|
||||
|
||||
export interface Pre600FilterQuery {
|
||||
// pre 6.0.0 global query:queryString:options were stored per dashboard and would
|
||||
|
@ -29,18 +29,18 @@ export interface Pre600FilterQuery {
|
|||
export interface SearchSourcePre600 {
|
||||
// I encountered at least one export from 7.0.0-alpha that was missing the filter property in here.
|
||||
// The maps data in esarchives actually has it, but I don't know how/when they created it.
|
||||
filter?: Array<esFilters.Filter | Pre600FilterQuery>;
|
||||
filter?: Array<Filter | Pre600FilterQuery>;
|
||||
}
|
||||
|
||||
export interface SearchSource730 {
|
||||
filter: esFilters.Filter[];
|
||||
filter: Filter[];
|
||||
query: Query;
|
||||
highlightAll?: boolean;
|
||||
version?: boolean;
|
||||
}
|
||||
|
||||
function isQueryFilter(filter: esFilters.Filter | { query: unknown }): filter is Pre600FilterQuery {
|
||||
return filter.query && !(filter as esFilters.Filter).meta;
|
||||
function isQueryFilter(filter: Filter | { query: unknown }): filter is Pre600FilterQuery {
|
||||
return filter.query && !(filter as Filter).meta;
|
||||
}
|
||||
|
||||
export function moveFiltersToQuery(
|
||||
|
|
|
@ -30,7 +30,7 @@ import {
|
|||
IIndexPattern,
|
||||
TimeRange,
|
||||
Query,
|
||||
esFilters,
|
||||
Filter,
|
||||
SavedQuery,
|
||||
} from '../../../../../../plugins/data/public';
|
||||
|
||||
|
@ -44,7 +44,7 @@ export interface DashboardAppScope extends ng.IScope {
|
|||
screenTitle: string;
|
||||
model: {
|
||||
query: Query;
|
||||
filters: esFilters.Filter[];
|
||||
filters: Filter[];
|
||||
timeRestore: boolean;
|
||||
title: string;
|
||||
description: string;
|
||||
|
@ -69,9 +69,9 @@ export interface DashboardAppScope extends ng.IScope {
|
|||
isPaused: boolean;
|
||||
refreshInterval: any;
|
||||
}) => void;
|
||||
onFiltersUpdated: (filters: esFilters.Filter[]) => void;
|
||||
onFiltersUpdated: (filters: Filter[]) => void;
|
||||
onCancelApplyFilters: () => void;
|
||||
onApplyFilters: (filters: esFilters.Filter[]) => void;
|
||||
onApplyFilters: (filters: Filter[]) => void;
|
||||
onQuerySaved: (savedQuery: SavedQuery) => void;
|
||||
onSavedQueryUpdated: (savedQuery: SavedQuery) => void;
|
||||
onClearSavedQuery: () => void;
|
||||
|
|
|
@ -30,8 +30,7 @@ import { DashboardEmptyScreen, DashboardEmptyScreenProps } from './dashboard_emp
|
|||
|
||||
import { migrateLegacyQuery, SavedObjectSaveOpts, subscribeWithScope } from '../legacy_imports';
|
||||
import {
|
||||
COMPARE_ALL_OPTIONS,
|
||||
compareFilters,
|
||||
esFilters,
|
||||
IndexPattern,
|
||||
IndexPatternsContract,
|
||||
Query,
|
||||
|
@ -319,10 +318,10 @@ export class DashboardAppController {
|
|||
// appState.save which will cause refreshDashboardContainer to be called.
|
||||
|
||||
if (
|
||||
!compareFilters(
|
||||
!esFilters.compareFilters(
|
||||
container.getInput().filters,
|
||||
queryFilter.getFilters(),
|
||||
COMPARE_ALL_OPTIONS
|
||||
esFilters.COMPARE_ALL_OPTIONS
|
||||
)
|
||||
) {
|
||||
// Add filters modifies the object passed to it, hence the clone deep.
|
||||
|
@ -422,7 +421,11 @@ export class DashboardAppController {
|
|||
|
||||
// Filters shouldn't be compared using regular isEqual
|
||||
if (
|
||||
!compareFilters(containerInput.filters, appStateDashboardInput.filters, COMPARE_ALL_OPTIONS)
|
||||
!esFilters.compareFilters(
|
||||
containerInput.filters,
|
||||
appStateDashboardInput.filters,
|
||||
esFilters.COMPARE_ALL_OPTIONS
|
||||
)
|
||||
) {
|
||||
differences.filters = appStateDashboardInput.filters;
|
||||
}
|
||||
|
|
|
@ -27,7 +27,7 @@ import { DashboardContainer } from 'src/legacy/core_plugins/dashboard_embeddable
|
|||
import { ViewMode } from '../../../../../../plugins/embeddable/public';
|
||||
import { migrateLegacyQuery } from '../legacy_imports';
|
||||
import {
|
||||
esFilters,
|
||||
Filter,
|
||||
Query,
|
||||
TimefilterContract as Timefilter,
|
||||
} from '../../../../../../plugins/data/public';
|
||||
|
@ -62,7 +62,7 @@ export class DashboardStateManager {
|
|||
public lastSavedDashboardFilters: {
|
||||
timeTo?: string | Moment;
|
||||
timeFrom?: string | Moment;
|
||||
filterBars: esFilters.Filter[];
|
||||
filterBars: Filter[];
|
||||
query: Query;
|
||||
};
|
||||
private stateDefaults: DashboardAppStateDefaults;
|
||||
|
@ -251,7 +251,7 @@ export class DashboardStateManager {
|
|||
this.stateContainer.transitions.set('fullScreenMode', fullScreenMode);
|
||||
}
|
||||
|
||||
public setFilters(filters: esFilters.Filter[]) {
|
||||
public setFilters(filters: Filter[]) {
|
||||
this.stateContainer.transitions.set('filters', filters);
|
||||
}
|
||||
|
||||
|
@ -367,7 +367,7 @@ export class DashboardStateManager {
|
|||
return this.savedDashboard.timeRestore;
|
||||
}
|
||||
|
||||
public getLastSavedFilterBars(): esFilters.Filter[] {
|
||||
public getLastSavedFilterBars(): Filter[] {
|
||||
return this.lastSavedDashboardFilters.filterBars;
|
||||
}
|
||||
|
||||
|
@ -546,7 +546,7 @@ export class DashboardStateManager {
|
|||
* Applies the current filter state to the dashboard.
|
||||
* @param filter An array of filter bar filters.
|
||||
*/
|
||||
public applyFilters(query: Query, filters: esFilters.Filter[]) {
|
||||
public applyFilters(query: Query, filters: Filter[]) {
|
||||
this.savedDashboard.searchSource.setField('query', query);
|
||||
this.savedDashboard.searchSource.setField('filter', filters);
|
||||
this.stateContainer.transitions.set('query', query);
|
||||
|
|
|
@ -19,7 +19,7 @@
|
|||
|
||||
import _ from 'lodash';
|
||||
import moment, { Moment } from 'moment';
|
||||
import { esFilters } from '../../../../../../../plugins/data/public';
|
||||
import { Filter } from '../../../../../../../plugins/data/public';
|
||||
|
||||
/**
|
||||
* @typedef {Object} QueryFilter
|
||||
|
@ -65,9 +65,9 @@ export class FilterUtils {
|
|||
* @param filters {Array.<Object>}
|
||||
* @returns {Array.<Object>}
|
||||
*/
|
||||
public static cleanFiltersForComparison(filters: esFilters.Filter[]) {
|
||||
public static cleanFiltersForComparison(filters: Filter[]) {
|
||||
return _.map(filters, filter => {
|
||||
const f: Partial<esFilters.Filter> = _.omit(filter, ['$$hashKey', '$state']);
|
||||
const f: Partial<Filter> = _.omit(filter, ['$$hashKey', '$state']);
|
||||
if (f.meta) {
|
||||
// f.meta.value is the value displayed in the filter bar.
|
||||
// It may also be loaded differently and shouldn't be used in this comparison.
|
||||
|
|
|
@ -26,7 +26,7 @@ import {
|
|||
RawSavedDashboardPanel640To720,
|
||||
RawSavedDashboardPanel730ToLatest,
|
||||
} from '../migrations/types';
|
||||
import { Query, esFilters } from '../../../../../../plugins/data/public';
|
||||
import { Query, Filter } from '../../../../../../plugins/data/public';
|
||||
|
||||
export type NavAction = (anchorElement?: any) => void;
|
||||
|
||||
|
@ -103,7 +103,7 @@ export interface DashboardAppState {
|
|||
useMargins: boolean;
|
||||
};
|
||||
query: Query | string;
|
||||
filters: esFilters.Filter[];
|
||||
filters: Filter[];
|
||||
viewMode: ViewMode;
|
||||
savedQuery?: string;
|
||||
}
|
||||
|
|
|
@ -21,7 +21,7 @@ import { createSavedObjectClass } from 'ui/saved_objects/saved_object';
|
|||
import { extractReferences, injectReferences } from './saved_dashboard_references';
|
||||
|
||||
import {
|
||||
esFilters,
|
||||
Filter,
|
||||
ISearchSource,
|
||||
Query,
|
||||
RefreshInterval,
|
||||
|
@ -42,7 +42,7 @@ export interface SavedObjectDashboard extends SavedObject {
|
|||
refreshInterval?: RefreshInterval;
|
||||
searchSource: ISearchSource;
|
||||
getQuery(): Query;
|
||||
getFilters(): esFilters.Filter[];
|
||||
getFilters(): Filter[];
|
||||
}
|
||||
|
||||
// Used only by the savedDashboards service, usually no reason to change this
|
||||
|
|
|
@ -24,7 +24,7 @@ import { fetchHitsInInterval } from './utils/fetch_hits_in_interval';
|
|||
import { generateIntervals } from './utils/generate_intervals';
|
||||
import { getEsQuerySearchAfter } from './utils/get_es_query_search_after';
|
||||
import { getEsQuerySort } from './utils/get_es_query_sort';
|
||||
import { esFilters, IndexPatternsContract } from '../../../../../../../../../plugins/data/public';
|
||||
import { Filter, IndexPatternsContract } from '../../../../../../../../../plugins/data/public';
|
||||
|
||||
export type SurrDocType = 'successors' | 'predecessors';
|
||||
export interface EsHitRecord {
|
||||
|
@ -65,7 +65,7 @@ function fetchContextProvider(indexPatterns: IndexPatternsContract) {
|
|||
tieBreakerField: string,
|
||||
sortDir: SortDirection,
|
||||
size: number,
|
||||
filters: esFilters.Filter[]
|
||||
filters: Filter[]
|
||||
) {
|
||||
if (typeof anchor !== 'object' || anchor === null) {
|
||||
return [];
|
||||
|
@ -110,7 +110,7 @@ function fetchContextProvider(indexPatterns: IndexPatternsContract) {
|
|||
return documents;
|
||||
}
|
||||
|
||||
async function createSearchSource(indexPattern: IndexPattern, filters: esFilters.Filter[]) {
|
||||
async function createSearchSource(indexPattern: IndexPattern, filters: Filter[]) {
|
||||
return new SearchSource()
|
||||
.setParent(undefined)
|
||||
.setField('index', indexPattern)
|
||||
|
|
|
@ -19,7 +19,7 @@
|
|||
|
||||
import _ from 'lodash';
|
||||
import { getServices } from '../../../../kibana_services';
|
||||
import { generateFilters } from '../../../../../../../../../plugins/data/public';
|
||||
import { esFilters } from '../../../../../../../../../plugins/data/public';
|
||||
|
||||
import { MAX_CONTEXT_SIZE, MIN_CONTEXT_SIZE, QUERY_PARAMETER_KEYS } from './constants';
|
||||
|
||||
|
@ -49,7 +49,13 @@ export function getQueryParameterActions() {
|
|||
|
||||
const addFilter = state => async (field, values, operation) => {
|
||||
const indexPatternId = state.queryParameters.indexPatternId;
|
||||
const newFilters = generateFilters(filterManager, field, values, operation, indexPatternId);
|
||||
const newFilters = esFilters.generateFilters(
|
||||
filterManager,
|
||||
field,
|
||||
values,
|
||||
operation,
|
||||
indexPatternId
|
||||
);
|
||||
filterManager.addFilters(newFilters);
|
||||
const indexPattern = await getServices().indexPatterns.get(indexPatternId);
|
||||
indexPattern.popularizeField(field.name, 1);
|
||||
|
|
|
@ -75,7 +75,7 @@ const {
|
|||
|
||||
import { getRootBreadcrumbs, getSavedSearchBreadcrumbs } from '../helpers/breadcrumbs';
|
||||
import {
|
||||
generateFilters,
|
||||
esFilters,
|
||||
indexPatterns as indexPatternsUtils,
|
||||
} from '../../../../../../../plugins/data/public';
|
||||
import { getIndexPatternId } from '../helpers/get_index_pattern_id';
|
||||
|
@ -901,7 +901,7 @@ function discoverController(
|
|||
// TODO: On array fields, negating does not negate the combination, rather all terms
|
||||
$scope.filterQuery = function(field, values, operation) {
|
||||
$scope.indexPattern.popularizeField(field, 1);
|
||||
const newFilters = generateFilters(
|
||||
const newFilters = esFilters.generateFilters(
|
||||
filterManager,
|
||||
field,
|
||||
values,
|
||||
|
|
|
@ -24,10 +24,9 @@ import { ExecuteTriggerActions } from 'src/plugins/ui_actions/public';
|
|||
import { RequestAdapter, Adapters } from '../../../../../../../plugins/inspector/public';
|
||||
import {
|
||||
esFilters,
|
||||
Filter,
|
||||
TimeRange,
|
||||
FilterManager,
|
||||
onlyDisabledFiltersChanged,
|
||||
generateFilters,
|
||||
getTime,
|
||||
Query,
|
||||
IFieldType,
|
||||
|
@ -97,7 +96,7 @@ export class SearchEmbeddable extends Embeddable<SearchInput, SearchOutput>
|
|||
private abortController?: AbortController;
|
||||
|
||||
private prevTimeRange?: TimeRange;
|
||||
private prevFilters?: esFilters.Filter[];
|
||||
private prevFilters?: Filter[];
|
||||
private prevQuery?: Query;
|
||||
|
||||
constructor(
|
||||
|
@ -236,7 +235,13 @@ export class SearchEmbeddable extends Embeddable<SearchInput, SearchOutput>
|
|||
};
|
||||
|
||||
searchScope.filter = async (field, value, operator) => {
|
||||
let filters = generateFilters(this.filterManager, field, value, operator, indexPattern.id!);
|
||||
let filters = esFilters.generateFilters(
|
||||
this.filterManager,
|
||||
field,
|
||||
value,
|
||||
operator,
|
||||
indexPattern.id!
|
||||
);
|
||||
filters = filters.map(filter => ({
|
||||
...filter,
|
||||
$state: { store: esFilters.FilterStateStore.APP_STATE },
|
||||
|
@ -316,7 +321,7 @@ export class SearchEmbeddable extends Embeddable<SearchInput, SearchOutput>
|
|||
|
||||
private pushContainerStateParamsToScope(searchScope: SearchScope) {
|
||||
const isFetchRequired =
|
||||
!onlyDisabledFiltersChanged(this.input.filters, this.prevFilters) ||
|
||||
!esFilters.onlyDisabledFiltersChanged(this.input.filters, this.prevFilters) ||
|
||||
!_.isEqual(this.prevQuery, this.input.query) ||
|
||||
!_.isEqual(this.prevTimeRange, this.input.timeRange) ||
|
||||
!_.isEqual(searchScope.sort, this.input.sort || this.savedSearch.sort);
|
||||
|
|
|
@ -20,17 +20,12 @@
|
|||
import { EmbeddableInput, EmbeddableOutput, IEmbeddable } from 'src/plugins/embeddable/public';
|
||||
import { SavedSearch } from '../types';
|
||||
import { SortOrder } from '../angular/doc_table/components/table_header/helpers';
|
||||
import {
|
||||
esFilters,
|
||||
IIndexPattern,
|
||||
TimeRange,
|
||||
Query,
|
||||
} from '../../../../../../../plugins/data/public';
|
||||
import { Filter, IIndexPattern, TimeRange, Query } from '../../../../../../../plugins/data/public';
|
||||
|
||||
export interface SearchInput extends EmbeddableInput {
|
||||
timeRange: TimeRange;
|
||||
query?: Query;
|
||||
filters?: esFilters.Filter[];
|
||||
filters?: Filter[];
|
||||
hidePanelTitles?: boolean;
|
||||
columns?: string[];
|
||||
sort?: SortOrder[];
|
||||
|
|
|
@ -17,7 +17,7 @@
|
|||
* under the License.
|
||||
*/
|
||||
|
||||
import { TimeRange, Query, esFilters, DataPublicPluginStart } from 'src/plugins/data/public';
|
||||
import { TimeRange, Query, Filter, DataPublicPluginStart } from 'src/plugins/data/public';
|
||||
import { IEmbeddableStart } from 'src/plugins/embeddable/public';
|
||||
import { LegacyCoreStart } from 'kibana/public';
|
||||
import { VisSavedObject, AppState, PersistedState } from '../legacy_imports';
|
||||
|
@ -27,7 +27,7 @@ export interface EditorRenderProps {
|
|||
core: LegacyCoreStart;
|
||||
data: DataPublicPluginStart;
|
||||
embeddables: IEmbeddableStart;
|
||||
filters: esFilters.Filter[];
|
||||
filters: Filter[];
|
||||
uiState: PersistedState;
|
||||
timeRange: TimeRange;
|
||||
query?: Query;
|
||||
|
|
|
@ -20,7 +20,7 @@
|
|||
import { i18n } from '@kbn/i18n';
|
||||
import { KIBANA_CONTEXT_NAME } from 'src/plugins/expressions/public';
|
||||
import { VisParams } from 'src/legacy/core_plugins/visualizations/public';
|
||||
import { TimeRange, esFilters, esQuery, Query } from '../../../../../plugins/data/public';
|
||||
import { TimeRange, Filter, esQuery, Query } from '../../../../../plugins/data/public';
|
||||
import { timezoneProvider } from '../legacy_imports';
|
||||
import { TimelionVisDependencies } from '../plugin';
|
||||
|
||||
|
@ -75,7 +75,7 @@ export function getTimelionRequestHandler({
|
|||
visParams,
|
||||
}: {
|
||||
timeRange: TimeRange;
|
||||
filters: esFilters.Filter[];
|
||||
filters: Filter[];
|
||||
query: Query;
|
||||
visParams: VisParams;
|
||||
forceFetch?: boolean;
|
||||
|
|
|
@ -19,7 +19,7 @@
|
|||
|
||||
// eslint-disable-next-line @kbn/eslint/no-restricted-paths
|
||||
import { getSearchService } from '../../../../plugins/data/public/services';
|
||||
import { esFilters, esQuery, TimeRange, Query } from '../../../../plugins/data/public';
|
||||
import { Filter, esQuery, TimeRange, Query } from '../../../../plugins/data/public';
|
||||
|
||||
// @ts-ignore
|
||||
import { VegaParser } from './data_model/vega_parser';
|
||||
|
@ -33,7 +33,7 @@ import { VisParams } from './vega_fn';
|
|||
|
||||
interface VegaRequestHandlerParams {
|
||||
query: Query;
|
||||
filters: esFilters.Filter;
|
||||
filters: Filter;
|
||||
timeRange: TimeRange;
|
||||
visParams: VisParams;
|
||||
}
|
||||
|
|
|
@ -24,10 +24,10 @@ import { toastNotifications } from 'ui/notify';
|
|||
import { IAggConfig } from 'ui/agg_types';
|
||||
import { timefilter } from 'ui/timefilter';
|
||||
import { Vis } from '../np_ready/public';
|
||||
import { esFilters, Query, SearchSource, ISearchSource } from '../../../../../plugins/data/public';
|
||||
import { Filter, Query, SearchSource, ISearchSource } from '../../../../../plugins/data/public';
|
||||
|
||||
interface QueryGeohashBoundsParams {
|
||||
filters?: esFilters.Filter[];
|
||||
filters?: Filter[];
|
||||
query?: Query;
|
||||
searchSource?: ISearchSource;
|
||||
}
|
||||
|
@ -78,7 +78,7 @@ export async function queryGeohashBounds(vis: Vis, params: QueryGeohashBoundsPar
|
|||
const useTimeFilter = !!indexPattern.timeFieldName;
|
||||
if (useTimeFilter) {
|
||||
const filter = timefilter.createFilter(indexPattern);
|
||||
if (filter) activeFilters.push((filter as any) as esFilters.Filter);
|
||||
if (filter) activeFilters.push((filter as any) as Filter);
|
||||
}
|
||||
return activeFilters;
|
||||
});
|
||||
|
|
|
@ -31,8 +31,8 @@ import {
|
|||
IIndexPattern,
|
||||
TimeRange,
|
||||
Query,
|
||||
onlyDisabledFiltersChanged,
|
||||
esFilters,
|
||||
Filter,
|
||||
ISearchSource,
|
||||
} from '../../../../../plugins/data/public';
|
||||
import {
|
||||
|
@ -75,7 +75,7 @@ export interface VisualizeEmbeddableConfiguration {
|
|||
export interface VisualizeInput extends EmbeddableInput {
|
||||
timeRange?: TimeRange;
|
||||
query?: Query;
|
||||
filters?: esFilters.Filter[];
|
||||
filters?: Filter[];
|
||||
vis?: {
|
||||
colors?: { [key: string]: string };
|
||||
};
|
||||
|
@ -100,7 +100,7 @@ export class VisualizeEmbeddable extends Embeddable<VisualizeInput, VisualizeOut
|
|||
private timeRange?: TimeRange;
|
||||
private query?: Query;
|
||||
private title?: string;
|
||||
private filters?: esFilters.Filter[];
|
||||
private filters?: Filter[];
|
||||
private visCustomizations: VisualizeInput['vis'];
|
||||
private subscriptions: Subscription[] = [];
|
||||
private expression: string = '';
|
||||
|
@ -214,7 +214,7 @@ export class VisualizeEmbeddable extends Embeddable<VisualizeInput, VisualizeOut
|
|||
}
|
||||
|
||||
// Check if filters has changed
|
||||
if (!onlyDisabledFiltersChanged(this.input.filters, this.filters)) {
|
||||
if (!esFilters.onlyDisabledFiltersChanged(this.input.filters, this.filters)) {
|
||||
this.filters = this.input.filters;
|
||||
dirty = true;
|
||||
}
|
||||
|
|
|
@ -19,6 +19,7 @@
|
|||
|
||||
import uiRoutes from 'ui/routes';
|
||||
import { npStart } from 'ui/new_platform';
|
||||
|
||||
import { TimefilterContract, TimeHistoryContract } from '../../../../plugins/data/public';
|
||||
import { registerTimefilterWithGlobalState } from './setup_router';
|
||||
|
||||
|
|
|
@ -20,7 +20,7 @@
|
|||
import React from 'react';
|
||||
import ReactDOM from 'react-dom';
|
||||
import { I18nProvider } from '@kbn/i18n/react';
|
||||
import { RefreshInterval, TimeRange, Query, esFilters } from '../../../data/public';
|
||||
import { RefreshInterval, TimeRange, Query, Filter } from '../../../data/public';
|
||||
import { CoreStart } from '../../../../core/public';
|
||||
import { UiActionsStart } from '../ui_actions_plugin';
|
||||
import {
|
||||
|
@ -45,7 +45,7 @@ import {
|
|||
|
||||
export interface DashboardContainerInput extends ContainerInput {
|
||||
viewMode: ViewMode;
|
||||
filters: esFilters.Filter[];
|
||||
filters: Filter[];
|
||||
query: Query;
|
||||
timeRange: TimeRange;
|
||||
refreshConfig?: RefreshInterval;
|
||||
|
@ -64,7 +64,7 @@ interface IndexSignature {
|
|||
}
|
||||
|
||||
export interface InheritedChildInput extends IndexSignature {
|
||||
filters: esFilters.Filter[];
|
||||
filters: Filter[];
|
||||
query: Query;
|
||||
timeRange: TimeRange;
|
||||
refreshConfig?: RefreshInterval;
|
||||
|
|
|
@ -17,19 +17,28 @@
|
|||
* under the License.
|
||||
*/
|
||||
|
||||
import { esFilters, IIndexPattern, IFieldType } from '../..';
|
||||
import { FilterMeta, FilterStateStore } from '.';
|
||||
import { IIndexPattern, IFieldType } from '../..';
|
||||
import {
|
||||
Filter,
|
||||
FILTERS,
|
||||
FilterStateStore,
|
||||
FilterMeta,
|
||||
buildPhraseFilter,
|
||||
buildPhrasesFilter,
|
||||
buildRangeFilter,
|
||||
buildExistsFilter,
|
||||
} from '.';
|
||||
|
||||
export function buildFilter(
|
||||
indexPattern: IIndexPattern,
|
||||
field: IFieldType,
|
||||
type: esFilters.FILTERS,
|
||||
type: FILTERS,
|
||||
negate: boolean,
|
||||
disabled: boolean,
|
||||
params: any,
|
||||
alias: string | null,
|
||||
store: esFilters.FilterStateStore
|
||||
): esFilters.Filter {
|
||||
store: FilterStateStore
|
||||
): Filter {
|
||||
const filter = buildBaseFilter(indexPattern, field, type, params);
|
||||
filter.meta.alias = alias;
|
||||
filter.meta.negate = negate;
|
||||
|
@ -45,15 +54,15 @@ export function buildCustomFilter(
|
|||
negate: boolean,
|
||||
alias: string | null,
|
||||
store: FilterStateStore
|
||||
): esFilters.Filter {
|
||||
): Filter {
|
||||
const meta: FilterMeta = {
|
||||
index: indexPatternString,
|
||||
type: esFilters.FILTERS.CUSTOM,
|
||||
type: FILTERS.CUSTOM,
|
||||
disabled,
|
||||
negate,
|
||||
alias,
|
||||
};
|
||||
const filter: esFilters.Filter = { ...queryDsl, meta };
|
||||
const filter: Filter = { ...queryDsl, meta };
|
||||
filter.$state = { store };
|
||||
return filter;
|
||||
}
|
||||
|
@ -61,19 +70,19 @@ export function buildCustomFilter(
|
|||
function buildBaseFilter(
|
||||
indexPattern: IIndexPattern,
|
||||
field: IFieldType,
|
||||
type: esFilters.FILTERS,
|
||||
type: FILTERS,
|
||||
params: any
|
||||
): esFilters.Filter {
|
||||
): Filter {
|
||||
switch (type) {
|
||||
case 'phrase':
|
||||
return esFilters.buildPhraseFilter(field, params, indexPattern);
|
||||
return buildPhraseFilter(field, params, indexPattern);
|
||||
case 'phrases':
|
||||
return esFilters.buildPhrasesFilter(field, params, indexPattern);
|
||||
return buildPhrasesFilter(field, params, indexPattern);
|
||||
case 'range':
|
||||
const newParams = { gte: params.from, lt: params.to };
|
||||
return esFilters.buildRangeFilter(field, newParams, indexPattern);
|
||||
return buildRangeFilter(field, newParams, indexPattern);
|
||||
case 'exists':
|
||||
return esFilters.buildExistsFilter(field, indexPattern);
|
||||
return buildExistsFilter(field, indexPattern);
|
||||
default:
|
||||
throw new Error(`Unknown filter type: ${type}`);
|
||||
}
|
||||
|
|
|
@ -17,9 +17,9 @@
|
|||
* under the License.
|
||||
*/
|
||||
|
||||
import { esFilters } from '../../..';
|
||||
import { ExistsFilter, FilterStateStore } from '..';
|
||||
|
||||
export const existsFilter: esFilters.ExistsFilter = {
|
||||
export const existsFilter: ExistsFilter = {
|
||||
meta: {
|
||||
index: 'logstash-*',
|
||||
negate: false,
|
||||
|
@ -29,6 +29,6 @@ export const existsFilter: esFilters.ExistsFilter = {
|
|||
alias: null,
|
||||
},
|
||||
$state: {
|
||||
store: esFilters.FilterStateStore.APP_STATE,
|
||||
store: FilterStateStore.APP_STATE,
|
||||
},
|
||||
};
|
||||
|
|
|
@ -17,9 +17,9 @@
|
|||
* under the License.
|
||||
*/
|
||||
|
||||
import { esFilters } from '../../..';
|
||||
import { PhraseFilter, FilterStateStore } from '..';
|
||||
|
||||
export const phraseFilter: esFilters.PhraseFilter = {
|
||||
export const phraseFilter: PhraseFilter = {
|
||||
meta: {
|
||||
negate: false,
|
||||
index: 'logstash-*',
|
||||
|
@ -33,6 +33,6 @@ export const phraseFilter: esFilters.PhraseFilter = {
|
|||
},
|
||||
},
|
||||
$state: {
|
||||
store: esFilters.FilterStateStore.APP_STATE,
|
||||
store: FilterStateStore.APP_STATE,
|
||||
},
|
||||
};
|
||||
|
|
|
@ -17,9 +17,9 @@
|
|||
* under the License.
|
||||
*/
|
||||
|
||||
import { esFilters } from '../../..';
|
||||
import { FilterStateStore, PhrasesFilter } from '..';
|
||||
|
||||
export const phrasesFilter: esFilters.PhrasesFilter = {
|
||||
export const phrasesFilter: PhrasesFilter = {
|
||||
meta: {
|
||||
index: 'logstash-*',
|
||||
type: 'phrases',
|
||||
|
@ -31,6 +31,6 @@ export const phrasesFilter: esFilters.PhrasesFilter = {
|
|||
alias: null,
|
||||
},
|
||||
$state: {
|
||||
store: esFilters.FilterStateStore.APP_STATE,
|
||||
store: FilterStateStore.APP_STATE,
|
||||
},
|
||||
};
|
||||
|
|
|
@ -17,9 +17,9 @@
|
|||
* under the License.
|
||||
*/
|
||||
|
||||
import { esFilters } from '../../..';
|
||||
import { RangeFilter, FilterStateStore } from '..';
|
||||
|
||||
export const rangeFilter: esFilters.RangeFilter = {
|
||||
export const rangeFilter: RangeFilter = {
|
||||
meta: {
|
||||
index: 'logstash-*',
|
||||
negate: false,
|
||||
|
@ -34,7 +34,7 @@ export const rangeFilter: esFilters.RangeFilter = {
|
|||
},
|
||||
},
|
||||
$state: {
|
||||
store: esFilters.FilterStateStore.APP_STATE,
|
||||
store: FilterStateStore.APP_STATE,
|
||||
},
|
||||
range: {},
|
||||
};
|
||||
|
|
|
@ -17,7 +17,5 @@
|
|||
* under the License.
|
||||
*/
|
||||
export * from './es_query';
|
||||
import * as esFilters from './filters';
|
||||
export * from './filters';
|
||||
export * from './kuery';
|
||||
|
||||
export { esFilters };
|
||||
|
|
|
@ -22,18 +22,12 @@ import { toMountPoint } from '../../../kibana_react/public';
|
|||
import { Action, createAction, IncompatibleActionError } from '../../../ui_actions/public';
|
||||
import { getOverlays, getIndexPatterns } from '../services';
|
||||
import { applyFiltersPopover } from '../ui/apply_filters';
|
||||
import {
|
||||
esFilters,
|
||||
FilterManager,
|
||||
TimefilterContract,
|
||||
changeTimeFilter,
|
||||
extractTimeFilter,
|
||||
} from '..';
|
||||
import { Filter, FilterManager, TimefilterContract, esFilters } from '..';
|
||||
|
||||
export const GLOBAL_APPLY_FILTER_ACTION = 'GLOBAL_APPLY_FILTER_ACTION';
|
||||
|
||||
interface ActionContext {
|
||||
filters: esFilters.Filter[];
|
||||
filters: Filter[];
|
||||
timeFieldName?: string;
|
||||
}
|
||||
|
||||
|
@ -63,7 +57,7 @@ export function createFilterAction(
|
|||
throw new IncompatibleActionError();
|
||||
}
|
||||
|
||||
let selectedFilters: esFilters.Filter[] = filters;
|
||||
let selectedFilters: Filter[] = filters;
|
||||
|
||||
if (selectedFilters.length > 1) {
|
||||
const indexPatterns = await Promise.all(
|
||||
|
@ -72,7 +66,7 @@ export function createFilterAction(
|
|||
})
|
||||
);
|
||||
|
||||
const filterSelectionPromise: Promise<esFilters.Filter[]> = new Promise(resolve => {
|
||||
const filterSelectionPromise: Promise<Filter[]> = new Promise(resolve => {
|
||||
const overlay = getOverlays().openModal(
|
||||
toMountPoint(
|
||||
applyFiltersPopover(
|
||||
|
@ -82,7 +76,7 @@ export function createFilterAction(
|
|||
overlay.close();
|
||||
resolve([]);
|
||||
},
|
||||
(filterSelection: esFilters.Filter[]) => {
|
||||
(filterSelection: Filter[]) => {
|
||||
overlay.close();
|
||||
resolve(filterSelection);
|
||||
}
|
||||
|
@ -98,13 +92,13 @@ export function createFilterAction(
|
|||
}
|
||||
|
||||
if (timeFieldName) {
|
||||
const { timeRangeFilter, restOfFilters } = extractTimeFilter(
|
||||
const { timeRangeFilter, restOfFilters } = esFilters.extractTimeFilter(
|
||||
timeFieldName,
|
||||
selectedFilters
|
||||
);
|
||||
filterManager.addFilters(restOfFilters);
|
||||
if (timeRangeFilter) {
|
||||
changeTimeFilter(timeFilter, timeRangeFilter);
|
||||
esFilters.changeTimeFilter(timeFilter, timeRangeFilter);
|
||||
}
|
||||
} else {
|
||||
filterManager.addFilters(selectedFilters);
|
||||
|
|
|
@ -19,12 +19,101 @@
|
|||
|
||||
import { PluginInitializerContext } from '../../../core/public';
|
||||
|
||||
/*
|
||||
* Filters:
|
||||
*/
|
||||
|
||||
import {
|
||||
FILTERS,
|
||||
buildEmptyFilter,
|
||||
buildPhrasesFilter,
|
||||
buildExistsFilter,
|
||||
buildPhraseFilter,
|
||||
buildQueryFilter,
|
||||
buildRangeFilter,
|
||||
toggleFilterNegated,
|
||||
disableFilter,
|
||||
FilterStateStore,
|
||||
getPhraseFilterField,
|
||||
getPhraseFilterValue,
|
||||
isPhraseFilter,
|
||||
isExistsFilter,
|
||||
isPhrasesFilter,
|
||||
isRangeFilter,
|
||||
isMatchAllFilter,
|
||||
isMissingFilter,
|
||||
isQueryStringFilter,
|
||||
getDisplayValueFromFilter,
|
||||
isFilterPinned,
|
||||
} from '../common';
|
||||
|
||||
import { FilterLabel } from './ui/filter_bar';
|
||||
|
||||
import {
|
||||
compareFilters,
|
||||
COMPARE_ALL_OPTIONS,
|
||||
generateFilters,
|
||||
onlyDisabledFiltersChanged,
|
||||
changeTimeFilter,
|
||||
mapAndFlattenFilters,
|
||||
extractTimeFilter,
|
||||
} from './query';
|
||||
|
||||
// Filter helpers namespace:
|
||||
export const esFilters = {
|
||||
FilterLabel,
|
||||
|
||||
FILTERS,
|
||||
FilterStateStore,
|
||||
|
||||
buildEmptyFilter,
|
||||
buildPhrasesFilter,
|
||||
buildExistsFilter,
|
||||
buildPhraseFilter,
|
||||
buildQueryFilter,
|
||||
buildRangeFilter,
|
||||
|
||||
isPhraseFilter,
|
||||
isExistsFilter,
|
||||
isPhrasesFilter,
|
||||
isRangeFilter,
|
||||
isMatchAllFilter,
|
||||
isMissingFilter,
|
||||
isQueryStringFilter,
|
||||
isFilterPinned,
|
||||
|
||||
toggleFilterNegated,
|
||||
disableFilter,
|
||||
getPhraseFilterField,
|
||||
getPhraseFilterValue,
|
||||
getDisplayValueFromFilter,
|
||||
|
||||
compareFilters,
|
||||
COMPARE_ALL_OPTIONS,
|
||||
generateFilters,
|
||||
onlyDisabledFiltersChanged,
|
||||
|
||||
changeTimeFilter,
|
||||
mapAndFlattenFilters,
|
||||
extractTimeFilter,
|
||||
};
|
||||
|
||||
export {
|
||||
RangeFilter,
|
||||
RangeFilterMeta,
|
||||
RangeFilterParams,
|
||||
ExistsFilter,
|
||||
PhrasesFilter,
|
||||
PhraseFilter,
|
||||
CustomFilter,
|
||||
MatchAllFilter,
|
||||
} from '../common';
|
||||
|
||||
/*
|
||||
* esQuery and esKuery:
|
||||
*/
|
||||
|
||||
import {
|
||||
doesKueryExpressionHaveLuceneSyntaxError,
|
||||
fromKueryExpression,
|
||||
toElasticsearchQuery,
|
||||
nodeTypes,
|
||||
|
@ -37,7 +126,6 @@ import {
|
|||
|
||||
export const esKuery = {
|
||||
nodeTypes,
|
||||
doesKueryExpressionHaveLuceneSyntaxError,
|
||||
fromKueryExpression,
|
||||
toElasticsearchQuery,
|
||||
};
|
||||
|
@ -80,6 +168,7 @@ import {
|
|||
TruncateFormat,
|
||||
} from '../common/field_formats';
|
||||
|
||||
// Field formats helpers namespace:
|
||||
export const fieldFormats = {
|
||||
FieldFormat,
|
||||
FieldFormatsRegistry, // exported only for tests. Consider mock.
|
||||
|
@ -134,6 +223,7 @@ import {
|
|||
formatHitProvider,
|
||||
} from './index_patterns';
|
||||
|
||||
// Index patterns namespace:
|
||||
export const indexPatterns = {
|
||||
ILLEGAL_CHARACTERS_KEY,
|
||||
CONTAINS_SPACES_KEY,
|
||||
|
@ -145,7 +235,7 @@ export const indexPatterns = {
|
|||
validate: validateIndexPattern,
|
||||
getFromSavedObject,
|
||||
flattenHitWrapper,
|
||||
// exported only in stub_index_pattern test. Move into data plugin and remove export.
|
||||
// TODO: exported only in stub_index_pattern test. Move into data plugin and remove export.
|
||||
getRoutes,
|
||||
formatHitProvider,
|
||||
};
|
||||
|
@ -156,7 +246,7 @@ export {
|
|||
Field as IndexPatternField,
|
||||
TypeMeta as IndexPatternTypeMeta,
|
||||
AggregationRestrictions as IndexPatternAggRestrictions,
|
||||
// exported only in stub_index_pattern test. Move into data plugin and remove export.
|
||||
// TODO: exported only in stub_index_pattern test. Move into data plugin and remove export.
|
||||
FieldList as IndexPatternFieldList,
|
||||
} from './index_patterns';
|
||||
|
||||
|
@ -181,33 +271,57 @@ export {
|
|||
QuerySuggestionField,
|
||||
} from './autocomplete';
|
||||
|
||||
export function plugin(initializerContext: PluginInitializerContext) {
|
||||
return new DataPublicPlugin(initializerContext);
|
||||
}
|
||||
/*
|
||||
* Search:
|
||||
*/
|
||||
|
||||
export { IRequestTypesMap, IResponseTypesMap } from './search';
|
||||
export * from './search';
|
||||
|
||||
/**
|
||||
* Types to be shared externally
|
||||
* @public
|
||||
*/
|
||||
export { IRequestTypesMap, IResponseTypesMap } from './search';
|
||||
export * from './types';
|
||||
export { Query, RefreshInterval, TimeRange } from '../common';
|
||||
export { Filter, Query, RefreshInterval, TimeRange } from '../common';
|
||||
|
||||
export * from './search';
|
||||
export * from './query';
|
||||
export * from './ui';
|
||||
export * from './field_formats';
|
||||
export {
|
||||
// es query
|
||||
esFilters,
|
||||
createSavedQueryService,
|
||||
syncAppFilters,
|
||||
syncQuery,
|
||||
getTime,
|
||||
getQueryLog,
|
||||
getQueryStateContainer,
|
||||
FilterManager,
|
||||
SavedQuery,
|
||||
SavedQueryService,
|
||||
SavedQueryTimeFilter,
|
||||
SavedQueryAttributes,
|
||||
InputTimeRange,
|
||||
TimefilterSetup,
|
||||
TimeHistory,
|
||||
TimefilterContract,
|
||||
TimeHistoryContract,
|
||||
} from './query';
|
||||
export * from './ui';
|
||||
export {
|
||||
// kbn field types
|
||||
castEsToKbnFieldTypeName,
|
||||
getKbnFieldType,
|
||||
getKbnTypeNames,
|
||||
// utils
|
||||
parseInterval,
|
||||
} from '../common';
|
||||
|
||||
// Export plugin after all other imports
|
||||
/*
|
||||
* Plugin setup
|
||||
*/
|
||||
|
||||
import { DataPublicPlugin } from './plugin';
|
||||
|
||||
export function plugin(initializerContext: PluginInitializerContext) {
|
||||
return new DataPublicPlugin(initializerContext);
|
||||
}
|
||||
|
||||
export { DataPublicPluginSetup, DataPublicPluginStart, IDataPluginServices } from './types';
|
||||
|
||||
// Export plugin after all other imports
|
||||
export { DataPublicPlugin as Plugin };
|
||||
|
|
|
@ -24,7 +24,7 @@ import { Subscription } from 'rxjs';
|
|||
import { FilterManager } from './filter_manager';
|
||||
import { getFilter } from './test_helpers/get_stub_filter';
|
||||
import { getFiltersArray } from './test_helpers/get_filters_array';
|
||||
import { esFilters } from '../../../common';
|
||||
import { Filter, FilterStateStore } from '../../../common';
|
||||
|
||||
import { coreMock } from '../../../../../core/public/mocks';
|
||||
const setupMock = coreMock.createSetup();
|
||||
|
@ -46,7 +46,7 @@ describe('filter_manager', () => {
|
|||
let updateListener: sinon.SinonSpy<any[], any>;
|
||||
|
||||
let filterManager: FilterManager;
|
||||
let readyFilters: esFilters.Filter[];
|
||||
let readyFilters: Filter[];
|
||||
|
||||
beforeEach(() => {
|
||||
updateListener = sinon.stub();
|
||||
|
@ -89,7 +89,7 @@ describe('filter_manager', () => {
|
|||
|
||||
test('app state should be set', async () => {
|
||||
updateSubscription = filterManager.getUpdates$().subscribe(updateListener);
|
||||
const f1 = getFilter(esFilters.FilterStateStore.APP_STATE, false, false, 'age', 34);
|
||||
const f1 = getFilter(FilterStateStore.APP_STATE, false, false, 'age', 34);
|
||||
filterManager.setFilters([f1]);
|
||||
expect(filterManager.getAppFilters()).toHaveLength(1);
|
||||
expect(filterManager.getGlobalFilters()).toHaveLength(0);
|
||||
|
@ -103,7 +103,7 @@ describe('filter_manager', () => {
|
|||
|
||||
test('global state should be set', async () => {
|
||||
updateSubscription = filterManager.getUpdates$().subscribe(updateListener);
|
||||
const f1 = getFilter(esFilters.FilterStateStore.GLOBAL_STATE, false, false, 'age', 34);
|
||||
const f1 = getFilter(FilterStateStore.GLOBAL_STATE, false, false, 'age', 34);
|
||||
filterManager.setFilters([f1]);
|
||||
expect(filterManager.getAppFilters()).toHaveLength(0);
|
||||
expect(filterManager.getGlobalFilters()).toHaveLength(1);
|
||||
|
@ -117,8 +117,8 @@ describe('filter_manager', () => {
|
|||
|
||||
test('both states should be set', async () => {
|
||||
updateSubscription = filterManager.getUpdates$().subscribe(updateListener);
|
||||
const f1 = getFilter(esFilters.FilterStateStore.GLOBAL_STATE, false, false, 'age', 34);
|
||||
const f2 = getFilter(esFilters.FilterStateStore.APP_STATE, false, false, 'gender', 'FEMALE');
|
||||
const f1 = getFilter(FilterStateStore.GLOBAL_STATE, false, false, 'age', 34);
|
||||
const f2 = getFilter(FilterStateStore.APP_STATE, false, false, 'gender', 'FEMALE');
|
||||
filterManager.setFilters([f1, f2]);
|
||||
expect(filterManager.getAppFilters()).toHaveLength(1);
|
||||
expect(filterManager.getGlobalFilters()).toHaveLength(1);
|
||||
|
@ -135,8 +135,8 @@ describe('filter_manager', () => {
|
|||
|
||||
test('set state should override previous state', async () => {
|
||||
updateSubscription = filterManager.getUpdates$().subscribe(updateListener);
|
||||
const f1 = getFilter(esFilters.FilterStateStore.GLOBAL_STATE, false, false, 'age', 34);
|
||||
const f2 = getFilter(esFilters.FilterStateStore.APP_STATE, false, false, 'gender', 'FEMALE');
|
||||
const f1 = getFilter(FilterStateStore.GLOBAL_STATE, false, false, 'age', 34);
|
||||
const f2 = getFilter(FilterStateStore.APP_STATE, false, false, 'gender', 'FEMALE');
|
||||
|
||||
filterManager.setFilters([f1]);
|
||||
filterManager.setFilters([f2]);
|
||||
|
@ -157,7 +157,7 @@ describe('filter_manager', () => {
|
|||
test('changing a disabled filter should fire only update event', async function() {
|
||||
const updateStub = jest.fn();
|
||||
const fetchStub = jest.fn();
|
||||
const f1 = getFilter(esFilters.FilterStateStore.GLOBAL_STATE, true, false, 'age', 34);
|
||||
const f1 = getFilter(FilterStateStore.GLOBAL_STATE, true, false, 'age', 34);
|
||||
|
||||
filterManager.setFilters([f1]);
|
||||
|
||||
|
@ -183,12 +183,12 @@ describe('filter_manager', () => {
|
|||
const appFilter1 = _.cloneDeep(readyFilters[1]);
|
||||
appFilter1.meta.negate = true;
|
||||
appFilter1.$state = {
|
||||
store: esFilters.FilterStateStore.APP_STATE,
|
||||
store: FilterStateStore.APP_STATE,
|
||||
};
|
||||
const appFilter2 = _.cloneDeep(readyFilters[2]);
|
||||
appFilter2.meta.negate = true;
|
||||
appFilter2.$state = {
|
||||
store: esFilters.FilterStateStore.APP_STATE,
|
||||
store: FilterStateStore.APP_STATE,
|
||||
};
|
||||
|
||||
const globalFilters = filterManager.getFilters();
|
||||
|
@ -199,7 +199,7 @@ describe('filter_manager', () => {
|
|||
expect(res).toHaveLength(3);
|
||||
expect(
|
||||
res.filter(function(filter) {
|
||||
return filter.$state && filter.$state.store === esFilters.FilterStateStore.GLOBAL_STATE;
|
||||
return filter.$state && filter.$state.store === FilterStateStore.GLOBAL_STATE;
|
||||
}).length
|
||||
).toBe(3);
|
||||
});
|
||||
|
@ -233,7 +233,7 @@ describe('filter_manager', () => {
|
|||
});
|
||||
|
||||
test('set filter with no state, and force pin', async () => {
|
||||
const f1 = getFilter(esFilters.FilterStateStore.GLOBAL_STATE, false, false, 'age', 38);
|
||||
const f1 = getFilter(FilterStateStore.GLOBAL_STATE, false, false, 'age', 38);
|
||||
f1.$state = undefined;
|
||||
|
||||
filterManager.setFilters([f1], true);
|
||||
|
@ -242,7 +242,7 @@ describe('filter_manager', () => {
|
|||
});
|
||||
|
||||
test('set filter with no state, and no pin', async () => {
|
||||
const f1 = getFilter(esFilters.FilterStateStore.GLOBAL_STATE, false, false, 'age', 38);
|
||||
const f1 = getFilter(FilterStateStore.GLOBAL_STATE, false, false, 'age', 38);
|
||||
f1.$state = undefined;
|
||||
|
||||
filterManager.setFilters([f1], false);
|
||||
|
@ -251,7 +251,7 @@ describe('filter_manager', () => {
|
|||
});
|
||||
|
||||
test('set filters with default pin', async () => {
|
||||
const f1 = getFilter(esFilters.FilterStateStore.GLOBAL_STATE, false, false, 'age', 38);
|
||||
const f1 = getFilter(FilterStateStore.GLOBAL_STATE, false, false, 'age', 38);
|
||||
f1.$state = undefined;
|
||||
setupMock.uiSettings.get.mockImplementationOnce(uiSettingsMock(true));
|
||||
|
||||
|
@ -261,7 +261,7 @@ describe('filter_manager', () => {
|
|||
});
|
||||
|
||||
test('set filters without default pin', async () => {
|
||||
const f1 = getFilter(esFilters.FilterStateStore.GLOBAL_STATE, false, false, 'age', 38);
|
||||
const f1 = getFilter(FilterStateStore.GLOBAL_STATE, false, false, 'age', 38);
|
||||
f1.$state = undefined;
|
||||
|
||||
setupMock.uiSettings.get.mockImplementationOnce(uiSettingsMock(false));
|
||||
|
@ -274,7 +274,7 @@ describe('filter_manager', () => {
|
|||
describe('add filters', () => {
|
||||
test('app state should accept a single filter', async function() {
|
||||
updateSubscription = filterManager.getUpdates$().subscribe(updateListener);
|
||||
const f1 = getFilter(esFilters.FilterStateStore.APP_STATE, false, false, 'age', 34);
|
||||
const f1 = getFilter(FilterStateStore.APP_STATE, false, false, 'age', 34);
|
||||
filterManager.addFilters(f1);
|
||||
const appFilters = filterManager.getAppFilters();
|
||||
expect(appFilters).toHaveLength(1);
|
||||
|
@ -284,8 +284,8 @@ describe('filter_manager', () => {
|
|||
});
|
||||
|
||||
test('app state should accept array and preserve order', async () => {
|
||||
const f1 = getFilter(esFilters.FilterStateStore.APP_STATE, false, false, 'age', 34);
|
||||
const f2 = getFilter(esFilters.FilterStateStore.APP_STATE, false, false, 'gender', 'female');
|
||||
const f1 = getFilter(FilterStateStore.APP_STATE, false, false, 'age', 34);
|
||||
const f2 = getFilter(FilterStateStore.APP_STATE, false, false, 'gender', 'female');
|
||||
|
||||
filterManager.addFilters([f1]);
|
||||
filterManager.addFilters([f2]);
|
||||
|
@ -297,7 +297,7 @@ describe('filter_manager', () => {
|
|||
|
||||
test('global state should accept a single filer', async () => {
|
||||
updateSubscription = filterManager.getUpdates$().subscribe(updateListener);
|
||||
const f1 = getFilter(esFilters.FilterStateStore.GLOBAL_STATE, false, false, 'age', 34);
|
||||
const f1 = getFilter(FilterStateStore.GLOBAL_STATE, false, false, 'age', 34);
|
||||
filterManager.addFilters(f1);
|
||||
expect(filterManager.getAppFilters()).toHaveLength(0);
|
||||
const globalFilters = filterManager.getGlobalFilters();
|
||||
|
@ -307,14 +307,8 @@ describe('filter_manager', () => {
|
|||
});
|
||||
|
||||
test('global state should be accept array and preserve order', async () => {
|
||||
const f1 = getFilter(esFilters.FilterStateStore.GLOBAL_STATE, false, false, 'age', 34);
|
||||
const f2 = getFilter(
|
||||
esFilters.FilterStateStore.GLOBAL_STATE,
|
||||
false,
|
||||
false,
|
||||
'gender',
|
||||
'female'
|
||||
);
|
||||
const f1 = getFilter(FilterStateStore.GLOBAL_STATE, false, false, 'age', 34);
|
||||
const f2 = getFilter(FilterStateStore.GLOBAL_STATE, false, false, 'gender', 'female');
|
||||
|
||||
filterManager.addFilters([f1, f2]);
|
||||
expect(filterManager.getAppFilters()).toHaveLength(0);
|
||||
|
@ -324,8 +318,8 @@ describe('filter_manager', () => {
|
|||
});
|
||||
|
||||
test('mixed filters: global filters should stay in the beginning', async () => {
|
||||
const f1 = getFilter(esFilters.FilterStateStore.GLOBAL_STATE, false, false, 'age', 34);
|
||||
const f2 = getFilter(esFilters.FilterStateStore.APP_STATE, false, false, 'gender', 'female');
|
||||
const f1 = getFilter(FilterStateStore.GLOBAL_STATE, false, false, 'age', 34);
|
||||
const f2 = getFilter(FilterStateStore.APP_STATE, false, false, 'gender', 'female');
|
||||
filterManager.addFilters([f1, f2]);
|
||||
const filters = filterManager.getFilters();
|
||||
expect(filters).toHaveLength(2);
|
||||
|
@ -333,14 +327,8 @@ describe('filter_manager', () => {
|
|||
});
|
||||
|
||||
test('mixed filters: global filters should move to the beginning', async () => {
|
||||
const f1 = getFilter(esFilters.FilterStateStore.APP_STATE, false, false, 'age', 34);
|
||||
const f2 = getFilter(
|
||||
esFilters.FilterStateStore.GLOBAL_STATE,
|
||||
false,
|
||||
false,
|
||||
'gender',
|
||||
'female'
|
||||
);
|
||||
const f1 = getFilter(FilterStateStore.APP_STATE, false, false, 'age', 34);
|
||||
const f2 = getFilter(FilterStateStore.GLOBAL_STATE, false, false, 'gender', 'female');
|
||||
filterManager.addFilters([f1, f2]);
|
||||
const filters = filterManager.getFilters();
|
||||
expect(filters).toHaveLength(2);
|
||||
|
@ -349,14 +337,8 @@ describe('filter_manager', () => {
|
|||
|
||||
test('add multiple filters at once', async () => {
|
||||
updateSubscription = filterManager.getUpdates$().subscribe(updateListener);
|
||||
const f1 = getFilter(esFilters.FilterStateStore.GLOBAL_STATE, false, false, 'age', 34);
|
||||
const f2 = getFilter(
|
||||
esFilters.FilterStateStore.GLOBAL_STATE,
|
||||
false,
|
||||
false,
|
||||
'gender',
|
||||
'female'
|
||||
);
|
||||
const f1 = getFilter(FilterStateStore.GLOBAL_STATE, false, false, 'age', 34);
|
||||
const f2 = getFilter(FilterStateStore.GLOBAL_STATE, false, false, 'gender', 'female');
|
||||
filterManager.addFilters([f1, f2]);
|
||||
expect(filterManager.getAppFilters()).toHaveLength(0);
|
||||
expect(filterManager.getGlobalFilters()).toHaveLength(2);
|
||||
|
@ -365,8 +347,8 @@ describe('filter_manager', () => {
|
|||
|
||||
test('add same filter to global and app', async () => {
|
||||
updateSubscription = filterManager.getUpdates$().subscribe(updateListener);
|
||||
const f1 = getFilter(esFilters.FilterStateStore.GLOBAL_STATE, false, false, 'age', 34);
|
||||
const f2 = getFilter(esFilters.FilterStateStore.APP_STATE, false, false, 'age', 34);
|
||||
const f1 = getFilter(FilterStateStore.GLOBAL_STATE, false, false, 'age', 34);
|
||||
const f2 = getFilter(FilterStateStore.APP_STATE, false, false, 'age', 34);
|
||||
filterManager.addFilters([f1, f2]);
|
||||
|
||||
// FILTER SHOULD BE ADDED ONLY ONCE, TO GLOBAL
|
||||
|
@ -377,8 +359,8 @@ describe('filter_manager', () => {
|
|||
|
||||
test('add same filter with different values to global and app', async () => {
|
||||
updateSubscription = filterManager.getUpdates$().subscribe(updateListener);
|
||||
const f1 = getFilter(esFilters.FilterStateStore.GLOBAL_STATE, false, false, 'age', 38);
|
||||
const f2 = getFilter(esFilters.FilterStateStore.APP_STATE, false, false, 'age', 34);
|
||||
const f1 = getFilter(FilterStateStore.GLOBAL_STATE, false, false, 'age', 38);
|
||||
const f2 = getFilter(FilterStateStore.APP_STATE, false, false, 'age', 34);
|
||||
filterManager.addFilters([f1, f2]);
|
||||
|
||||
// FILTER SHOULD BE ADDED TWICE
|
||||
|
@ -388,7 +370,7 @@ describe('filter_manager', () => {
|
|||
});
|
||||
|
||||
test('add filter with no state, and force pin', async () => {
|
||||
const f1 = getFilter(esFilters.FilterStateStore.GLOBAL_STATE, false, false, 'age', 38);
|
||||
const f1 = getFilter(FilterStateStore.GLOBAL_STATE, false, false, 'age', 38);
|
||||
f1.$state = undefined;
|
||||
|
||||
filterManager.addFilters([f1], true);
|
||||
|
@ -397,12 +379,12 @@ describe('filter_manager', () => {
|
|||
const f1Output = filterManager.getFilters()[0];
|
||||
expect(f1Output.$state).toBeDefined();
|
||||
if (f1Output.$state) {
|
||||
expect(f1Output.$state.store).toBe(esFilters.FilterStateStore.GLOBAL_STATE);
|
||||
expect(f1Output.$state.store).toBe(FilterStateStore.GLOBAL_STATE);
|
||||
}
|
||||
});
|
||||
|
||||
test('add filter with no state, and dont force pin', async () => {
|
||||
const f1 = getFilter(esFilters.FilterStateStore.GLOBAL_STATE, false, false, 'age', 38);
|
||||
const f1 = getFilter(FilterStateStore.GLOBAL_STATE, false, false, 'age', 38);
|
||||
f1.$state = undefined;
|
||||
|
||||
filterManager.addFilters([f1], false);
|
||||
|
@ -411,7 +393,7 @@ describe('filter_manager', () => {
|
|||
const f1Output = filterManager.getFilters()[0];
|
||||
expect(f1Output.$state).toBeDefined();
|
||||
if (f1Output.$state) {
|
||||
expect(f1Output.$state.store).toBe(esFilters.FilterStateStore.APP_STATE);
|
||||
expect(f1Output.$state.store).toBe(FilterStateStore.APP_STATE);
|
||||
}
|
||||
});
|
||||
|
||||
|
@ -423,11 +405,11 @@ describe('filter_manager', () => {
|
|||
// global filters should be listed first
|
||||
let res = filterManager.getFilters();
|
||||
expect(res).toHaveLength(2);
|
||||
expect(res[0].$state && res[0].$state.store).toEqual(esFilters.FilterStateStore.GLOBAL_STATE);
|
||||
expect(res[0].$state && res[0].$state.store).toEqual(FilterStateStore.GLOBAL_STATE);
|
||||
expect(res[0].meta.disabled).toEqual(filters[1].meta.disabled);
|
||||
expect(res[0].query).toEqual(filters[1].query);
|
||||
|
||||
expect(res[1].$state && res[1].$state.store).toEqual(esFilters.FilterStateStore.APP_STATE);
|
||||
expect(res[1].$state && res[1].$state.store).toEqual(FilterStateStore.APP_STATE);
|
||||
expect(res[1].meta.disabled).toEqual(filters[0].meta.disabled);
|
||||
expect(res[1].query).toEqual(filters[0].query);
|
||||
|
||||
|
@ -447,7 +429,7 @@ describe('filter_manager', () => {
|
|||
const res = filterManager.getFilters();
|
||||
expect(res).toHaveLength(3);
|
||||
_.each(res, function(filter) {
|
||||
expect(filter.$state && filter.$state.store).toBe(esFilters.FilterStateStore.GLOBAL_STATE);
|
||||
expect(filter.$state && filter.$state.store).toBe(FilterStateStore.GLOBAL_STATE);
|
||||
});
|
||||
});
|
||||
|
||||
|
@ -530,7 +512,7 @@ describe('filter_manager', () => {
|
|||
});
|
||||
|
||||
test('should de-dupe global filters being set', async () => {
|
||||
const f1 = getFilter(esFilters.FilterStateStore.GLOBAL_STATE, false, false, 'age', 34);
|
||||
const f1 = getFilter(FilterStateStore.GLOBAL_STATE, false, false, 'age', 34);
|
||||
const f2 = _.cloneDeep(f1);
|
||||
filterManager.setFilters([f1, f2]);
|
||||
expect(filterManager.getAppFilters()).toHaveLength(0);
|
||||
|
@ -539,7 +521,7 @@ describe('filter_manager', () => {
|
|||
});
|
||||
|
||||
test('should de-dupe app filters being set', async () => {
|
||||
const f1 = getFilter(esFilters.FilterStateStore.APP_STATE, false, false, 'age', 34);
|
||||
const f1 = getFilter(FilterStateStore.APP_STATE, false, false, 'age', 34);
|
||||
const f2 = _.cloneDeep(f1);
|
||||
filterManager.setFilters([f1, f2]);
|
||||
expect(filterManager.getAppFilters()).toHaveLength(1);
|
||||
|
@ -554,7 +536,7 @@ describe('filter_manager', () => {
|
|||
const appFilter = _.cloneDeep(readyFilters[idx]);
|
||||
appFilter.meta.negate = true;
|
||||
appFilter.$state = {
|
||||
store: esFilters.FilterStateStore.APP_STATE,
|
||||
store: FilterStateStore.APP_STATE,
|
||||
};
|
||||
filterManager.addFilters(appFilter);
|
||||
const res = filterManager.getFilters();
|
||||
|
@ -571,7 +553,7 @@ describe('filter_manager', () => {
|
|||
const appFilter = _.cloneDeep(readyFilters[1]);
|
||||
appFilter.meta.negate = true;
|
||||
appFilter.$state = {
|
||||
store: esFilters.FilterStateStore.APP_STATE,
|
||||
store: FilterStateStore.APP_STATE,
|
||||
};
|
||||
filterManager.addFilters(appFilter, false);
|
||||
|
||||
|
@ -580,7 +562,7 @@ describe('filter_manager', () => {
|
|||
expect(res).toHaveLength(3);
|
||||
expect(
|
||||
res.filter(function(filter) {
|
||||
return filter.$state && filter.$state.store === esFilters.FilterStateStore.GLOBAL_STATE;
|
||||
return filter.$state && filter.$state.store === FilterStateStore.GLOBAL_STATE;
|
||||
}).length
|
||||
).toBe(3);
|
||||
});
|
||||
|
@ -633,8 +615,8 @@ describe('filter_manager', () => {
|
|||
});
|
||||
|
||||
test('remove on full should clean and fire events', async () => {
|
||||
const f1 = getFilter(esFilters.FilterStateStore.GLOBAL_STATE, false, false, 'age', 34);
|
||||
const f2 = getFilter(esFilters.FilterStateStore.APP_STATE, false, false, 'gender', 'FEMALE');
|
||||
const f1 = getFilter(FilterStateStore.GLOBAL_STATE, false, false, 'age', 34);
|
||||
const f2 = getFilter(FilterStateStore.APP_STATE, false, false, 'gender', 'FEMALE');
|
||||
filterManager.setFilters([f1, f2]);
|
||||
|
||||
updateSubscription = filterManager.getUpdates$().subscribe(updateListener);
|
||||
|
@ -644,9 +626,9 @@ describe('filter_manager', () => {
|
|||
});
|
||||
|
||||
test('remove non existing filter should do nothing and not fire events', async () => {
|
||||
const f1 = getFilter(esFilters.FilterStateStore.GLOBAL_STATE, false, false, 'age', 34);
|
||||
const f2 = getFilter(esFilters.FilterStateStore.APP_STATE, false, false, 'gender', 'FEMALE');
|
||||
const f3 = getFilter(esFilters.FilterStateStore.APP_STATE, false, false, 'country', 'US');
|
||||
const f1 = getFilter(FilterStateStore.GLOBAL_STATE, false, false, 'age', 34);
|
||||
const f2 = getFilter(FilterStateStore.APP_STATE, false, false, 'gender', 'FEMALE');
|
||||
const f3 = getFilter(FilterStateStore.APP_STATE, false, false, 'country', 'US');
|
||||
filterManager.setFilters([f1, f2]);
|
||||
expect(filterManager.getFilters()).toHaveLength(2);
|
||||
|
||||
|
@ -657,9 +639,9 @@ describe('filter_manager', () => {
|
|||
});
|
||||
|
||||
test('remove existing filter should remove and fire events', async () => {
|
||||
const f1 = getFilter(esFilters.FilterStateStore.GLOBAL_STATE, false, false, 'age', 34);
|
||||
const f2 = getFilter(esFilters.FilterStateStore.APP_STATE, false, false, 'gender', 'FEMALE');
|
||||
const f3 = getFilter(esFilters.FilterStateStore.APP_STATE, false, false, 'country', 'US');
|
||||
const f1 = getFilter(FilterStateStore.GLOBAL_STATE, false, false, 'age', 34);
|
||||
const f2 = getFilter(FilterStateStore.APP_STATE, false, false, 'gender', 'FEMALE');
|
||||
const f3 = getFilter(FilterStateStore.APP_STATE, false, false, 'country', 'US');
|
||||
filterManager.setFilters([f1, f2, f3]);
|
||||
expect(filterManager.getFilters()).toHaveLength(3);
|
||||
|
||||
|
|
|
@ -28,10 +28,10 @@ import { mapAndFlattenFilters } from './lib/map_and_flatten_filters';
|
|||
import { uniqFilters } from './lib/uniq_filters';
|
||||
import { onlyDisabledFiltersChanged } from './lib/only_disabled';
|
||||
import { PartitionedFilters } from './types';
|
||||
import { esFilters } from '../../../common';
|
||||
import { FilterStateStore, Filter, isFilterPinned } from '../../../common';
|
||||
|
||||
export class FilterManager {
|
||||
private filters: esFilters.Filter[] = [];
|
||||
private filters: Filter[] = [];
|
||||
private updated$: Subject<void> = new Subject();
|
||||
private fetch$: Subject<void> = new Subject();
|
||||
private uiSettings: IUiSettingsClient;
|
||||
|
@ -40,13 +40,13 @@ export class FilterManager {
|
|||
this.uiSettings = uiSettings;
|
||||
}
|
||||
|
||||
private mergeIncomingFilters(partitionedFilters: PartitionedFilters): esFilters.Filter[] {
|
||||
private mergeIncomingFilters(partitionedFilters: PartitionedFilters): Filter[] {
|
||||
const globalFilters = partitionedFilters.globalFilters;
|
||||
const appFilters = partitionedFilters.appFilters;
|
||||
|
||||
// existing globalFilters should be mutated by appFilters
|
||||
// ignore original appFilters which are already inside globalFilters
|
||||
const cleanedAppFilters: esFilters.Filter[] = [];
|
||||
const cleanedAppFilters: Filter[] = [];
|
||||
_.each(appFilters, function(filter, i) {
|
||||
const match = _.find(globalFilters, function(globalFilter) {
|
||||
return compareFilters(globalFilter, filter);
|
||||
|
@ -64,22 +64,19 @@ export class FilterManager {
|
|||
return FilterManager.mergeFilters(cleanedAppFilters, globalFilters);
|
||||
}
|
||||
|
||||
private static mergeFilters(
|
||||
appFilters: esFilters.Filter[],
|
||||
globalFilters: esFilters.Filter[]
|
||||
): esFilters.Filter[] {
|
||||
private static mergeFilters(appFilters: Filter[], globalFilters: Filter[]): Filter[] {
|
||||
return uniqFilters(appFilters.reverse().concat(globalFilters.reverse())).reverse();
|
||||
}
|
||||
|
||||
private static partitionFilters(filters: esFilters.Filter[]): PartitionedFilters {
|
||||
const [globalFilters, appFilters] = _.partition(filters, esFilters.isFilterPinned);
|
||||
private static partitionFilters(filters: Filter[]): PartitionedFilters {
|
||||
const [globalFilters, appFilters] = _.partition(filters, isFilterPinned);
|
||||
return {
|
||||
globalFilters,
|
||||
appFilters,
|
||||
};
|
||||
}
|
||||
|
||||
private handleStateUpdate(newFilters: esFilters.Filter[]) {
|
||||
private handleStateUpdate(newFilters: Filter[]) {
|
||||
newFilters.sort(sortFilters);
|
||||
|
||||
const filtersUpdated = !compareFilters(this.filters, newFilters, COMPARE_ALL_OPTIONS);
|
||||
|
@ -125,7 +122,7 @@ export class FilterManager {
|
|||
/* Setters */
|
||||
|
||||
public addFilters(
|
||||
filters: esFilters.Filter[] | esFilters.Filter,
|
||||
filters: Filter[] | Filter,
|
||||
pinFilterStatus: boolean = this.uiSettings.get('filters:pinnedByDefault')
|
||||
) {
|
||||
if (!Array.isArray(filters)) {
|
||||
|
@ -136,9 +133,7 @@ export class FilterManager {
|
|||
return;
|
||||
}
|
||||
|
||||
const store = pinFilterStatus
|
||||
? esFilters.FilterStateStore.GLOBAL_STATE
|
||||
: esFilters.FilterStateStore.APP_STATE;
|
||||
const store = pinFilterStatus ? FilterStateStore.GLOBAL_STATE : FilterStateStore.APP_STATE;
|
||||
|
||||
FilterManager.setFiltersStore(filters, store);
|
||||
|
||||
|
@ -155,12 +150,10 @@ export class FilterManager {
|
|||
}
|
||||
|
||||
public setFilters(
|
||||
newFilters: esFilters.Filter[],
|
||||
newFilters: Filter[],
|
||||
pinFilterStatus: boolean = this.uiSettings.get('filters:pinnedByDefault')
|
||||
) {
|
||||
const store = pinFilterStatus
|
||||
? esFilters.FilterStateStore.GLOBAL_STATE
|
||||
: esFilters.FilterStateStore.APP_STATE;
|
||||
const store = pinFilterStatus ? FilterStateStore.GLOBAL_STATE : FilterStateStore.APP_STATE;
|
||||
|
||||
FilterManager.setFiltersStore(newFilters, store);
|
||||
|
||||
|
@ -175,9 +168,9 @@ export class FilterManager {
|
|||
* Removes app filters for which there is a duplicate within new global filters
|
||||
* @param newGlobalFilters
|
||||
*/
|
||||
public setGlobalFilters(newGlobalFilters: esFilters.Filter[]) {
|
||||
public setGlobalFilters(newGlobalFilters: Filter[]) {
|
||||
newGlobalFilters = mapAndFlattenFilters(newGlobalFilters);
|
||||
FilterManager.setFiltersStore(newGlobalFilters, esFilters.FilterStateStore.GLOBAL_STATE, true);
|
||||
FilterManager.setFiltersStore(newGlobalFilters, FilterStateStore.GLOBAL_STATE, true);
|
||||
const { appFilters: currentAppFilters } = this.getPartitionedFilters();
|
||||
// remove duplicates from current app filters, to make sure global will take precedence
|
||||
const filteredAppFilters = currentAppFilters.filter(
|
||||
|
@ -196,9 +189,9 @@ export class FilterManager {
|
|||
* Removes app filters for which there is a duplicate within new global filters
|
||||
* @param newAppFilters
|
||||
*/
|
||||
public setAppFilters(newAppFilters: esFilters.Filter[]) {
|
||||
public setAppFilters(newAppFilters: Filter[]) {
|
||||
newAppFilters = mapAndFlattenFilters(newAppFilters);
|
||||
FilterManager.setFiltersStore(newAppFilters, esFilters.FilterStateStore.APP_STATE, true);
|
||||
FilterManager.setFiltersStore(newAppFilters, FilterStateStore.APP_STATE, true);
|
||||
const { globalFilters: currentGlobalFilters } = this.getPartitionedFilters();
|
||||
// remove duplicates from current global filters, to make sure app will take precedence
|
||||
const filteredGlobalFilters = currentGlobalFilters.filter(
|
||||
|
@ -212,7 +205,7 @@ export class FilterManager {
|
|||
this.handleStateUpdate(newFilters);
|
||||
}
|
||||
|
||||
public removeFilter(filter: esFilters.Filter) {
|
||||
public removeFilter(filter: Filter) {
|
||||
const filterIndex = _.findIndex(this.filters, item => {
|
||||
return _.isEqual(item.meta, filter.meta) && _.isEqual(item.query, filter.query);
|
||||
});
|
||||
|
@ -229,11 +222,11 @@ export class FilterManager {
|
|||
}
|
||||
|
||||
public static setFiltersStore(
|
||||
filters: esFilters.Filter[],
|
||||
store: esFilters.FilterStateStore,
|
||||
filters: Filter[],
|
||||
store: FilterStateStore,
|
||||
shouldOverrideStore = false
|
||||
) {
|
||||
_.map(filters, (filter: esFilters.Filter) => {
|
||||
_.map(filters, (filter: Filter) => {
|
||||
// Override status only for filters that didn't have state in the first place.
|
||||
// or if shouldOverrideStore is explicitly true
|
||||
if (shouldOverrideStore || filter.$state === undefined) {
|
||||
|
|
|
@ -18,28 +18,28 @@
|
|||
*/
|
||||
|
||||
import { compareFilters, COMPARE_ALL_OPTIONS } from './compare_filters';
|
||||
import { esFilters } from '../../../../common';
|
||||
import { buildEmptyFilter, buildQueryFilter, FilterStateStore } from '../../../../common';
|
||||
|
||||
describe('filter manager utilities', () => {
|
||||
describe('compare filters', () => {
|
||||
test('should compare filters', () => {
|
||||
const f1 = esFilters.buildQueryFilter(
|
||||
const f1 = buildQueryFilter(
|
||||
{ _type: { match: { query: 'apache', type: 'phrase' } } },
|
||||
'index',
|
||||
''
|
||||
);
|
||||
const f2 = esFilters.buildEmptyFilter(true);
|
||||
const f2 = buildEmptyFilter(true);
|
||||
|
||||
expect(compareFilters(f1, f2)).toBeFalsy();
|
||||
});
|
||||
|
||||
test('should compare duplicates', () => {
|
||||
const f1 = esFilters.buildQueryFilter(
|
||||
const f1 = buildQueryFilter(
|
||||
{ _type: { match: { query: 'apache', type: 'phrase' } } },
|
||||
'index',
|
||||
''
|
||||
);
|
||||
const f2 = esFilters.buildQueryFilter(
|
||||
const f2 = buildQueryFilter(
|
||||
{ _type: { match: { query: 'apache', type: 'phrase' } } },
|
||||
'index',
|
||||
''
|
||||
|
@ -49,12 +49,12 @@ describe('filter manager utilities', () => {
|
|||
});
|
||||
|
||||
test('should compare duplicates, ignoring meta attributes', () => {
|
||||
const f1 = esFilters.buildQueryFilter(
|
||||
const f1 = buildQueryFilter(
|
||||
{ _type: { match: { query: 'apache', type: 'phrase' } } },
|
||||
'index1',
|
||||
''
|
||||
);
|
||||
const f2 = esFilters.buildQueryFilter(
|
||||
const f2 = buildQueryFilter(
|
||||
{ _type: { match: { query: 'apache', type: 'phrase' } } },
|
||||
'index2',
|
||||
''
|
||||
|
@ -65,33 +65,25 @@ describe('filter manager utilities', () => {
|
|||
|
||||
test('should compare duplicates, ignoring $state attributes', () => {
|
||||
const f1 = {
|
||||
$state: { store: esFilters.FilterStateStore.APP_STATE },
|
||||
...esFilters.buildQueryFilter(
|
||||
{ _type: { match: { query: 'apache', type: 'phrase' } } },
|
||||
'index',
|
||||
''
|
||||
),
|
||||
$state: { store: FilterStateStore.APP_STATE },
|
||||
...buildQueryFilter({ _type: { match: { query: 'apache', type: 'phrase' } } }, 'index', ''),
|
||||
};
|
||||
const f2 = {
|
||||
$state: { store: esFilters.FilterStateStore.GLOBAL_STATE },
|
||||
...esFilters.buildQueryFilter(
|
||||
{ _type: { match: { query: 'apache', type: 'phrase' } } },
|
||||
'index',
|
||||
''
|
||||
),
|
||||
$state: { store: FilterStateStore.GLOBAL_STATE },
|
||||
...buildQueryFilter({ _type: { match: { query: 'apache', type: 'phrase' } } }, 'index', ''),
|
||||
};
|
||||
|
||||
expect(compareFilters(f1, f2)).toBeTruthy();
|
||||
});
|
||||
|
||||
test('should compare filters array to non array', () => {
|
||||
const f1 = esFilters.buildQueryFilter(
|
||||
const f1 = buildQueryFilter(
|
||||
{ _type: { match: { query: 'apache', type: 'phrase' } } },
|
||||
'index',
|
||||
''
|
||||
);
|
||||
|
||||
const f2 = esFilters.buildQueryFilter(
|
||||
const f2 = buildQueryFilter(
|
||||
{ _type: { match: { query: 'mochi', type: 'phrase' } } },
|
||||
'index',
|
||||
''
|
||||
|
@ -101,13 +93,13 @@ describe('filter manager utilities', () => {
|
|||
});
|
||||
|
||||
test('should compare filters array to partial array', () => {
|
||||
const f1 = esFilters.buildQueryFilter(
|
||||
const f1 = buildQueryFilter(
|
||||
{ _type: { match: { query: 'apache', type: 'phrase' } } },
|
||||
'index',
|
||||
''
|
||||
);
|
||||
|
||||
const f2 = esFilters.buildQueryFilter(
|
||||
const f2 = buildQueryFilter(
|
||||
{ _type: { match: { query: 'mochi', type: 'phrase' } } },
|
||||
'index',
|
||||
''
|
||||
|
@ -117,13 +109,13 @@ describe('filter manager utilities', () => {
|
|||
});
|
||||
|
||||
test('should compare filters array to exact array', () => {
|
||||
const f1 = esFilters.buildQueryFilter(
|
||||
const f1 = buildQueryFilter(
|
||||
{ _type: { match: { query: 'apache', type: 'phrase' } } },
|
||||
'index',
|
||||
''
|
||||
);
|
||||
|
||||
const f2 = esFilters.buildQueryFilter(
|
||||
const f2 = buildQueryFilter(
|
||||
{ _type: { match: { query: 'mochi', type: 'phrase' } } },
|
||||
'index',
|
||||
''
|
||||
|
@ -133,12 +125,12 @@ describe('filter manager utilities', () => {
|
|||
});
|
||||
|
||||
test('should compare array of duplicates, ignoring meta attributes', () => {
|
||||
const f1 = esFilters.buildQueryFilter(
|
||||
const f1 = buildQueryFilter(
|
||||
{ _type: { match: { query: 'apache', type: 'phrase' } } },
|
||||
'index1',
|
||||
''
|
||||
);
|
||||
const f2 = esFilters.buildQueryFilter(
|
||||
const f2 = buildQueryFilter(
|
||||
{ _type: { match: { query: 'apache', type: 'phrase' } } },
|
||||
'index2',
|
||||
''
|
||||
|
@ -149,20 +141,12 @@ describe('filter manager utilities', () => {
|
|||
|
||||
test('should compare array of duplicates, ignoring $state attributes', () => {
|
||||
const f1 = {
|
||||
$state: { store: esFilters.FilterStateStore.APP_STATE },
|
||||
...esFilters.buildQueryFilter(
|
||||
{ _type: { match: { query: 'apache', type: 'phrase' } } },
|
||||
'index',
|
||||
''
|
||||
),
|
||||
$state: { store: FilterStateStore.APP_STATE },
|
||||
...buildQueryFilter({ _type: { match: { query: 'apache', type: 'phrase' } } }, 'index', ''),
|
||||
};
|
||||
const f2 = {
|
||||
$state: { store: esFilters.FilterStateStore.GLOBAL_STATE },
|
||||
...esFilters.buildQueryFilter(
|
||||
{ _type: { match: { query: 'apache', type: 'phrase' } } },
|
||||
'index',
|
||||
''
|
||||
),
|
||||
$state: { store: FilterStateStore.GLOBAL_STATE },
|
||||
...buildQueryFilter({ _type: { match: { query: 'apache', type: 'phrase' } } }, 'index', ''),
|
||||
};
|
||||
|
||||
expect(compareFilters([f1], [f2])).toBeTruthy();
|
||||
|
@ -170,20 +154,12 @@ describe('filter manager utilities', () => {
|
|||
|
||||
test('should compare duplicates with COMPARE_ALL_OPTIONS should check store', () => {
|
||||
const f1 = {
|
||||
$state: { store: esFilters.FilterStateStore.APP_STATE },
|
||||
...esFilters.buildQueryFilter(
|
||||
{ _type: { match: { query: 'apache', type: 'phrase' } } },
|
||||
'index',
|
||||
''
|
||||
),
|
||||
$state: { store: FilterStateStore.APP_STATE },
|
||||
...buildQueryFilter({ _type: { match: { query: 'apache', type: 'phrase' } } }, 'index', ''),
|
||||
};
|
||||
const f2 = {
|
||||
$state: { store: esFilters.FilterStateStore.GLOBAL_STATE },
|
||||
...esFilters.buildQueryFilter(
|
||||
{ _type: { match: { query: 'apache', type: 'phrase' } } },
|
||||
'index',
|
||||
''
|
||||
),
|
||||
$state: { store: FilterStateStore.GLOBAL_STATE },
|
||||
...buildQueryFilter({ _type: { match: { query: 'apache', type: 'phrase' } } }, 'index', ''),
|
||||
};
|
||||
|
||||
expect(compareFilters([f1], [f2], COMPARE_ALL_OPTIONS)).toBeFalsy();
|
||||
|
@ -191,20 +167,12 @@ describe('filter manager utilities', () => {
|
|||
|
||||
test('should compare duplicates with COMPARE_ALL_OPTIONS should not check key and value ', () => {
|
||||
const f1 = {
|
||||
$state: { store: esFilters.FilterStateStore.GLOBAL_STATE },
|
||||
...esFilters.buildQueryFilter(
|
||||
{ _type: { match: { query: 'apache', type: 'phrase' } } },
|
||||
'index',
|
||||
''
|
||||
),
|
||||
$state: { store: FilterStateStore.GLOBAL_STATE },
|
||||
...buildQueryFilter({ _type: { match: { query: 'apache', type: 'phrase' } } }, 'index', ''),
|
||||
};
|
||||
const f2 = {
|
||||
$state: { store: esFilters.FilterStateStore.GLOBAL_STATE },
|
||||
...esFilters.buildQueryFilter(
|
||||
{ _type: { match: { query: 'apache', type: 'phrase' } } },
|
||||
'index',
|
||||
''
|
||||
),
|
||||
$state: { store: FilterStateStore.GLOBAL_STATE },
|
||||
...buildQueryFilter({ _type: { match: { query: 'apache', type: 'phrase' } } }, 'index', ''),
|
||||
};
|
||||
|
||||
f2.meta.key = 'wassup';
|
||||
|
|
|
@ -18,7 +18,7 @@
|
|||
*/
|
||||
|
||||
import { defaults, isEqual, omit, map } from 'lodash';
|
||||
import { esFilters } from '../../../../common';
|
||||
import { FilterMeta, Filter } from '../../../../common';
|
||||
|
||||
export interface FilterCompareOptions {
|
||||
disabled?: boolean;
|
||||
|
@ -36,11 +36,11 @@ export const COMPARE_ALL_OPTIONS: FilterCompareOptions = {
|
|||
};
|
||||
|
||||
const mapFilter = (
|
||||
filter: esFilters.Filter,
|
||||
filter: Filter,
|
||||
comparators: FilterCompareOptions,
|
||||
excludedAttributes: string[]
|
||||
) => {
|
||||
const cleaned: esFilters.FilterMeta = omit(filter, excludedAttributes);
|
||||
const cleaned: FilterMeta = omit(filter, excludedAttributes);
|
||||
|
||||
if (comparators.negate) cleaned.negate = filter.meta && Boolean(filter.meta.negate);
|
||||
if (comparators.disabled) cleaned.disabled = filter.meta && Boolean(filter.meta.disabled);
|
||||
|
@ -49,28 +49,26 @@ const mapFilter = (
|
|||
};
|
||||
|
||||
const mapFilterArray = (
|
||||
filters: esFilters.Filter[],
|
||||
filters: Filter[],
|
||||
comparators: FilterCompareOptions,
|
||||
excludedAttributes: string[]
|
||||
) => {
|
||||
return map(filters, (filter: esFilters.Filter) =>
|
||||
mapFilter(filter, comparators, excludedAttributes)
|
||||
);
|
||||
return map(filters, (filter: Filter) => mapFilter(filter, comparators, excludedAttributes));
|
||||
};
|
||||
|
||||
/**
|
||||
* Compare two filters or filter arrays to see if they match.
|
||||
* For filter arrays, the assumption is they are sorted.
|
||||
*
|
||||
* @param {esFilters.Filter | esFilters.Filter[]} first The first filter or filter array to compare
|
||||
* @param {esFilters.Filter | esFilters.Filter[]} second The second filter or filter array to compare
|
||||
* @param {Filter | Filter[]} first The first filter or filter array to compare
|
||||
* @param {Filter | Filter[]} second The second filter or filter array to compare
|
||||
* @param {FilterCompareOptions} comparatorOptions Parameters to use for comparison
|
||||
*
|
||||
* @returns {bool} Filters are the same
|
||||
*/
|
||||
export const compareFilters = (
|
||||
first: esFilters.Filter | esFilters.Filter[],
|
||||
second: esFilters.Filter | esFilters.Filter[],
|
||||
first: Filter | Filter[],
|
||||
second: Filter | Filter[],
|
||||
comparatorOptions: FilterCompareOptions = {}
|
||||
) => {
|
||||
let comparators: FilterCompareOptions = {};
|
||||
|
|
|
@ -18,7 +18,14 @@
|
|||
*/
|
||||
|
||||
import { dedupFilters } from './dedup_filters';
|
||||
import { esFilters, IIndexPattern, IFieldType } from '../../../../common';
|
||||
import {
|
||||
Filter,
|
||||
IIndexPattern,
|
||||
IFieldType,
|
||||
buildRangeFilter,
|
||||
buildQueryFilter,
|
||||
FilterStateStore,
|
||||
} from '../../../../common';
|
||||
|
||||
describe('filter manager utilities', () => {
|
||||
let indexPattern: IIndexPattern;
|
||||
|
@ -31,31 +38,18 @@ describe('filter manager utilities', () => {
|
|||
|
||||
describe('dedupFilters(existing, filters)', () => {
|
||||
test('should return only filters which are not in the existing', () => {
|
||||
const existing: esFilters.Filter[] = [
|
||||
esFilters.buildRangeFilter(
|
||||
{ name: 'bytes' } as IFieldType,
|
||||
{ from: 0, to: 1024 },
|
||||
indexPattern,
|
||||
''
|
||||
),
|
||||
esFilters.buildQueryFilter(
|
||||
{ match: { _term: { query: 'apache', type: 'phrase' } } },
|
||||
'index',
|
||||
''
|
||||
),
|
||||
const existing: Filter[] = [
|
||||
buildRangeFilter({ name: 'bytes' } as IFieldType, { from: 0, to: 1024 }, indexPattern, ''),
|
||||
buildQueryFilter({ match: { _term: { query: 'apache', type: 'phrase' } } }, 'index', ''),
|
||||
];
|
||||
const filters: esFilters.Filter[] = [
|
||||
esFilters.buildRangeFilter(
|
||||
const filters: Filter[] = [
|
||||
buildRangeFilter(
|
||||
{ name: 'bytes' } as IFieldType,
|
||||
{ from: 1024, to: 2048 },
|
||||
indexPattern,
|
||||
''
|
||||
),
|
||||
esFilters.buildQueryFilter(
|
||||
{ match: { _term: { query: 'apache', type: 'phrase' } } },
|
||||
'index',
|
||||
''
|
||||
),
|
||||
buildQueryFilter({ match: { _term: { query: 'apache', type: 'phrase' } } }, 'index', ''),
|
||||
];
|
||||
const results = dedupFilters(existing, filters);
|
||||
|
||||
|
@ -64,15 +58,10 @@ describe('filter manager utilities', () => {
|
|||
});
|
||||
|
||||
test('should ignore the disabled attribute when comparing ', () => {
|
||||
const existing: esFilters.Filter[] = [
|
||||
esFilters.buildRangeFilter(
|
||||
{ name: 'bytes' } as IFieldType,
|
||||
{ from: 0, to: 1024 },
|
||||
indexPattern,
|
||||
''
|
||||
),
|
||||
const existing: Filter[] = [
|
||||
buildRangeFilter({ name: 'bytes' } as IFieldType, { from: 0, to: 1024 }, indexPattern, ''),
|
||||
{
|
||||
...esFilters.buildQueryFilter(
|
||||
...buildQueryFilter(
|
||||
{ match: { _term: { query: 'apache', type: 'phrase' } } },
|
||||
'index1',
|
||||
''
|
||||
|
@ -80,18 +69,14 @@ describe('filter manager utilities', () => {
|
|||
meta: { disabled: true, negate: false, alias: null },
|
||||
},
|
||||
];
|
||||
const filters: esFilters.Filter[] = [
|
||||
esFilters.buildRangeFilter(
|
||||
const filters: Filter[] = [
|
||||
buildRangeFilter(
|
||||
{ name: 'bytes' } as IFieldType,
|
||||
{ from: 1024, to: 2048 },
|
||||
indexPattern,
|
||||
''
|
||||
),
|
||||
esFilters.buildQueryFilter(
|
||||
{ match: { _term: { query: 'apache', type: 'phrase' } } },
|
||||
'index1',
|
||||
''
|
||||
),
|
||||
buildQueryFilter({ match: { _term: { query: 'apache', type: 'phrase' } } }, 'index1', ''),
|
||||
];
|
||||
const results = dedupFilters(existing, filters);
|
||||
|
||||
|
@ -100,36 +85,31 @@ describe('filter manager utilities', () => {
|
|||
});
|
||||
|
||||
test('should ignore $state attribute', () => {
|
||||
const existing: esFilters.Filter[] = [
|
||||
esFilters.buildRangeFilter(
|
||||
{ name: 'bytes' } as IFieldType,
|
||||
{ from: 0, to: 1024 },
|
||||
indexPattern,
|
||||
''
|
||||
),
|
||||
const existing: Filter[] = [
|
||||
buildRangeFilter({ name: 'bytes' } as IFieldType, { from: 0, to: 1024 }, indexPattern, ''),
|
||||
{
|
||||
...esFilters.buildQueryFilter(
|
||||
...buildQueryFilter(
|
||||
{ match: { _term: { query: 'apache', type: 'phrase' } } },
|
||||
'index',
|
||||
''
|
||||
),
|
||||
$state: { store: esFilters.FilterStateStore.APP_STATE },
|
||||
$state: { store: FilterStateStore.APP_STATE },
|
||||
},
|
||||
];
|
||||
const filters: esFilters.Filter[] = [
|
||||
esFilters.buildRangeFilter(
|
||||
const filters: Filter[] = [
|
||||
buildRangeFilter(
|
||||
{ name: 'bytes' } as IFieldType,
|
||||
{ from: 1024, to: 2048 },
|
||||
indexPattern,
|
||||
''
|
||||
),
|
||||
{
|
||||
...esFilters.buildQueryFilter(
|
||||
...buildQueryFilter(
|
||||
{ match: { _term: { query: 'apache', type: 'phrase' } } },
|
||||
'index',
|
||||
''
|
||||
),
|
||||
$state: { store: esFilters.FilterStateStore.GLOBAL_STATE },
|
||||
$state: { store: FilterStateStore.GLOBAL_STATE },
|
||||
},
|
||||
];
|
||||
const results = dedupFilters(existing, filters);
|
||||
|
|
|
@ -19,7 +19,7 @@
|
|||
|
||||
import { filter, find } from 'lodash';
|
||||
import { compareFilters, FilterCompareOptions } from './compare_filters';
|
||||
import { esFilters } from '../../../../common';
|
||||
import { Filter } from '../../../../common';
|
||||
|
||||
/**
|
||||
* Combine 2 filter collections, removing duplicates
|
||||
|
@ -31,8 +31,8 @@ import { esFilters } from '../../../../common';
|
|||
* @returns {object} An array of filters that were not in existing
|
||||
*/
|
||||
export const dedupFilters = (
|
||||
existingFilters: esFilters.Filter[],
|
||||
filters: esFilters.Filter[],
|
||||
existingFilters: Filter[],
|
||||
filters: Filter[],
|
||||
comparatorOptions: FilterCompareOptions = {}
|
||||
) => {
|
||||
if (!Array.isArray(filters)) {
|
||||
|
@ -41,8 +41,8 @@ export const dedupFilters = (
|
|||
|
||||
return filter(
|
||||
filters,
|
||||
(f: esFilters.Filter) =>
|
||||
!find(existingFilters, (existingFilter: esFilters.Filter) =>
|
||||
(f: Filter) =>
|
||||
!find(existingFilters, (existingFilter: Filter) =>
|
||||
compareFilters(existingFilter, f, comparatorOptions)
|
||||
)
|
||||
);
|
||||
|
|
|
@ -20,7 +20,15 @@
|
|||
import { generateFilters } from './generate_filters';
|
||||
import { FilterManager } from '../filter_manager';
|
||||
|
||||
import { esFilters, IFieldType, IIndexPattern } from '../../../../common';
|
||||
import {
|
||||
Filter,
|
||||
IFieldType,
|
||||
IIndexPattern,
|
||||
isExistsFilter,
|
||||
buildExistsFilter,
|
||||
PhraseFilter,
|
||||
isPhraseFilter,
|
||||
} from '../../../../common';
|
||||
|
||||
const INDEX_NAME = 'my-index';
|
||||
const EXISTS_FIELD_NAME = '_exists_';
|
||||
|
@ -31,7 +39,7 @@ const PHRASE_VALUE = 'my-value';
|
|||
|
||||
describe('Generate filters', () => {
|
||||
let mockFilterManager: FilterManager;
|
||||
let filtersArray: esFilters.Filter[];
|
||||
let filtersArray: Filter[];
|
||||
|
||||
beforeEach(() => {
|
||||
filtersArray = [];
|
||||
|
@ -53,7 +61,7 @@ describe('Generate filters', () => {
|
|||
expect(filters).toHaveLength(1);
|
||||
expect(filters[0].meta.index === INDEX_NAME);
|
||||
expect(filters[0].meta.negate).toBeFalsy();
|
||||
expect(esFilters.isExistsFilter(filters[0])).toBeTruthy();
|
||||
expect(isExistsFilter(filters[0])).toBeTruthy();
|
||||
});
|
||||
|
||||
it('should create negated exists filter', () => {
|
||||
|
@ -67,11 +75,11 @@ describe('Generate filters', () => {
|
|||
expect(filters).toHaveLength(1);
|
||||
expect(filters[0].meta.index === INDEX_NAME);
|
||||
expect(filters[0].meta.negate).toBeTruthy();
|
||||
expect(esFilters.isExistsFilter(filters[0])).toBeTruthy();
|
||||
expect(isExistsFilter(filters[0])).toBeTruthy();
|
||||
});
|
||||
|
||||
it('should update and re-enable EXISTING exists filter', () => {
|
||||
const filter = esFilters.buildExistsFilter(FIELD, { id: INDEX_NAME } as IIndexPattern);
|
||||
const filter = buildExistsFilter(FIELD, { id: INDEX_NAME } as IIndexPattern);
|
||||
filter.meta.disabled = true;
|
||||
filtersArray.push(filter);
|
||||
|
||||
|
@ -80,7 +88,7 @@ describe('Generate filters', () => {
|
|||
expect(filters[0].meta.index === INDEX_NAME);
|
||||
expect(filters[0].meta.negate).toBeTruthy();
|
||||
expect(filters[0].meta.disabled).toBeFalsy();
|
||||
expect(esFilters.isExistsFilter(filters[0])).toBeTruthy();
|
||||
expect(isExistsFilter(filters[0])).toBeTruthy();
|
||||
});
|
||||
|
||||
it('should create phrase filter', () => {
|
||||
|
@ -88,8 +96,8 @@ describe('Generate filters', () => {
|
|||
expect(filters).toHaveLength(1);
|
||||
expect(filters[0].meta.index === INDEX_NAME);
|
||||
expect(filters[0].meta.negate).toBeFalsy();
|
||||
expect(esFilters.isPhraseFilter(filters[0])).toBeTruthy();
|
||||
expect((filters[0] as esFilters.PhraseFilter).query.match_phrase).toEqual({
|
||||
expect(isPhraseFilter(filters[0])).toBeTruthy();
|
||||
expect((filters[0] as PhraseFilter).query.match_phrase).toEqual({
|
||||
[FIELD.name]: PHRASE_VALUE,
|
||||
});
|
||||
});
|
||||
|
@ -99,8 +107,8 @@ describe('Generate filters', () => {
|
|||
expect(filters).toHaveLength(1);
|
||||
expect(filters[0].meta.index === INDEX_NAME);
|
||||
expect(filters[0].meta.negate).toBeTruthy();
|
||||
expect(esFilters.isPhraseFilter(filters[0])).toBeTruthy();
|
||||
expect((filters[0] as esFilters.PhraseFilter).query.match_phrase).toEqual({
|
||||
expect(isPhraseFilter(filters[0])).toBeTruthy();
|
||||
expect((filters[0] as PhraseFilter).query.match_phrase).toEqual({
|
||||
[FIELD.name]: PHRASE_VALUE,
|
||||
});
|
||||
});
|
||||
|
@ -119,12 +127,12 @@ describe('Generate filters', () => {
|
|||
expect(filters[0].meta.negate).toBeFalsy();
|
||||
expect(filters[1].meta.index === INDEX_NAME);
|
||||
expect(filters[1].meta.negate).toBeFalsy();
|
||||
expect(esFilters.isPhraseFilter(filters[0])).toBeTruthy();
|
||||
expect(esFilters.isPhraseFilter(filters[1])).toBeTruthy();
|
||||
expect((filters[0] as esFilters.PhraseFilter).query.match_phrase).toEqual({
|
||||
expect(isPhraseFilter(filters[0])).toBeTruthy();
|
||||
expect(isPhraseFilter(filters[1])).toBeTruthy();
|
||||
expect((filters[0] as PhraseFilter).query.match_phrase).toEqual({
|
||||
[FIELD.name]: PHRASE_VALUE,
|
||||
});
|
||||
expect((filters[1] as esFilters.PhraseFilter).query.match_phrase).toEqual({
|
||||
expect((filters[1] as PhraseFilter).query.match_phrase).toEqual({
|
||||
[FIELD.name]: ANOTHER_PHRASE,
|
||||
});
|
||||
});
|
||||
|
|
|
@ -18,36 +18,45 @@
|
|||
*/
|
||||
|
||||
import _ from 'lodash';
|
||||
import { esFilters, IFieldType, IIndexPattern } from '../../../../common';
|
||||
import {
|
||||
IFieldType,
|
||||
IIndexPattern,
|
||||
Filter,
|
||||
isExistsFilter,
|
||||
isPhraseFilter,
|
||||
getPhraseFilterValue,
|
||||
getPhraseFilterField,
|
||||
isScriptedPhraseFilter,
|
||||
buildFilter,
|
||||
FilterStateStore,
|
||||
FILTERS,
|
||||
} from '../../../../common';
|
||||
import { FilterManager } from '../filter_manager';
|
||||
|
||||
function getExistingFilter(
|
||||
appFilters: esFilters.Filter[],
|
||||
appFilters: Filter[],
|
||||
fieldName: string,
|
||||
value: any
|
||||
): esFilters.Filter | undefined {
|
||||
): Filter | undefined {
|
||||
// TODO: On array fields, negating does not negate the combination, rather all terms
|
||||
return _.find(appFilters, function(filter) {
|
||||
if (!filter) return;
|
||||
|
||||
if (fieldName === '_exists_' && esFilters.isExistsFilter(filter)) {
|
||||
if (fieldName === '_exists_' && isExistsFilter(filter)) {
|
||||
return filter.exists!.field === value;
|
||||
}
|
||||
|
||||
if (esFilters.isPhraseFilter(filter)) {
|
||||
return (
|
||||
esFilters.getPhraseFilterField(filter) === fieldName &&
|
||||
esFilters.getPhraseFilterValue(filter) === value
|
||||
);
|
||||
if (isPhraseFilter(filter)) {
|
||||
return getPhraseFilterField(filter) === fieldName && getPhraseFilterValue(filter) === value;
|
||||
}
|
||||
|
||||
if (esFilters.isScriptedPhraseFilter(filter)) {
|
||||
if (isScriptedPhraseFilter(filter)) {
|
||||
return filter.meta.field === fieldName && filter.script!.script.params.value === value;
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
function updateExistingFilter(existingFilter: esFilters.Filter, negate: boolean) {
|
||||
function updateExistingFilter(existingFilter: Filter, negate: boolean) {
|
||||
existingFilter.meta.disabled = false;
|
||||
if (existingFilter.meta.negate !== negate) {
|
||||
existingFilter.meta.negate = !existingFilter.meta.negate;
|
||||
|
@ -72,7 +81,7 @@ export function generateFilters(
|
|||
values: any,
|
||||
operation: string,
|
||||
index: string
|
||||
): esFilters.Filter[] {
|
||||
): Filter[] {
|
||||
values = Array.isArray(values) ? values : [values];
|
||||
const fieldObj = (_.isObject(field)
|
||||
? field
|
||||
|
@ -80,7 +89,7 @@ export function generateFilters(
|
|||
name: field,
|
||||
}) as IFieldType;
|
||||
const fieldName = fieldObj.name;
|
||||
const newFilters: esFilters.Filter[] = [];
|
||||
const newFilters: Filter[] = [];
|
||||
const appFilters = filterManager.getAppFilters();
|
||||
|
||||
const negate = operation === '-';
|
||||
|
@ -95,9 +104,8 @@ export function generateFilters(
|
|||
} else {
|
||||
const tmpIndexPattern = { id: index } as IIndexPattern;
|
||||
|
||||
const filterType =
|
||||
fieldName === '_exists_' ? esFilters.FILTERS.EXISTS : esFilters.FILTERS.PHRASE;
|
||||
filter = esFilters.buildFilter(
|
||||
const filterType = fieldName === '_exists_' ? FILTERS.EXISTS : FILTERS.PHRASE;
|
||||
filter = buildFilter(
|
||||
tmpIndexPattern,
|
||||
fieldObj,
|
||||
filterType,
|
||||
|
@ -105,7 +113,7 @@ export function generateFilters(
|
|||
false,
|
||||
value,
|
||||
null,
|
||||
esFilters.FilterStateStore.APP_STATE
|
||||
FilterStateStore.APP_STATE
|
||||
);
|
||||
}
|
||||
|
||||
|
|
|
@ -19,7 +19,7 @@
|
|||
|
||||
import sinon from 'sinon';
|
||||
import { generateMappingChain } from './generate_mapping_chain';
|
||||
import { esFilters } from '../../../../common';
|
||||
import { buildEmptyFilter } from '../../../../common';
|
||||
|
||||
describe('filter manager utilities', () => {
|
||||
let mapping: any;
|
||||
|
@ -32,7 +32,7 @@ describe('filter manager utilities', () => {
|
|||
|
||||
describe('generateMappingChain()', () => {
|
||||
test('should create a chaining function which calls the next function if the error is thrown', async () => {
|
||||
const filter = esFilters.buildEmptyFilter(true);
|
||||
const filter = buildEmptyFilter(true);
|
||||
|
||||
mapping.throws(filter);
|
||||
next.returns('good');
|
||||
|
@ -45,7 +45,7 @@ describe('filter manager utilities', () => {
|
|||
});
|
||||
|
||||
test('should create a chaining function which DOES NOT call the next function if the result is returned', async () => {
|
||||
const filter = esFilters.buildEmptyFilter(true);
|
||||
const filter = buildEmptyFilter(true);
|
||||
|
||||
mapping.returns('good');
|
||||
next.returns('bad');
|
||||
|
@ -57,7 +57,7 @@ describe('filter manager utilities', () => {
|
|||
});
|
||||
|
||||
test('should resolve result for the mapping function', async () => {
|
||||
const filter = esFilters.buildEmptyFilter(true);
|
||||
const filter = buildEmptyFilter(true);
|
||||
|
||||
mapping.returns({ key: 'test', value: 'example' });
|
||||
|
||||
|
@ -70,7 +70,7 @@ describe('filter manager utilities', () => {
|
|||
|
||||
test('should call the mapping function with the argument to the chain', async () => {
|
||||
// @ts-ignore
|
||||
const filter: esFilters.Filter = { test: 'example' };
|
||||
const filter: Filter = { test: 'example' };
|
||||
|
||||
mapping.returns({ key: 'test', value: 'example' });
|
||||
|
||||
|
@ -84,7 +84,7 @@ describe('filter manager utilities', () => {
|
|||
});
|
||||
|
||||
test('should resolve result for the next function', async () => {
|
||||
const filter = esFilters.buildEmptyFilter(true);
|
||||
const filter = buildEmptyFilter(true);
|
||||
|
||||
mapping.throws(filter);
|
||||
next.returns({ key: 'test', value: 'example' });
|
||||
|
@ -98,7 +98,7 @@ describe('filter manager utilities', () => {
|
|||
});
|
||||
|
||||
test('should throw an error if no functions match', async done => {
|
||||
const filter = esFilters.buildEmptyFilter(true);
|
||||
const filter = buildEmptyFilter(true);
|
||||
|
||||
mapping.throws(filter);
|
||||
|
||||
|
|
|
@ -16,14 +16,14 @@
|
|||
* specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*/
|
||||
import { esFilters } from '../../../../common';
|
||||
import { Filter } from '../../../../common';
|
||||
|
||||
const noop = () => {
|
||||
throw new Error('No mappings have been found for filter.');
|
||||
};
|
||||
|
||||
export const generateMappingChain = (fn: Function, next: Function = noop) => {
|
||||
return (filter: esFilters.Filter) => {
|
||||
return (filter: Filter) => {
|
||||
try {
|
||||
return fn(filter);
|
||||
} catch (result) {
|
||||
|
|
|
@ -18,13 +18,13 @@
|
|||
*/
|
||||
|
||||
import { mapAndFlattenFilters } from './map_and_flatten_filters';
|
||||
import { esFilters } from '../../../../common';
|
||||
import { Filter } from '../../../../common';
|
||||
|
||||
describe('filter manager utilities', () => {
|
||||
describe('mapAndFlattenFilters()', () => {
|
||||
let filters: unknown;
|
||||
|
||||
function getDisplayName(filter: esFilters.Filter) {
|
||||
function getDisplayName(filter: Filter) {
|
||||
return typeof filter.meta.value === 'function' ? filter.meta.value() : filter.meta.value;
|
||||
}
|
||||
|
||||
|
@ -45,7 +45,7 @@ describe('filter manager utilities', () => {
|
|||
});
|
||||
|
||||
test('should map and flatten the filters', () => {
|
||||
const results = mapAndFlattenFilters(filters as esFilters.Filter[]);
|
||||
const results = mapAndFlattenFilters(filters as Filter[]);
|
||||
|
||||
expect(results).toHaveLength(5);
|
||||
expect(results[0]).toHaveProperty('meta');
|
||||
|
|
|
@ -19,8 +19,8 @@
|
|||
|
||||
import { compact, flatten } from 'lodash';
|
||||
import { mapFilter } from './map_filter';
|
||||
import { esFilters } from '../../../../common';
|
||||
import { Filter } from '../../../../common';
|
||||
|
||||
export const mapAndFlattenFilters = (filters: esFilters.Filter[]) => {
|
||||
return compact(flatten(filters)).map((item: esFilters.Filter) => mapFilter(item));
|
||||
export const mapAndFlattenFilters = (filters: Filter[]) => {
|
||||
return compact(flatten(filters)).map((item: Filter) => mapFilter(item));
|
||||
};
|
||||
|
|
|
@ -18,10 +18,10 @@
|
|||
*/
|
||||
|
||||
import { mapFilter } from './map_filter';
|
||||
import { esFilters } from '../../../../common';
|
||||
import { Filter } from '../../../../common';
|
||||
|
||||
describe('filter manager utilities', () => {
|
||||
function getDisplayName(filter: esFilters.Filter) {
|
||||
function getDisplayName(filter: Filter) {
|
||||
return typeof filter.meta.value === 'function' ? filter.meta.value() : filter.meta.value;
|
||||
}
|
||||
|
||||
|
@ -31,7 +31,7 @@ describe('filter manager utilities', () => {
|
|||
meta: { index: 'logstash-*' },
|
||||
query: { match: { _type: { query: 'apache', type: 'phrase' } } },
|
||||
};
|
||||
const after = mapFilter(before as esFilters.Filter);
|
||||
const after = mapFilter(before as Filter);
|
||||
|
||||
expect(after).toHaveProperty('meta');
|
||||
expect(after.meta).toHaveProperty('key', '_type');
|
||||
|
@ -43,7 +43,7 @@ describe('filter manager utilities', () => {
|
|||
|
||||
test('should map exists filters', async () => {
|
||||
const before: any = { meta: { index: 'logstash-*' }, exists: { field: '@timestamp' } };
|
||||
const after = mapFilter(before as esFilters.Filter);
|
||||
const after = mapFilter(before as Filter);
|
||||
|
||||
expect(after).toHaveProperty('meta');
|
||||
expect(after.meta).toHaveProperty('key', '@timestamp');
|
||||
|
@ -55,7 +55,7 @@ describe('filter manager utilities', () => {
|
|||
|
||||
test('should map missing filters', async () => {
|
||||
const before: any = { meta: { index: 'logstash-*' }, missing: { field: '@timestamp' } };
|
||||
const after = mapFilter(before as esFilters.Filter);
|
||||
const after = mapFilter(before as Filter);
|
||||
|
||||
expect(after).toHaveProperty('meta');
|
||||
expect(after.meta).toHaveProperty('key', '@timestamp');
|
||||
|
@ -67,7 +67,7 @@ describe('filter manager utilities', () => {
|
|||
|
||||
test('should map json filter', async () => {
|
||||
const before: any = { meta: { index: 'logstash-*' }, query: { match_all: {} } };
|
||||
const after = mapFilter(before as esFilters.Filter);
|
||||
const after = mapFilter(before as Filter);
|
||||
|
||||
expect(after).toHaveProperty('meta');
|
||||
expect(after.meta).toHaveProperty('key', 'query');
|
||||
|
@ -81,7 +81,7 @@ describe('filter manager utilities', () => {
|
|||
const before: any = { meta: { index: 'logstash-*' } };
|
||||
|
||||
try {
|
||||
mapFilter(before as esFilters.Filter);
|
||||
mapFilter(before as Filter);
|
||||
} catch (e) {
|
||||
expect(e).toBeInstanceOf(Error);
|
||||
expect(e.message).toBe('No mappings have been found for filter.');
|
||||
|
|
|
@ -31,9 +31,9 @@ import { mapGeoBoundingBox } from './mappers/map_geo_bounding_box';
|
|||
import { mapGeoPolygon } from './mappers/map_geo_polygon';
|
||||
import { mapDefault } from './mappers/map_default';
|
||||
import { generateMappingChain } from './generate_mapping_chain';
|
||||
import { esFilters } from '../../../../common';
|
||||
import { Filter } from '../../../../common';
|
||||
|
||||
export function mapFilter(filter: esFilters.Filter) {
|
||||
export function mapFilter(filter: Filter) {
|
||||
/** Mappers **/
|
||||
|
||||
// Each mapper is a simple promise function that test if the mapper can
|
||||
|
|
|
@ -18,12 +18,12 @@
|
|||
*/
|
||||
|
||||
import { mapDefault } from './map_default';
|
||||
import { esFilters } from '../../../../../common';
|
||||
import { buildQueryFilter, buildEmptyFilter } from '../../../../../common';
|
||||
|
||||
describe('filter manager utilities', () => {
|
||||
describe('mapDefault()', () => {
|
||||
test('should return the key and value for matching filters', async () => {
|
||||
const filter = esFilters.buildQueryFilter({ match_all: {} }, 'index', '');
|
||||
const filter = buildQueryFilter({ match_all: {} }, 'index', '');
|
||||
const result = mapDefault(filter);
|
||||
|
||||
expect(result).toHaveProperty('key', 'query');
|
||||
|
@ -31,7 +31,7 @@ describe('filter manager utilities', () => {
|
|||
});
|
||||
|
||||
test('should return undefined if there is no valid key', async () => {
|
||||
const filter = esFilters.buildEmptyFilter(true);
|
||||
const filter = buildEmptyFilter(true);
|
||||
|
||||
try {
|
||||
mapDefault(filter);
|
||||
|
|
|
@ -18,14 +18,14 @@
|
|||
*/
|
||||
|
||||
import { find, keys, get } from 'lodash';
|
||||
import { esFilters } from '../../../../../common';
|
||||
import { Filter, FILTERS } from '../../../../../common';
|
||||
|
||||
export const mapDefault = (filter: esFilters.Filter) => {
|
||||
export const mapDefault = (filter: Filter) => {
|
||||
const metaProperty = /(^\$|meta)/;
|
||||
const key = find(keys(filter), item => !item.match(metaProperty));
|
||||
|
||||
if (key) {
|
||||
const type = esFilters.FILTERS.CUSTOM;
|
||||
const type = FILTERS.CUSTOM;
|
||||
const value = JSON.stringify(get(filter, key, {}));
|
||||
|
||||
return { type, key, value };
|
||||
|
|
|
@ -19,7 +19,12 @@
|
|||
|
||||
import { mapExists } from './map_exists';
|
||||
import { mapQueryString } from './map_query_string';
|
||||
import { esFilters, IIndexPattern, IFieldType } from '../../../../../common';
|
||||
import {
|
||||
IIndexPattern,
|
||||
IFieldType,
|
||||
buildExistsFilter,
|
||||
buildEmptyFilter,
|
||||
} from '../../../../../common';
|
||||
|
||||
describe('filter manager utilities', () => {
|
||||
describe('mapExists()', () => {
|
||||
|
@ -32,7 +37,7 @@ describe('filter manager utilities', () => {
|
|||
});
|
||||
|
||||
test('should return the key and value for matching filters', async () => {
|
||||
const filter = esFilters.buildExistsFilter({ name: '_type' } as IFieldType, indexPattern);
|
||||
const filter = buildExistsFilter({ name: '_type' } as IFieldType, indexPattern);
|
||||
const result = mapExists(filter);
|
||||
|
||||
expect(result).toHaveProperty('key', '_type');
|
||||
|
@ -40,7 +45,7 @@ describe('filter manager utilities', () => {
|
|||
});
|
||||
|
||||
test('should return undefined for none matching', async done => {
|
||||
const filter = esFilters.buildEmptyFilter(true);
|
||||
const filter = buildEmptyFilter(true);
|
||||
|
||||
try {
|
||||
mapQueryString(filter);
|
||||
|
|
|
@ -18,13 +18,13 @@
|
|||
*/
|
||||
|
||||
import { get } from 'lodash';
|
||||
import { esFilters } from '../../../../../common';
|
||||
import { Filter, isExistsFilter, FILTERS } from '../../../../../common';
|
||||
|
||||
export const mapExists = (filter: esFilters.Filter) => {
|
||||
if (esFilters.isExistsFilter(filter)) {
|
||||
export const mapExists = (filter: Filter) => {
|
||||
if (isExistsFilter(filter)) {
|
||||
return {
|
||||
type: esFilters.FILTERS.EXISTS,
|
||||
value: esFilters.FILTERS.EXISTS,
|
||||
type: FILTERS.EXISTS,
|
||||
value: FILTERS.EXISTS,
|
||||
key: get(filter, 'exists.field'),
|
||||
};
|
||||
}
|
||||
|
|
|
@ -18,7 +18,7 @@
|
|||
*/
|
||||
|
||||
import { mapGeoBoundingBox } from './map_geo_bounding_box';
|
||||
import { esFilters } from '../../../../../common';
|
||||
import { Filter, GeoBoundingBoxFilter } from '../../../../../common';
|
||||
|
||||
describe('filter manager utilities', () => {
|
||||
describe('mapGeoBoundingBox()', () => {
|
||||
|
@ -34,7 +34,7 @@ describe('filter manager utilities', () => {
|
|||
bottom_right: { lat: 15, lon: 20 },
|
||||
},
|
||||
},
|
||||
} as esFilters.GeoBoundingBoxFilter;
|
||||
} as GeoBoundingBoxFilter;
|
||||
|
||||
const result = mapGeoBoundingBox(filter);
|
||||
|
||||
|
@ -63,7 +63,7 @@ describe('filter manager utilities', () => {
|
|||
bottom_right: { lat: 15, lon: 20 },
|
||||
},
|
||||
},
|
||||
} as esFilters.GeoBoundingBoxFilter;
|
||||
} as GeoBoundingBoxFilter;
|
||||
|
||||
const result = mapGeoBoundingBox(filter);
|
||||
|
||||
|
@ -83,7 +83,7 @@ describe('filter manager utilities', () => {
|
|||
const filter = {
|
||||
meta: { index: 'logstash-*' },
|
||||
query: { query_string: { query: 'foo:bar' } },
|
||||
} as esFilters.Filter;
|
||||
} as Filter;
|
||||
|
||||
try {
|
||||
mapGeoBoundingBox(filter);
|
||||
|
|
|
@ -16,10 +16,16 @@
|
|||
* specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*/
|
||||
import { esFilters } from '../../../../../common';
|
||||
import {
|
||||
FilterValueFormatter,
|
||||
GeoBoundingBoxFilter,
|
||||
FILTERS,
|
||||
isGeoBoundingBoxFilter,
|
||||
Filter,
|
||||
} from '../../../../../common';
|
||||
|
||||
const getFormattedValueFn = (params: any) => {
|
||||
return (formatter?: esFilters.FilterValueFormatter) => {
|
||||
return (formatter?: FilterValueFormatter) => {
|
||||
const corners = formatter
|
||||
? {
|
||||
topLeft: formatter.convert(params.top_left),
|
||||
|
@ -34,20 +40,20 @@ const getFormattedValueFn = (params: any) => {
|
|||
};
|
||||
};
|
||||
|
||||
const getParams = (filter: esFilters.GeoBoundingBoxFilter) => {
|
||||
const getParams = (filter: GeoBoundingBoxFilter) => {
|
||||
const key = Object.keys(filter.geo_bounding_box).filter(k => k !== 'ignore_unmapped')[0];
|
||||
const params = filter.geo_bounding_box[key];
|
||||
|
||||
return {
|
||||
key,
|
||||
params,
|
||||
type: esFilters.FILTERS.GEO_BOUNDING_BOX,
|
||||
type: FILTERS.GEO_BOUNDING_BOX,
|
||||
value: getFormattedValueFn(params),
|
||||
};
|
||||
};
|
||||
|
||||
export const mapGeoBoundingBox = (filter: esFilters.Filter) => {
|
||||
if (!esFilters.isGeoBoundingBoxFilter(filter)) {
|
||||
export const mapGeoBoundingBox = (filter: Filter) => {
|
||||
if (!isGeoBoundingBoxFilter(filter)) {
|
||||
throw filter;
|
||||
}
|
||||
|
||||
|
|
|
@ -18,10 +18,10 @@
|
|||
*/
|
||||
|
||||
import { mapGeoPolygon } from './map_geo_polygon';
|
||||
import { esFilters } from '../../../../../common';
|
||||
import { Filter, GeoPolygonFilter } from '../../../../../common';
|
||||
|
||||
describe('filter manager utilities', () => {
|
||||
let filter: esFilters.GeoPolygonFilter;
|
||||
let filter: GeoPolygonFilter;
|
||||
|
||||
beforeEach(() => {
|
||||
filter = {
|
||||
|
@ -36,7 +36,7 @@ describe('filter manager utilities', () => {
|
|||
],
|
||||
},
|
||||
},
|
||||
} as esFilters.GeoPolygonFilter;
|
||||
} as GeoPolygonFilter;
|
||||
});
|
||||
|
||||
describe('mapGeoPolygon()', () => {
|
||||
|
@ -74,7 +74,7 @@ describe('filter manager utilities', () => {
|
|||
const wrongFilter = {
|
||||
meta: { index: 'logstash-*' },
|
||||
query: { query_string: { query: 'foo:bar' } },
|
||||
} as esFilters.Filter;
|
||||
} as Filter;
|
||||
|
||||
try {
|
||||
mapGeoPolygon(wrongFilter);
|
||||
|
|
|
@ -17,32 +17,38 @@
|
|||
* under the License.
|
||||
*/
|
||||
|
||||
import { esFilters } from '../../../../../common';
|
||||
import {
|
||||
FilterValueFormatter,
|
||||
GeoPolygonFilter,
|
||||
FILTERS,
|
||||
Filter,
|
||||
isGeoPolygonFilter,
|
||||
} from '../../../../../common';
|
||||
|
||||
const POINTS_SEPARATOR = ', ';
|
||||
|
||||
const getFormattedValueFn = (points: string[]) => {
|
||||
return (formatter?: esFilters.FilterValueFormatter) => {
|
||||
return (formatter?: FilterValueFormatter) => {
|
||||
return points
|
||||
.map((point: string) => (formatter ? formatter.convert(point) : JSON.stringify(point)))
|
||||
.join(POINTS_SEPARATOR);
|
||||
};
|
||||
};
|
||||
|
||||
function getParams(filter: esFilters.GeoPolygonFilter) {
|
||||
function getParams(filter: GeoPolygonFilter) {
|
||||
const key = Object.keys(filter.geo_polygon).filter(k => k !== 'ignore_unmapped')[0];
|
||||
const params = filter.geo_polygon[key];
|
||||
|
||||
return {
|
||||
key,
|
||||
params,
|
||||
type: esFilters.FILTERS.GEO_POLYGON,
|
||||
type: FILTERS.GEO_POLYGON,
|
||||
value: getFormattedValueFn(params.points || []),
|
||||
};
|
||||
}
|
||||
|
||||
export function mapGeoPolygon(filter: esFilters.Filter) {
|
||||
if (!esFilters.isGeoPolygonFilter(filter)) {
|
||||
export function mapGeoPolygon(filter: Filter) {
|
||||
if (!isGeoPolygonFilter(filter)) {
|
||||
throw filter;
|
||||
}
|
||||
return getParams(filter);
|
||||
|
|
|
@ -18,11 +18,11 @@
|
|||
*/
|
||||
|
||||
import { mapMatchAll } from './map_match_all';
|
||||
import { esFilters } from '../../../../../common';
|
||||
import { MatchAllFilter } from '../../../../../common';
|
||||
|
||||
describe('filter_manager/lib', () => {
|
||||
describe('mapMatchAll()', () => {
|
||||
let filter: esFilters.MatchAllFilter;
|
||||
let filter: MatchAllFilter;
|
||||
|
||||
beforeEach(() => {
|
||||
filter = {
|
||||
|
|
|
@ -16,12 +16,12 @@
|
|||
* specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*/
|
||||
import { esFilters } from '../../../../../common';
|
||||
import { Filter, isMatchAllFilter, FILTERS } from '../../../../../common';
|
||||
|
||||
export const mapMatchAll = (filter: esFilters.Filter) => {
|
||||
if (esFilters.isMatchAllFilter(filter)) {
|
||||
export const mapMatchAll = (filter: Filter) => {
|
||||
if (isMatchAllFilter(filter)) {
|
||||
return {
|
||||
type: esFilters.FILTERS.MATCH_ALL,
|
||||
type: FILTERS.MATCH_ALL,
|
||||
key: filter.meta.field,
|
||||
value: filter.meta.formattedValue || 'all',
|
||||
};
|
||||
|
|
|
@ -18,14 +18,14 @@
|
|||
*/
|
||||
|
||||
import { mapMissing } from './map_missing';
|
||||
import { esFilters } from '../../../../../common';
|
||||
import { MissingFilter, buildEmptyFilter } from '../../../../../common';
|
||||
|
||||
describe('filter manager utilities', () => {
|
||||
describe('mapMissing()', () => {
|
||||
test('should return the key and value for matching filters', async () => {
|
||||
const filter: esFilters.MissingFilter = {
|
||||
const filter: MissingFilter = {
|
||||
missing: { field: '_type' },
|
||||
...esFilters.buildEmptyFilter(true),
|
||||
...buildEmptyFilter(true),
|
||||
};
|
||||
const result = mapMissing(filter);
|
||||
|
||||
|
@ -34,7 +34,7 @@ describe('filter manager utilities', () => {
|
|||
});
|
||||
|
||||
test('should return undefined for none matching', async done => {
|
||||
const filter = esFilters.buildEmptyFilter(true);
|
||||
const filter = buildEmptyFilter(true);
|
||||
|
||||
try {
|
||||
mapMissing(filter);
|
||||
|
|
|
@ -17,13 +17,13 @@
|
|||
* under the License.
|
||||
*/
|
||||
|
||||
import { esFilters } from '../../../../../common';
|
||||
import { Filter, isMissingFilter, FILTERS } from '../../../../../common';
|
||||
|
||||
export const mapMissing = (filter: esFilters.Filter) => {
|
||||
if (esFilters.isMissingFilter(filter)) {
|
||||
export const mapMissing = (filter: Filter) => {
|
||||
if (isMissingFilter(filter)) {
|
||||
return {
|
||||
type: esFilters.FILTERS.MISSING,
|
||||
value: esFilters.FILTERS.MISSING,
|
||||
type: FILTERS.MISSING,
|
||||
value: FILTERS.MISSING,
|
||||
key: filter.missing.field,
|
||||
};
|
||||
}
|
||||
|
|
|
@ -17,7 +17,7 @@
|
|||
* under the License.
|
||||
*/
|
||||
import { mapPhrase } from './map_phrase';
|
||||
import { esFilters } from '../../../../../common';
|
||||
import { PhraseFilter, Filter } from '../../../../../common';
|
||||
|
||||
describe('filter manager utilities', () => {
|
||||
describe('mapPhrase()', () => {
|
||||
|
@ -25,7 +25,7 @@ describe('filter manager utilities', () => {
|
|||
const filter = {
|
||||
meta: { index: 'logstash-*' },
|
||||
query: { match: { _type: { query: 'apache', type: 'phrase' } } },
|
||||
} as esFilters.PhraseFilter;
|
||||
} as PhraseFilter;
|
||||
|
||||
const result = mapPhrase(filter);
|
||||
|
||||
|
@ -42,7 +42,7 @@ describe('filter manager utilities', () => {
|
|||
const filter = {
|
||||
meta: { index: 'logstash-*' },
|
||||
query: { query_string: { query: 'foo:bar' } },
|
||||
} as esFilters.Filter;
|
||||
} as Filter;
|
||||
|
||||
try {
|
||||
mapPhrase(filter);
|
||||
|
|
|
@ -18,36 +18,45 @@
|
|||
*/
|
||||
|
||||
import { get } from 'lodash';
|
||||
import { esFilters } from '../../../../../common';
|
||||
import {
|
||||
PhraseFilter,
|
||||
FilterValueFormatter,
|
||||
getPhraseFilterValue,
|
||||
getPhraseFilterField,
|
||||
FILTERS,
|
||||
isScriptedPhraseFilter,
|
||||
Filter,
|
||||
isPhraseFilter,
|
||||
} from '../../../../../common';
|
||||
|
||||
const getScriptedPhraseValue = (filter: esFilters.PhraseFilter) =>
|
||||
const getScriptedPhraseValue = (filter: PhraseFilter) =>
|
||||
get(filter, ['script', 'script', 'params', 'value']);
|
||||
|
||||
const getFormattedValueFn = (value: any) => {
|
||||
return (formatter?: esFilters.FilterValueFormatter) => {
|
||||
return (formatter?: FilterValueFormatter) => {
|
||||
return formatter ? formatter.convert(value) : value;
|
||||
};
|
||||
};
|
||||
|
||||
const getParams = (filter: esFilters.PhraseFilter) => {
|
||||
const getParams = (filter: PhraseFilter) => {
|
||||
const scriptedPhraseValue = getScriptedPhraseValue(filter);
|
||||
const isScriptedFilter = Boolean(scriptedPhraseValue);
|
||||
const key = isScriptedFilter ? filter.meta.field || '' : esFilters.getPhraseFilterField(filter);
|
||||
const query = scriptedPhraseValue || esFilters.getPhraseFilterValue(filter);
|
||||
const key = isScriptedFilter ? filter.meta.field || '' : getPhraseFilterField(filter);
|
||||
const query = scriptedPhraseValue || getPhraseFilterValue(filter);
|
||||
const params = { query };
|
||||
|
||||
return {
|
||||
key,
|
||||
params,
|
||||
type: esFilters.FILTERS.PHRASE,
|
||||
type: FILTERS.PHRASE,
|
||||
value: getFormattedValueFn(query),
|
||||
};
|
||||
};
|
||||
|
||||
export const isMapPhraseFilter = (filter: any): filter is esFilters.PhraseFilter =>
|
||||
esFilters.isPhraseFilter(filter) || esFilters.isScriptedPhraseFilter(filter);
|
||||
export const isMapPhraseFilter = (filter: any): filter is PhraseFilter =>
|
||||
isPhraseFilter(filter) || isScriptedPhraseFilter(filter);
|
||||
|
||||
export const mapPhrase = (filter: esFilters.Filter) => {
|
||||
export const mapPhrase = (filter: Filter) => {
|
||||
if (!isMapPhraseFilter(filter)) {
|
||||
throw filter;
|
||||
}
|
||||
|
|
|
@ -17,10 +17,10 @@
|
|||
* under the License.
|
||||
*/
|
||||
|
||||
import { esFilters } from '../../../../../common';
|
||||
import { Filter, isPhrasesFilter } from '../../../../../common';
|
||||
|
||||
export const mapPhrases = (filter: esFilters.Filter) => {
|
||||
if (!esFilters.isPhrasesFilter(filter)) {
|
||||
export const mapPhrases = (filter: Filter) => {
|
||||
if (!isPhrasesFilter(filter)) {
|
||||
throw filter;
|
||||
}
|
||||
|
||||
|
|
|
@ -18,27 +18,23 @@
|
|||
*/
|
||||
|
||||
import { mapQueryString } from './map_query_string';
|
||||
import { esFilters } from '../../../../../common';
|
||||
import { buildQueryFilter, buildEmptyFilter, Filter } from '../../../../../common';
|
||||
|
||||
describe('filter manager utilities', () => {
|
||||
describe('mapQueryString()', () => {
|
||||
test('should return the key and value for matching filters', async () => {
|
||||
const filter = esFilters.buildQueryFilter(
|
||||
{ query_string: { query: 'foo:bar' } },
|
||||
'index',
|
||||
''
|
||||
);
|
||||
const result = mapQueryString(filter as esFilters.Filter);
|
||||
const filter = buildQueryFilter({ query_string: { query: 'foo:bar' } }, 'index', '');
|
||||
const result = mapQueryString(filter as Filter);
|
||||
|
||||
expect(result).toHaveProperty('key', 'query');
|
||||
expect(result).toHaveProperty('value', 'foo:bar');
|
||||
});
|
||||
|
||||
test('should return undefined for none matching', async done => {
|
||||
const filter = esFilters.buildEmptyFilter(true);
|
||||
const filter = buildEmptyFilter(true);
|
||||
|
||||
try {
|
||||
mapQueryString(filter as esFilters.Filter);
|
||||
mapQueryString(filter as Filter);
|
||||
} catch (e) {
|
||||
expect(e).toBe(filter);
|
||||
done();
|
||||
|
|
|
@ -16,12 +16,12 @@
|
|||
* specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*/
|
||||
import { esFilters } from '../../../../../common';
|
||||
import { FILTERS, Filter, isQueryStringFilter } from '../../../../../common';
|
||||
|
||||
export const mapQueryString = (filter: esFilters.Filter) => {
|
||||
if (esFilters.isQueryStringFilter(filter)) {
|
||||
export const mapQueryString = (filter: Filter) => {
|
||||
if (isQueryStringFilter(filter)) {
|
||||
return {
|
||||
type: esFilters.FILTERS.QUERY_STRING,
|
||||
type: FILTERS.QUERY_STRING,
|
||||
key: 'query',
|
||||
value: filter.query.query_string.query,
|
||||
};
|
||||
|
|
|
@ -18,15 +18,15 @@
|
|||
*/
|
||||
|
||||
import { mapRange } from './map_range';
|
||||
import { esFilters } from '../../../../../common';
|
||||
import { FilterMeta, RangeFilter, Filter } from '../../../../../common';
|
||||
|
||||
describe('filter manager utilities', () => {
|
||||
describe('mapRange()', () => {
|
||||
test('should return the key and value for matching filters with gt/lt', async () => {
|
||||
const filter = {
|
||||
meta: { index: 'logstash-*' } as esFilters.FilterMeta,
|
||||
meta: { index: 'logstash-*' } as FilterMeta,
|
||||
range: { bytes: { lt: 2048, gt: 1024 } },
|
||||
} as esFilters.RangeFilter;
|
||||
} as RangeFilter;
|
||||
const result = mapRange(filter);
|
||||
|
||||
expect(result).toHaveProperty('key', 'bytes');
|
||||
|
@ -41,7 +41,7 @@ describe('filter manager utilities', () => {
|
|||
const filter = {
|
||||
meta: { index: 'logstash-*' },
|
||||
query: { query_string: { query: 'foo:bar' } },
|
||||
} as esFilters.Filter;
|
||||
} as Filter;
|
||||
|
||||
try {
|
||||
mapRange(filter);
|
||||
|
|
|
@ -18,10 +18,17 @@
|
|||
*/
|
||||
|
||||
import { get, has } from 'lodash';
|
||||
import { esFilters } from '../../../../../common';
|
||||
import {
|
||||
FilterValueFormatter,
|
||||
RangeFilter,
|
||||
isScriptedRangeFilter,
|
||||
isRangeFilter,
|
||||
Filter,
|
||||
FILTERS,
|
||||
} from '../../../../../common';
|
||||
|
||||
const getFormattedValueFn = (left: any, right: any) => {
|
||||
return (formatter?: esFilters.FilterValueFormatter) => {
|
||||
return (formatter?: FilterValueFormatter) => {
|
||||
let displayValue = `${left} to ${right}`;
|
||||
if (formatter) {
|
||||
const convert = formatter.getConverterFor('text');
|
||||
|
@ -31,12 +38,11 @@ const getFormattedValueFn = (left: any, right: any) => {
|
|||
};
|
||||
};
|
||||
|
||||
const getFirstRangeKey = (filter: esFilters.RangeFilter) =>
|
||||
filter.range && Object.keys(filter.range)[0];
|
||||
const getRangeByKey = (filter: esFilters.RangeFilter, key: string) => get(filter, ['range', key]);
|
||||
const getFirstRangeKey = (filter: RangeFilter) => filter.range && Object.keys(filter.range)[0];
|
||||
const getRangeByKey = (filter: RangeFilter, key: string) => get(filter, ['range', key]);
|
||||
|
||||
function getParams(filter: esFilters.RangeFilter) {
|
||||
const isScriptedRange = esFilters.isScriptedRangeFilter(filter);
|
||||
function getParams(filter: RangeFilter) {
|
||||
const isScriptedRange = isScriptedRangeFilter(filter);
|
||||
const key: string = (isScriptedRange ? filter.meta.field : getFirstRangeKey(filter)) || '';
|
||||
const params: any = isScriptedRange
|
||||
? get(filter, 'script.script.params')
|
||||
|
@ -50,13 +56,13 @@ function getParams(filter: esFilters.RangeFilter) {
|
|||
|
||||
const value = getFormattedValueFn(left, right);
|
||||
|
||||
return { type: esFilters.FILTERS.RANGE, key, value, params };
|
||||
return { type: FILTERS.RANGE, key, value, params };
|
||||
}
|
||||
|
||||
export const isMapRangeFilter = (filter: any): filter is esFilters.RangeFilter =>
|
||||
esFilters.isRangeFilter(filter) || esFilters.isScriptedRangeFilter(filter);
|
||||
export const isMapRangeFilter = (filter: any): filter is RangeFilter =>
|
||||
isRangeFilter(filter) || isScriptedRangeFilter(filter);
|
||||
|
||||
export const mapRange = (filter: esFilters.Filter) => {
|
||||
export const mapRange = (filter: Filter) => {
|
||||
if (!isMapRangeFilter(filter)) {
|
||||
throw filter;
|
||||
}
|
||||
|
|
|
@ -18,7 +18,7 @@
|
|||
*/
|
||||
|
||||
import { mapSpatialFilter } from './map_spatial_filter';
|
||||
import { esFilters } from '../../../../../common';
|
||||
import { FilterMeta, Filter, FILTERS } from '../../../../../common';
|
||||
|
||||
describe('mapSpatialFilter()', () => {
|
||||
test('should return the key for matching multi polygon filter', async () => {
|
||||
|
@ -26,8 +26,8 @@ describe('mapSpatialFilter()', () => {
|
|||
meta: {
|
||||
key: 'location',
|
||||
alias: 'my spatial filter',
|
||||
type: esFilters.FILTERS.SPATIAL_FILTER,
|
||||
} as esFilters.FilterMeta,
|
||||
type: FILTERS.SPATIAL_FILTER,
|
||||
} as FilterMeta,
|
||||
query: {
|
||||
bool: {
|
||||
should: [
|
||||
|
@ -39,12 +39,12 @@ describe('mapSpatialFilter()', () => {
|
|||
],
|
||||
},
|
||||
},
|
||||
} as esFilters.Filter;
|
||||
} as Filter;
|
||||
const result = mapSpatialFilter(filter);
|
||||
|
||||
expect(result).toHaveProperty('key', 'location');
|
||||
expect(result).toHaveProperty('value', '');
|
||||
expect(result).toHaveProperty('type', esFilters.FILTERS.SPATIAL_FILTER);
|
||||
expect(result).toHaveProperty('type', FILTERS.SPATIAL_FILTER);
|
||||
});
|
||||
|
||||
test('should return the key for matching polygon filter', async () => {
|
||||
|
@ -52,17 +52,17 @@ describe('mapSpatialFilter()', () => {
|
|||
meta: {
|
||||
key: 'location',
|
||||
alias: 'my spatial filter',
|
||||
type: esFilters.FILTERS.SPATIAL_FILTER,
|
||||
} as esFilters.FilterMeta,
|
||||
type: FILTERS.SPATIAL_FILTER,
|
||||
} as FilterMeta,
|
||||
geo_polygon: {
|
||||
geoCoordinates: { points: [] },
|
||||
},
|
||||
} as esFilters.Filter;
|
||||
} as Filter;
|
||||
const result = mapSpatialFilter(filter);
|
||||
|
||||
expect(result).toHaveProperty('key', 'location');
|
||||
expect(result).toHaveProperty('value', '');
|
||||
expect(result).toHaveProperty('type', esFilters.FILTERS.SPATIAL_FILTER);
|
||||
expect(result).toHaveProperty('type', FILTERS.SPATIAL_FILTER);
|
||||
});
|
||||
|
||||
test('should return undefined for none matching', async done => {
|
||||
|
@ -70,11 +70,11 @@ describe('mapSpatialFilter()', () => {
|
|||
meta: {
|
||||
key: 'location',
|
||||
alias: 'my spatial filter',
|
||||
} as esFilters.FilterMeta,
|
||||
} as FilterMeta,
|
||||
geo_polygon: {
|
||||
geoCoordinates: { points: [] },
|
||||
},
|
||||
} as esFilters.Filter;
|
||||
} as Filter;
|
||||
|
||||
try {
|
||||
mapSpatialFilter(filter);
|
||||
|
|
|
@ -16,15 +16,15 @@
|
|||
* specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*/
|
||||
import { esFilters } from '../../../../../common';
|
||||
import { Filter, FILTERS } from '../../../../../common';
|
||||
|
||||
// Use mapSpatialFilter mapper to avoid bloated meta with value and params for spatial filters.
|
||||
export const mapSpatialFilter = (filter: esFilters.Filter) => {
|
||||
export const mapSpatialFilter = (filter: Filter) => {
|
||||
if (
|
||||
filter.meta &&
|
||||
filter.meta.key &&
|
||||
filter.meta.alias &&
|
||||
filter.meta.type === esFilters.FILTERS.SPATIAL_FILTER
|
||||
filter.meta.type === FILTERS.SPATIAL_FILTER
|
||||
) {
|
||||
return {
|
||||
key: filter.meta.key,
|
||||
|
|
|
@ -18,7 +18,7 @@
|
|||
*/
|
||||
|
||||
import { onlyDisabledFiltersChanged } from './only_disabled';
|
||||
import { esFilters } from '../../../../common';
|
||||
import { Filter } from '../../../../common';
|
||||
|
||||
describe('filter manager utilities', () => {
|
||||
describe('onlyDisabledFiltersChanged()', () => {
|
||||
|
@ -27,20 +27,20 @@ describe('filter manager utilities', () => {
|
|||
{ meta: { disabled: true } },
|
||||
{ meta: { disabled: true } },
|
||||
{ meta: { disabled: true } },
|
||||
] as esFilters.Filter[];
|
||||
const newFilters = [{ meta: { disabled: true } }] as esFilters.Filter[];
|
||||
] as Filter[];
|
||||
const newFilters = [{ meta: { disabled: true } }] as Filter[];
|
||||
|
||||
expect(onlyDisabledFiltersChanged(newFilters, filters)).toBe(true);
|
||||
});
|
||||
|
||||
test('should return false if there are no old filters', () => {
|
||||
const newFilters = [{ meta: { disabled: false } }] as esFilters.Filter[];
|
||||
const newFilters = [{ meta: { disabled: false } }] as Filter[];
|
||||
|
||||
expect(onlyDisabledFiltersChanged(newFilters, undefined)).toBe(false);
|
||||
});
|
||||
|
||||
test('should return false if there are no new filters', () => {
|
||||
const filters = [{ meta: { disabled: false } }] as esFilters.Filter[];
|
||||
const filters = [{ meta: { disabled: false } }] as Filter[];
|
||||
|
||||
expect(onlyDisabledFiltersChanged(undefined, filters)).toBe(false);
|
||||
});
|
||||
|
@ -50,8 +50,8 @@ describe('filter manager utilities', () => {
|
|||
{ meta: { disabled: false } },
|
||||
{ meta: { disabled: false } },
|
||||
{ meta: { disabled: false } },
|
||||
] as esFilters.Filter[];
|
||||
const newFilters = [{ meta: { disabled: false } }] as esFilters.Filter[];
|
||||
] as Filter[];
|
||||
const newFilters = [{ meta: { disabled: false } }] as Filter[];
|
||||
|
||||
expect(onlyDisabledFiltersChanged(newFilters, filters)).toBe(false);
|
||||
});
|
||||
|
@ -61,8 +61,8 @@ describe('filter manager utilities', () => {
|
|||
{ meta: { disabled: true } },
|
||||
{ meta: { disabled: true } },
|
||||
{ meta: { disabled: true } },
|
||||
] as esFilters.Filter[];
|
||||
const newFilters = [{ meta: { disabled: false } }] as esFilters.Filter[];
|
||||
] as Filter[];
|
||||
const newFilters = [{ meta: { disabled: false } }] as Filter[];
|
||||
|
||||
expect(onlyDisabledFiltersChanged(newFilters, filters)).toBe(false);
|
||||
});
|
||||
|
@ -72,8 +72,8 @@ describe('filter manager utilities', () => {
|
|||
{ meta: { disabled: false } },
|
||||
{ meta: { disabled: false } },
|
||||
{ meta: { disabled: false } },
|
||||
] as esFilters.Filter[];
|
||||
const newFilters = [{ meta: { disabled: true } }] as esFilters.Filter[];
|
||||
] as Filter[];
|
||||
const newFilters = [{ meta: { disabled: true } }] as Filter[];
|
||||
|
||||
expect(onlyDisabledFiltersChanged(newFilters, filters)).toBe(false);
|
||||
});
|
||||
|
@ -83,8 +83,8 @@ describe('filter manager utilities', () => {
|
|||
{ meta: { disabled: true } },
|
||||
{ meta: { disabled: true } },
|
||||
{ meta: { disabled: true } },
|
||||
] as esFilters.Filter[];
|
||||
const newFilters = [] as esFilters.Filter[];
|
||||
] as Filter[];
|
||||
const newFilters = [] as Filter[];
|
||||
|
||||
expect(onlyDisabledFiltersChanged(newFilters, filters)).toBe(true);
|
||||
});
|
||||
|
@ -94,8 +94,8 @@ describe('filter manager utilities', () => {
|
|||
{ meta: { disabled: false } },
|
||||
{ meta: { disabled: false } },
|
||||
{ meta: { disabled: false } },
|
||||
] as esFilters.Filter[];
|
||||
const newFilters = [] as esFilters.Filter[];
|
||||
] as Filter[];
|
||||
const newFilters = [] as Filter[];
|
||||
|
||||
expect(onlyDisabledFiltersChanged(newFilters, filters)).toBe(false);
|
||||
});
|
||||
|
@ -104,11 +104,11 @@ describe('filter manager utilities', () => {
|
|||
const filters = [
|
||||
{ meta: { disabled: true, negate: false } },
|
||||
{ meta: { disabled: true, negate: false } },
|
||||
] as esFilters.Filter[];
|
||||
] as Filter[];
|
||||
const newFilters = [
|
||||
{ meta: { disabled: true, negate: true } },
|
||||
{ meta: { disabled: true, negate: true } },
|
||||
] as esFilters.Filter[];
|
||||
] as Filter[];
|
||||
|
||||
expect(onlyDisabledFiltersChanged(newFilters, filters)).toBe(true);
|
||||
});
|
||||
|
@ -118,8 +118,8 @@ describe('filter manager utilities', () => {
|
|||
{ meta: { disabled: false } },
|
||||
{ meta: { disabled: false } },
|
||||
{ meta: { disabled: true } },
|
||||
] as esFilters.Filter[];
|
||||
const newFilters = [{ meta: { disabled: false } }] as esFilters.Filter[];
|
||||
] as Filter[];
|
||||
const newFilters = [{ meta: { disabled: false } }] as Filter[];
|
||||
|
||||
expect(onlyDisabledFiltersChanged(newFilters, filters)).toBe(false);
|
||||
});
|
||||
|
@ -129,15 +129,15 @@ describe('filter manager utilities', () => {
|
|||
{ meta: { disabled: true } },
|
||||
{ meta: { disabled: false } },
|
||||
{ meta: { disabled: true } },
|
||||
] as esFilters.Filter[];
|
||||
const newFilters = [] as esFilters.Filter[];
|
||||
] as Filter[];
|
||||
const newFilters = [] as Filter[];
|
||||
|
||||
expect(onlyDisabledFiltersChanged(newFilters, filters)).toBe(false);
|
||||
});
|
||||
|
||||
test('should not throw with null filters', () => {
|
||||
const filters = [null, { meta: { disabled: true } }] as esFilters.Filter[];
|
||||
const newFilters = [] as esFilters.Filter[];
|
||||
const filters = [null, { meta: { disabled: true } }] as Filter[];
|
||||
const newFilters = [] as Filter[];
|
||||
|
||||
expect(() => {
|
||||
onlyDisabledFiltersChanged(newFilters, filters);
|
||||
|
|
|
@ -18,20 +18,17 @@
|
|||
*/
|
||||
|
||||
import { filter } from 'lodash';
|
||||
import { esFilters } from '../../../../common';
|
||||
import { Filter } from '../../../../common';
|
||||
import { compareFilters, COMPARE_ALL_OPTIONS } from './compare_filters';
|
||||
|
||||
const isEnabled = (f: esFilters.Filter) => f && f.meta && !f.meta.disabled;
|
||||
const isEnabled = (f: Filter) => f && f.meta && !f.meta.disabled;
|
||||
|
||||
/**
|
||||
* Checks to see if only disabled filters have been changed
|
||||
*
|
||||
* @returns {bool} Only disabled filters
|
||||
*/
|
||||
export const onlyDisabledFiltersChanged = (
|
||||
newFilters?: esFilters.Filter[],
|
||||
oldFilters?: esFilters.Filter[]
|
||||
) => {
|
||||
export const onlyDisabledFiltersChanged = (newFilters?: Filter[], oldFilters?: Filter[]) => {
|
||||
// If it's the same - compare only enabled filters
|
||||
const newEnabledFilters = filter(newFilters || [], isEnabled);
|
||||
const oldEnabledFilters = filter(oldFilters || [], isEnabled);
|
||||
|
|
|
@ -18,26 +18,18 @@
|
|||
*/
|
||||
|
||||
import { sortFilters } from './sort_filters';
|
||||
import { esFilters } from '../../../../common';
|
||||
import { FilterStateStore, buildQueryFilter } from '../../../../common';
|
||||
|
||||
describe('sortFilters', () => {
|
||||
describe('sortFilters()', () => {
|
||||
test('Not sort two application level filters', () => {
|
||||
const f1 = {
|
||||
$state: { store: esFilters.FilterStateStore.APP_STATE },
|
||||
...esFilters.buildQueryFilter(
|
||||
{ _type: { match: { query: 'apache', type: 'phrase' } } },
|
||||
'index',
|
||||
''
|
||||
),
|
||||
$state: { store: FilterStateStore.APP_STATE },
|
||||
...buildQueryFilter({ _type: { match: { query: 'apache', type: 'phrase' } } }, 'index', ''),
|
||||
};
|
||||
const f2 = {
|
||||
$state: { store: esFilters.FilterStateStore.APP_STATE },
|
||||
...esFilters.buildQueryFilter(
|
||||
{ _type: { match: { query: 'apache', type: 'phrase' } } },
|
||||
'index',
|
||||
''
|
||||
),
|
||||
$state: { store: FilterStateStore.APP_STATE },
|
||||
...buildQueryFilter({ _type: { match: { query: 'apache', type: 'phrase' } } }, 'index', ''),
|
||||
};
|
||||
|
||||
const filters = [f1, f2].sort(sortFilters);
|
||||
|
@ -46,20 +38,12 @@ describe('sortFilters', () => {
|
|||
|
||||
test('Not sort two global level filters', () => {
|
||||
const f1 = {
|
||||
$state: { store: esFilters.FilterStateStore.GLOBAL_STATE },
|
||||
...esFilters.buildQueryFilter(
|
||||
{ _type: { match: { query: 'apache', type: 'phrase' } } },
|
||||
'index',
|
||||
''
|
||||
),
|
||||
$state: { store: FilterStateStore.GLOBAL_STATE },
|
||||
...buildQueryFilter({ _type: { match: { query: 'apache', type: 'phrase' } } }, 'index', ''),
|
||||
};
|
||||
const f2 = {
|
||||
$state: { store: esFilters.FilterStateStore.GLOBAL_STATE },
|
||||
...esFilters.buildQueryFilter(
|
||||
{ _type: { match: { query: 'apache', type: 'phrase' } } },
|
||||
'index',
|
||||
''
|
||||
),
|
||||
$state: { store: FilterStateStore.GLOBAL_STATE },
|
||||
...buildQueryFilter({ _type: { match: { query: 'apache', type: 'phrase' } } }, 'index', ''),
|
||||
};
|
||||
|
||||
const filters = [f1, f2].sort(sortFilters);
|
||||
|
@ -68,20 +52,12 @@ describe('sortFilters', () => {
|
|||
|
||||
test('Move global level filter to the beginning of the array', () => {
|
||||
const f1 = {
|
||||
$state: { store: esFilters.FilterStateStore.APP_STATE },
|
||||
...esFilters.buildQueryFilter(
|
||||
{ _type: { match: { query: 'apache', type: 'phrase' } } },
|
||||
'index',
|
||||
''
|
||||
),
|
||||
$state: { store: FilterStateStore.APP_STATE },
|
||||
...buildQueryFilter({ _type: { match: { query: 'apache', type: 'phrase' } } }, 'index', ''),
|
||||
};
|
||||
const f2 = {
|
||||
$state: { store: esFilters.FilterStateStore.GLOBAL_STATE },
|
||||
...esFilters.buildQueryFilter(
|
||||
{ _type: { match: { query: 'apache', type: 'phrase' } } },
|
||||
'index',
|
||||
''
|
||||
),
|
||||
$state: { store: FilterStateStore.GLOBAL_STATE },
|
||||
...buildQueryFilter({ _type: { match: { query: 'apache', type: 'phrase' } } }, 'index', ''),
|
||||
};
|
||||
|
||||
const filters = [f1, f2].sort(sortFilters);
|
||||
|
|
|
@ -17,7 +17,7 @@
|
|||
* under the License.
|
||||
*/
|
||||
|
||||
import { esFilters } from '../../../../common';
|
||||
import { Filter, FilterStateStore } from '../../../../common';
|
||||
|
||||
/**
|
||||
* Sort filters according to their store - global filters go first
|
||||
|
@ -27,15 +27,11 @@ import { esFilters } from '../../../../common';
|
|||
*
|
||||
* @returns {number} Sorting order of filters
|
||||
*/
|
||||
export const sortFilters = (
|
||||
{ $state: a }: esFilters.Filter,
|
||||
{ $state: b }: esFilters.Filter
|
||||
): number => {
|
||||
export const sortFilters = ({ $state: a }: Filter, { $state: b }: Filter): number => {
|
||||
if (a!.store === b!.store) {
|
||||
return 0;
|
||||
} else {
|
||||
return a!.store === esFilters.FilterStateStore.GLOBAL_STATE &&
|
||||
b!.store !== esFilters.FilterStateStore.GLOBAL_STATE
|
||||
return a!.store === FilterStateStore.GLOBAL_STATE && b!.store !== FilterStateStore.GLOBAL_STATE
|
||||
? -1
|
||||
: 1;
|
||||
}
|
||||
|
|
|
@ -18,22 +18,14 @@
|
|||
*/
|
||||
|
||||
import { uniqFilters } from './uniq_filters';
|
||||
import { esFilters } from '../../../../common';
|
||||
import { buildQueryFilter, Filter, FilterStateStore } from '../../../../common';
|
||||
|
||||
describe('filter manager utilities', () => {
|
||||
describe('niqFilter', () => {
|
||||
test('should filter out dups', () => {
|
||||
const before: esFilters.Filter[] = [
|
||||
esFilters.buildQueryFilter(
|
||||
{ _type: { match: { query: 'apache', type: 'phrase' } } },
|
||||
'index',
|
||||
''
|
||||
),
|
||||
esFilters.buildQueryFilter(
|
||||
{ _type: { match: { query: 'apache', type: 'phrase' } } },
|
||||
'index',
|
||||
''
|
||||
),
|
||||
const before: Filter[] = [
|
||||
buildQueryFilter({ _type: { match: { query: 'apache', type: 'phrase' } } }, 'index', ''),
|
||||
buildQueryFilter({ _type: { match: { query: 'apache', type: 'phrase' } } }, 'index', ''),
|
||||
];
|
||||
const results = uniqFilters(before);
|
||||
|
||||
|
@ -41,17 +33,9 @@ describe('filter manager utilities', () => {
|
|||
});
|
||||
|
||||
test('should filter out duplicates, ignoring meta attributes', () => {
|
||||
const before: esFilters.Filter[] = [
|
||||
esFilters.buildQueryFilter(
|
||||
{ _type: { match: { query: 'apache', type: 'phrase' } } },
|
||||
'index1',
|
||||
''
|
||||
),
|
||||
esFilters.buildQueryFilter(
|
||||
{ _type: { match: { query: 'apache', type: 'phrase' } } },
|
||||
'index2',
|
||||
''
|
||||
),
|
||||
const before: Filter[] = [
|
||||
buildQueryFilter({ _type: { match: { query: 'apache', type: 'phrase' } } }, 'index1', ''),
|
||||
buildQueryFilter({ _type: { match: { query: 'apache', type: 'phrase' } } }, 'index2', ''),
|
||||
];
|
||||
const results = uniqFilters(before);
|
||||
|
||||
|
@ -59,18 +43,18 @@ describe('filter manager utilities', () => {
|
|||
});
|
||||
|
||||
test('should filter out duplicates, ignoring $state attributes', () => {
|
||||
const before: esFilters.Filter[] = [
|
||||
const before: Filter[] = [
|
||||
{
|
||||
$state: { store: esFilters.FilterStateStore.APP_STATE },
|
||||
...esFilters.buildQueryFilter(
|
||||
$state: { store: FilterStateStore.APP_STATE },
|
||||
...buildQueryFilter(
|
||||
{ _type: { match: { query: 'apache', type: 'phrase' } } },
|
||||
'index',
|
||||
''
|
||||
),
|
||||
},
|
||||
{
|
||||
$state: { store: esFilters.FilterStateStore.GLOBAL_STATE },
|
||||
...esFilters.buildQueryFilter(
|
||||
$state: { store: FilterStateStore.GLOBAL_STATE },
|
||||
...buildQueryFilter(
|
||||
{ _type: { match: { query: 'apache', type: 'phrase' } } },
|
||||
'index',
|
||||
''
|
||||
|
|
|
@ -18,7 +18,7 @@
|
|||
*/
|
||||
import { each, union } from 'lodash';
|
||||
import { dedupFilters } from './dedup_filters';
|
||||
import { esFilters } from '../../../../common';
|
||||
import { Filter } from '../../../../common';
|
||||
|
||||
/**
|
||||
* Remove duplicate filters from an array of filters
|
||||
|
@ -28,10 +28,10 @@ import { esFilters } from '../../../../common';
|
|||
|
||||
* @returns {object} The original filters array with duplicates removed
|
||||
*/
|
||||
export const uniqFilters = (filters: esFilters.Filter[], comparatorOptions: any = {}) => {
|
||||
let results: esFilters.Filter[] = [];
|
||||
export const uniqFilters = (filters: Filter[], comparatorOptions: any = {}) => {
|
||||
let results: Filter[] = [];
|
||||
|
||||
each(filters, (filter: esFilters.Filter) => {
|
||||
each(filters, (filter: Filter) => {
|
||||
results = union(results, dedupFilters(results, [filter]), comparatorOptions);
|
||||
});
|
||||
|
||||
|
|
|
@ -17,9 +17,9 @@
|
|||
* under the License.
|
||||
*/
|
||||
|
||||
import { esFilters } from '../../../../common';
|
||||
import { Filter } from '../../../../common';
|
||||
|
||||
export function getFiltersArray(): esFilters.Filter[] {
|
||||
export function getFiltersArray(): Filter[] {
|
||||
return [
|
||||
{
|
||||
query: { match: { extension: { query: 'jpg', type: 'phrase' } } },
|
||||
|
|
|
@ -17,15 +17,15 @@
|
|||
* under the License.
|
||||
*/
|
||||
|
||||
import { esFilters } from '../../../../common';
|
||||
import { Filter, FilterStateStore } from '../../../../common';
|
||||
|
||||
export function getFilter(
|
||||
store: esFilters.FilterStateStore,
|
||||
store: FilterStateStore,
|
||||
disabled: boolean,
|
||||
negated: boolean,
|
||||
queryKey: string,
|
||||
queryValue: any
|
||||
): esFilters.Filter {
|
||||
): Filter {
|
||||
return {
|
||||
$state: {
|
||||
store,
|
||||
|
|
|
@ -17,9 +17,9 @@
|
|||
* under the License.
|
||||
*/
|
||||
|
||||
import { esFilters } from '../../../common';
|
||||
import { Filter } from '../../../common';
|
||||
|
||||
export interface PartitionedFilters {
|
||||
globalFilters: esFilters.Filter[];
|
||||
appFilters: esFilters.Filter[];
|
||||
globalFilters: Filter[];
|
||||
appFilters: Filter[];
|
||||
}
|
||||
|
|
|
@ -18,7 +18,8 @@
|
|||
*/
|
||||
|
||||
import { createSavedQueryService } from './saved_query_service';
|
||||
import { esFilters, SavedQueryAttributes } from '../..';
|
||||
import { SavedQueryAttributes } from '../..';
|
||||
import { FilterStateStore } from '../../../common';
|
||||
|
||||
const savedQueryAttributes: SavedQueryAttributes = {
|
||||
title: 'foo',
|
||||
|
@ -42,7 +43,7 @@ const savedQueryAttributesWithFilters: SavedQueryAttributes = {
|
|||
filters: [
|
||||
{
|
||||
query: { match_all: {} },
|
||||
$state: { store: esFilters.FilterStateStore.APP_STATE },
|
||||
$state: { store: FilterStateStore.APP_STATE },
|
||||
meta: {
|
||||
disabled: false,
|
||||
negate: false,
|
||||
|
|
|
@ -17,7 +17,7 @@
|
|||
* under the License.
|
||||
*/
|
||||
|
||||
import { RefreshInterval, TimeRange, Query, esFilters } from '../..';
|
||||
import { RefreshInterval, TimeRange, Query, Filter } from '../..';
|
||||
|
||||
export type SavedQueryTimeFilter = TimeRange & {
|
||||
refreshInterval: RefreshInterval;
|
||||
|
@ -32,7 +32,7 @@ export interface SavedQueryAttributes {
|
|||
title: string;
|
||||
description: string;
|
||||
query: Query;
|
||||
filters?: esFilters.Filter[];
|
||||
filters?: Filter[];
|
||||
timefilter?: SavedQueryTimeFilter;
|
||||
}
|
||||
|
||||
|
|
|
@ -20,7 +20,7 @@
|
|||
import { Subscription } from 'rxjs';
|
||||
import { FilterManager } from '../filter_manager';
|
||||
import { getFilter } from '../filter_manager/test_helpers/get_stub_filter';
|
||||
import { esFilters } from '../../../common';
|
||||
import { Filter, FilterStateStore } from '../../../common';
|
||||
import { syncAppFilters } from './sync_app_filters';
|
||||
import { coreMock } from '../../../../../core/public/mocks';
|
||||
import { BaseStateContainer, createStateContainer } from '../../../../kibana_utils/public';
|
||||
|
@ -33,30 +33,30 @@ setupMock.uiSettings.get.mockImplementation((key: string) => {
|
|||
|
||||
describe('sync_app_filters', () => {
|
||||
let filterManager: FilterManager;
|
||||
let appState: BaseStateContainer<esFilters.Filter[]>;
|
||||
let appState: BaseStateContainer<Filter[]>;
|
||||
let appStateSub: Subscription;
|
||||
let appStateChangeTriggered = jest.fn();
|
||||
let filterManagerChangeSub: Subscription;
|
||||
let filterManagerChangeTriggered = jest.fn();
|
||||
|
||||
let gF1: esFilters.Filter;
|
||||
let gF2: esFilters.Filter;
|
||||
let aF1: esFilters.Filter;
|
||||
let aF2: esFilters.Filter;
|
||||
let gF1: Filter;
|
||||
let gF2: Filter;
|
||||
let aF1: Filter;
|
||||
let aF2: Filter;
|
||||
|
||||
beforeEach(() => {
|
||||
filterManager = new FilterManager(setupMock.uiSettings);
|
||||
appState = createStateContainer([] as esFilters.Filter[]);
|
||||
appState = createStateContainer([] as Filter[]);
|
||||
appStateChangeTriggered = jest.fn();
|
||||
appStateSub = appState.state$.subscribe(appStateChangeTriggered);
|
||||
|
||||
filterManagerChangeTriggered = jest.fn();
|
||||
filterManagerChangeSub = filterManager.getUpdates$().subscribe(filterManagerChangeTriggered);
|
||||
|
||||
gF1 = getFilter(esFilters.FilterStateStore.GLOBAL_STATE, true, true, 'key1', 'value1');
|
||||
gF2 = getFilter(esFilters.FilterStateStore.GLOBAL_STATE, false, false, 'key2', 'value2');
|
||||
aF1 = getFilter(esFilters.FilterStateStore.APP_STATE, true, true, 'key3', 'value3');
|
||||
aF2 = getFilter(esFilters.FilterStateStore.APP_STATE, false, false, 'key4', 'value4');
|
||||
gF1 = getFilter(FilterStateStore.GLOBAL_STATE, true, true, 'key1', 'value1');
|
||||
gF2 = getFilter(FilterStateStore.GLOBAL_STATE, false, false, 'key2', 'value2');
|
||||
aF1 = getFilter(FilterStateStore.APP_STATE, true, true, 'key3', 'value3');
|
||||
aF2 = getFilter(FilterStateStore.APP_STATE, false, false, 'key4', 'value4');
|
||||
});
|
||||
afterEach(() => {
|
||||
appStateSub.unsubscribe();
|
||||
|
|
|
@ -20,7 +20,7 @@
|
|||
import _ from 'lodash';
|
||||
import { filter, map } from 'rxjs/operators';
|
||||
import { COMPARE_ALL_OPTIONS, compareFilters } from '../filter_manager/lib/compare_filters';
|
||||
import { esFilters } from '../../../common';
|
||||
import { Filter } from '../../../common';
|
||||
import { FilterManager } from '../filter_manager';
|
||||
import { BaseStateContainer } from '../../../../../plugins/kibana_utils/public';
|
||||
|
||||
|
@ -31,7 +31,7 @@ import { BaseStateContainer } from '../../../../../plugins/kibana_utils/public';
|
|||
*/
|
||||
export function syncAppFilters(
|
||||
filterManager: FilterManager,
|
||||
appState: BaseStateContainer<esFilters.Filter[]>
|
||||
appState: BaseStateContainer<Filter[]>
|
||||
) {
|
||||
// make sure initial app filters are picked by filterManager
|
||||
filterManager.setAppFilters(_.cloneDeep(appState.get()));
|
||||
|
|
|
@ -21,7 +21,7 @@ import { Subscription } from 'rxjs';
|
|||
import { createBrowserHistory, History } from 'history';
|
||||
import { FilterManager } from '../filter_manager';
|
||||
import { getFilter } from '../filter_manager/test_helpers/get_stub_filter';
|
||||
import { esFilters } from '../../../common';
|
||||
import { Filter, FilterStateStore } from '../../../common';
|
||||
import { coreMock } from '../../../../../core/public/mocks';
|
||||
import {
|
||||
createKbnUrlStateStorage,
|
||||
|
@ -59,8 +59,8 @@ describe('sync_query', () => {
|
|||
let filterManagerChangeSub: Subscription;
|
||||
let filterManagerChangeTriggered = jest.fn();
|
||||
|
||||
let gF: esFilters.Filter;
|
||||
let aF: esFilters.Filter;
|
||||
let gF: Filter;
|
||||
let aF: Filter;
|
||||
|
||||
const pathWithFilter =
|
||||
"/#?_g=(filters:!(('$state':(store:globalState),meta:(alias:!n,disabled:!t,index:'logstash-*',key:query,negate:!t,type:custom,value:'%7B%22match%22:%7B%22key1%22:%22value1%22%7D%7D'),query:(match:(key1:value1)))),refreshInterval:(pause:!t,value:0),time:(from:now-15m,to:now))";
|
||||
|
@ -82,8 +82,8 @@ describe('sync_query', () => {
|
|||
history = createBrowserHistory();
|
||||
kbnUrlStateStorage = createKbnUrlStateStorage({ useHash: false, history });
|
||||
|
||||
gF = getFilter(esFilters.FilterStateStore.GLOBAL_STATE, true, true, 'key1', 'value1');
|
||||
aF = getFilter(esFilters.FilterStateStore.APP_STATE, true, true, 'key3', 'value3');
|
||||
gF = getFilter(FilterStateStore.GLOBAL_STATE, true, true, 'key1', 'value1');
|
||||
aF = getFilter(FilterStateStore.APP_STATE, true, true, 'key3', 'value3');
|
||||
});
|
||||
afterEach(() => {
|
||||
filterManagerChangeSub.unsubscribe();
|
||||
|
|
|
@ -26,7 +26,7 @@ import {
|
|||
syncState,
|
||||
} from '../../../../kibana_utils/public';
|
||||
import { COMPARE_ALL_OPTIONS, compareFilters } from '../filter_manager/lib/compare_filters';
|
||||
import { esFilters, RefreshInterval, TimeRange } from '../../../common';
|
||||
import { Filter, RefreshInterval, TimeRange } from '../../../common';
|
||||
import { QuerySetup, QueryStart } from '../query_service';
|
||||
|
||||
const GLOBAL_STATE_STORAGE_KEY = '_g';
|
||||
|
@ -34,7 +34,7 @@ const GLOBAL_STATE_STORAGE_KEY = '_g';
|
|||
export interface QuerySyncState {
|
||||
time?: TimeRange;
|
||||
refreshInterval?: RefreshInterval;
|
||||
filters?: esFilters.Filter[];
|
||||
filters?: Filter[];
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -140,7 +140,7 @@ export const getQueryStateContainer = (
|
|||
...state,
|
||||
refreshInterval,
|
||||
}),
|
||||
setFilters: (state: QuerySyncState) => (filters: esFilters.Filter[]) => ({
|
||||
setFilters: (state: QuerySyncState) => (filters: Filter[]) => ({
|
||||
...state,
|
||||
filters,
|
||||
}),
|
||||
|
|
|
@ -19,10 +19,7 @@
|
|||
|
||||
import dateMath from '@elastic/datemath';
|
||||
import { IIndexPattern } from '../..';
|
||||
import { TimeRange, IFieldType } from '../../../common';
|
||||
|
||||
// TODO: remove this
|
||||
import { esFilters } from '../../../common';
|
||||
import { TimeRange, IFieldType, buildRangeFilter } from '../../../common';
|
||||
|
||||
interface CalculateBoundsOptions {
|
||||
forceNow?: Date;
|
||||
|
@ -57,7 +54,7 @@ export function getTime(
|
|||
if (!bounds) {
|
||||
return;
|
||||
}
|
||||
return esFilters.buildRangeFilter(
|
||||
return buildRangeFilter(
|
||||
timefield,
|
||||
{
|
||||
...(bounds.min && { gte: bounds.min.toISOString() }),
|
||||
|
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Add table
Add a link
Reference in a new issue