UNPKG

treem

Version:

High performance conversion of flat data (like SQL result rows) into nested objects.

185 lines (167 loc) 19.3 kB
'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); var _set = require('babel-runtime/core-js/set'); var _set2 = _interopRequireDefault(_set); var _map = require('babel-runtime/core-js/map'); var _map2 = _interopRequireDefault(_map); var _classCallCheck2 = require('babel-runtime/helpers/classCallCheck'); var _classCallCheck3 = _interopRequireDefault(_classCallCheck2); var _createClass2 = require('babel-runtime/helpers/createClass'); var _createClass3 = _interopRequireDefault(_createClass2); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } var Node = function () { function Node(name, headers, config, isCollection) { var _this = this; var depth = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : 0; (0, _classCallCheck3.default)(this, Node); this._name = name; this._config = config; this._keys = []; this._properties = []; this._children = new _map2.default(); this._data = new _map2.default(); this._parentData = new _map2.default(); this._isCollection = isCollection; this._nodeName = depth === 0 ? '' : this._name; var children = new _map2.default(); headers.forEach(function (header) { if (header.depth === depth) { _this._properties.push(header); if (header.isKey()) { _this._keys.push(header.name); } } else { var child = header.nodes[depth]; if (!children.has(child.name)) { children.set(child.name, { isCollection: child.isCollection, headers: [] }); } children.get(child.name).headers.push(header); } }); children.forEach(function (child, name) { _this._children.set(name, new Node(name, child.headers, config, child.isCollection, depth + 1)); }); // if no key, use all properties as keys if (this._keys.length === 0) { this._keys = this._properties.map(function (_ref) { var name = _ref.name; return name; }); this._reuseObject = this._config.reuseObject === 'key' ? false : this._config.reuseObject; } else { this._reuseObject = this._config.reuseObject === 'key' ? true : this._config.reuseObject; } } (0, _createClass3.default)(Node, [{ key: 'add', value: function add(row, parentDatum) { var _this2 = this; var arrayKey = this._keys.map(function (key) { return row[key]; }); if (!this._reuseObject) { arrayKey.push(parentDatum); } var key = this._config.equalArray(arrayKey); if (!this._data.has(key)) { var prune = true; var newDatum = this._config.wrap.single(this._nodeName); // set my properties this._properties.forEach(function (_ref2) { var property = _ref2.property, name = _ref2.name; if (!_this2._config.prune(row[name])) { newDatum[property] = row[name]; prune = false; } }); // set placeholders for my children and call them this._children.forEach(function (node, name) { if (node._isCollection) { newDatum[name] = _this2._config.wrap.collection(_this2._nodeName); node.add(row, newDatum); if (newDatum[name].length > 0) prune = false; } else { newDatum[name] = null; node.add(row, newDatum); if (newDatum[name] !== null) { prune = false; } else { delete newDatum[name]; } } }); var finalDatum = prune ? null : newDatum; // add me to my parent's properties this._parentData.set(finalDatum, new _set2.default([parentDatum])); this._addToParent(parentDatum, finalDatum); // memorize me this._data.set(key, finalDatum); } else { var datum = this._data.get(key); var _prune = true; var currentDatum = null; // the cached datum can be null because of prune if (datum !== null) { _prune = false; currentDatum = datum; } else { currentDatum = this._config.wrap.single(this._nodeName); } this._children.forEach(function (node, name) { if (node._isCollection) { // the cached datum is null so create a new collection if (datum === null) { currentDatum[name] = _this2._config.wrap.collection(_this2._nodeName); } node.add(row, currentDatum); if (currentDatum[name].length > 0) { _prune = false; } } else { if (datum === null) { currentDatum[name] = null; } var memObject = currentDatum[name]; // memObject can be undefined because of prune if (memObject === undefined) { memObject = null; } node.add(row, currentDatum); // if overwrite is not allowed, use the memObject // note : memObject may have changed because of additional rows in sub-collections if (!_this2._config.overwriteObject) { currentDatum[name] = memObject; } if (currentDatum[name] !== null) { _prune = false; } else { delete currentDatum[name]; } } }); var _finalDatum = _prune ? null : currentDatum; var parentData = this._parentData.get(_finalDatum); if (!parentData.has(parentDatum)) { this._addToParent(parentDatum, _finalDatum); parentData.add(parentDatum); } } } }, { key: '_addToParent', value: function _addToParent(parentDatum, datum) { if (datum === null) return; if (this._isCollection) { parentDatum[this._name].push(datum); } else { parentDatum[this._name] = datum; } } }]); return Node; }(); exports.default = Node; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9ub2RlLmpzIl0sIm5hbWVzIjpbIk5vZGUiLCJuYW1lIiwiaGVhZGVycyIsImNvbmZpZyIsImlzQ29sbGVjdGlvbiIsImRlcHRoIiwiX25hbWUiLCJfY29uZmlnIiwiX2tleXMiLCJfcHJvcGVydGllcyIsIl9jaGlsZHJlbiIsIl9kYXRhIiwiX3BhcmVudERhdGEiLCJfaXNDb2xsZWN0aW9uIiwiX25vZGVOYW1lIiwiY2hpbGRyZW4iLCJmb3JFYWNoIiwiaGVhZGVyIiwicHVzaCIsImlzS2V5IiwiY2hpbGQiLCJub2RlcyIsImhhcyIsInNldCIsImdldCIsImxlbmd0aCIsIm1hcCIsIl9yZXVzZU9iamVjdCIsInJldXNlT2JqZWN0Iiwicm93IiwicGFyZW50RGF0dW0iLCJhcnJheUtleSIsImtleSIsImVxdWFsQXJyYXkiLCJwcnVuZSIsIm5ld0RhdHVtIiwid3JhcCIsInNpbmdsZSIsInByb3BlcnR5Iiwibm9kZSIsImNvbGxlY3Rpb24iLCJhZGQiLCJmaW5hbERhdHVtIiwiX2FkZFRvUGFyZW50IiwiZGF0dW0iLCJjdXJyZW50RGF0dW0iLCJtZW1PYmplY3QiLCJ1bmRlZmluZWQiLCJvdmVyd3JpdGVPYmplY3QiLCJwYXJlbnREYXRhIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7SUFBcUJBLEk7QUFFbkIsZ0JBQVlDLElBQVosRUFBa0JDLE9BQWxCLEVBQTJCQyxNQUEzQixFQUFtQ0MsWUFBbkMsRUFBNkQ7QUFBQTs7QUFBQSxRQUFaQyxLQUFZLHVFQUFKLENBQUk7QUFBQTs7QUFDM0QsU0FBS0MsS0FBTCxHQUFhTCxJQUFiO0FBQ0EsU0FBS00sT0FBTCxHQUFlSixNQUFmO0FBQ0EsU0FBS0ssS0FBTCxHQUFhLEVBQWI7QUFDQSxTQUFLQyxXQUFMLEdBQW1CLEVBQW5CO0FBQ0EsU0FBS0MsU0FBTCxHQUFpQixtQkFBakI7QUFDQSxTQUFLQyxLQUFMLEdBQWEsbUJBQWI7QUFDQSxTQUFLQyxXQUFMLEdBQW1CLG1CQUFu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QztBQUMvQmlDLHVCQUFRLEtBQVI7QUFDRCxhQUZELE1BRU87QUFDTCxxQkFBT1csYUFBYTVDLElBQWIsQ0FBUDtBQUNEO0FBQ0Y7QUFDRixTQS9CRDtBQWdDQSxZQUFNeUMsY0FBYVIsU0FBUSxJQUFSLEdBQWVXLFlBQWxDO0FBQ0EsWUFBTUksYUFBYSxLQUFLckMsV0FBTCxDQUFpQlksR0FBakIsQ0FBcUJrQixXQUFyQixDQUFuQjtBQUNBLFlBQUksQ0FBQ08sV0FBVzNCLEdBQVgsQ0FBZVEsV0FBZixDQUFMLEVBQWtDO0FBQ2hDLGVBQUthLFlBQUwsQ0FBa0JiLFdBQWxCLEVBQStCWSxXQUEvQjtBQUNBTyxxQkFBV1IsR0FBWCxDQUFlWCxXQUFmO0FBQ0Q7QUFDRjtBQUNGOzs7aUNBRVlBLFcsRUFBYWMsSyxFQUFNO0FBQzlCLFVBQUlBLFVBQVUsSUFBZCxFQUFvQjtBQUNwQixVQUFJLEtBQUsvQixhQUFULEVBQXdCO0FBQ3RCaUIsb0JBQVksS0FBS3hCLEtBQWpCLEVBQXdCWSxJQUF4QixDQUE2QjBCLEtBQTdCO0FBQ0QsT0FGRCxNQUVPO0FBQ0xkLG9CQUFZLEtBQUt4QixLQUFqQixJQUEwQnNDLEtBQTFCO0FBQ0Q7QUFDRjs7Ozs7a0JBeklrQjVDLEkiLCJmaWxlIjoibm9kZS5qcyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBkZWZhdWx0IGNsYXNzIE5vZGUge1xuXG4gIGNvbnN0cnVjdG9yKG5hbWUsIGhlYWRlcnMsIGNvbmZpZywgaXNDb2xsZWN0aW9uLCBkZXB0aCA9IDAgKSB7XG4gICAgdGhpcy5fbmFtZSA9IG5hbWU7XG4gICAgdGhpcy5fY29uZmlnID0gY29uZmlnO1xuICAgIHRoaXMuX2tleXMgPSBbXTtcbiAgICB0aGlzLl9wcm9wZXJ0aWVzID0gW107XG4gICAgdGhpcy5fY2hpbGRyZW4gPSBuZXcgTWFwKCk7XG4gICAgdGhpcy5fZGF0YSA9IG5ldyBNYXAoKTtcbiAgICB0aGlzLl9wYXJlbnREYXRhID0gbmV3IE1hcCgpO1xuICAgIHRoaXMuX2lzQ29sbGVjdGlvbiA9IGlzQ29sbGVjdGlvbjtcbiAgICB0aGlzLl9ub2RlTmFtZSA9IGRlcHRoID09PSAwID8gJycgOiB0aGlzLl9uYW1lO1xuXG4gICAgY29uc3QgY2hpbGRyZW4gPSBuZXcgTWFwKCk7XG4gICAgaGVhZGVycy5mb3JFYWNoKGhlYWRlciA9PiB7XG4gICAgICBpZiAoaGVhZGVyLmRlcHRoID09PSBkZXB0aCkge1xuICAgICAgICB0aGlzLl9wcm9wZXJ0aWVzLnB1c2goaGVhZGVyKTtcbiAgICAgICAgaWYgKGhlYWRlci5pc0tleSgpKSB7XG4gICAgICAgICAgdGhpcy5fa2V5cy5wdXNoKGhlYWRlci5uYW1lKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgY2hpbGQgPSBoZWFkZXIubm9kZXNbZGVwdGhdO1xuICAgICAgICBpZiAoIWNoaWxkcmVuLmhhcyhjaGlsZC5uYW1lKSkge1xuICAgICAgICAgIGNoaWxkcmVuLnNldChjaGlsZC5uYW1lLCB7aXNDb2xsZWN0aW9uOiBjaGlsZC5pc0NvbGxlY3Rpb24sIGhlYWRlcnM6IFtdfSk7XG4gICAgICAgIH1cbiAgICAgICAgY2hpbGRyZW4uZ2V0KGNoaWxkLm5hbWUpLmhlYWRlcnMucHVzaChoZWFkZXIpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIGNoaWxkcmVuLmZvckVhY2goKGNoaWxkLCBuYW1lKSA9PiB7XG4gICAgICAgIHRoaXMuX2NoaWxkcmVuLnNldChuYW1lLCBuZXcgTm9kZShuYW1lLCBjaGlsZC5oZWFkZXJzLCBjb25maWcsIGNoaWxkLmlzQ29sbGVjdGlvbiwgZGVwdGggKyAxKSk7XG4gICAgfSk7XG4gICAgLy8gaWYgbm8ga2V5LCB1c2UgYWxsIHByb3BlcnRpZXMgYXMga2V5c1xuICAgIGlmICh0aGlzLl9rZXlzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhpcy5fa2V5cyA9IHRoaXMuX3Byb3BlcnRpZXMubWFwKCh7bmFtZX0pID0+IG5hbWUpO1xuICAgICAgdGhpcy5fcmV1c2VPYmplY3QgPSB0aGlzLl9jb25maWcucmV1c2VPYmplY3QgPT09ICdrZXknID8gZmFsc2UgOiB0aGlzLl9jb25maWcucmV1c2VPYmplY3Q7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX3JldXNlT2JqZWN0ID0gdGhpcy5fY29uZmlnLnJldXNlT2JqZWN0ID09PSAna2V5JyA/IHRydWUgOiB0aGlzLl9jb25maWcucmV1c2VPYmplY3Q7XG4gICAgfVxuICB9XG5cbiAgYWRkKHJvdywgcGFyZW50RGF0dW0pIHtcbiAgICBjb25zdCBhcnJheUtleSA9IHRoaXMuX2tleXMubWFwKGtleSA9PiByb3dba2V5XSk7XG4gICAgaWYgKCF0aGlzLl9yZXVzZU9iamVjdCkge1xuICAgICAgYXJyYXlLZXkucHVzaChwYXJlbnREYXR1bSk7XG4gICAgfVxuICAgIGNvbnN0IGtleSA9IHRoaXMuX2NvbmZpZy5lcXVhbEFycmF5KGFycmF5S2V5KTtcbiAgICBpZiAoIXRoaXMuX2RhdGEuaGFzKGtleSkpIHtcbiAgICAgIGxldCBwcnVuZSA9IHRydWU7XG4gICAgICBjb25zdCBuZXdEYXR1bSA9IHRoaXMuX2NvbmZpZy53cmFwLnNpbmdsZSh0aGlzLl9ub2RlTmFtZSk7XG4gICAgICAvLyBzZXQgbXkgcHJvcGVydGllc1xuICAgICAgdGhpcy5fcHJvcGVydGllcy5mb3JFYWNoKCh7cHJvcGVydHksIG5hbWV9KSA9PiB7XG4gICAgICAgIGlmICghdGhpcy5fY29uZmlnLnBydW5lKHJvd1tuYW1lXSkpIHtcbiAgICAgICAgICBuZXdEYXR1bVtwcm9wZXJ0eV0gPSByb3dbbmFtZV07XG4gICAgICAgICAgcHJ1bmUgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICAvLyBzZXQgcGxhY2Vob2xkZXJzIGZvciBteSBjaGlsZHJlbiBhbmQgY2FsbCB0aGVtXG4gICAgICB0aGlzLl9jaGlsZHJlbi5mb3JFYWNoKChub2RlLCBuYW1lKSA9PiB7XG4gICAgICAgIGlmIChub2RlLl9pc0NvbGxlY3Rpb24pIHtcbiAgICAgICAgICBuZXdEYXR1bVtuYW1lXSA9IHRoaXMuX2NvbmZpZy53cmFwLmNvbGxlY3Rpb24odGhpcy5fbm9kZU5hbWUpO1xuICAgICAgICAgIG5vZGUuYWRkKHJvdywgbmV3RGF0dW0pO1xuICAgICAgICAgIGlmIChuZXdEYXR1bVtuYW1lXS5sZW5ndGggPiAwKSBwcnVuZSA9IGZhbHNlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG5ld0RhdHVtW25hbWVdID0gbnVsbDtcbiAgICAgICAgICBub2RlLmFkZChyb3csIG5ld0RhdHVtKTtcbiAgICAgICAgICBpZiAobmV3RGF0dW1bbmFtZV0gIT09IG51bGwpIHtcbiAgICAgICAgICAgIHBydW5lID0gZmFsc2U7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGRlbGV0ZSBuZXdEYXR1bVtuYW1lXTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgY29uc3QgZmluYWxEYXR1bSA9IHBydW5lID8gbnVsbCA6IG5ld0RhdHVtO1xuICAgICAgLy8gYWRkIG1lIHRvIG15IHBhcmVudCdzIHByb3BlcnRpZXNcbiAgICAgIHRoaXMuX3BhcmVudERhdGEuc2V0KGZpbmFsRGF0dW0sIG5ldyBTZXQoW3BhcmVudERhdHVtXSkpO1xuICAgICAgdGhpcy5fYWRkVG9QYXJlbnQocGFyZW50RGF0dW0sIGZpbmFsRGF0dW0pO1xuICAgICAgLy8gbWVtb3JpemUgbWVcbiAgICAgIHRoaXMuX2RhdGEuc2V0KGtleSwgZmluYWxEYXR1bSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGRhdHVtID0gdGhpcy5fZGF0YS5nZXQoa2V5KTtcbiAgICAgIGxldCBwcnVuZSA9IHRydWU7XG4gICAgICBsZXQgY3VycmVudERhdHVtID0gbnVsbDtcbiAgICAgIC8vIHRoZSBjYWNoZWQgZGF0dW0gY2FuIGJlIG51bGwgYmVjYXVzZSBvZiBwcnVuZVxuICAgICAgaWYgKGRhdHVtICE9PSBudWxsKSB7XG4gICAgICAgIHBydW5lID0gZmFsc2U7XG4gICAgICAgIGN1cnJlbnREYXR1bSA9IGRhdHVtO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY3VycmVudERhdHVtID0gdGhpcy5fY29uZmlnLndyYXAuc2luZ2xlKHRoaXMuX25vZGVOYW1lKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuX2NoaWxkcmVuLmZvckVhY2goKG5vZGUsIG5hbWUpID0+IHtcbiAgICAgICAgaWYgKG5vZGUuX2lzQ29sbGVjdGlvbikge1xuICAgICAgICAgIC8vIHRoZSBjYWNoZWQgZGF0dW0gaXMgbnVsbCBzbyBjcmVhdGUgYSBuZXcgY29sbGVjdGlvblxuICAgICAgICAgIGlmIChkYXR1bSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgY3VycmVudERhdHVtW25hbWVdID0gdGhpcy5fY29uZmlnLndyYXAuY29sbGVjdGlvbih0aGlzLl9ub2RlTmFtZSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIG5vZGUuYWRkKHJvdywgY3VycmVudERhdHVtKTtcbiAgICAgICAgICBpZiAoY3VycmVudERhdHVtW25hbWVdLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHBydW5lID0gZmFsc2U7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGlmIChkYXR1bSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgY3VycmVudERhdHVtW25hbWVdID0gbnVsbDtcbiAgICAgICAgICB9XG4gICAgICAgICAgbGV0IG1lbU9iamVjdCA9IGN1cnJlbnREYXR1bVtuYW1lXTtcbiAgICAgICAgICAvLyAgbWVtT2JqZWN0IGNhbiBiZSB1bmRlZmluZWQgYmVjYXVzZSBvZiBwcnVuZVxuICAgICAgICAgIGlmIChtZW1PYmplY3QgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgbWVtT2JqZWN0ID0gbnVsbDtcbiAgICAgICAgICB9XG4gICAgICAgICAgbm9kZS5hZGQocm93LCBjdXJyZW50RGF0dW0pO1xuICAgICAgICAgIC8vIGlmIG92ZXJ3cml0ZSBpcyBub3QgYWxsb3dlZCwgdXNlIHRoZSBtZW1PYmplY3RcbiAgICAgICAgICAvLyBub3RlIDogbWVtT2JqZWN0IG1heSBoYXZlIGNoYW5nZWQgYmVjYXVzZSBvZiBhZGRpdGlvbmFsIHJvd3MgaW4gc3ViLWNvbGxlY3Rpb25zXG4gICAgICAgICAgaWYgKCF0aGlzLl9jb25maWcub3ZlcndyaXRlT2JqZWN0KSB7XG4gICAgICAgICAgICBjdXJyZW50RGF0dW1bbmFtZV0gPSBtZW1PYmplY3Q7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChjdXJyZW50RGF0dW1bbmFtZV0gIT09IG51bGwpIHtcbiAgICAgICAgICAgIHBydW5lID0gZmFsc2U7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGRlbGV0ZSBjdXJyZW50RGF0dW1bbmFtZV07XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIGNvbnN0IGZpbmFsRGF0dW0gPSBwcnVuZSA/IG51bGwgOiBjdXJyZW50RGF0dW07XG4gICAgICBjb25zdCBwYXJlbnREYXRhID0gdGhpcy5fcGFyZW50RGF0YS5nZXQoZmluYWxEYXR1bSk7XG4gICAgICBpZiAoIXBhcmVudERhdGEuaGFzKHBhcmVudERhdHVtKSkge1xuICAgICAgICB0aGlzLl9hZGRUb1BhcmVudChwYXJlbnREYXR1bSwgZmluYWxEYXR1bSk7XG4gICAgICAgIHBhcmVudERhdGEuYWRkKHBhcmVudERhdHVtKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBfYWRkVG9QYXJlbnQocGFyZW50RGF0dW0sIGRhdHVtKXtcbiAgICBpZiAoZGF0dW0gPT09IG51bGwpIHJldHVybjtcbiAgICBpZiAodGhpcy5faXNDb2xsZWN0aW9uKSB7XG4gICAgICBwYXJlbnREYXR1bVt0aGlzLl9uYW1lXS5wdXNoKGRhdHVtKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcGFyZW50RGF0dW1bdGhpcy5fbmFtZV0gPSBkYXR1bTtcbiAgICB9XG4gIH1cbn1cbiJdfQ==