command.js 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281
  1. import { QueryCommand, QUERY_COMMANDS_LITERAL } from './commands/query';
  2. import { LogicCommand, LOGIC_COMMANDS_LITERAL } from './commands/logic';
  3. import { UpdateCommand, UPDATE_COMMANDS_LITERAL } from './commands/update';
  4. import { isArray, isObject, isString } from './utils/type';
  5. import Aggregation from './aggregate';
  6. export const Command = {
  7. eq(val) {
  8. return new QueryCommand(QUERY_COMMANDS_LITERAL.EQ, [val]);
  9. },
  10. neq(val) {
  11. return new QueryCommand(QUERY_COMMANDS_LITERAL.NEQ, [val]);
  12. },
  13. lt(val) {
  14. return new QueryCommand(QUERY_COMMANDS_LITERAL.LT, [val]);
  15. },
  16. lte(val) {
  17. return new QueryCommand(QUERY_COMMANDS_LITERAL.LTE, [val]);
  18. },
  19. gt(val) {
  20. return new QueryCommand(QUERY_COMMANDS_LITERAL.GT, [val]);
  21. },
  22. gte(val) {
  23. return new QueryCommand(QUERY_COMMANDS_LITERAL.GTE, [val]);
  24. },
  25. in(val) {
  26. return new QueryCommand(QUERY_COMMANDS_LITERAL.IN, val);
  27. },
  28. nin(val) {
  29. return new QueryCommand(QUERY_COMMANDS_LITERAL.NIN, val);
  30. },
  31. all(val) {
  32. return new QueryCommand(QUERY_COMMANDS_LITERAL.ALL, val);
  33. },
  34. elemMatch(val) {
  35. return new QueryCommand(QUERY_COMMANDS_LITERAL.ELEM_MATCH, [val]);
  36. },
  37. exists(val) {
  38. return new QueryCommand(QUERY_COMMANDS_LITERAL.EXISTS, [val]);
  39. },
  40. size(val) {
  41. return new QueryCommand(QUERY_COMMANDS_LITERAL.SIZE, [val]);
  42. },
  43. mod() {
  44. if (arguments.length == 1)
  45. return new QueryCommand(QUERY_COMMANDS_LITERAL.MOD, [arguments[0]]);
  46. if (arguments.length == 2)
  47. return new QueryCommand(QUERY_COMMANDS_LITERAL.MOD, [[arguments[0], arguments[1]]]);
  48. return new QueryCommand(QUERY_COMMANDS_LITERAL.MOD, arguments);
  49. },
  50. geoNear(val) {
  51. return new QueryCommand(QUERY_COMMANDS_LITERAL.GEO_NEAR, [val]);
  52. },
  53. geoWithin(val) {
  54. return new QueryCommand(QUERY_COMMANDS_LITERAL.GEO_WITHIN, [val]);
  55. },
  56. geoIntersects(val) {
  57. return new QueryCommand(QUERY_COMMANDS_LITERAL.GEO_INTERSECTS, [val]);
  58. },
  59. and(...__expressions__) {
  60. const expressions = isArray(arguments[0]) ? arguments[0] : Array.from(arguments);
  61. return new LogicCommand(LOGIC_COMMANDS_LITERAL.AND, expressions);
  62. },
  63. nor(...__expressions__) {
  64. const expressions = isArray(arguments[0]) ? arguments[0] : Array.from(arguments);
  65. return new LogicCommand(LOGIC_COMMANDS_LITERAL.NOR, expressions);
  66. },
  67. or(...__expressions__) {
  68. const expressions = isArray(arguments[0]) ? arguments[0] : Array.from(arguments);
  69. return new LogicCommand(LOGIC_COMMANDS_LITERAL.OR, expressions);
  70. },
  71. not(...__expressions__) {
  72. const expressions = isArray(arguments[0]) ? arguments[0] : Array.from(arguments);
  73. return new LogicCommand(LOGIC_COMMANDS_LITERAL.NOT, expressions);
  74. },
  75. set(val) {
  76. return new UpdateCommand(UPDATE_COMMANDS_LITERAL.SET, [val]);
  77. },
  78. remove() {
  79. return new UpdateCommand(UPDATE_COMMANDS_LITERAL.REMOVE, []);
  80. },
  81. inc(val) {
  82. return new UpdateCommand(UPDATE_COMMANDS_LITERAL.INC, [val]);
  83. },
  84. mul(val) {
  85. return new UpdateCommand(UPDATE_COMMANDS_LITERAL.MUL, [val]);
  86. },
  87. push(...args) {
  88. let values;
  89. if (isObject(args[0]) && args[0].hasOwnProperty('each')) {
  90. values = {};
  91. const options = args[0];
  92. if (options.each !== undefined) {
  93. values['$each'] = options.each;
  94. }
  95. if (options.position !== undefined) {
  96. values['$position'] = options.position;
  97. }
  98. if (options.sort !== undefined) {
  99. values['$sort'] = options.sort;
  100. }
  101. if (options.slice !== undefined) {
  102. values['$slice'] = options.slice;
  103. }
  104. }
  105. else if (isArray(args[0])) {
  106. values = args[0];
  107. }
  108. else {
  109. values = Array.from(args);
  110. }
  111. return new UpdateCommand(UPDATE_COMMANDS_LITERAL.PUSH, values);
  112. },
  113. pull(values) {
  114. return new UpdateCommand(UPDATE_COMMANDS_LITERAL.PULL, values);
  115. },
  116. pullAll(values) {
  117. return new UpdateCommand(UPDATE_COMMANDS_LITERAL.PULL_ALL, values);
  118. },
  119. pop() {
  120. return new UpdateCommand(UPDATE_COMMANDS_LITERAL.POP, []);
  121. },
  122. shift() {
  123. return new UpdateCommand(UPDATE_COMMANDS_LITERAL.SHIFT, []);
  124. },
  125. unshift(...__values__) {
  126. const values = isArray(arguments[0]) ? arguments[0] : Array.from(arguments);
  127. return new UpdateCommand(UPDATE_COMMANDS_LITERAL.UNSHIFT, values);
  128. },
  129. addToSet(values) {
  130. return new UpdateCommand(UPDATE_COMMANDS_LITERAL.ADD_TO_SET, values);
  131. },
  132. rename(values) {
  133. return new UpdateCommand(UPDATE_COMMANDS_LITERAL.RENAME, [values]);
  134. },
  135. bit(values) {
  136. return new UpdateCommand(UPDATE_COMMANDS_LITERAL.BIT, [values]);
  137. },
  138. max(values) {
  139. return new UpdateCommand(UPDATE_COMMANDS_LITERAL.MAX, [values]);
  140. },
  141. min(values) {
  142. return new UpdateCommand(UPDATE_COMMANDS_LITERAL.MIN, [values]);
  143. },
  144. expr(values) {
  145. return {
  146. $expr: values
  147. };
  148. },
  149. jsonSchema(schema) {
  150. return {
  151. $jsonSchema: schema
  152. };
  153. },
  154. text(values) {
  155. if (isString(values)) {
  156. return {
  157. $search: values.search
  158. };
  159. }
  160. else {
  161. return {
  162. $search: values.search,
  163. $language: values.language,
  164. $caseSensitive: values.caseSensitive,
  165. $diacriticSensitive: values.diacriticSensitive
  166. };
  167. }
  168. },
  169. aggregate: {
  170. pipeline() {
  171. return new Aggregation();
  172. },
  173. abs: param => new AggregationOperator('abs', param),
  174. add: param => new AggregationOperator('add', param),
  175. ceil: param => new AggregationOperator('ceil', param),
  176. divide: param => new AggregationOperator('divide', param),
  177. exp: param => new AggregationOperator('exp', param),
  178. floor: param => new AggregationOperator('floor', param),
  179. ln: param => new AggregationOperator('ln', param),
  180. log: param => new AggregationOperator('log', param),
  181. log10: param => new AggregationOperator('log10', param),
  182. mod: param => new AggregationOperator('mod', param),
  183. multiply: param => new AggregationOperator('multiply', param),
  184. pow: param => new AggregationOperator('pow', param),
  185. sqrt: param => new AggregationOperator('sqrt', param),
  186. subtract: param => new AggregationOperator('subtract', param),
  187. trunc: param => new AggregationOperator('trunc', param),
  188. arrayElemAt: param => new AggregationOperator('arrayElemAt', param),
  189. arrayToObject: param => new AggregationOperator('arrayToObject', param),
  190. concatArrays: param => new AggregationOperator('concatArrays', param),
  191. filter: param => new AggregationOperator('filter', param),
  192. in: param => new AggregationOperator('in', param),
  193. indexOfArray: param => new AggregationOperator('indexOfArray', param),
  194. isArray: param => new AggregationOperator('isArray', param),
  195. map: param => new AggregationOperator('map', param),
  196. range: param => new AggregationOperator('range', param),
  197. reduce: param => new AggregationOperator('reduce', param),
  198. reverseArray: param => new AggregationOperator('reverseArray', param),
  199. size: param => new AggregationOperator('size', param),
  200. slice: param => new AggregationOperator('slice', param),
  201. zip: param => new AggregationOperator('zip', param),
  202. and: param => new AggregationOperator('and', param),
  203. not: param => new AggregationOperator('not', param),
  204. or: param => new AggregationOperator('or', param),
  205. cmp: param => new AggregationOperator('cmp', param),
  206. eq: param => new AggregationOperator('eq', param),
  207. gt: param => new AggregationOperator('gt', param),
  208. gte: param => new AggregationOperator('gte', param),
  209. lt: param => new AggregationOperator('lt', param),
  210. lte: param => new AggregationOperator('lte', param),
  211. neq: param => new AggregationOperator('ne', param),
  212. cond: param => new AggregationOperator('cond', param),
  213. ifNull: param => new AggregationOperator('ifNull', param),
  214. switch: param => new AggregationOperator('switch', param),
  215. dateFromParts: param => new AggregationOperator('dateFromParts', param),
  216. dateFromString: param => new AggregationOperator('dateFromString', param),
  217. dayOfMonth: param => new AggregationOperator('dayOfMonth', param),
  218. dayOfWeek: param => new AggregationOperator('dayOfWeek', param),
  219. dayOfYear: param => new AggregationOperator('dayOfYear', param),
  220. isoDayOfWeek: param => new AggregationOperator('isoDayOfWeek', param),
  221. isoWeek: param => new AggregationOperator('isoWeek', param),
  222. isoWeekYear: param => new AggregationOperator('isoWeekYear', param),
  223. millisecond: param => new AggregationOperator('millisecond', param),
  224. minute: param => new AggregationOperator('minute', param),
  225. month: param => new AggregationOperator('month', param),
  226. second: param => new AggregationOperator('second', param),
  227. hour: param => new AggregationOperator('hour', param),
  228. week: param => new AggregationOperator('week', param),
  229. year: param => new AggregationOperator('year', param),
  230. literal: param => new AggregationOperator('literal', param),
  231. mergeObjects: param => new AggregationOperator('mergeObjects', param),
  232. objectToArray: param => new AggregationOperator('objectToArray', param),
  233. allElementsTrue: param => new AggregationOperator('allElementsTrue', param),
  234. anyElementTrue: param => new AggregationOperator('anyElementTrue', param),
  235. setDifference: param => new AggregationOperator('setDifference', param),
  236. setEquals: param => new AggregationOperator('setEquals', param),
  237. setIntersection: param => new AggregationOperator('setIntersection', param),
  238. setIsSubset: param => new AggregationOperator('setIsSubset', param),
  239. setUnion: param => new AggregationOperator('setUnion', param),
  240. concat: param => new AggregationOperator('concat', param),
  241. dateToString: param => new AggregationOperator('dateToString', param),
  242. indexOfBytes: param => new AggregationOperator('indexOfBytes', param),
  243. indexOfCP: param => new AggregationOperator('indexOfCP', param),
  244. split: param => new AggregationOperator('split', param),
  245. strLenBytes: param => new AggregationOperator('strLenBytes', param),
  246. strLenCP: param => new AggregationOperator('strLenCP', param),
  247. strcasecmp: param => new AggregationOperator('strcasecmp', param),
  248. substr: param => new AggregationOperator('substr', param),
  249. substrBytes: param => new AggregationOperator('substrBytes', param),
  250. substrCP: param => new AggregationOperator('substrCP', param),
  251. toLower: param => new AggregationOperator('toLower', param),
  252. toUpper: param => new AggregationOperator('toUpper', param),
  253. meta: param => new AggregationOperator('meta', param),
  254. addToSet: param => new AggregationOperator('addToSet', param),
  255. avg: param => new AggregationOperator('avg', param),
  256. first: param => new AggregationOperator('first', param),
  257. last: param => new AggregationOperator('last', param),
  258. max: param => new AggregationOperator('max', param),
  259. min: param => new AggregationOperator('min', param),
  260. push: param => new AggregationOperator('push', param),
  261. stdDevPop: param => new AggregationOperator('stdDevPop', param),
  262. stdDevSamp: param => new AggregationOperator('stdDevSamp', param),
  263. sum: param => new AggregationOperator('sum', param),
  264. let: param => new AggregationOperator('let', param)
  265. },
  266. project: {
  267. slice: param => new ProjectionOperator('slice', param),
  268. elemMatch: param => new ProjectionOperator('elemMatch', param)
  269. }
  270. };
  271. export class AggregationOperator {
  272. constructor(name, param) {
  273. this['$' + name] = param;
  274. }
  275. }
  276. export class ProjectionOperator {
  277. constructor(name, param) {
  278. this['$' + name] = param;
  279. }
  280. }
  281. export default Command;