UNPKG

objection

Version:
108 lines (81 loc) 8.98 kB
'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); exports.ref = exports.default = undefined; var _classCallCheck2 = require('babel-runtime/helpers/classCallCheck'); var _classCallCheck3 = _interopRequireDefault(_classCallCheck2); var _jsonFieldExpressionParser = require('./parsers/jsonFieldExpressionParser'); var _jsonFieldExpressionParser2 = _interopRequireDefault(_jsonFieldExpressionParser); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } var ReferenceBuilder = function () { function ReferenceBuilder(fieldExpression) { (0, _classCallCheck3.default)(this, ReferenceBuilder); // for premature optimization _reference could be lazy memoized getter... this._reference = _jsonFieldExpressionParser2.default.parse(fieldExpression); this._cast = null; this._toJson = false; this._as = null; // TODO: UNIT TEST } ReferenceBuilder.prototype.castText = function castText() { return this.castType('text'); }; ReferenceBuilder.prototype.castInt = function castInt() { return this.castType('integer'); }; ReferenceBuilder.prototype.castBigInt = function castBigInt() { return this.castType('bigint'); }; ReferenceBuilder.prototype.castFloat = function castFloat() { return this.castType('float'); }; ReferenceBuilder.prototype.castDecimal = function castDecimal() { return this.castType('decimal'); }; ReferenceBuilder.prototype.castReal = function castReal() { return this.castType('real'); }; ReferenceBuilder.prototype.castBool = function castBool() { return this.castType('boolean'); }; ReferenceBuilder.prototype.castJson = function castJson() { // maybe different for mysql, no need to support postgres plain json this._toJson = true; return this; }; ReferenceBuilder.prototype.castType = function castType(sqlType) { // we could maybe check some valid values here... at least fail on invalid chars this._cast = sqlType; return this; }; ReferenceBuilder.prototype.as = function as(_as) { this._as = _as; return this; }; ReferenceBuilder.prototype.toRawArgs = function toRawArgs() { var referenceSql = '??'; // if json field ref if (this._reference.access.length > 0) { // TODO: for mysql this needs separate implementation... maybe something like SELECT JSON_EXTRACT('{"id": 14, "name": "Aztalan"}', '$.name'); var extractor = this._cast ? '#>>' : '#>'; var jsonFieldRef = this._reference.access.map(function (field) { return field.ref; }).join(','); referenceSql = '??' + extractor + '\'{' + jsonFieldRef + '}\''; } var castedRefQuery = this._cast ? 'CAST(' + referenceSql + ' AS ' + this._cast + ')' : referenceSql; var toJsonQuery = this._toJson ? 'to_jsonb(' + castedRefQuery + ')' : castedRefQuery; if (this._as) { return [toJsonQuery + ' AS ??', [this._reference.columnName, this._as]]; } else { return [toJsonQuery, [this._reference.columnName]]; } }; return ReferenceBuilder; }(); exports.default = ReferenceBuilder; var ref = function ref(fieldExpression) { return new ReferenceBuilder(fieldExpression); }; exports.ref = ref; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIlJlZmVyZW5jZUJ1aWxkZXIuanMiXSwibmFtZXMiOlsiUmVmZXJlbmNlQnVpbGRlciIsImZpZWxkRXhwcmVzc2lvbiIsIl9yZWZlcmVuY2UiLCJwYXJzZSIsIl9jYXN0IiwiX3RvSnNvbiIsIl9hcyIsImNhc3RUZXh0IiwiY2FzdFR5cGUiLCJjYXN0SW50IiwiY2FzdEJpZ0ludCIsImNhc3RGbG9hdCIsImNhc3REZWNpbWFsIiwiY2FzdFJlYWwiLCJjYXN0Qm9vbCIsImNhc3RKc29uIiwic3FsVHlwZSIsImFzIiwidG9SYXdBcmdzIiwicmVmZXJlbmNlU3FsIiwiYWNjZXNzIiwibGVuZ3RoIiwiZXh0cmFjdG9yIiwianNvbkZpZWxkUmVmIiwibWFwIiwiZmllbGQiLCJyZWYiLCJqb2luIiwiY2FzdGVkUmVmUXVlcnkiLCJ0b0pzb25RdWVyeSIsImNvbHVtbk5hbWUiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7O0FBQUE7Ozs7OztJQUVxQkEsZ0I7QUFFbkIsNEJBQVlDLGVBQVosRUFBNkI7QUFBQTs7QUFDM0I7QUFDQSxTQUFLQyxVQUFMLEdBQWtCLG9DQUEwQkMsS0FBMUIsQ0FBZ0NGLGVBQWhDLENBQWxCO0FBQ0EsU0FBS0csS0FBTCxHQUFhLElBQWI7QUFDQSxTQUFLQyxPQUFMLEdBQWUsS0FBZjtBQUNBLFNBQUtDLEdBQUwsR0FBVyxJQUFYLENBTDJCLENBS1Y7QUFDbEI7OzZCQUVEQyxRLHVCQUFXO0FBQ1QsV0FBTyxLQUFLQyxRQUFMLENBQWMsTUFBZCxDQUFQO0FBQ0QsRzs7NkJBRURDLE8sc0JBQVU7QUFDUixXQUFPLEtBQUtELFFBQUwsQ0FBYyxTQUFkLENBQVA7QUFDRCxHOzs2QkFFREUsVSx5QkFBYTtBQUNYLFdBQU8sS0FBS0YsUUFBTCxDQUFjLFFBQWQsQ0FBUDtBQUNELEc7OzZCQUVERyxTLHdCQUFZO0FBQ1YsV0FBTyxLQUFLSCxRQUFMLENBQWMsT0FBZCxDQUFQO0FBQ0QsRzs7NkJBRURJLFcsMEJBQWM7QUFDWixXQUFPLEtBQUtKLFFBQUwsQ0FBYyxTQUFkLENBQVA7QUFDRCxHOzs2QkFFREssUSx1QkFBVztBQUNULFdBQU8sS0FBS0wsUUFBTCxDQUFjLE1BQWQsQ0FBUDtBQUNELEc7OzZCQUVETSxRLHVCQUFXO0FBQ1QsV0FBTyxLQUFLTixRQUFMLENBQWMsU0FBZCxDQUFQO0FBQ0QsRzs7NkJBRURPLFEsdUJBQVc7QUFDVDtBQUNBLFNBQUtWLE9BQUwsR0FBZSxJQUFmO0FBQ0EsV0FBTyxJQUFQO0FBQ0QsRzs7NkJBRURHLFEscUJBQVNRLE8sRUFBUztBQUNoQjtBQUNBLFNBQUtaLEtBQUwsR0FBYVksT0FBYjtBQUNBLFdBQU8sSUFBUDtBQUNELEc7OzZCQUVEQyxFLGVBQUdBLEcsRUFBSTtBQUNMLFNBQUtYLEdBQUwsR0FBV1csR0FBWDtBQUNBLFdBQU8sSUFBUDtBQUNELEc7OzZCQUVEQyxTLHdCQUFZO0FBQ1YsUUFBSUMsbUJBQUo7O0FBRUE7QUFDQSxRQUFJLEtBQUtqQixVQUFMLENBQWdCa0IsTUFBaEIsQ0FBdUJDLE1BQXZCLEdBQWdDLENBQXBDLEVBQXVDO0FBQ3JDO0FBQ0EsVUFBSUMsWUFBWSxLQUFLbEIsS0FBTCxHQUFhLEtBQWIsR0FBcUIsSUFBckM7QUFDQSxVQUFJbUIsZUFBZSxLQUFLckIsVUFBTCxDQUFnQmtCLE1BQWhCLENBQXVCSSxHQUF2QixDQUEyQjtBQUFBLGVBQVNDLE1BQU1DLEdBQWY7QUFBQSxPQUEzQixFQUErQ0MsSUFBL0MsQ0FBb0QsR0FBcEQsQ0FBbkI7QUFDQVIsNEJBQW9CRyxTQUFwQixXQUFrQ0MsWUFBbEM7QUFDRDs7QUFFRCxRQUFJSyxpQkFBaUIsS0FBS3hCLEtBQUwsYUFBcUJlLFlBQXJCLFlBQXdDLEtBQUtmLEtBQTdDLFNBQXdEZSxZQUE3RTtBQUNBLFFBQUlVLGNBQWMsS0FBS3hCLE9BQUwsaUJBQTJCdUIsY0FBM0IsU0FBK0NBLGNBQWpFOztBQUVBLFFBQUksS0FBS3RCLEdBQVQsRUFBYztBQUNaLGFBQU8sQ0FBSXVCLFdBQUosYUFBeUIsQ0FBQyxLQUFLM0IsVUFBTCxDQUFnQjRCLFVBQWpCLEVBQTZCLEtBQUt4QixHQUFsQyxDQUF6QixDQUFQO0FBQ0QsS0FGRCxNQUVPO0FBQ0wsYUFBTyxDQUFDdUIsV0FBRCxFQUFjLENBQUMsS0FBSzNCLFVBQUwsQ0FBZ0I0QixVQUFqQixDQUFkLENBQVA7QUFDRDtBQUNGLEc7Ozs7O2tCQTFFa0I5QixnQjs7O0FBOEVyQixJQUFJMEIsTUFBTSxTQUFOQSxHQUFNO0FBQUEsU0FBbUIsSUFBSTFCLGdCQUFKLENBQXFCQyxlQUFyQixDQUFuQjtBQUFBLENBQVY7O1FBRVN5QixHLEdBQUFBLEciLCJmaWxlIjoiUmVmZXJlbmNlQnVpbGRlci5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBqc29uRmllbGRFeHByZXNzaW9uUGFyc2VyIGZyb20gJy4vcGFyc2Vycy9qc29uRmllbGRFeHByZXNzaW9uUGFyc2VyJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUmVmZXJlbmNlQnVpbGRlciB7XG5cbiAgY29uc3RydWN0b3IoZmllbGRFeHByZXNzaW9uKSB7XG4gICAgLy8gZm9yIHByZW1hdHVyZSBvcHRpbWl6YXRpb24gX3JlZmVyZW5jZSBjb3VsZCBiZSBsYXp5IG1lbW9pemVkIGdldHRlci4uLiBcbiAgICB0aGlzLl9yZWZlcmVuY2UgPSBqc29uRmllbGRFeHByZXNzaW9uUGFyc2VyLnBhcnNlKGZpZWxkRXhwcmVzc2lvbik7XG4gICAgdGhpcy5fY2FzdCA9IG51bGw7XG4gICAgdGhpcy5fdG9Kc29uID0gZmFsc2U7XG4gICAgdGhpcy5fYXMgPSBudWxsOyAvLyBUT0RPOiBVTklUIFRFU1RcbiAgfVxuXG4gIGNhc3RUZXh0KCkge1xuICAgIHJldHVybiB0aGlzLmNhc3RUeXBlKCd0ZXh0Jyk7XG4gIH1cblxuICBjYXN0SW50KCkge1xuICAgIHJldHVybiB0aGlzLmNhc3RUeXBlKCdpbnRlZ2VyJyk7XG4gIH1cblxuICBjYXN0QmlnSW50KCkge1xuICAgIHJldHVybiB0aGlzLmNhc3RUeXBlKCdiaWdpbnQnKTtcbiAgfVxuXG4gIGNhc3RGbG9hdCgpIHtcbiAgICByZXR1cm4gdGhpcy5jYXN0VHlwZSgnZmxvYXQnKTtcbiAgfVxuXG4gIGNhc3REZWNpbWFsKCkge1xuICAgIHJldHVybiB0aGlzLmNhc3RUeXBlKCdkZWNpbWFsJyk7XG4gIH1cblxuICBjYXN0UmVhbCgpIHtcbiAgICByZXR1cm4gdGhpcy5jYXN0VHlwZSgncmVhbCcpO1xuICB9XG5cbiAgY2FzdEJvb2woKSB7XG4gICAgcmV0dXJuIHRoaXMuY2FzdFR5cGUoJ2Jvb2xlYW4nKTtcbiAgfVxuXG4gIGNhc3RKc29uKCkge1xuICAgIC8vIG1heWJlIGRpZmZlcmVudCBmb3IgbXlzcWwsIG5vIG5lZWQgdG8gc3VwcG9ydCBwb3N0Z3JlcyBwbGFpbiBqc29uXG4gICAgdGhpcy5fdG9Kc29uID0gdHJ1ZTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIGNhc3RUeXBlKHNxbFR5cGUpIHtcbiAgICAvLyB3ZSBjb3VsZCBtYXliZSBjaGVjayBzb21lIHZhbGlkIHZhbHVlcyBoZXJlLi4uIGF0IGxlYXN0IGZhaWwgb24gaW52YWxpZCBjaGFycyBcbiAgICB0aGlzLl9jYXN0ID0gc3FsVHlwZTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIGFzKGFzKSB7XG4gICAgdGhpcy5fYXMgPSBhcztcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIHRvUmF3QXJncygpIHtcbiAgICBsZXQgcmVmZXJlbmNlU3FsID0gYD8/YDtcbiBcbiAgICAvLyBpZiBqc29uIGZpZWxkIHJlZlxuICAgIGlmICh0aGlzLl9yZWZlcmVuY2UuYWNjZXNzLmxlbmd0aCA+IDApIHtcbiAgICAgIC8vIFRPRE86IGZvciBteXNxbCB0aGlzIG5lZWRzIHNlcGFyYXRlIGltcGxlbWVudGF0aW9uLi4uIG1heWJlIHNvbWV0aGluZyBsaWtlIFNFTEVDVCBKU09OX0VYVFJBQ1QoJ3tcImlkXCI6IDE0LCBcIm5hbWVcIjogXCJBenRhbGFuXCJ9JywgJyQubmFtZScpO1xuICAgICAgbGV0IGV4dHJhY3RvciA9IHRoaXMuX2Nhc3QgPyAnIz4+JyA6ICcjPic7XG4gICAgICBsZXQganNvbkZpZWxkUmVmID0gdGhpcy5fcmVmZXJlbmNlLmFjY2Vzcy5tYXAoZmllbGQgPT4gZmllbGQucmVmKS5qb2luKCcsJyk7ICBcbiAgICAgIHJlZmVyZW5jZVNxbCA9IGA/PyR7ZXh0cmFjdG9yfSd7JHtqc29uRmllbGRSZWZ9fSdgO1xuICAgIH1cblxuICAgIGxldCBjYXN0ZWRSZWZRdWVyeSA9IHRoaXMuX2Nhc3QgPyBgQ0FTVCgke3JlZmVyZW5jZVNxbH0gQVMgJHt0aGlzLl9jYXN0fSlgIDogcmVmZXJlbmNlU3FsO1xuICAgIGxldCB0b0pzb25RdWVyeSA9IHRoaXMuX3RvSnNvbiA/IGB0b19qc29uYigke2Nhc3RlZFJlZlF1ZXJ5fSlgIDogY2FzdGVkUmVmUXVlcnk7XG5cbiAgICBpZiAodGhpcy5fYXMpIHtcbiAgICAgIHJldHVybiBbYCR7dG9Kc29uUXVlcnl9IEFTID8/YCwgW3RoaXMuX3JlZmVyZW5jZS5jb2x1bW5OYW1lLCB0aGlzLl9hc11dO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gW3RvSnNvblF1ZXJ5LCBbdGhpcy5fcmVmZXJlbmNlLmNvbHVtbk5hbWVdXTtcbiAgICB9XG4gIH1cblxufVxuXG5sZXQgcmVmID0gZmllbGRFeHByZXNzaW9uID0+IG5ldyBSZWZlcmVuY2VCdWlsZGVyKGZpZWxkRXhwcmVzc2lvbik7XG5cbmV4cG9ydCB7IHJlZiB9O1xuIl19