update.js 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142
  1. "use strict";
  2. Object.defineProperty(exports, "__esModule", { value: true });
  3. const update_1 = require("../commands/update");
  4. const symbol_1 = require("../helper/symbol");
  5. const type_1 = require("../utils/type");
  6. const operator_map_1 = require("../operator-map");
  7. const common_1 = require("./common");
  8. const utils_1 = require("../utils/utils");
  9. class UpdateSerializer {
  10. constructor() { }
  11. static encode(query) {
  12. const stringifier = new UpdateSerializer();
  13. return stringifier.encodeUpdate(query);
  14. }
  15. static encodeEJSON(query) {
  16. const stringifier = new UpdateSerializer();
  17. return utils_1.stringifyByEJSON(stringifier.encodeUpdate(query));
  18. }
  19. encodeUpdate(query) {
  20. if (update_1.isUpdateCommand(query)) {
  21. return this.encodeUpdateCommand(query);
  22. }
  23. else if (type_1.getType(query) === 'object') {
  24. return this.encodeUpdateObject(query);
  25. }
  26. else {
  27. return query;
  28. }
  29. }
  30. encodeUpdateCommand(query) {
  31. if (query.fieldName === symbol_1.SYMBOL_UNSET_FIELD_NAME) {
  32. throw new Error('Cannot encode a comparison command with unset field name');
  33. }
  34. switch (query.operator) {
  35. case update_1.UPDATE_COMMANDS_LITERAL.PUSH:
  36. case update_1.UPDATE_COMMANDS_LITERAL.PULL:
  37. case update_1.UPDATE_COMMANDS_LITERAL.PULL_ALL:
  38. case update_1.UPDATE_COMMANDS_LITERAL.POP:
  39. case update_1.UPDATE_COMMANDS_LITERAL.SHIFT:
  40. case update_1.UPDATE_COMMANDS_LITERAL.UNSHIFT:
  41. case update_1.UPDATE_COMMANDS_LITERAL.ADD_TO_SET: {
  42. return this.encodeArrayUpdateCommand(query);
  43. }
  44. default: {
  45. return this.encodeFieldUpdateCommand(query);
  46. }
  47. }
  48. }
  49. encodeFieldUpdateCommand(query) {
  50. const $op = operator_map_1.operatorToString(query.operator);
  51. switch (query.operator) {
  52. case update_1.UPDATE_COMMANDS_LITERAL.REMOVE: {
  53. return {
  54. [$op]: {
  55. [query.fieldName]: ''
  56. }
  57. };
  58. }
  59. default: {
  60. return {
  61. [$op]: {
  62. [query.fieldName]: query.operands[0]
  63. }
  64. };
  65. }
  66. }
  67. }
  68. encodeArrayUpdateCommand(query) {
  69. const $op = operator_map_1.operatorToString(query.operator);
  70. switch (query.operator) {
  71. case update_1.UPDATE_COMMANDS_LITERAL.PUSH: {
  72. let modifiers;
  73. if (type_1.isArray(query.operands)) {
  74. modifiers = {
  75. $each: query.operands.map(common_1.encodeInternalDataType)
  76. };
  77. }
  78. else {
  79. modifiers = query.operands;
  80. }
  81. return {
  82. [$op]: {
  83. [query.fieldName]: modifiers
  84. }
  85. };
  86. }
  87. case update_1.UPDATE_COMMANDS_LITERAL.UNSHIFT: {
  88. const modifiers = {
  89. $each: query.operands.map(common_1.encodeInternalDataType),
  90. $position: 0
  91. };
  92. return {
  93. [$op]: {
  94. [query.fieldName]: modifiers
  95. }
  96. };
  97. }
  98. case update_1.UPDATE_COMMANDS_LITERAL.POP: {
  99. return {
  100. [$op]: {
  101. [query.fieldName]: 1
  102. }
  103. };
  104. }
  105. case update_1.UPDATE_COMMANDS_LITERAL.SHIFT: {
  106. return {
  107. [$op]: {
  108. [query.fieldName]: -1
  109. }
  110. };
  111. }
  112. default: {
  113. return {
  114. [$op]: {
  115. [query.fieldName]: common_1.encodeInternalDataType(query.operands)
  116. }
  117. };
  118. }
  119. }
  120. }
  121. encodeUpdateObject(query) {
  122. const flattened = common_1.flattenQueryObject(query);
  123. for (const key in flattened) {
  124. if (/^\$/.test(key))
  125. continue;
  126. let val = flattened[key];
  127. if (update_1.isUpdateCommand(val)) {
  128. flattened[key] = val._setFieldName(key);
  129. const condition = this.encodeUpdateCommand(flattened[key]);
  130. common_1.mergeConditionAfterEncode(flattened, condition, key);
  131. }
  132. else {
  133. flattened[key] = val = common_1.encodeInternalDataType(val);
  134. const $setCommand = new update_1.UpdateCommand(update_1.UPDATE_COMMANDS_LITERAL.SET, [val], key);
  135. const condition = this.encodeUpdateCommand($setCommand);
  136. common_1.mergeConditionAfterEncode(flattened, condition, key);
  137. }
  138. }
  139. return flattened;
  140. }
  141. }
  142. exports.UpdateSerializer = UpdateSerializer;