shyft-storage-connector
Version:
Storage connector for Shyft
283 lines (238 loc) • 14.3 kB
JavaScript
;
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;