UNPKG

@gooddata/gooddata-js

Version:
56 lines (55 loc) 1.98 kB
"use strict"; 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;