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,
|
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,
|
||||||
|
@ -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: {
|
||||||
|
@ -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: {
|
||||||
|
@ -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,
|
||||||
|
@ -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;
|
||||||
|
};
|
||||||
|
Loading…
x
Reference in New Issue
Block a user