compiler.js 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734
  1. 'use strict';
  2. exports.__esModule = true;
  3. var _keys = require('babel-runtime/core-js/object/keys');
  4. var _keys2 = _interopRequireDefault(_keys);
  5. var _typeof2 = require('babel-runtime/helpers/typeof');
  6. var _typeof3 = _interopRequireDefault(_typeof2);
  7. var _defineProperties = require('babel-runtime/core-js/object/define-properties');
  8. var _defineProperties2 = _interopRequireDefault(_defineProperties);
  9. var _reduce2 = require('lodash/reduce');
  10. var _reduce3 = _interopRequireDefault(_reduce2);
  11. var _omitBy2 = require('lodash/omitBy');
  12. var _omitBy3 = _interopRequireDefault(_omitBy2);
  13. var _map2 = require('lodash/map');
  14. var _map3 = _interopRequireDefault(_map2);
  15. var _isUndefined2 = require('lodash/isUndefined');
  16. var _isUndefined3 = _interopRequireDefault(_isUndefined2);
  17. var _isString2 = require('lodash/isString');
  18. var _isString3 = _interopRequireDefault(_isString2);
  19. var _isEmpty2 = require('lodash/isEmpty');
  20. var _isEmpty3 = _interopRequireDefault(_isEmpty2);
  21. var _groupBy2 = require('lodash/groupBy');
  22. var _groupBy3 = _interopRequireDefault(_groupBy2);
  23. var _compact2 = require('lodash/compact');
  24. var _compact3 = _interopRequireDefault(_compact2);
  25. var _bind2 = require('lodash/bind');
  26. var _bind3 = _interopRequireDefault(_bind2);
  27. var _assign2 = require('lodash/assign');
  28. var _assign3 = _interopRequireDefault(_assign2);
  29. var _helpers = require('../helpers');
  30. var helpers = _interopRequireWildcard(_helpers);
  31. var _raw = require('../raw');
  32. var _raw2 = _interopRequireDefault(_raw);
  33. var _joinclause = require('./joinclause');
  34. var _joinclause2 = _interopRequireDefault(_joinclause);
  35. var _debug = require('debug');
  36. var _debug2 = _interopRequireDefault(_debug);
  37. var _uuid = require('uuid');
  38. var _uuid2 = _interopRequireDefault(_uuid);
  39. function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }
  40. function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
  41. var debugBindings = (0, _debug2.default)('knex:bindings');
  42. // The "QueryCompiler" takes all of the query statements which
  43. // have been gathered in the "QueryBuilder" and turns them into a
  44. // properly formatted / bound query string.
  45. // Query Compiler
  46. // -------
  47. function QueryCompiler(client, builder) {
  48. this.client = client;
  49. this.method = builder._method || 'select';
  50. this.options = builder._options;
  51. this.single = builder._single;
  52. this.timeout = builder._timeout || false;
  53. this.cancelOnTimeout = builder._cancelOnTimeout || false;
  54. this.grouped = (0, _groupBy3.default)(builder._statements, 'grouping');
  55. this.formatter = client.formatter(builder);
  56. }
  57. var components = ['columns', 'join', 'where', 'union', 'group', 'having', 'order', 'limit', 'offset', 'lock'];
  58. (0, _assign3.default)(QueryCompiler.prototype, {
  59. // Used when the insert call is empty.
  60. _emptyInsertValue: 'default values',
  61. // Collapse the builder into a single object
  62. toSQL: function toSQL(method, tz) {
  63. var _this = this;
  64. this._undefinedInWhereClause = false;
  65. method = method || this.method;
  66. var val = this[method]() || '';
  67. var query = {
  68. method: method,
  69. options: (0, _reduce3.default)(this.options, _assign3.default, {}),
  70. timeout: this.timeout,
  71. cancelOnTimeout: this.cancelOnTimeout,
  72. bindings: this.formatter.bindings || [],
  73. __knexQueryUid: _uuid2.default.v4()
  74. };
  75. (0, _defineProperties2.default)(query, {
  76. toNative: {
  77. value: function value() {
  78. return {
  79. sql: _this.client.positionBindings(query.sql),
  80. bindings: _this.client.prepBindings(query.bindings)
  81. };
  82. },
  83. enumerable: false
  84. }
  85. });
  86. if ((0, _isString3.default)(val)) {
  87. query.sql = val;
  88. } else {
  89. (0, _assign3.default)(query, val);
  90. }
  91. if (method === 'select' || method === 'first') {
  92. if (this.single.as) {
  93. query.as = this.single.as;
  94. }
  95. }
  96. if (this._undefinedInWhereClause) {
  97. debugBindings(query.bindings);
  98. throw new Error('Undefined binding(s) detected when compiling ' + (method.toUpperCase() + ' query: ' + query.sql));
  99. }
  100. return query;
  101. },
  102. // Compiles the `select` statement, or nested sub-selects by calling each of
  103. // the component compilers, trimming out the empties, and returning a
  104. // generated query string.
  105. select: function select() {
  106. var _this2 = this;
  107. var sql = this.with();
  108. var statements = components.map(function (component) {
  109. return _this2[component](_this2);
  110. });
  111. sql += (0, _compact3.default)(statements).join(' ');
  112. return sql;
  113. },
  114. pluck: function pluck() {
  115. var toPluck = this.single.pluck;
  116. if (toPluck.indexOf('.') !== -1) {
  117. toPluck = toPluck.split('.').slice(-1)[0];
  118. }
  119. return {
  120. sql: this.select(),
  121. pluck: toPluck
  122. };
  123. },
  124. // Compiles an "insert" query, allowing for multiple
  125. // inserts using a single query statement.
  126. insert: function insert() {
  127. var insertValues = this.single.insert || [];
  128. var sql = this.with() + ('insert into ' + this.tableName + ' ');
  129. if (Array.isArray(insertValues)) {
  130. if (insertValues.length === 0) {
  131. return '';
  132. }
  133. } else if ((typeof insertValues === 'undefined' ? 'undefined' : (0, _typeof3.default)(insertValues)) === 'object' && (0, _isEmpty3.default)(insertValues)) {
  134. return sql + this._emptyInsertValue;
  135. }
  136. var insertData = this._prepInsert(insertValues);
  137. if (typeof insertData === 'string') {
  138. sql += insertData;
  139. } else {
  140. if (insertData.columns.length) {
  141. sql += '(' + this.formatter.columnize(insertData.columns);
  142. sql += ') values (';
  143. var i = -1;
  144. while (++i < insertData.values.length) {
  145. if (i !== 0) sql += '), (';
  146. sql += this.formatter.parameterize(insertData.values[i], this.client.valueForUndefined);
  147. }
  148. sql += ')';
  149. } else if (insertValues.length === 1 && insertValues[0]) {
  150. sql += this._emptyInsertValue;
  151. } else {
  152. sql = '';
  153. }
  154. }
  155. return sql;
  156. },
  157. // Compiles the "update" query.
  158. update: function update() {
  159. // Make sure tableName is processed by the formatter first.
  160. var tableName = this.tableName;
  161. var updateData = this._prepUpdate(this.single.update);
  162. var wheres = this.where();
  163. return this.with() + ('update ' + (this.single.only ? 'only ' : '') + tableName) + ' set ' + updateData.join(', ') + (wheres ? ' ' + wheres : '');
  164. },
  165. // Compiles the columns in the query, specifying if an item was distinct.
  166. columns: function columns() {
  167. var distinct = false;
  168. if (this.onlyUnions()) return '';
  169. var columns = this.grouped.columns || [];
  170. var i = -1,
  171. sql = [];
  172. if (columns) {
  173. while (++i < columns.length) {
  174. var stmt = columns[i];
  175. if (stmt.distinct) distinct = true;
  176. if (stmt.type === 'aggregate') {
  177. sql.push(this.aggregate(stmt));
  178. } else if (stmt.type === 'aggregateRaw') {
  179. sql.push(this.aggregateRaw(stmt));
  180. } else if (stmt.value && stmt.value.length > 0) {
  181. sql.push(this.formatter.columnize(stmt.value));
  182. }
  183. }
  184. }
  185. if (sql.length === 0) sql = ['*'];
  186. return 'select ' + (distinct ? 'distinct ' : '') + sql.join(', ') + (this.tableName ? ' from ' + (this.single.only ? 'only ' : '') + this.tableName : '');
  187. },
  188. _aggregate: function _aggregate(stmt) {
  189. var _this3 = this;
  190. var _ref = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {},
  191. _ref$aliasSeparator = _ref.aliasSeparator,
  192. aliasSeparator = _ref$aliasSeparator === undefined ? ' as ' : _ref$aliasSeparator,
  193. distinctParentheses = _ref.distinctParentheses;
  194. var value = stmt.value;
  195. var method = stmt.method;
  196. var distinct = stmt.aggregateDistinct ? 'distinct ' : '';
  197. var wrap = function wrap(identifier) {
  198. return _this3.formatter.wrap(identifier);
  199. };
  200. var addAlias = function addAlias(value, alias) {
  201. if (alias) {
  202. return value + aliasSeparator + wrap(alias);
  203. }
  204. return value;
  205. };
  206. var aggregateArray = function aggregateArray(value, alias) {
  207. var columns = value.map(wrap).join(', ');
  208. if (distinct) {
  209. var openParen = distinctParentheses ? '(' : ' ';
  210. var closeParen = distinctParentheses ? ')' : '';
  211. columns = distinct.trim() + openParen + columns + closeParen;
  212. }
  213. var aggregated = method + '(' + columns + ')';
  214. return addAlias(aggregated, alias);
  215. };
  216. var aggregateString = function aggregateString(value, alias) {
  217. var aggregated = method + '(' + (distinct + wrap(value)) + ')';
  218. return addAlias(aggregated, alias);
  219. };
  220. if (Array.isArray(value)) {
  221. return aggregateArray(value);
  222. }
  223. if ((typeof value === 'undefined' ? 'undefined' : (0, _typeof3.default)(value)) === 'object') {
  224. var keys = (0, _keys2.default)(value);
  225. var alias = keys[0];
  226. var column = value[alias];
  227. if (Array.isArray(column)) {
  228. return aggregateArray(column, alias);
  229. }
  230. return aggregateString(column, alias);
  231. }
  232. // Allows us to speciy an alias for the aggregate types.
  233. var splitOn = value.toLowerCase().indexOf(' as ');
  234. if (splitOn !== -1) {
  235. var _column = value.slice(0, splitOn);
  236. var _alias = value.slice(splitOn + 4);
  237. return aggregateString(_column, _alias);
  238. }
  239. return aggregateString(value);
  240. },
  241. aggregate: function aggregate(stmt) {
  242. return this._aggregate(stmt);
  243. },
  244. aggregateRaw: function aggregateRaw(stmt) {
  245. var distinct = stmt.aggregateDistinct ? 'distinct ' : '';
  246. return stmt.method + '(' + (distinct + this.formatter.unwrapRaw(stmt.value)) + ')';
  247. },
  248. // Compiles all each of the `join` clauses on the query,
  249. // including any nested join queries.
  250. join: function join() {
  251. var sql = '';
  252. var i = -1;
  253. var joins = this.grouped.join;
  254. if (!joins) return '';
  255. while (++i < joins.length) {
  256. var join = joins[i];
  257. var table = join.schema ? join.schema + '.' + join.table : join.table;
  258. if (i > 0) sql += ' ';
  259. if (join.joinType === 'raw') {
  260. sql += this.formatter.unwrapRaw(join.table);
  261. } else {
  262. sql += join.joinType + ' join ' + this.formatter.wrap(table);
  263. var ii = -1;
  264. while (++ii < join.clauses.length) {
  265. var clause = join.clauses[ii];
  266. if (ii > 0) {
  267. sql += ' ' + clause.bool + ' ';
  268. } else {
  269. sql += ' ' + (clause.type === 'onUsing' ? 'using' : 'on') + ' ';
  270. }
  271. var val = this[clause.type].call(this, clause);
  272. if (val) {
  273. sql += val;
  274. }
  275. }
  276. }
  277. }
  278. return sql;
  279. },
  280. onBetween: function onBetween(statement) {
  281. return this.formatter.wrap(statement.column) + ' ' + this._not(statement, 'between') + ' ' + (0, _map3.default)(statement.value, (0, _bind3.default)(this.formatter.parameter, this.formatter)).join(' and ');
  282. },
  283. onNull: function onNull(statement) {
  284. return this.formatter.wrap(statement.column) + ' is ' + this._not(statement, 'null');
  285. },
  286. onExists: function onExists(statement) {
  287. return this._not(statement, 'exists') + ' (' + this.formatter.rawOrFn(statement.value) + ')';
  288. },
  289. onIn: function onIn(statement) {
  290. if (Array.isArray(statement.column)) return this.multiOnIn(statement);
  291. return this.formatter.wrap(statement.column) + ' ' + this._not(statement, 'in ') + this.wrap(this.formatter.parameterize(statement.value));
  292. },
  293. multiOnIn: function multiOnIn(statement) {
  294. var i = -1,
  295. sql = '(' + this.formatter.columnize(statement.column) + ') ';
  296. sql += this._not(statement, 'in ') + '((';
  297. while (++i < statement.value.length) {
  298. if (i !== 0) sql += '),(';
  299. sql += this.formatter.parameterize(statement.value[i]);
  300. }
  301. return sql + '))';
  302. },
  303. // Compiles all `where` statements on the query.
  304. where: function where() {
  305. var wheres = this.grouped.where;
  306. if (!wheres) return;
  307. var sql = [];
  308. var i = -1;
  309. while (++i < wheres.length) {
  310. var stmt = wheres[i];
  311. if (stmt.hasOwnProperty('value') && helpers.containsUndefined(stmt.value)) {
  312. this._undefinedInWhereClause = true;
  313. }
  314. var val = this[stmt.type](stmt);
  315. if (val) {
  316. if (sql.length === 0) {
  317. sql[0] = 'where';
  318. } else {
  319. sql.push(stmt.bool);
  320. }
  321. sql.push(val);
  322. }
  323. }
  324. return sql.length > 1 ? sql.join(' ') : '';
  325. },
  326. group: function group() {
  327. return this._groupsOrders('group');
  328. },
  329. order: function order() {
  330. return this._groupsOrders('order');
  331. },
  332. // Compiles the `having` statements.
  333. having: function having() {
  334. var havings = this.grouped.having;
  335. if (!havings) return '';
  336. var sql = ['having'];
  337. for (var i = 0, l = havings.length; i < l; i++) {
  338. var s = havings[i];
  339. var val = this[s.type](s);
  340. if (val) {
  341. if (sql.length === 0) {
  342. sql[0] = 'where';
  343. }
  344. if (sql.length > 1 || sql.length === 1 && sql[0] !== 'having') {
  345. sql.push(s.bool);
  346. }
  347. sql.push(val);
  348. }
  349. }
  350. return sql.length > 1 ? sql.join(' ') : '';
  351. },
  352. havingRaw: function havingRaw(statement) {
  353. return this._not(statement, '') + this.formatter.unwrapRaw(statement.value);
  354. },
  355. havingWrapped: function havingWrapped(statement) {
  356. var val = this.formatter.rawOrFn(statement.value, 'where');
  357. return val && this._not(statement, '') + '(' + val.slice(6) + ')' || '';
  358. },
  359. havingBasic: function havingBasic(statement) {
  360. return this._not(statement, '') + this.formatter.wrap(statement.column) + ' ' + this.formatter.operator(statement.operator) + ' ' + this.formatter.parameter(statement.value);
  361. },
  362. havingNull: function havingNull(statement) {
  363. return this.formatter.wrap(statement.column) + ' is ' + this._not(statement, 'null');
  364. },
  365. havingExists: function havingExists(statement) {
  366. return this._not(statement, 'exists') + ' (' + this.formatter.rawOrFn(statement.value) + ')';
  367. },
  368. havingBetween: function havingBetween(statement) {
  369. return this.formatter.wrap(statement.column) + ' ' + this._not(statement, 'between') + ' ' + (0, _map3.default)(statement.value, (0, _bind3.default)(this.formatter.parameter, this.formatter)).join(' and ');
  370. },
  371. havingIn: function havingIn(statement) {
  372. if (Array.isArray(statement.column)) return this.multiHavingIn(statement);
  373. return this.formatter.wrap(statement.column) + ' ' + this._not(statement, 'in ') + this.wrap(this.formatter.parameterize(statement.value));
  374. },
  375. multiHavingIn: function multiHavingIn(statement) {
  376. var i = -1,
  377. sql = '(' + this.formatter.columnize(statement.column) + ') ';
  378. sql += this._not(statement, 'in ') + '((';
  379. while (++i < statement.value.length) {
  380. if (i !== 0) sql += '),(';
  381. sql += this.formatter.parameterize(statement.value[i]);
  382. }
  383. return sql + '))';
  384. },
  385. // Compile the "union" queries attached to the main query.
  386. union: function union() {
  387. var onlyUnions = this.onlyUnions();
  388. var unions = this.grouped.union;
  389. if (!unions) return '';
  390. var sql = '';
  391. for (var i = 0, l = unions.length; i < l; i++) {
  392. var union = unions[i];
  393. if (i > 0) sql += ' ';
  394. if (i > 0 || !onlyUnions) sql += union.clause + ' ';
  395. var statement = this.formatter.rawOrFn(union.value);
  396. if (statement) {
  397. if (union.wrap) sql += '(';
  398. sql += statement;
  399. if (union.wrap) sql += ')';
  400. }
  401. }
  402. return sql;
  403. },
  404. // If we haven't specified any columns or a `tableName`, we're assuming this
  405. // is only being used for unions.
  406. onlyUnions: function onlyUnions() {
  407. return !this.grouped.columns && this.grouped.union && !this.tableName;
  408. },
  409. limit: function limit() {
  410. var noLimit = !this.single.limit && this.single.limit !== 0;
  411. if (noLimit) return '';
  412. return 'limit ' + this.formatter.parameter(this.single.limit);
  413. },
  414. offset: function offset() {
  415. if (!this.single.offset) return '';
  416. return 'offset ' + this.formatter.parameter(this.single.offset);
  417. },
  418. // Compiles a `delete` query.
  419. del: function del() {
  420. // Make sure tableName is processed by the formatter first.
  421. var tableName = this.tableName;
  422. var wheres = this.where();
  423. return this.with() + ('delete from ' + (this.single.only ? 'only ' : '') + tableName) + (wheres ? ' ' + wheres : '');
  424. },
  425. // Compiles a `truncate` query.
  426. truncate: function truncate() {
  427. return 'truncate ' + this.tableName;
  428. },
  429. // Compiles the "locks".
  430. lock: function lock() {
  431. if (this.single.lock) {
  432. return this[this.single.lock]();
  433. }
  434. },
  435. // Compile the "counter".
  436. counter: function counter() {
  437. var counter = this.single.counter;
  438. var toUpdate = {};
  439. toUpdate[counter.column] = this.client.raw(this.formatter.wrap(counter.column) + ' ' + (counter.symbol || '+') + ' ' + counter.amount);
  440. this.single.update = toUpdate;
  441. return this.update();
  442. },
  443. // On Clause
  444. // ------
  445. onWrapped: function onWrapped(clause) {
  446. var self = this;
  447. var wrapJoin = new _joinclause2.default();
  448. clause.value.call(wrapJoin, wrapJoin);
  449. var sql = '';
  450. wrapJoin.clauses.forEach(function (wrapClause, ii) {
  451. if (ii > 0) {
  452. sql += ' ' + wrapClause.bool + ' ';
  453. }
  454. var val = self[wrapClause.type](wrapClause);
  455. if (val) {
  456. sql += val;
  457. }
  458. });
  459. if (sql.length) {
  460. return '(' + sql + ')';
  461. }
  462. return '';
  463. },
  464. onBasic: function onBasic(clause) {
  465. return this.formatter.wrap(clause.column) + ' ' + this.formatter.operator(clause.operator) + ' ' + this.formatter.wrap(clause.value);
  466. },
  467. onRaw: function onRaw(clause) {
  468. return this.formatter.unwrapRaw(clause.value);
  469. },
  470. onUsing: function onUsing(clause) {
  471. return this.formatter.wrap(clause.column);
  472. },
  473. // Where Clause
  474. // ------
  475. whereIn: function whereIn(statement) {
  476. var columns = null;
  477. if (Array.isArray(statement.column)) {
  478. columns = '(' + this.formatter.columnize(statement.column) + ')';
  479. } else {
  480. columns = this.formatter.wrap(statement.column);
  481. }
  482. var values = this.formatter.values(statement.value);
  483. return columns + ' ' + this._not(statement, 'in ') + values;
  484. },
  485. whereNull: function whereNull(statement) {
  486. return this.formatter.wrap(statement.column) + ' is ' + this._not(statement, 'null');
  487. },
  488. // Compiles a basic "where" clause.
  489. whereBasic: function whereBasic(statement) {
  490. return this._not(statement, '') + this.formatter.wrap(statement.column) + ' ' + this.formatter.operator(statement.operator) + ' ' + this.formatter.parameter(statement.value);
  491. },
  492. whereExists: function whereExists(statement) {
  493. return this._not(statement, 'exists') + ' (' + this.formatter.rawOrFn(statement.value) + ')';
  494. },
  495. whereWrapped: function whereWrapped(statement) {
  496. var val = this.formatter.rawOrFn(statement.value, 'where');
  497. return val && this._not(statement, '') + '(' + val.slice(6) + ')' || '';
  498. },
  499. whereBetween: function whereBetween(statement) {
  500. return this.formatter.wrap(statement.column) + ' ' + this._not(statement, 'between') + ' ' + (0, _map3.default)(statement.value, (0, _bind3.default)(this.formatter.parameter, this.formatter)).join(' and ');
  501. },
  502. // Compiles a "whereRaw" query.
  503. whereRaw: function whereRaw(statement) {
  504. return this._not(statement, '') + this.formatter.unwrapRaw(statement.value);
  505. },
  506. wrap: function wrap(str) {
  507. if (str.charAt(0) !== '(') return '(' + str + ')';
  508. return str;
  509. },
  510. // Compiles all `with` statements on the query.
  511. with: function _with() {
  512. if (!this.grouped.with || !this.grouped.with.length) {
  513. return '';
  514. }
  515. var withs = this.grouped.with;
  516. if (!withs) return;
  517. var sql = [];
  518. var i = -1;
  519. while (++i < withs.length) {
  520. var stmt = withs[i];
  521. var val = this[stmt.type](stmt);
  522. sql.push(val);
  523. }
  524. return 'with ' + sql.join(', ') + ' ';
  525. },
  526. withWrapped: function withWrapped(statement) {
  527. var val = this.formatter.rawOrFn(statement.value);
  528. return val && this.formatter.columnize(statement.alias) + ' as (' + val + ')' || '';
  529. },
  530. // Determines whether to add a "not" prefix to the where clause.
  531. _not: function _not(statement, str) {
  532. if (statement.not) return 'not ' + str;
  533. return str;
  534. },
  535. _prepInsert: function _prepInsert(data) {
  536. var isRaw = this.formatter.rawOrFn(data);
  537. if (isRaw) return isRaw;
  538. var columns = [];
  539. var values = [];
  540. if (!Array.isArray(data)) data = data ? [data] : [];
  541. var i = -1;
  542. while (++i < data.length) {
  543. if (data[i] == null) break;
  544. if (i === 0) columns = (0, _keys2.default)(data[i]).sort();
  545. var row = new Array(columns.length);
  546. var keys = (0, _keys2.default)(data[i]);
  547. var j = -1;
  548. while (++j < keys.length) {
  549. var key = keys[j];
  550. var idx = columns.indexOf(key);
  551. if (idx === -1) {
  552. columns = columns.concat(key).sort();
  553. idx = columns.indexOf(key);
  554. var k = -1;
  555. while (++k < values.length) {
  556. values[k].splice(idx, 0, undefined);
  557. }
  558. row.splice(idx, 0, undefined);
  559. }
  560. row[idx] = data[i][key];
  561. }
  562. values.push(row);
  563. }
  564. return {
  565. columns: columns,
  566. values: values
  567. };
  568. },
  569. // "Preps" the update.
  570. _prepUpdate: function _prepUpdate(data) {
  571. data = (0, _omitBy3.default)(data, _isUndefined3.default);
  572. var vals = [];
  573. var columns = (0, _keys2.default)(data);
  574. var i = -1;
  575. while (++i < columns.length) {
  576. vals.push(this.formatter.wrap(columns[i]) + ' = ' + this.formatter.parameter(data[columns[i]]));
  577. }
  578. if ((0, _isEmpty3.default)(vals)) {
  579. throw new Error(['Empty .update() call detected!', 'Update data does not contain any values to update.', 'This will result in a faulty query.'].join(' '));
  580. }
  581. return vals;
  582. },
  583. // Compiles the `order by` statements.
  584. _groupsOrders: function _groupsOrders(type) {
  585. var items = this.grouped[type];
  586. if (!items) return '';
  587. var formatter = this.formatter;
  588. var sql = items.map(function (item) {
  589. var column = item.value instanceof _raw2.default ? formatter.unwrapRaw(item.value) : formatter.columnize(item.value);
  590. var direction = type === 'order' && item.type !== 'orderByRaw' ? ' ' + formatter.direction(item.direction) : '';
  591. return column + direction;
  592. });
  593. return sql.length ? type + ' by ' + sql.join(', ') : '';
  594. }
  595. });
  596. QueryCompiler.prototype.first = QueryCompiler.prototype.select;
  597. // Get the table name, wrapping it if necessary.
  598. // Implemented as a property to prevent ordering issues as described in #704.
  599. Object.defineProperty(QueryCompiler.prototype, 'tableName', {
  600. get: function get() {
  601. if (!this._tableName) {
  602. // Only call this.formatter.wrap() the first time this property is accessed.
  603. var tableName = this.single.table;
  604. var schemaName = this.single.schema;
  605. if (tableName && schemaName) tableName = schemaName + '.' + tableName;
  606. this._tableName = tableName ? this.formatter.wrap(tableName) : '';
  607. }
  608. return this._tableName;
  609. }
  610. });
  611. exports.default = QueryCompiler;
  612. module.exports = exports['default'];