[Maps] create NOT EXISTS filter for tooltip property with no value (#62849)

* [Maps] create NOT EXISTS filter for tooltip property with no value

* review feedback
This commit is contained in:
Nathan Reese 2020-04-09 09:56:11 -06:00 committed by GitHub
parent 5e1c0be501
commit 0dd89e388d
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
4 changed files with 125 additions and 9 deletions

View file

@ -0,0 +1,105 @@
/*
* Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
* or more contributor license agreements. Licensed under the Elastic License;
* you may not use this file except in compliance with the Elastic License.
*/
import { IFieldType, IndexPattern } from '../../../../../../src/plugins/data/public';
import { ESTooltipProperty } from './es_tooltip_property';
import { TooltipProperty } from './tooltip_property';
import { AbstractField } from '../fields/field';
import { FIELD_ORIGIN } from '../../../common/constants';
class MockField extends AbstractField {}
const indexPatternField = {
name: 'machine.os',
type: 'string',
esTypes: ['text'],
count: 0,
scripted: false,
searchable: true,
aggregatable: true,
readFromDocValues: false,
} as IFieldType;
const featurePropertyField = new MockField({
fieldName: 'machine.os',
origin: FIELD_ORIGIN.SOURCE,
});
const indexPattern = {
id: 'indexPatternId',
fields: {
getByName: (name: string): IFieldType | null => {
return name === 'machine.os' ? indexPatternField : null;
},
},
title: 'my index pattern',
} as IndexPattern;
describe('getESFilters', () => {
test('Should return empty array when field does not exist in index pattern', async () => {
const notFoundFeaturePropertyField = new MockField({
fieldName: 'field name that is not in index pattern',
origin: FIELD_ORIGIN.SOURCE,
});
const esTooltipProperty = new ESTooltipProperty(
new TooltipProperty(
notFoundFeaturePropertyField.getName(),
await notFoundFeaturePropertyField.getLabel(),
'my value'
),
indexPattern,
notFoundFeaturePropertyField
);
expect(await esTooltipProperty.getESFilters()).toEqual([]);
});
test('Should return phrase filter when field value is provided', async () => {
const esTooltipProperty = new ESTooltipProperty(
new TooltipProperty(
featurePropertyField.getName(),
await featurePropertyField.getLabel(),
'my value'
),
indexPattern,
featurePropertyField
);
expect(await esTooltipProperty.getESFilters()).toEqual([
{
meta: {
index: 'indexPatternId',
},
query: {
match_phrase: {
['machine.os']: 'my value',
},
},
},
]);
});
test('Should return NOT exists filter for null values', async () => {
const esTooltipProperty = new ESTooltipProperty(
new TooltipProperty(
featurePropertyField.getName(),
await featurePropertyField.getLabel(),
undefined
),
indexPattern,
featurePropertyField
);
expect(await esTooltipProperty.getESFilters()).toEqual([
{
meta: {
index: 'indexPatternId',
negate: true,
},
exists: {
field: 'machine.os',
},
},
]);
});
});

View file

@ -7,8 +7,12 @@
import _ from 'lodash';
import { ITooltipProperty } from './tooltip_property';
import { IField } from '../fields/field';
import { esFilters, IFieldType, IndexPattern } from '../../../../../../src/plugins/data/public';
import { PhraseFilter } from '../../../../../../src/plugins/data/public';
import {
esFilters,
Filter,
IFieldType,
IndexPattern,
} from '../../../../../../src/plugins/data/public';
export class ESTooltipProperty implements ITooltipProperty {
private readonly _tooltipProperty: ITooltipProperty;
@ -64,12 +68,19 @@ export class ESTooltipProperty implements ITooltipProperty {
);
}
async getESFilters(): Promise<PhraseFilter[]> {
async getESFilters(): Promise<Filter[]> {
const indexPatternField = this._getIndexPatternField();
if (!indexPatternField) {
return [];
}
return [esFilters.buildPhraseFilter(indexPatternField, this.getRawValue(), this._indexPattern)];
const value = this.getRawValue();
if (value == null) {
const existsFilter = esFilters.buildExistsFilter(indexPatternField, this._indexPattern);
existsFilter.meta.negate = true;
return [existsFilter];
} else {
return [esFilters.buildPhraseFilter(indexPatternField, value, this._indexPattern)];
}
}
}

View file

@ -6,7 +6,7 @@
import { ITooltipProperty } from './tooltip_property';
import { IJoin } from '../joins/join';
import { PhraseFilter } from '../../../../../../src/plugins/data/public';
import { Filter } from '../../../../../../src/plugins/data/public';
export class JoinTooltipProperty implements ITooltipProperty {
private readonly _tooltipProperty: ITooltipProperty;
@ -37,7 +37,7 @@ export class JoinTooltipProperty implements ITooltipProperty {
return this._tooltipProperty.getHtmlDisplayValue();
}
async getESFilters(): Promise<PhraseFilter[]> {
async getESFilters(): Promise<Filter[]> {
const esFilters = [];
if (this._tooltipProperty.isFilterable()) {
esFilters.push(...(await this._tooltipProperty.getESFilters()));

View file

@ -5,7 +5,7 @@
*/
import _ from 'lodash';
import { PhraseFilter } from '../../../../../../src/plugins/data/public';
import { Filter } from '../../../../../../src/plugins/data/public';
import { TooltipFeature } from '../../../../../plugins/maps/common/descriptor_types';
export interface ITooltipProperty {
@ -14,7 +14,7 @@ export interface ITooltipProperty {
getHtmlDisplayValue(): string;
getRawValue(): string | undefined;
isFilterable(): boolean;
getESFilters(): Promise<PhraseFilter[]>;
getESFilters(): Promise<Filter[]>;
}
export interface LoadFeatureProps {
@ -70,7 +70,7 @@ export class TooltipProperty implements ITooltipProperty {
return false;
}
async getESFilters(): Promise<PhraseFilter[]> {
async getESFilters(): Promise<Filter[]> {
return [];
}
}