diff --git a/frontend/src/container/ExplorerOptions/ExplorerOptions.tsx b/frontend/src/container/ExplorerOptions/ExplorerOptions.tsx index 8bccc41c67..85ce464db4 100644 --- a/frontend/src/container/ExplorerOptions/ExplorerOptions.tsx +++ b/frontend/src/container/ExplorerOptions/ExplorerOptions.tsx @@ -112,6 +112,7 @@ function ExplorerOptions({ panelType, isStagedQueryUpdated, redirectWithQueryBuilderData, + isDefaultQuery, } = useQueryBuilder(); const handleSaveViewModalToggle = (): void => { @@ -478,6 +479,11 @@ function ExplorerOptions({ ] = useState(false); useEffect(() => { + // If the query is not the default query, don't set the recently used saved view + if (!isDefaultQuery({ currentQuery, sourcePage: sourcepage })) { + return; + } + const parsedPreservedView = JSON.parse( localStorage.getItem(PRESERVED_VIEW_LOCAL_STORAGE_KEY) || '{}', ); @@ -499,12 +505,18 @@ function ExplorerOptions({ setIsRecentlyUsedSavedViewSelected(false); } - return (): void => clearTimeout(timeoutId); + // eslint-disable-next-line consistent-return + return (): void => { + clearTimeout(timeoutId); + }; }, [ PRESERVED_VIEW_LOCAL_STORAGE_KEY, PRESERVED_VIEW_TYPE, + currentQuery, + isDefaultQuery, isRecentlyUsedSavedViewSelected, onMenuItemSelectHandler, + sourcepage, viewKey, viewName, viewsData?.data?.data, diff --git a/frontend/src/pages/LogsExplorer/__tests__/LogsExplorer.test.tsx b/frontend/src/pages/LogsExplorer/__tests__/LogsExplorer.test.tsx index f76bdce610..f22bfbac80 100644 --- a/frontend/src/pages/LogsExplorer/__tests__/LogsExplorer.test.tsx +++ b/frontend/src/pages/LogsExplorer/__tests__/LogsExplorer.test.tsx @@ -155,6 +155,7 @@ describe('Logs Explorer Tests', () => { const { queryAllByText } = render( false, currentQuery: { ...initialQueriesMap.metrics, builder: { diff --git a/frontend/src/pages/TracesExplorer/__test__/testUtils.ts b/frontend/src/pages/TracesExplorer/__test__/testUtils.ts index 8a46740e6a..22817103e5 100644 --- a/frontend/src/pages/TracesExplorer/__test__/testUtils.ts +++ b/frontend/src/pages/TracesExplorer/__test__/testUtils.ts @@ -195,6 +195,7 @@ export const compositeQuery: Query = { export const redirectWithQueryBuilderData = jest.fn(); export const qbProviderValue = { + isDefaultQuery: jest.fn(() => false), currentQuery: { ...initialQueriesMap.traces, builder: { diff --git a/frontend/src/providers/QueryBuilder.tsx b/frontend/src/providers/QueryBuilder.tsx index 9db10d2767..031ca9841f 100644 --- a/frontend/src/providers/QueryBuilder.tsx +++ b/frontend/src/providers/QueryBuilder.tsx @@ -27,7 +27,7 @@ import { createIdFromObjectFields } from 'lib/createIdFromObjectFields'; import { createNewBuilderItemName } from 'lib/newQueryBuilder/createNewBuilderItemName'; import { getOperatorsBySourceAndPanelType } from 'lib/newQueryBuilder/getOperatorsBySourceAndPanelType'; import { replaceIncorrectObjectFields } from 'lib/replaceIncorrectObjectFields'; -import { cloneDeep, get, merge, set } from 'lodash-es'; +import { cloneDeep, get, isEqual, merge, set } from 'lodash-es'; import { createContext, PropsWithChildren, @@ -53,6 +53,7 @@ import { ViewProps } from 'types/api/saveViews/types'; import { EQueryType } from 'types/common/dashboard'; import { DataSource, + IsDefaultQueryProps, QueryBuilderContextType, QueryBuilderData, } from 'types/common/queryBuilder'; @@ -87,6 +88,7 @@ export const QueryBuilderContext = createContext({ initQueryBuilderData: () => {}, handleOnUnitsChange: () => {}, isStagedQueryUpdated: () => false, + isDefaultQuery: () => false, }); export function QueryBuilderProvider({ @@ -250,6 +252,88 @@ export function QueryBuilderProvider({ [getElementWithActualOperator], ); + const extractRelevantKeys = useCallback( + (queryData: IBuilderQuery): IBuilderQuery => { + const { + dataSource, + queryName, + aggregateOperator, + aggregateAttribute, + timeAggregation, + spaceAggregation, + functions, + filters, + expression, + disabled, + stepInterval, + having, + groupBy, + legend, + } = queryData; + + return { + dataSource, + queryName, + aggregateOperator, + // remove id from aggregateAttribute + aggregateAttribute: { + ...aggregateAttribute, + id: '', + }, + timeAggregation, + spaceAggregation, + functions, + filters, + expression, + disabled, + stepInterval, + having, + groupBy, + legend, + // set to default values + orderBy: [], + limit: null, + reduceTo: 'avg', + }; + }, + [], + ); + + const isDefaultQuery = useCallback( + ({ currentQuery, sourcePage }: IsDefaultQueryProps): boolean => { + // Get default query with updated operators + const defaultQuery = updateAllQueriesOperators( + initialQueriesMap[sourcePage], + PANEL_TYPES.LIST, + sourcePage, + ); + + // Early return if query types don't match + if (currentQuery.queryType !== defaultQuery.queryType) { + return false; + } + + // Only compare builder queries + if (currentQuery.queryType !== EQueryType.QUERY_BUILDER) { + return false; + } + + // If there is more than one query, then it is not a default query + if (currentQuery.builder.queryData.length > 1) { + return false; + } + + const currentBuilderData = extractRelevantKeys( + currentQuery.builder.queryData[0], + ); + const defaultBuilderData = extractRelevantKeys( + defaultQuery.builder.queryData[0], + ); + + return isEqual(currentBuilderData, defaultBuilderData); + }, + [updateAllQueriesOperators, extractRelevantKeys], + ); const updateQueriesData = useCallback( ( query: Query, @@ -884,6 +968,7 @@ export function QueryBuilderProvider({ handleRunQuery, resetQuery, updateAllQueriesOperators, + isDefaultQuery, updateQueriesData, initQueryBuilderData, handleOnUnitsChange, @@ -910,6 +995,7 @@ export function QueryBuilderProvider({ redirectWithQueryBuilderData, handleRunQuery, updateAllQueriesOperators, + isDefaultQuery, updateQueriesData, initQueryBuilderData, handleOnUnitsChange, diff --git a/frontend/src/types/common/queryBuilder.ts b/frontend/src/types/common/queryBuilder.ts index 0987347fd5..fe77e1ad68 100644 --- a/frontend/src/types/common/queryBuilder.ts +++ b/frontend/src/types/common/queryBuilder.ts @@ -247,9 +247,15 @@ export type QueryBuilderContextType = { viewData: ViewProps[] | undefined, viewKey: string, ) => boolean; + isDefaultQuery: (props: IsDefaultQueryProps) => boolean; }; export type QueryAdditionalFilter = { field: keyof IBuilderQuery; text: string; }; + +export type IsDefaultQueryProps = { + currentQuery: Query; + sourcePage: DataSource; +};