dtable-utils
Version:
dtable common utils
155 lines (145 loc) • 5.21 kB
JavaScript
Object.defineProperty(exports, '__esModule', { value: true });
var cellType = require('../constants/cell-type.js');
var formula = require('../constants/formula.js');
/**
* Transform the formats of link column to link-formula's
* @param {object} linkColumn e.g. { key, data: { display_column_key, ... }, ... }
* @returns converted link column, object
*/
var transLink2LinkFormula = function transLink2LinkFormula(linkColumn) {
var key = linkColumn.key,
name = linkColumn.name,
data = linkColumn.data;
var display_column_key = data.display_column_key;
return {
key: key,
name: name,
type: cellType.CellType.LINK_FORMULA,
data: {
formula: 'lookup',
link_column_key: key,
level1_linked_table_column_key: display_column_key,
level2_linked_table_column_key: null,
operated_columns: []
}
};
};
/**
* Get sorted formula columns
* @param {array} formulaColumns the formula columns waiting to sort
* @param {object} table e.g. { columns, ... }
* @returns sorted formula columns, array
*/
var getSortedFormulaColumns = function getSortedFormulaColumns(formulaColumns, table) {
if (!Array.isArray(formulaColumns) || !table || !Array.isArray(table.columns)) return [];
var keyColumnMap = {};
table.columns.forEach(function (column) {
var key = column.key,
type = column.type;
if (formula.FORMULA_COLUMN_TYPES_MAP[type]) {
keyColumnMap[key] = column;
} else if (type === cellType.CellType.LINK && column.data) {
keyColumnMap[key] = transLink2LinkFormula(column);
}
});
// get none-repeating formulas
var key_sorting_formula_column = {};
var sorting_formula_column_keys = [];
formulaColumns.forEach(function (column) {
var columnKey = column.key;
if (!key_sorting_formula_column[columnKey]) {
key_sorting_formula_column[columnKey] = column;
sorting_formula_column_keys.push(columnKey);
}
});
/**
* e.g. formula1 = formula2 + formula3
* e.g. formula2 = 1 + 2
* e.g. formula3 = formula2 + 3
* edges: formula2 --> formula1, formula2 --> formula3; formula3 --> formula1
* keyInDegreeMap, the total number of formula columns that depend on: { formula1_key: 2, formula2_key: 0, formula3_key: 1 }
* keyEdgesMap: { formula2_key: [formula1_key, formula3_key], formula3_kye: [formula1_key]}
*/
var keyInDegreeMap = {};
var keyEdgesMap = {};
sorting_formula_column_keys.forEach(function (formulaColumnKey) {
var formulaColumn = key_sorting_formula_column[formulaColumnKey];
var data = formulaColumn.data;
var operated_columns = data.operated_columns;
keyInDegreeMap[formulaColumnKey] = 0;
if (Array.isArray(operated_columns)) {
operated_columns.forEach(function (dependColumnKey) {
var dependColumn = keyColumnMap[dependColumnKey];
if (!dependColumn) {
return;
}
keyInDegreeMap[formulaColumnKey] += 1;
if (keyEdgesMap[dependColumnKey]) {
keyEdgesMap[dependColumnKey].push(formulaColumnKey);
} else {
keyEdgesMap[dependColumnKey] = [formulaColumnKey];
}
});
}
});
var sortedList = [];
var waitingQueue = [];
sorting_formula_column_keys.forEach(function (formulaColumnKey) {
if (keyInDegreeMap[formulaColumnKey] === 0) {
waitingQueue.push(formulaColumnKey);
}
});
while (waitingQueue.length) {
var columnKey = waitingQueue.shift();
var edges = keyEdgesMap[columnKey];
sortedList.push(columnKey);
if (Array.isArray(edges)) {
edges.forEach(function (edge) {
keyInDegreeMap[edge] -= 1;
if (keyInDegreeMap[edge] === 0) {
waitingQueue.push(edge);
}
});
}
}
return sortedList.map(function (columnKey) {
return keyColumnMap[columnKey];
});
};
/**
* Get table formula columns and link columns
* @param {object} table e.g. { columns, ... }
* @returns formula and link columns, array
*/
var getFormulaColumnsContainLinks = function getFormulaColumnsContainLinks(table) {
var columns = table.columns;
var formulaColumns = columns.filter(function (column) {
var type = column.type,
data = column.data;
if (type === cellType.CellType.LINK) {
return !!data;
}
return formula.FORMULA_COLUMN_TYPES_MAP[type] && data;
});
return formulaColumns.map(function (column) {
if (column.type === cellType.CellType.LINK) {
return transLink2LinkFormula(column);
}
return column;
});
};
/**
* Get sorted formula and link columns from table
* @param {object} table e.g. { columns, ... }
* @returns sorted formula and link columns, array
*/
var getSortedFormulaColumnsContainLinks = function getSortedFormulaColumnsContainLinks(table) {
var formulaColumns = getFormulaColumnsContainLinks(table);
if (formulaColumns.length === 0) return [];
return getSortedFormulaColumns(formulaColumns, table);
};
exports.getFormulaColumnsContainLinks = getFormulaColumnsContainLinks;
exports.getSortedFormulaColumns = getSortedFormulaColumns;
exports.getSortedFormulaColumnsContainLinks = getSortedFormulaColumnsContainLinks;
exports.transLink2LinkFormula = transLink2LinkFormula;
;