dtable-utils
Version:
dtable common utils
127 lines (121 loc) • 4.27 kB
JavaScript
;
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');
require('../constants/column.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');
var formula = require('../constants/formula.js');
require('../constants/sort.js');
require('../constants/group.js');
var number$1 = require('../number.js');
require('../date.js');
var number = require('../column/number.js');
require('@babel/runtime/helpers/slicedToArray');
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;