dtable-utils
Version:
dtable common utils
122 lines (118 loc) • 4.18 kB
JavaScript
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 };