UNPKG

dtable-utils

Version:

dtable common utils

122 lines (118 loc) 4.18 kB
import { getRowsByIds } from '../table/row.js'; import { isTableRows } from '../row/core.js'; import '@babel/runtime/helpers/typeof'; import '../cell-value-get/cell-value.js'; import '@babel/runtime/helpers/defineProperty'; import '@babel/runtime/helpers/toConsumableArray'; import '../constants/column.js'; import '../constants/filter/filter-column-options.js'; import '../constants/filter/filter-modifier.js'; import '../constants/filter/filter-predicate.js'; import '../constants/filter/filter-is-within.js'; import { FORMULA_COLUMN_TYPES_MAP } from '../constants/formula.js'; import '../constants/sort.js'; import '../constants/group.js'; import { isNumber } from '../number.js'; import '../date.js'; import { isNumericColumn } from '../column/number.js'; import '@babel/runtime/helpers/slicedToArray'; import 'dayjs'; import { getGroupsRowIds as _getGroupsRowIds } from '../group/core.js'; /** * Calculate summaries of table numeric columns * @param {object} table e.g. { columns, ... } * @param {array} rows e.g. table rows: [{ _id, ...}, ...] | view rows: [ row._id, ... ] * @param {object} formulaRows for numeric formula columns * @returns summaries: { [column.key]: { sum, average, median, max, min, ... }, ... }, object */ var getSummaries = function getSummaries(table, rows, formulaRows) { var numericColumns = table.columns.filter(function (column) { return isNumericColumn(column); }); if (numericColumns.length === 0) { return {}; } var summaryRows = isTableRows(rows) ? rows : getRowsByIds(table, rows); var summaries = {}; numericColumns.forEach(function (column) { var type = column.type, key = column.key; var validNumbersCount = 0; var medianArr = []; var sum = 0; var min; var max; var median; summaryRows.forEach(function (row) { var cellValue = row[key]; if (FORMULA_COLUMN_TYPES_MAP[type]) { var formulaRow = formulaRows && formulaRows[row._id]; cellValue = formulaRow && formulaRow[key]; if (Array.isArray(cellValue) && cellValue.length === 1) { cellValue = cellValue[0]; } } if (isNumber(cellValue)) { medianArr.push(cellValue); validNumbersCount += 1; sum += cellValue; if (min === undefined) { min = cellValue; } else { min = cellValue < min ? cellValue : min; } if (max === undefined) { max = cellValue; } else { max = cellValue > max ? cellValue : max; } } }); if (validNumbersCount > 0) { medianArr.sort(function (numLeft, numRight) { return numLeft - numRight; }); // sort number with asc if (medianArr.length % 2 === 0) { median = (medianArr[medianArr.length / 2 - 1] + medianArr[medianArr.length / 2]) / 2; } else { median = medianArr[parseInt(medianArr.length / 2)]; } } var average = validNumbersCount === 0 ? 0 : sum / validNumbersCount; summaries[key] = { sum: sum, average: average, median: median, max: max, min: min }; }); return summaries; }; /** * Calculate group summaries * @param {array} groups e.g. [{ subgroups, row_ids, ... }, ...] * @param {object} table e.g. { columns, ... } * @param {object} formulaRows for numeric formula columns * @returns void */ var _updateGroupSummaries = function updateGroupSummaries(groups, table, formulaRows) { var numericColumns = table.columns.filter(function (column) { return isNumericColumn(column); }); if (!Array.isArray(groups) || numericColumns.length === 0) { return; } groups.forEach(function (group) { var subgroups = group.subgroups, row_ids = group.row_ids; if (Array.isArray(subgroups) && subgroups.length > 0) { _updateGroupSummaries(subgroups, table, formulaRows); var groupRowsIds = _getGroupsRowIds([group]); group.summaries = getSummaries(table, groupRowsIds, formulaRows); } else if (row_ids) { group.summaries = getSummaries(table, row_ids, formulaRows); } }); }; export { getSummaries, _updateGroupSummaries as updateGroupSummaries };