UNPKG

dtable-utils

Version:

dtable common utils

126 lines (120 loc) 4.22 kB
'use strict'; Object.defineProperty(exports, '__esModule', { value: true }); var row = require('../table/row.js'); var core = require('../row/core.js'); require('@babel/runtime/helpers/typeof'); require('../cell-value-get/cell-value.js'); require('@babel/runtime/helpers/defineProperty'); require('@babel/runtime/helpers/toConsumableArray'); var formula = require('../constants/formula.js'); var number$1 = require('../number.js'); require('../constants/column.js'); require('../date.js'); require('../constants/filter/filter-column-options.js'); require('../constants/filter/filter-modifier.js'); require('../constants/filter/filter-predicate.js'); require('../constants/filter/filter-is-within.js'); require('../constants/sort.js'); require('../constants/group.js'); var number = require('../column/number.js'); require('dayjs'); var core$1 = require('../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 number.isNumericColumn(column); }); if (numericColumns.length === 0) { return {}; } var summaryRows = core.isTableRows(rows) ? rows : row.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.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 (number$1.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 number.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 = core$1.getGroupsRowIds([group]); group.summaries = getSummaries(table, groupRowsIds, formulaRows); } else if (row_ids) { group.summaries = getSummaries(table, row_ids, formulaRows); } }); }; exports.getSummaries = getSummaries; exports.updateGroupSummaries = _updateGroupSummaries;