mirror of
https://git.mirrors.martin98.com/https://github.com/SigNoz/signoz
synced 2025-08-12 16:58:59 +08:00
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:
parent
838192cf5c
commit
d2aa1cf06e
@ -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,
|
||||
|
@ -155,6 +155,7 @@ describe('Logs Explorer Tests', () => {
|
||||
const { queryAllByText } = render(
|
||||
<QueryBuilderContext.Provider
|
||||
value={{
|
||||
isDefaultQuery: (): boolean => false,
|
||||
currentQuery: {
|
||||
...initialQueriesMap.metrics,
|
||||
builder: {
|
||||
|
@ -195,6 +195,7 @@ export const compositeQuery: Query = {
|
||||
export const redirectWithQueryBuilderData = jest.fn();
|
||||
|
||||
export const qbProviderValue = {
|
||||
isDefaultQuery: jest.fn(() => false),
|
||||
currentQuery: {
|
||||
...initialQueriesMap.traces,
|
||||
builder: {
|
||||
|
@ -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,
|
||||
|
@ -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;
|
||||
};
|
||||
|
Loading…
x
Reference in New Issue
Block a user