Skip to content
This repository was archived by the owner on May 13, 2025. It is now read-only.

Commit e08e116

Browse files
committed
feat: Log Count for correlation page
1 parent a53b1c1 commit e08e116

File tree

6 files changed

+128
-8
lines changed

6 files changed

+128
-8
lines changed

src/api/query.ts

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,12 @@ export const getCorrelationQueryLogsWithHeaders = (logsQuery: CorrelationLogs) =
6868
return Axios().post<LogsResponseWithHeaders>(endPoint, queryBuilder.getCorrelationQuery(), {});
6969
};
7070

71+
export const getCorrelationQueryCount = (logsQuery: CorrelationLogs) => {
72+
const queryBuilder = new CorrelationQueryBuilder(logsQuery);
73+
const endPoint = LOG_QUERY_URL();
74+
return Axios().post<Log[]>(endPoint, makeCustomQueryRequestData(logsQuery, queryBuilder.getCountQuery()), {});
75+
};
76+
7177
export const getStreamDataWithHeaders = (logsQuery: CorrelationLogs) => {
7278
const queryBuilder = new CorrelationQueryBuilder(logsQuery);
7379
const endPoint = LOG_QUERY_URL({ fields: true }, queryBuilder.getResourcePath());
@@ -76,7 +82,7 @@ export const getStreamDataWithHeaders = (logsQuery: CorrelationLogs) => {
7682

7783
// ------ Custom sql query
7884

79-
const makeCustomQueryRequestData = (logsQuery: LogsQuery, query: string) => {
85+
const makeCustomQueryRequestData = (logsQuery: LogsQuery | CorrelationLogs, query: string) => {
8086
const { startTime, endTime } = logsQuery;
8187
return { query, startTime: optimizeTime(startTime), endTime: optimizeTime(endTime) };
8288
};

src/pages/Correlation/Views/CorrelationFooter.tsx

Lines changed: 35 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { FC, useCallback } from 'react';
22
import { usePagination } from '@mantine/hooks';
3-
import { Box, Center, Group, Menu, Pagination, Stack } from '@mantine/core';
3+
import { Box, Center, Group, Menu, Pagination, Stack, Tooltip } from '@mantine/core';
44
import _ from 'lodash';
55
import { Text } from '@mantine/core';
66
import { IconSelector } from '@tabler/icons-react';
@@ -9,9 +9,37 @@ import classes from '../styles/Footer.module.css';
99
import { LOGS_FOOTER_HEIGHT } from '@/constants/theme';
1010
import { correlationStoreReducers, useCorrelationStore } from '@/pages/Correlation/providers/CorrelationProvider';
1111
import { LOG_QUERY_LIMITS, LOAD_LIMIT } from '@/pages/Stream/providers/LogsProvider';
12+
import { HumanizeNumber } from '@/utils/formatBytes';
1213

1314
const { setCurrentOffset, setCurrentPage, setPageAndPageData } = correlationStoreReducers;
1415

16+
const TotalCount = (props: { totalCount: number }) => {
17+
return (
18+
<Tooltip label={props.totalCount}>
19+
<Text style={{ fontSize: '0.7rem' }}>{HumanizeNumber(props.totalCount)}</Text>
20+
</Tooltip>
21+
);
22+
};
23+
24+
const TotalLogsCount = (props: { hasTableLoaded: boolean; isTableEmpty: boolean }) => {
25+
const [{ totalCount, perPage, pageData }] = useCorrelationStore((store) => store.tableOpts);
26+
const displayedCount = _.size(pageData);
27+
const showingCount = displayedCount < perPage ? displayedCount : perPage;
28+
if (typeof totalCount !== 'number' || typeof displayedCount !== 'number') return <Stack />;
29+
30+
return (
31+
<Stack style={{ alignItems: 'center', justifyContent: 'center', flexDirection: 'row' }} gap={6}>
32+
{!props.isTableEmpty ? (
33+
<>
34+
<Text style={{ fontSize: '0.7rem' }}>{`Showing ${showingCount} out of`}</Text>
35+
<TotalCount totalCount={totalCount} />
36+
<Text style={{ fontSize: '0.7rem' }}>records</Text>
37+
</>
38+
) : null}
39+
</Stack>
40+
);
41+
};
42+
1543
const LimitControl: FC = () => {
1644
const [opened, setOpened] = useMountedState(false);
1745
const [perPage, setCorrelationStore] = useCorrelationStore((store) => store.tableOpts.perPage);
@@ -58,6 +86,7 @@ const LimitControl: FC = () => {
5886

5987
const CorrelationFooter = (props: { loaded: boolean; hasNoData: boolean; isFetchingCount: boolean }) => {
6088
const [tableOpts, setCorrelationStore] = useCorrelationStore((store) => store.tableOpts);
89+
const [isCorrelatedData] = useCorrelationStore((store) => store.isCorrelatedData);
6190
const { totalPages, currentOffset, currentPage, perPage, totalCount } = tableOpts;
6291

6392
const onPageChange = useCallback((page: number) => {
@@ -84,14 +113,14 @@ const CorrelationFooter = (props: { loaded: boolean; hasNoData: boolean; isFetch
84113
[currentOffset],
85114
);
86115

116+
console.log('currentOffset', currentOffset);
117+
// console.log(LOAD_LIMIT);
118+
console.log('totalCount', totalCount);
119+
87120
return (
88121
<Stack className={classes.footerContainer} gap={0} style={{ height: LOGS_FOOTER_HEIGHT }}>
89122
<Stack w="100%" justify="center" align="flex-start">
90-
{/* <TotalLogsCount
91-
hasTableLoaded={props.loaded}
92-
isFetchingCount={props.isFetchingCount}
93-
isTableEmpty={props.hasNoData}
94-
/> */}
123+
{isCorrelatedData && <TotalLogsCount hasTableLoaded={props.loaded} isTableEmpty={props.hasNoData} />}
95124
</Stack>
96125
<Stack w="100%" justify="center">
97126
{props.loaded ? (
Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
import { useAppStore } from '@/layouts/MainLayout/providers/AppProvider';
2+
import {
3+
CORRELATION_LOAD_LIMIT,
4+
correlationStoreReducers,
5+
useCorrelationStore,
6+
} from '../providers/CorrelationProvider';
7+
import { useState } from 'react';
8+
import { useQuery } from 'react-query';
9+
import { getCorrelationQueryCount } from '@/api/query';
10+
import _ from 'lodash';
11+
import { useStreamStore } from '@/pages/Stream/providers/StreamProvider';
12+
13+
const { setTotalCount } = correlationStoreReducers;
14+
15+
export const useCorrelationFetchCount = () => {
16+
const [timeRange] = useAppStore((store) => store.timeRange);
17+
const [{ fields, tableOpts, selectedFields, correlationCondition }, setCorrelationData] = useCorrelationStore(
18+
(store) => store,
19+
);
20+
const [streamInfo] = useStreamStore((store) => store.info);
21+
const timePartitionColumn = _.get(streamInfo, 'time_partition', 'p_timestamp');
22+
const [countLoading, setCountLoading] = useState(true);
23+
24+
const streamNames = Object.keys(fields);
25+
const defaultQueryOpts = {
26+
startTime: timeRange.startTime,
27+
endTime: timeRange.endTime,
28+
limit: CORRELATION_LOAD_LIMIT,
29+
pageOffset: tableOpts.currentOffset,
30+
timePartitionColumn,
31+
selectedFields: _.flatMap(selectedFields, (values, key) => _.map(values, (value) => `${key}.${value}`)) || [],
32+
correlationCondition: correlationCondition,
33+
};
34+
const queryOpts = { ...defaultQueryOpts, streamNames };
35+
36+
const { refetch: refetchCount } = useQuery(
37+
['fetchCount', defaultQueryOpts],
38+
async () => {
39+
setCountLoading(true);
40+
const data = await getCorrelationQueryCount(queryOpts);
41+
const count = _.first(data.data)?.count;
42+
typeof count === 'number' && setCorrelationData((store) => setTotalCount(store, count));
43+
return data;
44+
},
45+
{
46+
// query for count should always hit the endpoint for parseable query
47+
refetchOnWindowFocus: false,
48+
retry: false,
49+
enabled: false,
50+
onSuccess: () => {
51+
setCountLoading(false);
52+
},
53+
onError: () => {
54+
setCountLoading(false);
55+
},
56+
},
57+
);
58+
59+
return {
60+
countLoading,
61+
refetchCount,
62+
};
63+
};

src/pages/Correlation/index.tsx

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ import { useCorrelationsQuery } from '@/hooks/useCorrelations';
3131
import SavedCorrelationsButton from './components/SavedCorrelationsBtn';
3232
import SavedCorrelationsModal from './components/SavedCorrelationsModal';
3333
import SaveCorrelationModal from './components/SaveCorrelationModal';
34+
import { useCorrelationFetchCount } from './hooks/useCorrelationFetchCount';
3435

3536
const { changeStream, syncTimeRange } = appStoreReducers;
3637
const {
@@ -78,6 +79,7 @@ const Correlation = () => {
7879
const { getCorrelationData, loading: logsLoading, error: errorMessage } = useCorrelationQueryLogs();
7980
const { getFetchStreamData, loading: streamsLoading } = useFetchStreamData();
8081
const { fetchCorrelations, getCorrelationByIdMutation } = useCorrelationsQuery();
82+
const { refetchCount, countLoading } = useCorrelationFetchCount();
8183

8284
// Local State
8385
const [searchText, setSearchText] = useState('');
@@ -149,6 +151,7 @@ const Correlation = () => {
149151

150152
useEffect(() => {
151153
if (isCorrelatedData) {
154+
refetchCount();
152155
getCorrelationData();
153156
} else {
154157
getFetchStreamData();
@@ -159,6 +162,7 @@ const Correlation = () => {
159162
updateCorrelationCondition();
160163
if (activeCorrelation && correlationCondition && isSavedCorrelation) {
161164
setCorrelationData((store) => setIsCorrelatedFlag(store, true));
165+
refetchCount();
162166
getCorrelationData();
163167
}
164168
correlationCondition && setIsCorrelationEnabled(true);
@@ -474,6 +478,7 @@ const Correlation = () => {
474478
onClick={() => {
475479
setCorrelationData((store) => setIsCorrelatedFlag(store, true));
476480
setIsCorrelationEnabled(false);
481+
refetchCount();
477482
getCorrelationData();
478483
}}>
479484
Correlate
@@ -496,7 +501,7 @@ const Correlation = () => {
496501
{...{ errorMessage, logsLoading, streamsLoading, showTable, hasNoData }}
497502
primaryHeaderHeight={primaryHeaderHeight}
498503
/>
499-
<CorrelationFooter loaded={showTable} hasNoData={hasNoData} isFetchingCount={true} />
504+
<CorrelationFooter loaded={showTable} hasNoData={hasNoData} isFetchingCount={countLoading} />
500505
</>
501506
)}
502507
{Object.keys(selectedFields).length === 0 && (

src/pages/Correlation/providers/CorrelationProvider.tsx

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,7 @@ type CorrelationStoreReducers = {
9090
toggleSaveCorrelationModal: (_store: CorrelationStore, val: boolean) => ReducerOutput;
9191
cleanCorrelationStore: (store: CorrelationStore) => ReducerOutput;
9292
setSavedCorrelationId: (store: CorrelationStore, id: string) => ReducerOutput;
93+
setTotalCount: (store: CorrelationStore, count: number) => ReducerOutput;
9394
};
9495

9596
const initialState: CorrelationStore = {
@@ -260,6 +261,15 @@ const cleanCorrelationStore = (store: CorrelationStore) => {
260261
};
261262
};
262263

264+
const setTotalCount = (store: CorrelationStore, totalCount: number) => {
265+
return {
266+
tableOpts: {
267+
...store.tableOpts,
268+
totalCount,
269+
},
270+
};
271+
};
272+
263273
const toggleSaveCorrelationModal = (store: CorrelationStore, val: boolean) => {
264274
return {
265275
...store,
@@ -599,6 +609,7 @@ const correlationStoreReducers: CorrelationStoreReducers = {
599609
setActiveCorrelation,
600610
cleanCorrelationStore,
601611
setSavedCorrelationId,
612+
setTotalCount,
602613
};
603614

604615
export { CorrelationProvider, useCorrelationStore, correlationStoreReducers };

src/utils/queryBuilder.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -142,6 +142,12 @@ export class CorrelationQueryBuilder {
142142
};
143143
}
144144

145+
getCountQuery() {
146+
return `WITH user_query_count as ( ${
147+
this.getCorrelationQuery().query
148+
} )SELECT count(*) as count from user_query_count`;
149+
}
150+
145151
getParseableQuery() {
146152
/* eslint-disable no-useless-escape */
147153
const query = `SELECT * FROM \"${this.streamNames[0]}\" LIMIT ${this.limit}`;

0 commit comments

Comments
 (0)