UNPKG

shyft-storage-connector

Version:
283 lines (238 loc) 14.3 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.isStoragePostgresConfiguration = exports["default"] = void 0; var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator")); var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator")); var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck")); var _assertThisInitialized2 = _interopRequireDefault(require("@babel/runtime/helpers/assertThisInitialized")); var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits")); var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime/helpers/possibleConstructorReturn")); var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime/helpers/getPrototypeOf")); var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var _shyft = require("shyft"); var _util = require("./util"); var _fs = _interopRequireDefault(require("fs")); var _lodash = _interopRequireDefault(require("lodash")); function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; } function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { (0, _defineProperty2["default"])(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; } function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = (0, _getPrototypeOf2["default"])(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = (0, _getPrototypeOf2["default"])(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return (0, _possibleConstructorReturn2["default"])(this, result); }; } function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } } var templatesPath = "".concat(__dirname, "/../storageScripts"); var loadTemplate = function loadTemplate(templateFileName) { return _fs["default"].readFileSync("".concat(templatesPath, "/").concat(templateFileName), 'UTF8'); }; var formatJSON = function formatJSON(obj) { return JSON.stringify(obj, null, 2).split('\n').join('\n '); }; var formatArray = function formatArray(arr) { return "{".concat(arr.map(JSON.stringify).join(', '), "}"); }; var StoragePostgresConfiguration = /*#__PURE__*/function (_StorageConfiguration) { (0, _inherits2["default"])(StoragePostgresConfiguration, _StorageConfiguration); var _super = _createSuper(StoragePostgresConfiguration); function StoragePostgresConfiguration() { var _this; var setup = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; (0, _classCallCheck2["default"])(this, StoragePostgresConfiguration); _this = _super.call(this, _objectSpread(_objectSpread({}, setup), {}, { name: 'StorageTypePostgres' })); (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "_generateGetStateFunction", function (configuration, templateFileName, functionName) { var schema = configuration.getSchema(); var statesMap = {}; var statesMapFlipped = {}; _lodash["default"].forEach(schema.getEntities(), function (entity) { if (entity.getStates) { var states = entity.getStates(); if (states) { statesMap[entity.storageTableName] = states; statesMapFlipped[entity.storageTableName] = _lodash["default"].invert(states); } } }); var template = loadTemplate(templateFileName); var vars = { functionName: functionName, statesMap: formatJSON(statesMap), statesMapFlipped: formatJSON(statesMapFlipped) }; return _lodash["default"].template(template)(vars); }); (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "generateGetStateIdFunctionName", function () { return 'get_state_id'; }); (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "generateGetStateIdFunction", function (configuration) { return _this._generateGetStateFunction(configuration, 'get_state_id.tpl.sql', _this.generateGetStateIdFunctionName()); }); (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "generateGetStateIdsFunctionName", function () { return 'get_state_ids'; }); (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "generateGetStateIdsFunction", function (configuration) { return _this._generateGetStateFunction(configuration, 'get_state_ids.tpl.sql', _this.generateGetStateIdsFunctionName()); }); (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "generateGetStateMapFunctionName", function () { return 'get_state_map'; }); (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "generateGetStateMapFunction", function (configuration) { return _this._generateGetStateFunction(configuration, 'get_state_map.tpl.sql', _this.generateGetStateMapFunctionName()); }); (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "generateGetStateNameFunctionName", function () { return 'get_state_name'; }); (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "generateGetStateNameFunction", function (configuration) { return _this._generateGetStateFunction(configuration, 'get_state_name.tpl.sql', _this.generateGetStateNameFunctionName()); }); (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "_generateGetAttributeTranslationFunction", function (configuration, templateFileName, functionName) { var languages = configuration.getLanguages(); var defaultLanguage = configuration.getDefaultLanguage(); var template = loadTemplate(templateFileName); var vars = { functionName: functionName, languages: formatArray(languages), defaultLanguage: defaultLanguage }; return _lodash["default"].template(template)(vars); }); (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "generateGetAttributeTranslationFunctionName", function () { return 'get_attribute_translation'; }); (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "generateGetAttributeTranslationFunction", function (configuration) { return _this._generateGetAttributeTranslationFunction(configuration, 'get_attribute_translation.tpl.sql', _this.generateGetAttributeTranslationFunctionName()); }); (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "generateGetAttributeTranslationsFunctionName", function () { return 'get_attribute_translations'; }); (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "generateGetAttributeTranslationsFunction", function (configuration) { return _this._generateGetAttributeTranslationFunction(configuration, 'get_attribute_translations.tpl.sql', _this.generateGetAttributeTranslationsFunctionName()); }); (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "generateMergeTranslationsFunctionName", function () { return 'merge_translations'; }); (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "generateMergeTranslationsFunction", function (configuration) { return _this._generateGetAttributeTranslationFunction(configuration, 'merge_translations.tpl.sql', _this.generateMergeTranslationsFunctionName()); }); (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "generateI18nIndices", function (configuration) { var indices = []; var languages = configuration.getLanguages(); var languageIds = Object.keys(languages).filter(function (languageName) { return languageName !== 'default'; }).map(function (languageName) { return languages[languageName]; }); var schema = configuration.getSchema(); var storageConfiguration = configuration.getStorageConfiguration(); var modelRegistry = storageConfiguration.getStorageModels(); var textIndexTemplate = loadTemplate('i18n_text_index.tpl.sql'); var trgmIndexTemplate = loadTemplate('i18n_trgm_index.tpl.sql'); _lodash["default"].forEach(schema.getEntities(), function (entity) { var i18nAttributeNames = entity.getI18nAttributeNames ? entity.getI18nAttributeNames() : null; if (!i18nAttributeNames) { return; } var entityName = entity.name; var dataShaperMap = modelRegistry[entityName].dataShaperMap; var storageTableName = entity.storageTableName; i18nAttributeNames.map(function (i18nAttributeName) { var attributeName = dataShaperMap[i18nAttributeName]; if (!attributeName) { return; } languageIds.map(function (languageId) { var textIndexName = (0, _util.generateIndexName)(storageTableName, [attributeName], "_i18n_".concat(languageId, "_text_idx")); indices.push({ name: textIndexName, query: _lodash["default"].template(textIndexTemplate)({ indexName: textIndexName, attributeName: attributeName, languageId: languageId, storageTableName: storageTableName }) }); var trgmIndexName = (0, _util.generateIndexName)(storageTableName, [attributeName], "_i18n_".concat(languageId, "_trgm_idx")); indices.push({ name: trgmIndexName, query: _lodash["default"].template(trgmIndexTemplate)({ indexName: trgmIndexName, attributeName: attributeName, languageId: languageId, storageTableName: storageTableName }) }); }); }); }); return indices; }); (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "createI18nIndices", function (configuration) { var result = ''; var extensionTemplate = loadTemplate('trigram_extension.tpl.sql'); var indices = _this.generateI18nIndices(configuration); if (indices && indices.length) { indices.forEach(function (_ref) { var query = _ref.query; result += query; }); result = _lodash["default"].template(extensionTemplate)() + result; } return result; }); (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "generateI18nIndicesMigration", /*#__PURE__*/function () { var _ref2 = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee(configuration, manager) { var upQueries, downQueries, indices, foundIndices; return _regenerator["default"].wrap(function _callee$(_context) { while (1) { switch (_context.prev = _context.next) { case 0: upQueries = []; downQueries = []; indices = _this.generateI18nIndices(configuration); _context.next = 5; return manager.query("\n SELECT *\n FROM pg_indexes\n WHERE indexname ~ '__i18n_.*(text|trgm)_idx'\n "); case 5: foundIndices = _context.sent; foundIndices.forEach(function (foundIndex) { if (!indices.find(function (_ref3) { var name = _ref3.name; return name === foundIndex.indexname; })) { upQueries.push("DROP INDEX IF EXISTS ".concat(foundIndex.indexname)); downQueries.push(foundIndex.indexdef); } }); indices.forEach(function (index) { if (!foundIndices.find(function (_ref4) { var indexname = _ref4.indexname; return indexname === index.name; })) { upQueries.push(index.query.replace(new RegExp('\n', 'g'), ' ')); downQueries.push("DROP INDEX IF EXISTS ".concat(index.name)); } }); return _context.abrupt("return", { upQueries: upQueries, downQueries: downQueries }); case 9: case "end": return _context.stop(); } } }, _callee); })); return function (_x, _x2) { return _ref2.apply(this, arguments); }; }()); return _this; } return StoragePostgresConfiguration; }(_shyft.StorageConfiguration); var _default = StoragePostgresConfiguration; exports["default"] = _default; var isStoragePostgresConfiguration = function isStoragePostgresConfiguration(obj) { return obj instanceof StoragePostgresConfiguration; }; exports.isStoragePostgresConfiguration = isStoragePostgresConfiguration;