Skip to content

Commit

Permalink
[Maps] create NOT EXISTS filter for tooltip property with no value (#…
Browse files Browse the repository at this point in the history
…62849) (#63143)

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

* review feedback
  • Loading branch information
nreese authored Apr 9, 2020
1 parent 9701d52 commit 72226bf
Show file tree
Hide file tree
Showing 4 changed files with 125 additions and 9 deletions.
105 changes: 105 additions & 0 deletions x-pack/plugins/maps/public/layers/tooltips/es_tooltip_property.test.ts
Original file line number Diff line number Diff line change
@@ -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',
},
},
]);
});
});
19 changes: 15 additions & 4 deletions x-pack/plugins/maps/public/layers/tooltips/es_tooltip_property.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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)];
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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()));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand All @@ -14,7 +14,7 @@ export interface ITooltipProperty {
getHtmlDisplayValue(): string;
getRawValue(): string | undefined;
isFilterable(): boolean;
getESFilters(): Promise<PhraseFilter[]>;
getESFilters(): Promise<Filter[]>;
}

export interface LoadFeatureProps {
Expand Down Expand Up @@ -70,7 +70,7 @@ export class TooltipProperty implements ITooltipProperty {
return false;
}

async getESFilters(): Promise<PhraseFilter[]> {
async getESFilters(): Promise<Filter[]> {
return [];
}
}

0 comments on commit 72226bf

Please sign in to comment.