mirror of
https://github.com/elastic/kibana.git
synced 2025-04-23 09:19:04 -04:00
[Exploratory view] Update discover dependency (#117500)
Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com>
This commit is contained in:
parent
279d093277
commit
b68e8c9e4a
6 changed files with 96 additions and 46 deletions
|
@ -16,6 +16,7 @@ export type QueryStringFilter = Filter & {
|
|||
query?: {
|
||||
query_string?: {
|
||||
query: string;
|
||||
fields?: string[];
|
||||
};
|
||||
};
|
||||
};
|
||||
|
|
|
@ -11,6 +11,7 @@
|
|||
"observability"
|
||||
],
|
||||
"optionalPlugins": [
|
||||
"discover",
|
||||
"embeddable",
|
||||
"home",
|
||||
"lens",
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
|
|
|
@ -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>
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue