[Exploratory view] Update discover dependency (#117500)

Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com>
This commit is contained in:
Shahzad 2021-11-18 10:53:47 +01:00 committed by GitHub
parent 279d093277
commit b68e8c9e4a
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
6 changed files with 96 additions and 46 deletions

View file

@ -16,6 +16,7 @@ export type QueryStringFilter = Filter & {
query?: {
query_string?: {
query: string;
fields?: string[];
};
};
};

View file

@ -11,6 +11,7 @@
"observability"
],
"optionalPlugins": [
"discover",
"embeddable",
"home",
"lens",

View file

@ -5,10 +5,15 @@
* 2.0.
*/
import rison, { RisonValue } from 'rison-node';
import { buildQueryFilter } from '@kbn/es-query';
import type { ReportViewType, SeriesUrl, UrlFilter } from '../types';
import type { AllSeries, AllShortSeries } from '../hooks/use_series_storage';
import { IndexPattern } from '../../../../../../../../src/plugins/data/common';
import { esFilters, ExistsFilter } from '../../../../../../../../src/plugins/data/public';
import {
esFilters,
ExistsFilter,
PhraseFilter,
} from '../../../../../../../../src/plugins/data/public';
import { URL_KEYS } from './constants/url_constants';
import { PersistableFilter } from '../../../../../../lens/common';
@ -64,9 +69,32 @@ export function buildPhraseFilter(field: string, value: string, indexPattern: In
return [];
}
export function getQueryFilter(field: string, value: string[], indexPattern: IndexPattern) {
const fieldMeta = indexPattern?.fields.find((fieldT) => fieldT.name === field);
if (fieldMeta && indexPattern.id) {
return value.map((val) =>
buildQueryFilter(
{
query_string: {
fields: [field],
query: `*${val}*`,
},
},
indexPattern.id!,
''
)
);
}
return [];
}
export function buildPhrasesFilter(field: string, value: string[], indexPattern: IndexPattern) {
const fieldMeta = indexPattern?.fields.find((fieldT) => fieldT.name === field);
if (fieldMeta) {
if (value.length === 1) {
return [esFilters.buildPhraseFilter(fieldMeta, value[0], indexPattern)];
}
return [esFilters.buildPhrasesFilter(fieldMeta, value, indexPattern)];
}
return [];
@ -80,7 +108,7 @@ export function buildExistsFilter(field: string, indexPattern: IndexPattern) {
return [];
}
type FiltersType = PersistableFilter[] | ExistsFilter[];
type FiltersType = Array<PersistableFilter | ExistsFilter | PhraseFilter>;
export function urlFilterToPersistedFilter({
urlFilters,
@ -88,23 +116,36 @@ export function urlFilterToPersistedFilter({
indexPattern,
}: {
urlFilters: UrlFilter[];
initFilters: FiltersType;
initFilters?: FiltersType;
indexPattern: IndexPattern;
}) {
const parsedFilters: FiltersType = initFilters ? [...initFilters] : [];
urlFilters.forEach(({ field, values = [], notValues = [] }) => {
if (values?.length > 0) {
const filter = buildPhrasesFilter(field, values, indexPattern);
parsedFilters.push(...filter);
}
urlFilters.forEach(
({ field, values = [], notValues = [], wildcards = [], notWildcards = ([] = []) }) => {
if (values.length > 0) {
const filter = buildPhrasesFilter(field, values, indexPattern);
parsedFilters.push(...filter);
}
if (notValues?.length > 0) {
const filter = buildPhrasesFilter(field, notValues, indexPattern)[0];
filter.meta.negate = true;
parsedFilters.push(filter);
if (notValues.length > 0) {
const filter = buildPhrasesFilter(field, notValues, indexPattern)[0];
filter.meta.negate = true;
parsedFilters.push(filter);
}
if (wildcards.length > 0) {
const filter = getQueryFilter(field, wildcards, indexPattern);
parsedFilters.push(...filter);
}
if (notWildcards.length > 0) {
const filter = getQueryFilter(field, notWildcards, indexPattern)[0];
filter.meta.negate = true;
parsedFilters.push(filter);
}
}
});
);
return parsedFilters;
}

View file

@ -9,7 +9,7 @@ import { useCallback, useEffect, useState } from 'react';
import { useKibana } from '../../../../utils/kibana_react';
import { SeriesConfig, SeriesUrl } from '../types';
import { useAppIndexPatternContext } from './use_app_index_pattern';
import { buildExistsFilter, buildPhraseFilter, buildPhrasesFilter } from '../configurations/utils';
import { buildExistsFilter, urlFilterToPersistedFilter } from '../configurations/utils';
import { getFiltersFromDefs } from './use_lens_attributes';
import { RECORDS_FIELD, RECORDS_PERCENTAGE_FIELD } from '../configurations/constants';
@ -32,42 +32,42 @@ export const useDiscoverLink = ({ series, seriesConfig }: UseDiscoverLink) => {
useEffect(() => {
const indexPattern = indexPatterns?.[series.dataType];
const definitions = series.reportDefinitions ?? {};
const filters = [...(seriesConfig?.baseFilters ?? [])];
if (indexPattern) {
const definitions = series.reportDefinitions ?? {};
const definitionFilters = getFiltersFromDefs(definitions);
const urlFilters = (series.filters ?? []).concat(getFiltersFromDefs(definitions));
definitionFilters.forEach(({ field, values = [] }) => {
if (values.length > 1) {
filters.push(buildPhrasesFilter(field, values, indexPattern)[0]);
} else {
filters.push(buildPhraseFilter(field, values[0], indexPattern)[0]);
}
});
const selectedMetricField = series.selectedMetricField;
if (
selectedMetricField &&
selectedMetricField !== RECORDS_FIELD &&
selectedMetricField !== RECORDS_PERCENTAGE_FIELD
) {
filters.push(buildExistsFilter(selectedMetricField, indexPattern)[0]);
}
const getDiscoverUrl = async () => {
if (!urlGenerator?.createUrl) return;
const newUrl = await urlGenerator.createUrl({
filters,
indexPatternId: indexPattern?.id,
const filters = urlFilterToPersistedFilter({
indexPattern,
urlFilters,
initFilters: seriesConfig?.baseFilters,
});
setDiscoverUrl(newUrl);
};
getDiscoverUrl();
const selectedMetricField = series.selectedMetricField;
if (
selectedMetricField &&
selectedMetricField !== RECORDS_FIELD &&
selectedMetricField !== RECORDS_PERCENTAGE_FIELD
) {
filters.push(buildExistsFilter(selectedMetricField, indexPattern)[0]);
}
const getDiscoverUrl = async () => {
if (!urlGenerator?.createUrl) return;
const newUrl = await urlGenerator.createUrl({
filters,
indexPatternId: indexPattern?.id,
});
setDiscoverUrl(newUrl);
};
getDiscoverUrl();
}
}, [
indexPatterns,
series.dataType,
series.filters,
series.reportDefinitions,
series.selectedMetricField,
seriesConfig?.baseFilters,

View file

@ -66,7 +66,9 @@ export function ReportDefinitionField({
const values = selectedReportDefinitions?.[fieldT];
if (!values.includes(ALL_VALUES_SELECTED)) {
const valueFilter = buildPhrasesFilter(fieldT, values, indexPattern)[0];
filtersN.push(valueFilter.query);
if (valueFilter.query) {
filtersN.push(valueFilter.query);
}
}
}
});

View file

@ -12,6 +12,7 @@ import { RemoveSeries } from './remove_series';
import { useSeriesStorage } from '../../hooks/use_series_storage';
import { SeriesConfig, SeriesUrl } from '../../types';
import { useDiscoverLink } from '../../hooks/use_discover_link';
import { useAppIndexPatternContext } from '../../hooks/use_app_index_pattern';
interface Props {
seriesId: number;
@ -25,6 +26,10 @@ export function SeriesActions({ seriesId, series, seriesConfig, onEditClick }: P
const { href: discoverHref } = useDiscoverLink({ series, seriesConfig });
const { indexPatterns } = useAppIndexPatternContext();
const indexPattern = indexPatterns?.[series.dataType];
const copySeries = () => {
let copySeriesId: string = `${series.name}-copy`;
if (allSeries.find(({ name }) => name === copySeriesId)) {
@ -63,7 +68,7 @@ export function SeriesActions({ seriesId, series, seriesConfig, onEditClick }: P
color="text"
target="_blank"
href={discoverHref}
isDisabled={!series.dataType || !series.selectedMetricField}
isDisabled={!series.dataType || !series.selectedMetricField || !indexPattern}
/>
</EuiToolTip>
</EuiFlexItem>