Skip to content

Commit db81235

Browse files
authored
fix: use count query for...bar instead of limit 100 (#3756)
Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
1 parent a6990b5 commit db81235

2 files changed

Lines changed: 51 additions & 24 deletions

File tree

src/components/QueriesActivityBar/useQueriesActivityData.ts

Lines changed: 4 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@ import React from 'react';
22

33
import {selectGraphShardExists} from '../../store/reducers/capabilities/capabilities';
44
import {topQueriesApi} from '../../store/reducers/executeTopQueries/executeTopQueries';
5-
import type {KeyValueRow} from '../../types/api/query';
65
import {useAutoRefreshInterval} from '../../utils/hooks';
76
import {useTypedSelector} from '../../utils/hooks/useTypedSelector';
87
import type {TimeFrame} from '../../utils/timeframes';
@@ -32,10 +31,9 @@ export function useQueriesActivityData(database: string): UseQueriesActivityData
3231
const graphShardExists = useTypedSelector((state) => selectGraphShardExists(state, database));
3332
const skipCharts = graphShardExists === false;
3433

35-
const {data: runningQueriesData} = topQueriesApi.useGetRunningQueriesQuery(
34+
const {data: runningQueriesCountData} = topQueriesApi.useGetRunningQueriesCountQuery(
3635
{
3736
database,
38-
filters: {},
3937
},
4038
{pollingInterval: shouldRefresh},
4139
);
@@ -64,7 +62,9 @@ export function useQueriesActivityData(database: string): UseQueriesActivityData
6462
{pollingInterval: shouldRefresh, skip: skipCharts},
6563
);
6664

67-
const runningQueriesCount = runningQueriesData?.resultSets?.[0]?.result?.length || 0;
65+
const runningQueriesCount = runningQueriesCountData?.runningQueriesCount ?? 0;
66+
const uniqueApplications = runningQueriesCountData?.uniqueApplications ?? 0;
67+
const uniqueUsers = runningQueriesCountData?.uniqueUsers ?? 0;
6868

6969
// Determine chart availability from queries API success/error state
7070
const areChartsAvailable = React.useMemo(() => {
@@ -90,26 +90,6 @@ export function useQueriesActivityData(database: string): UseQueriesActivityData
9090
[latencyData?.metrics?.[0]?.data],
9191
);
9292

93-
const uniqueApplications = React.useMemo(() => {
94-
const apps = new Set<string>();
95-
runningQueriesData?.resultSets?.[0]?.result?.forEach((row: KeyValueRow) => {
96-
if (row.ApplicationName) {
97-
apps.add(String(row.ApplicationName));
98-
}
99-
});
100-
return apps.size;
101-
}, [runningQueriesData]);
102-
103-
const uniqueUsers = React.useMemo(() => {
104-
const users = new Set<string>();
105-
runningQueriesData?.resultSets?.[0]?.result?.forEach((row: KeyValueRow) => {
106-
if (row.UserSID) {
107-
users.add(String(row.UserSID));
108-
}
109-
});
110-
return users.size;
111-
}, [runningQueriesData]);
112-
11393
return {
11494
runningQueriesCount,
11595
uniqueApplications,

src/store/reducers/executeTopQueries/executeTopQueries.ts

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -99,6 +99,17 @@ AND QueryStartAt is not null ${orderBy}
9999
LIMIT ${limit || 100}`;
100100
}
101101

102+
function getRunningQueriesCountText() {
103+
return `${QUERY_TECHNICAL_MARK}
104+
SELECT
105+
COUNT(*) as RunningQueriesCount,
106+
COUNT(DISTINCT CASE WHEN ApplicationName = '' THEN NULL ELSE ApplicationName END) as UniqueApplications,
107+
COUNT(DISTINCT CASE WHEN UserSID = '' THEN NULL ELSE UserSID END) as UniqueUsers
108+
FROM \`.sys/query_sessions\`
109+
WHERE Query NOT LIKE '%${QUERY_TECHNICAL_MARK}%'
110+
AND QueryStartAt is not null`;
111+
}
112+
102113
interface QueriesRequestParams {
103114
database: string;
104115
filters?: TopQueriesFilters;
@@ -190,6 +201,42 @@ export const topQueriesApi = api.injectEndpoints({
190201
},
191202
providesTags: ['All'],
192203
}),
204+
getRunningQueriesCount: build.query({
205+
queryFn: async ({database}: {database: string}, {signal}) => {
206+
try {
207+
const response = await window.api.viewer.sendQuery(
208+
{
209+
query: getRunningQueriesCountText(),
210+
database,
211+
action: 'execute-query',
212+
internal_call: true,
213+
},
214+
{signal, withRetries: true},
215+
);
216+
217+
if (isQueryErrorResponse(response)) {
218+
throw response;
219+
}
220+
221+
const data = parseQueryAPIResponse(response);
222+
const row = data?.resultSets?.[0]?.result?.[0];
223+
224+
return {
225+
data: {
226+
runningQueriesCount: Number(row?.RunningQueriesCount) || 0,
227+
uniqueApplications: Number(row?.UniqueApplications) || 0,
228+
uniqueUsers: Number(row?.UniqueUsers) || 0,
229+
},
230+
};
231+
} catch (error) {
232+
return {error};
233+
}
234+
},
235+
forceRefetch() {
236+
return true;
237+
},
238+
providesTags: ['All'],
239+
}),
193240
}),
194241
overrideExisting: 'throw',
195242
});

0 commit comments

Comments
 (0)