From b8b802c8ed6dd352c47865af15dc37aebd399ff9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gast=C3=B3n=20Fournier?= Date: Fri, 19 Aug 2022 11:45:41 +0200 Subject: [PATCH] refactor: improve performance of collapseHourlyMetrics (#1945) --- src/lib/util/collapseHourlyMetrics.ts | 50 ++++++++------------------- 1 file changed, 15 insertions(+), 35 deletions(-) diff --git a/src/lib/util/collapseHourlyMetrics.ts b/src/lib/util/collapseHourlyMetrics.ts index 9b0bd75803..f28c3bce45 100644 --- a/src/lib/util/collapseHourlyMetrics.ts +++ b/src/lib/util/collapseHourlyMetrics.ts @@ -1,17 +1,6 @@ import { IClientMetricsEnv } from '../types/stores/client-metrics-store-v2'; import { startOfHour } from 'date-fns'; -const groupBy = (list: T[], createKey: (item: T) => string): T[][] => { - const groups = list.reduce((acc, item) => { - const key = createKey(item); - acc[key] = acc[key] ?? []; - acc[key].push(item); - return acc; - }, {} as Record); - - return Object.values(groups); -}; - const createMetricKey = (metric: IClientMetricsEnv): string => { return [ metric.featureName, @@ -21,31 +10,22 @@ const createMetricKey = (metric: IClientMetricsEnv): string => { ].join(); }; -const sumYesNo = ( - metrics: IClientMetricsEnv[], -): Pick => { - return metrics.reduce( - (acc, metric) => ({ - yes: acc.yes + metric.yes, - no: acc.no + metric.no, - }), - { - yes: 0, - no: 0, - }, - ); -}; - export const collapseHourlyMetrics = ( metrics: IClientMetricsEnv[], ): IClientMetricsEnv[] => { - const hourlyMetrics = metrics.map((metric) => ({ - ...metric, - timestamp: startOfHour(metric.timestamp), - })); - - return groupBy(hourlyMetrics, createMetricKey).flatMap((group) => ({ - ...group[0], - ...sumYesNo(group), - })); + const grouped = new Map(); + metrics.forEach((metric) => { + const hourlyMetric = { + ...metric, + timestamp: startOfHour(metric.timestamp), + }; + const key = createMetricKey(hourlyMetric); + if (!grouped[key]) { + grouped[key] = hourlyMetric; + } else { + grouped[key].yes = metric.yes + (grouped[key].yes || 0); + grouped[key].no = metric.no + (grouped[key].no || 0); + } + }); + return Object.values(grouped); };