+ {isLoading && formatted == null ? (
+
+ Loading Chart Data...
+
+ ) : formatted == null || formatted.graphResults.length === 0 ? (
+
+ No data found within time range.
+
+ ) : (
+
+ )}
+
+ );
+}
+
+/**
+ * Summed "N Results" across every selected source, sharing the histogram's
+ * per-source queries (identical query keys) so it adds no ClickHouse load.
+ */
+function MergedSourcesTotalCount({
+ specs,
+ enabled = true,
+ queryKeyPrefix,
+ enableParallelQueries,
+}: {
+ specs: SearchHistogramSpec[];
+ enabled?: boolean;
+ queryKeyPrefix: string;
+ enableParallelQueries?: boolean;
+}) {
+ const { mergedResponse, isLoading, allFailed } = useMultiSourceHistogram(
+ specs,
+ {
+ enabled,
+ queryKeyPrefix,
+ enableParallelQueries,
+ },
+ );
+
+ const totalCount = useMemo(() => {
+ if (mergedResponse == null) return undefined;
+ // The count column may be renamed (e.g. via materialized views); fall back
+ // to the first numeric column, mirroring SearchTotalCountChart.
+ const countColumn =
+ mergedResponse.meta?.find(c => c.name === 'count()')?.name ??
+ filterColumnMetaByType(mergedResponse.meta ?? [], [
+ JSDataType.Number,
+ ])?.[0]?.name ??
+ 'count()';
+ return mergedResponse.data.reduce(
+ (sum: number, row: any) => sum + (Number.parseInt(row[countColumn]) || 0),
+ 0,
+ );
+ }, [mergedResponse]);
+
+ return (
+