query-interface.js 7.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171
  1. "use strict";
  2. var __defProp = Object.defineProperty;
  3. var __defProps = Object.defineProperties;
  4. var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
  5. var __getOwnPropSymbols = Object.getOwnPropertySymbols;
  6. var __hasOwnProp = Object.prototype.hasOwnProperty;
  7. var __propIsEnum = Object.prototype.propertyIsEnumerable;
  8. var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
  9. var __spreadValues = (a, b) => {
  10. for (var prop in b || (b = {}))
  11. if (__hasOwnProp.call(b, prop))
  12. __defNormalProp(a, prop, b[prop]);
  13. if (__getOwnPropSymbols)
  14. for (var prop of __getOwnPropSymbols(b)) {
  15. if (__propIsEnum.call(b, prop))
  16. __defNormalProp(a, prop, b[prop]);
  17. }
  18. return a;
  19. };
  20. var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
  21. var __objRest = (source, exclude) => {
  22. var target = {};
  23. for (var prop in source)
  24. if (__hasOwnProp.call(source, prop) && exclude.indexOf(prop) < 0)
  25. target[prop] = source[prop];
  26. if (source != null && __getOwnPropSymbols)
  27. for (var prop of __getOwnPropSymbols(source)) {
  28. if (exclude.indexOf(prop) < 0 && __propIsEnum.call(source, prop))
  29. target[prop] = source[prop];
  30. }
  31. return target;
  32. };
  33. const DataTypes = require("../../data-types");
  34. const QueryTypes = require("../../query-types");
  35. const { QueryInterface } = require("../abstract/query-interface");
  36. const Utils = require("../../utils");
  37. const Deferrable = require("../../deferrable");
  38. class PostgresQueryInterface extends QueryInterface {
  39. async ensureEnums(tableName, attributes, options, model) {
  40. const keys = Object.keys(attributes);
  41. const keyLen = keys.length;
  42. let sql = "";
  43. let promises = [];
  44. let i = 0;
  45. for (i = 0; i < keyLen; i++) {
  46. const attribute = attributes[keys[i]];
  47. const type = attribute.type;
  48. if (type instanceof DataTypes.ENUM || type instanceof DataTypes.ARRAY && type.type instanceof DataTypes.ENUM) {
  49. sql = this.queryGenerator.pgListEnums(tableName, attribute.field || keys[i], options);
  50. promises.push(this.sequelize.query(sql, __spreadProps(__spreadValues({}, options), { plain: true, raw: true, type: QueryTypes.SELECT })));
  51. }
  52. }
  53. const results = await Promise.all(promises);
  54. promises = [];
  55. let enumIdx = 0;
  56. const addEnumValue = (field, value, relativeValue, position = "before", spliceStart = promises.length) => {
  57. const valueOptions = __spreadValues({}, options);
  58. valueOptions.before = null;
  59. valueOptions.after = null;
  60. switch (position) {
  61. case "after":
  62. valueOptions.after = relativeValue;
  63. break;
  64. case "before":
  65. default:
  66. valueOptions.before = relativeValue;
  67. break;
  68. }
  69. promises.splice(spliceStart, 0, () => {
  70. return this.sequelize.query(this.queryGenerator.pgEnumAdd(tableName, field, value, valueOptions), valueOptions);
  71. });
  72. };
  73. for (i = 0; i < keyLen; i++) {
  74. const attribute = attributes[keys[i]];
  75. const type = attribute.type;
  76. const enumType = type.type || type;
  77. const field = attribute.field || keys[i];
  78. if (type instanceof DataTypes.ENUM || type instanceof DataTypes.ARRAY && enumType instanceof DataTypes.ENUM) {
  79. if (!results[enumIdx]) {
  80. promises.push(() => {
  81. return this.sequelize.query(this.queryGenerator.pgEnum(tableName, field, enumType, options), __spreadProps(__spreadValues({}, options), { raw: true }));
  82. });
  83. } else if (!!results[enumIdx] && !!model) {
  84. const enumVals = this.queryGenerator.fromArray(results[enumIdx].enum_value);
  85. const vals = enumType.values;
  86. let lastOldEnumValue;
  87. let rightestPosition = -1;
  88. for (let oldIndex = 0; oldIndex < enumVals.length; oldIndex++) {
  89. const enumVal = enumVals[oldIndex];
  90. const newIdx = vals.indexOf(enumVal);
  91. lastOldEnumValue = enumVal;
  92. if (newIdx === -1) {
  93. continue;
  94. }
  95. const newValuesBefore = vals.slice(0, newIdx);
  96. const promisesLength = promises.length;
  97. for (let reverseIdx = newValuesBefore.length - 1; reverseIdx >= 0; reverseIdx--) {
  98. if (~enumVals.indexOf(newValuesBefore[reverseIdx])) {
  99. break;
  100. }
  101. addEnumValue(field, newValuesBefore[reverseIdx], lastOldEnumValue, "before", promisesLength);
  102. }
  103. if (newIdx > rightestPosition) {
  104. rightestPosition = newIdx;
  105. }
  106. }
  107. if (lastOldEnumValue && rightestPosition < vals.length - 1) {
  108. const remainingEnumValues = vals.slice(rightestPosition + 1);
  109. for (let reverseIdx = remainingEnumValues.length - 1; reverseIdx >= 0; reverseIdx--) {
  110. addEnumValue(field, remainingEnumValues[reverseIdx], lastOldEnumValue, "after");
  111. }
  112. }
  113. enumIdx++;
  114. }
  115. }
  116. }
  117. const result = await promises.reduce(async (promise, asyncFunction) => await asyncFunction(await promise), Promise.resolve());
  118. if (promises.length) {
  119. await this.sequelize.dialect.connectionManager._refreshDynamicOIDs();
  120. }
  121. return result;
  122. }
  123. async getForeignKeyReferencesForTable(table, options) {
  124. const queryOptions = __spreadProps(__spreadValues({}, options), {
  125. type: QueryTypes.FOREIGNKEYS
  126. });
  127. const query = this.queryGenerator.getForeignKeyReferencesQuery(table.tableName || table, this.sequelize.config.database);
  128. const result = await this.sequelize.query(query, queryOptions);
  129. return result.map((fkMeta) => {
  130. const _a = Utils.camelizeObjectKeys(fkMeta), { initiallyDeferred, isDeferrable } = _a, remaining = __objRest(_a, ["initiallyDeferred", "isDeferrable"]);
  131. return __spreadProps(__spreadValues({}, remaining), {
  132. deferrable: isDeferrable === "NO" ? Deferrable.NOT : initiallyDeferred === "NO" ? Deferrable.INITIALLY_IMMEDIATE : Deferrable.INITIALLY_DEFERRED
  133. });
  134. });
  135. }
  136. async dropEnum(enumName, options) {
  137. options = options || {};
  138. return this.sequelize.query(this.queryGenerator.pgEnumDrop(null, null, this.queryGenerator.pgEscapeAndQuote(enumName)), __spreadProps(__spreadValues({}, options), { raw: true }));
  139. }
  140. async dropAllEnums(options) {
  141. options = options || {};
  142. const enums = await this.pgListEnums(null, options);
  143. return await Promise.all(enums.map((result) => this.sequelize.query(this.queryGenerator.pgEnumDrop(null, null, this.queryGenerator.pgEscapeAndQuote(result.enum_name)), __spreadProps(__spreadValues({}, options), { raw: true }))));
  144. }
  145. async pgListEnums(tableName, options) {
  146. options = options || {};
  147. const sql = this.queryGenerator.pgListEnums(tableName);
  148. return this.sequelize.query(sql, __spreadProps(__spreadValues({}, options), { plain: false, raw: true, type: QueryTypes.SELECT }));
  149. }
  150. async dropTable(tableName, options) {
  151. await super.dropTable(tableName, options);
  152. const promises = [];
  153. const instanceTable = this.sequelize.modelManager.getModel(tableName, { attribute: "tableName" });
  154. if (!instanceTable) {
  155. return;
  156. }
  157. const getTableName = (!options || !options.schema || options.schema === "public" ? "" : `${options.schema}_`) + tableName;
  158. const keys = Object.keys(instanceTable.rawAttributes);
  159. const keyLen = keys.length;
  160. for (let i = 0; i < keyLen; i++) {
  161. if (instanceTable.rawAttributes[keys[i]].type instanceof DataTypes.ENUM) {
  162. const sql = this.queryGenerator.pgEnumDrop(getTableName, keys[i]);
  163. options.supportsSearchPath = false;
  164. promises.push(this.sequelize.query(sql, __spreadProps(__spreadValues({}, options), { raw: true })));
  165. }
  166. }
  167. await Promise.all(promises);
  168. }
  169. }
  170. exports.PostgresQueryInterface = PostgresQueryInterface;
  171. //# sourceMappingURL=query-interface.js.map