Skip to content

Commit 98c5610

Browse files
committed
feat(RunningQueries): add userSID search
1 parent a278618 commit 98c5610

File tree

6 files changed

+25
-15
lines changed

6 files changed

+25
-15
lines changed

src/containers/Tenant/Diagnostics/TopQueries/RunningQueriesData.tsx

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import {ResponseError} from '../../../../components/Errors/ResponseError';
44
import {ResizeableDataTable} from '../../../../components/ResizeableDataTable/ResizeableDataTable';
55
import {TableWithControlsLayout} from '../../../../components/TableWithControlsLayout/TableWithControlsLayout';
66
import {topQueriesApi} from '../../../../store/reducers/executeTopQueries/executeTopQueries';
7+
import type {KeyValueRow} from '../../../../types/api/query';
78
import {useAutoRefreshInterval, useTypedSelector} from '../../../../utils/hooks';
89
import {parseQueryErrorToString} from '../../../../utils/query';
910
import {QUERY_TABLE_SETTINGS} from '../../utils/constants';
@@ -16,9 +17,11 @@ import i18n from './i18n';
1617

1718
interface Props {
1819
database: string;
20+
onRowClick: (query: string) => void;
21+
rowClassName: string;
1922
}
2023

21-
export const RunningQueriesData = ({database}: Props) => {
24+
export const RunningQueriesData = ({database, onRowClick, rowClassName}: Props) => {
2225
const [autoRefreshInterval] = useAutoRefreshInterval();
2326
const filters = useTypedSelector((state) => state.executeTopQueries);
2427
const {currentData, isFetching, error} = topQueriesApi.useGetRunningQueriesQuery(
@@ -31,16 +34,22 @@ export const RunningQueriesData = ({database}: Props) => {
3134

3235
const data = currentData?.resultSets?.[0].result || [];
3336

37+
const handleRowClick = (row: KeyValueRow) => {
38+
return onRowClick(row.QueryText as string);
39+
};
40+
3441
return (
3542
<React.Fragment>
3643
{error ? <ResponseError error={parseQueryErrorToString(error)} /> : null}
37-
<TableWithControlsLayout.Table loading={isFetching && data === undefined}>
44+
<TableWithControlsLayout.Table loading={isFetching && !data.length}>
3845
<ResizeableDataTable
3946
emptyDataMessage={i18n('no-data')}
4047
columnsWidthLSKey={RUNNING_QUERIES_COLUMNS_WIDTH_LS_KEY}
4148
columns={RUNNING_QUERIES_COLUMNS}
4249
data={data}
4350
settings={QUERY_TABLE_SETTINGS}
51+
onRowClick={handleRowClick}
52+
rowClassName={() => rowClassName}
4453
/>
4554
</TableWithControlsLayout.Table>
4655
</React.Fragment>

src/containers/Tenant/Diagnostics/TopQueries/TopQueries.tsx

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,8 @@ export const TopQueries = ({tenantName}: TopQueriesProps) => {
9393
dispatch(setTopQueriesFilters(value));
9494
};
9595

96+
const DataComponent = isTopQueries ? TopQueriesData : RunningQueriesData;
97+
9698
return (
9799
<TableWithControlsLayout>
98100
<TableWithControlsLayout.Controls>
@@ -115,11 +117,7 @@ export const TopQueries = ({tenantName}: TopQueriesProps) => {
115117
/>
116118
) : null}
117119
</TableWithControlsLayout.Controls>
118-
{isTopQueries ? (
119-
<TopQueriesData database={tenantName} onRowClick={onRowClick} />
120-
) : (
121-
<RunningQueriesData database={tenantName} />
122-
)}
120+
<DataComponent database={tenantName} onRowClick={onRowClick} rowClassName={b('row')} />
123121
</TableWithControlsLayout>
124122
);
125123
};

src/containers/Tenant/Diagnostics/TopQueries/TopQueriesData.tsx

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@ import {ResizeableDataTable} from '../../../../components/ResizeableDataTable/Re
55
import {TableWithControlsLayout} from '../../../../components/TableWithControlsLayout/TableWithControlsLayout';
66
import {topQueriesApi} from '../../../../store/reducers/executeTopQueries/executeTopQueries';
77
import type {KeyValueRow} from '../../../../types/api/query';
8-
import {cn} from '../../../../utils/cn';
98
import {isSortableTopQueriesProperty} from '../../../../utils/diagnostics';
109
import {useAutoRefreshInterval, useTypedSelector} from '../../../../utils/hooks';
1110
import {parseQueryErrorToString} from '../../../../utils/query';
@@ -14,14 +13,13 @@ import {QUERY_TABLE_SETTINGS} from '../../utils/constants';
1413
import {TOP_QUERIES_COLUMNS, TOP_QUERIES_COLUMNS_WIDTH_LS_KEY} from './getTopQueriesColumns';
1514
import i18n from './i18n';
1615

17-
const b = cn('kv-top-queries');
18-
1916
interface Props {
2017
database: string;
2118
onRowClick: (query: string) => void;
19+
rowClassName: string;
2220
}
2321

24-
export const TopQueriesData = ({database, onRowClick}: Props) => {
22+
export const TopQueriesData = ({database, onRowClick, rowClassName}: Props) => {
2523
const [autoRefreshInterval] = useAutoRefreshInterval();
2624
const filters = useTypedSelector((state) => state.executeTopQueries);
2725
const {currentData, isFetching, error} = topQueriesApi.useGetTopQueriesQuery(
@@ -54,7 +52,7 @@ export const TopQueriesData = ({database, onRowClick}: Props) => {
5452
data={data || []}
5553
settings={QUERY_TABLE_SETTINGS}
5654
onRowClick={handleRowClick}
57-
rowClassName={() => b('row')}
55+
rowClassName={() => rowClassName}
5856
/>
5957
</TableWithControlsLayout.Table>
6058
</React.Fragment>

src/containers/Tenant/Diagnostics/TopQueries/i18n/en.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"no-data": "No data",
3-
"filter.text.placeholder": "Search by query text...",
3+
"filter.text.placeholder": "Search by query text or userSID...",
44
"mode_top": "Top",
55
"mode_running": "Running",
66
"col_user": "User",

src/store/reducers/executeTopQueries/executeTopQueries.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -94,7 +94,10 @@ export const topQueriesApi = api.injectEndpoints({
9494
{signal},
9595
) => {
9696
try {
97-
const filterConditions = filters?.text ? `Query ILIKE '%${filters.text}%'` : '';
97+
const filterConditions = filters?.text
98+
? `Query ILIKE '%${filters.text}%' OR UserSID ILIKE '%${filters.text}%'`
99+
: '';
100+
98101
const commonQueryPart = `SELECT UserSID, QueryStartAt, Query as QueryText, ApplicationName from \`.sys/query_sessions\` WHERE ${filterConditions || 'true'}`;
99102

100103
const queryText = `${commonQueryPart} AND Query NOT LIKE '${commonQueryPart}%' ORDER BY SessionStartAt limit 100`;

src/store/reducers/executeTopQueries/utils.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,9 @@ export function getFiltersConditions(path: string, filters?: TopQueriesFilters)
3737
}
3838

3939
if (filters?.text) {
40-
conditions.push(`QueryText ILIKE '%${filters.text}%'`);
40+
conditions.push(
41+
`(QueryText ILIKE '%${filters.text}%' OR UserSID ILIKE '%${filters.text}%')`,
42+
);
4143
}
4244

4345
return conditions.join(' AND ');

0 commit comments

Comments
 (0)