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,
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,

View File

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

View File

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

View File

@ -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<QueryBuilderContextType>({
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(
<T extends keyof QueryBuilderData>(
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,

View File

@ -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;
};