68 lines
2.5 KiB
JavaScript
68 lines
2.5 KiB
JavaScript
import { masks } from 'dateformat';
|
|
import { get } from 'lodash';
|
|
import { formatDate } from '~/lib/utils/datetime_utility';
|
|
|
|
const { isoDate } = masks;
|
|
|
|
/**
|
|
* Takes an array of items and returns one item per month with the average of the `count`s from that month
|
|
* @param {Array} items
|
|
* @param {Number} items[index].count value to be averaged
|
|
* @param {String} items[index].recordedAt item dateTime time stamp to be collected into a month
|
|
* @param {Object} options
|
|
* @param {Object} options.shouldRound an option to specify whether the retuned averages should be rounded
|
|
* @return {Array} items collected into [month, average],
|
|
* where month is a dateTime string representing the first of the given month
|
|
* and average is the average of the count
|
|
*/
|
|
export function getAverageByMonth(items = [], options = {}) {
|
|
const { shouldRound = false } = options;
|
|
const itemsMap = items.reduce((memo, item) => {
|
|
const { count, recordedAt } = item;
|
|
const date = new Date(recordedAt);
|
|
const month = formatDate(new Date(date.getFullYear(), date.getMonth(), 1), isoDate);
|
|
if (memo[month]) {
|
|
const { sum, recordCount } = memo[month];
|
|
return { ...memo, [month]: { sum: sum + count, recordCount: recordCount + 1 } };
|
|
}
|
|
|
|
return { ...memo, [month]: { sum: count, recordCount: 1 } };
|
|
}, {});
|
|
|
|
return Object.keys(itemsMap).map((month) => {
|
|
const { sum, recordCount } = itemsMap[month];
|
|
const avg = sum / recordCount;
|
|
if (shouldRound) {
|
|
return [month, Math.round(avg)];
|
|
}
|
|
|
|
return [month, avg];
|
|
});
|
|
}
|
|
|
|
/**
|
|
* Takes an array of usage counts and returns the last item in the list
|
|
* @param {Array} arr array of usage counts in the form { count: Number, recordedAt: date String }
|
|
* @return {String} the 'recordedAt' value of the earliest item
|
|
*/
|
|
export const getEarliestDate = (arr = []) => {
|
|
const len = arr.length;
|
|
return get(arr, `[${len - 1}].recordedAt`, null);
|
|
};
|
|
|
|
/**
|
|
* Takes an array of queries and produces an object with the query identifier as key
|
|
* and a supplied defaultValue as its value
|
|
* @param {Array} queries array of chart query configs,
|
|
* see ./analytics/usage_trends/components/charts_config.js
|
|
* @param {any} defaultValue value to set each identifier to
|
|
* @return {Object} key value pair of the form { queryIdentifier: defaultValue }
|
|
*/
|
|
export const generateDataKeys = (queries, defaultValue) =>
|
|
queries.reduce(
|
|
(acc, { identifier }) => ({
|
|
...acc,
|
|
[identifier]: defaultValue,
|
|
}),
|
|
{},
|
|
);
|