Skip to content

Commit

Permalink
[bug] set saved search instance for Discover based on dataset (opense…
Browse files Browse the repository at this point in the history
…arch-project#8689)

* [bug] set saved search instance for Discover based on dataset

Preventing any errors being thrown because of the index pattern
not existing in the case of saved search was created with
a dataset.

Also fix issue that prevented saved search instance not being
set even though loaded properly.

The original fix that was removed fixed a previous issue but
subsequent updates and refactors required an update that was uncaught.

Issue:
n/a

Signed-off-by: Kawika Avilla <[email protected]>

* set saved search order

Signed-off-by: Kawika Avilla <[email protected]>

---------

Signed-off-by: Kawika Avilla <[email protected]>
  • Loading branch information
kavilla authored and Qxisylolo committed Oct 30, 2024
1 parent e2dfde4 commit 3cb4028
Show file tree
Hide file tree
Showing 5 changed files with 41 additions and 16 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@ import { migrateLegacyQuery } from './migrate_legacy_query';
import { SearchSource, SearchSourceDependencies } from './search_source';
import { IndexPatternsContract } from '../../index_patterns/index_patterns';
import { SearchSourceFields } from './types';
import { DEFAULT_DATA } from '../../constants';

/**
* Deserializes a json string and a set of referenced objects to a `SearchSource` instance.
Expand All @@ -57,8 +58,13 @@ export const createSearchSource = (
const fields = { ...searchSourceFields };

// hydrating index pattern
if (fields.index && typeof fields.index === 'string') {
fields.index = await indexPatterns.get(searchSourceFields.index as any);
if (
fields.index &&
typeof fields.index === 'string' &&
(!fields.query?.dataset?.type ||
fields.query.dataset.type === DEFAULT_DATA.SET_TYPES.INDEX_PATTERN)
) {
fields.index = await indexPatterns.get(fields.index as string);
}

const searchSource = new SearchSource(fields, searchSourceDependencies);
Expand Down
2 changes: 0 additions & 2 deletions src/plugins/data/public/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -68,8 +68,6 @@ export {
DQLBody,
SingleLineInput,
DatasetSelector,
AdvancedSelector,
NoIndexPatternsPanel,
DatasetSelectorAppearance,
} from './ui';

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,11 @@ import { RootState, DefaultViewState } from '../../../../../data_explorer/public
import { buildColumns } from '../columns';
import * as utils from './common';
import { SortOrder } from '../../../saved_searches/types';
import { DEFAULT_COLUMNS_SETTING, PLUGIN_ID } from '../../../../common';
import {
DEFAULT_COLUMNS_SETTING,
PLUGIN_ID,
QUERY_ENHANCEMENT_ENABLED_SETTING,
} from '../../../../common';

export interface DiscoverState {
/**
Expand Down Expand Up @@ -90,7 +94,8 @@ export const getPreloadedState = async ({
const indexPatternId = savedSearchInstance.searchSource.getField('index')?.id;
preloadedState.root = {
metadata: {
indexPattern: indexPatternId,
...(indexPatternId &&
!config.get(QUERY_ENHANCEMENT_ENABLED_SETTING) && { indexPattern: indexPatternId }),
view: PLUGIN_ID,
},
};
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -358,18 +358,35 @@ export const useSearch = (services: DiscoverViewServices) => {
useEffect(() => {
(async () => {
const savedSearchInstance = await getSavedSearchById(savedSearchId);
setSavedSearch(savedSearchInstance);

// if saved search does not exist, do not atempt to sync filters and query from savedObject
if (!savedSearch) {
return;
const query =
savedSearchInstance.searchSource.getField('query') ||
data.query.queryString.getDefaultQuery();

const isEnhancementsEnabled = await uiSettings.get('query:enhancements:enabled');
if (isEnhancementsEnabled && query.dataset) {
let pattern = await data.indexPatterns.get(
query.dataset.id,
query.dataset.type !== 'INDEX_PATTERN'
);
if (!pattern) {
await data.query.queryString.getDatasetService().cacheDataset(query.dataset, {
uiSettings: services.uiSettings,
savedObjects: services.savedObjects,
notifications: services.notifications,
http: services.http,
data: services.data,
});
pattern = await data.indexPatterns.get(
query.dataset.id,
query.dataset.type !== 'INDEX_PATTERN'
);
savedSearchInstance.searchSource.setField('index', pattern);
}
}

// sync initial app filters from savedObject to filterManager
const filters = cloneDeep(savedSearchInstance.searchSource.getOwnField('filter'));
const query =
savedSearchInstance.searchSource.getField('query') ||
data.query.queryString.getDefaultQuery();
const actualFilters = [];

if (filters !== undefined) {
Expand All @@ -381,6 +398,7 @@ export const useSearch = (services: DiscoverViewServices) => {

filterManager.setAppFilters(actualFilters);
data.query.queryString.setQuery(query);
setSavedSearch(savedSearchInstance);

if (savedSearchInstance?.id) {
chrome.recentlyAccessed.add(
Expand All @@ -393,8 +411,6 @@ export const useSearch = (services: DiscoverViewServices) => {
);
}
})();

return () => {};
// This effect will only run when getSavedSearchById is called, which is
// only called when the component is first mounted.
// eslint-disable-next-line react-hooks/exhaustive-deps
Expand Down
2 changes: 1 addition & 1 deletion src/plugins/query_enhancements/public/plugin.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -96,7 +96,7 @@ export class QueryEnhancementsPlugin
title: 'SQL',
search: sqlSearchInterceptor,
getQueryString: (query: Query) => {
return `SELECT * FROM ${queryString.getQuery().dataset?.title} LIMIT 10`;
return `SELECT * FROM ${query.dataset?.title} LIMIT 10`;
},
fields: {
filterable: false,
Expand Down

0 comments on commit 3cb4028

Please sign in to comment.