mirror of
https://github.com/elastic/kibana.git
synced 2025-04-24 09:48:58 -04:00
[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:
parent
5e1c0be501
commit
0dd89e388d
4 changed files with 125 additions and 9 deletions
|
@ -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',
|
||||
},
|
||||
},
|
||||
]);
|
||||
});
|
||||
});
|
|
@ -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)];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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()));
|
||||
|
|
|
@ -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 [];
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue