@gooddata/gooddata-js
Version:
GoodData JavaScript SDK
56 lines (55 loc) • 1.98 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
// (C) 2007-2018 GoodData Corporation
var difference_1 = __importDefault(require("lodash/difference"));
var map_1 = __importDefault(require("lodash/map"));
var IDENTIFIER_REGEX = /{\S+}/g;
function getDependencies(_a) {
var metricDefinition = _a.metricDefinition;
return (metricDefinition.expression.match(IDENTIFIER_REGEX) || []).map(function (s) {
return s.substring(1, s.length - 1);
});
}
function getIdentifier(_a) {
var metricDefinition = _a.metricDefinition;
return metricDefinition.identifier;
}
function resolvedDependencies(resolved, _a) {
var dependencies = _a.dependencies;
var identifiers = map_1.default(resolved, "identifier");
return difference_1.default(dependencies, identifiers).length === 0;
}
function scan(resolved, unresolved) {
for (var i = 0; i < unresolved.length; i += 1) {
var tested = unresolved[i];
if (resolvedDependencies(resolved, tested)) {
resolved.push(tested);
unresolved.splice(i, 1);
i -= 1;
}
}
}
function sort(unresolved) {
var resolved = [];
var lastLength;
while (unresolved.length > 0) {
lastLength = unresolved.length;
scan(resolved, unresolved);
if (unresolved.length === lastLength) {
throw new Error("Metric defintions cannot be sorted due to missing dependencies.");
}
}
return resolved;
}
function sortDefinitions(definitions) {
var indexed = definitions.map(function (definition) { return ({
definition: definition,
identifier: getIdentifier(definition),
dependencies: getDependencies(definition),
}); });
return map_1.default(sort(indexed), "definition");
}
exports.sortDefinitions = sortDefinitions;