Skip to content

Commit a3b22e9

Browse files
committed
fix: minor improvements to chunked chart queries
1 parent 5620ca8 commit a3b22e9

File tree

2 files changed

+38
-15
lines changed

2 files changed

+38
-15
lines changed

packages/app/src/hooks/useChartConfig.tsx

Lines changed: 19 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,10 @@ import {
55
ResponseJSON,
66
} from '@hyperdx/common-utils/dist/clickhouse';
77
import { ClickhouseClient } from '@hyperdx/common-utils/dist/clickhouse/browser';
8-
import { renderChartConfig } from '@hyperdx/common-utils/dist/renderChartConfig';
8+
import {
9+
DEFAULT_AUTO_GRANULARITY_MAX_BUCKETS,
10+
renderChartConfig,
11+
} from '@hyperdx/common-utils/dist/renderChartConfig';
912
import { format } from '@hyperdx/common-utils/dist/sqlFormatter';
1013
import { ChartConfigWithOptDateRange } from '@hyperdx/common-utils/dist/types';
1114
import {
@@ -14,7 +17,10 @@ import {
1417
UseQueryOptions,
1518
} from '@tanstack/react-query';
1619

17-
import { toStartOfInterval } from '@/ChartUtils';
20+
import {
21+
convertDateRangeToGranularityString,
22+
toStartOfInterval,
23+
} from '@/ChartUtils';
1824
import { useClickhouseClient } from '@/clickhouse';
1925
import { IS_MTVIEWS_ENABLED } from '@/config';
2026
import { buildMTViewSelectQuery } from '@/hdxMTViews';
@@ -39,18 +45,25 @@ export const getGranularityAlignedTimeWindows = (
3945
>,
4046
windowDurationsSeconds?: number[],
4147
): TimeWindow[] | [undefined] => {
42-
// Granularity is required for pagination, otherwise we could break other group-bys
48+
// Granularity is required for pagination, otherwise we could break other group-bys.
4349
// Date range is required for pagination, otherwise we'd have infinite pages, or some unbounded page(s).
4450
if (!config.dateRange || !config.granularity) return [undefined];
4551

4652
const [startDate, endDate] = config.dateRange;
47-
const granularity = config.granularity;
4853
const windowsUnaligned = generateTimeWindowsDescending(
4954
startDate,
5055
endDate,
5156
windowDurationsSeconds,
5257
);
5358

59+
const granularity =
60+
config.granularity === 'auto' // TODO test this
61+
? convertDateRangeToGranularityString(
62+
config.dateRange,
63+
DEFAULT_AUTO_GRANULARITY_MAX_BUCKETS,
64+
)
65+
: config.granularity;
66+
5467
const windows = [];
5568
for (const [index, window] of windowsUnaligned.entries()) {
5669
// Align windows to chart buckets
@@ -137,7 +150,7 @@ export function useQueriedChartConfig(
137150
initialValue: { data: [], meta: [], rows: 0 } as TQueryFnData,
138151
reducer: (acc, chunk) => {
139152
return {
140-
data: [...(acc?.data || []), ...(chunk.data || [])],
153+
data: [...(chunk.data || []), ...(acc?.data || [])],
141154
meta: chunk.meta,
142155
rows: (acc?.rows || 0) + (chunk.rows || 0),
143156
};
@@ -155,13 +168,8 @@ export function useQueriedChartConfig(
155168
return query;
156169
}
157170

158-
// TODO: Can we always search backwards or do we need to support forwards too?
159171
// TODO: Check if this is impacted by timezones or DST changes --> Everything UTC? Should be fine.
160-
// TODO: See if we can combine this with the useOffsetPaginatedQuery stuff
161-
// TODO: How does live mode affect this?
162-
// TODO: Can we remove the IS_MTVIEWS_ENABLED stuff?
163-
// TODO: How is caching working?
164-
// Test that this works as expected with no pagination in place (eg. no granularity or no date range)
172+
// TODO: Test that this works as expected with no pagination in place (eg. no granularity or no date range)
165173

166174
export function useRenderedSqlChartConfig(
167175
config: ChartConfigWithOptDateRange,

packages/common-utils/src/renderChartConfig.ts

Lines changed: 19 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,9 @@ import {
2929
splitAndTrimWithBracket,
3030
} from '@/utils';
3131

32+
/** The default maximum number of buckets setting when determining a bucket duration for 'auto' granularity */
33+
export const DEFAULT_AUTO_GRANULARITY_MAX_BUCKETS = 60;
34+
3235
// FIXME: SQLParser.ColumnRef is incomplete
3336
type ColumnRef = SQLParser.ColumnRef & {
3437
array_index?: {
@@ -451,7 +454,10 @@ function timeBucketExpr({
451454
const unsafeInterval = {
452455
UNSAFE_RAW_SQL:
453456
interval === 'auto' && Array.isArray(dateRange)
454-
? convertDateRangeToGranularityString(dateRange, 60)
457+
? convertDateRangeToGranularityString(
458+
dateRange,
459+
DEFAULT_AUTO_GRANULARITY_MAX_BUCKETS,
460+
)
455461
: interval,
456462
};
457463

@@ -911,7 +917,10 @@ function renderDeltaExpression(
911917
) {
912918
const interval =
913919
chartConfig.granularity === 'auto' && Array.isArray(chartConfig.dateRange)
914-
? convertDateRangeToGranularityString(chartConfig.dateRange, 60)
920+
? convertDateRangeToGranularityString(
921+
chartConfig.dateRange,
922+
DEFAULT_AUTO_GRANULARITY_MAX_BUCKETS,
923+
)
915924
: chartConfig.granularity;
916925
const intervalInSeconds = convertGranularityToSeconds(interval ?? '');
917926

@@ -1058,7 +1067,10 @@ async function translateMetricChartConfig(
10581067
includedDataInterval:
10591068
chartConfig.granularity === 'auto' &&
10601069
Array.isArray(chartConfig.dateRange)
1061-
? convertDateRangeToGranularityString(chartConfig.dateRange, 60)
1070+
? convertDateRangeToGranularityString(
1071+
chartConfig.dateRange,
1072+
DEFAULT_AUTO_GRANULARITY_MAX_BUCKETS,
1073+
)
10621074
: chartConfig.granularity,
10631075
},
10641076
metadata,
@@ -1172,7 +1184,10 @@ async function translateMetricChartConfig(
11721184
includedDataInterval:
11731185
chartConfig.granularity === 'auto' &&
11741186
Array.isArray(chartConfig.dateRange)
1175-
? convertDateRangeToGranularityString(chartConfig.dateRange, 60)
1187+
? convertDateRangeToGranularityString(
1188+
chartConfig.dateRange,
1189+
DEFAULT_AUTO_GRANULARITY_MAX_BUCKETS,
1190+
)
11761191
: chartConfig.granularity,
11771192
} as ChartConfigWithOptDateRangeEx;
11781193

0 commit comments

Comments
 (0)