fix: fix the issue of saved view overriding query for logs and traces (#6678)

* fix: fix the issue of saved view overriding query for logs and traces for builder type query

* chore: refactored isDefaultQuery to use a function to extract relevant keys and use lodash's isEqual

* fix: add check for multiple queries in isDefaultQuery logic

* chore: moved extractRelevantKeys outside isDefaultQuery

* fix: fix the failing tests
This commit is contained in:
Shaheer Kochai 2024-12-24 20:09:48 +04:30 committed by GitHub
parent 838192cf5c
commit d2aa1cf06e
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
5 changed files with 108 additions and 2 deletions

View File

@ -112,6 +112,7 @@ function ExplorerOptions({
panelType, panelType,
isStagedQueryUpdated, isStagedQueryUpdated,
redirectWithQueryBuilderData, redirectWithQueryBuilderData,
isDefaultQuery,
} = useQueryBuilder(); } = useQueryBuilder();
const handleSaveViewModalToggle = (): void => { const handleSaveViewModalToggle = (): void => {
@ -478,6 +479,11 @@ function ExplorerOptions({
] = useState(false); ] = useState(false);
useEffect(() => { 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( const parsedPreservedView = JSON.parse(
localStorage.getItem(PRESERVED_VIEW_LOCAL_STORAGE_KEY) || '{}', localStorage.getItem(PRESERVED_VIEW_LOCAL_STORAGE_KEY) || '{}',
); );
@ -499,12 +505,18 @@ function ExplorerOptions({
setIsRecentlyUsedSavedViewSelected(false); setIsRecentlyUsedSavedViewSelected(false);
} }
return (): void => clearTimeout(timeoutId); // eslint-disable-next-line consistent-return
return (): void => {
clearTimeout(timeoutId);
};
}, [ }, [
PRESERVED_VIEW_LOCAL_STORAGE_KEY, PRESERVED_VIEW_LOCAL_STORAGE_KEY,
PRESERVED_VIEW_TYPE, PRESERVED_VIEW_TYPE,
currentQuery,
isDefaultQuery,
isRecentlyUsedSavedViewSelected, isRecentlyUsedSavedViewSelected,
onMenuItemSelectHandler, onMenuItemSelectHandler,
sourcepage,
viewKey, viewKey,
viewName, viewName,
viewsData?.data?.data, viewsData?.data?.data,

View File

@ -155,6 +155,7 @@ describe('Logs Explorer Tests', () => {
const { queryAllByText } = render( const { queryAllByText } = render(
<QueryBuilderContext.Provider <QueryBuilderContext.Provider
value={{ value={{
isDefaultQuery: (): boolean => false,
currentQuery: { currentQuery: {
...initialQueriesMap.metrics, ...initialQueriesMap.metrics,
builder: { builder: {

View File

@ -195,6 +195,7 @@ export const compositeQuery: Query = {
export const redirectWithQueryBuilderData = jest.fn(); export const redirectWithQueryBuilderData = jest.fn();
export const qbProviderValue = { export const qbProviderValue = {
isDefaultQuery: jest.fn(() => false),
currentQuery: { currentQuery: {
...initialQueriesMap.traces, ...initialQueriesMap.traces,
builder: { builder: {

View File

@ -27,7 +27,7 @@ import { createIdFromObjectFields } from 'lib/createIdFromObjectFields';
import { createNewBuilderItemName } from 'lib/newQueryBuilder/createNewBuilderItemName'; import { createNewBuilderItemName } from 'lib/newQueryBuilder/createNewBuilderItemName';
import { getOperatorsBySourceAndPanelType } from 'lib/newQueryBuilder/getOperatorsBySourceAndPanelType'; import { getOperatorsBySourceAndPanelType } from 'lib/newQueryBuilder/getOperatorsBySourceAndPanelType';
import { replaceIncorrectObjectFields } from 'lib/replaceIncorrectObjectFields'; import { replaceIncorrectObjectFields } from 'lib/replaceIncorrectObjectFields';
import { cloneDeep, get, merge, set } from 'lodash-es'; import { cloneDeep, get, isEqual, merge, set } from 'lodash-es';
import { import {
createContext, createContext,
PropsWithChildren, PropsWithChildren,
@ -53,6 +53,7 @@ import { ViewProps } from 'types/api/saveViews/types';
import { EQueryType } from 'types/common/dashboard'; import { EQueryType } from 'types/common/dashboard';
import { import {
DataSource, DataSource,
IsDefaultQueryProps,
QueryBuilderContextType, QueryBuilderContextType,
QueryBuilderData, QueryBuilderData,
} from 'types/common/queryBuilder'; } from 'types/common/queryBuilder';
@ -87,6 +88,7 @@ export const QueryBuilderContext = createContext<QueryBuilderContextType>({
initQueryBuilderData: () => {}, initQueryBuilderData: () => {},
handleOnUnitsChange: () => {}, handleOnUnitsChange: () => {},
isStagedQueryUpdated: () => false, isStagedQueryUpdated: () => false,
isDefaultQuery: () => false,
}); });
export function QueryBuilderProvider({ export function QueryBuilderProvider({
@ -250,6 +252,88 @@ export function QueryBuilderProvider({
[getElementWithActualOperator], [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( const updateQueriesData = useCallback(
<T extends keyof QueryBuilderData>( <T extends keyof QueryBuilderData>(
query: Query, query: Query,
@ -884,6 +968,7 @@ export function QueryBuilderProvider({
handleRunQuery, handleRunQuery,
resetQuery, resetQuery,
updateAllQueriesOperators, updateAllQueriesOperators,
isDefaultQuery,
updateQueriesData, updateQueriesData,
initQueryBuilderData, initQueryBuilderData,
handleOnUnitsChange, handleOnUnitsChange,
@ -910,6 +995,7 @@ export function QueryBuilderProvider({
redirectWithQueryBuilderData, redirectWithQueryBuilderData,
handleRunQuery, handleRunQuery,
updateAllQueriesOperators, updateAllQueriesOperators,
isDefaultQuery,
updateQueriesData, updateQueriesData,
initQueryBuilderData, initQueryBuilderData,
handleOnUnitsChange, handleOnUnitsChange,

View File

@ -247,9 +247,15 @@ export type QueryBuilderContextType = {
viewData: ViewProps[] | undefined, viewData: ViewProps[] | undefined,
viewKey: string, viewKey: string,
) => boolean; ) => boolean;
isDefaultQuery: (props: IsDefaultQueryProps) => boolean;
}; };
export type QueryAdditionalFilter = { export type QueryAdditionalFilter = {
field: keyof IBuilderQuery; field: keyof IBuilderQuery;
text: string; text: string;
}; };
export type IsDefaultQueryProps = {
currentQuery: Query;
sourcePage: DataSource;
};