mirror of
https://github.com/gnh1201/welsonjs.git
synced 2024-11-26 15:31:42 +00:00
3068 lines
94 KiB
JavaScript
3068 lines
94 KiB
JavaScript
;(function(root, factory) {
|
||
if (typeof define === 'function' && define.amd) {
|
||
define([], factory);
|
||
} else if (typeof exports === 'object') {
|
||
module.exports = factory();
|
||
} else {
|
||
root.squel = factory();
|
||
}
|
||
}(this, function() {
|
||
'use strict';
|
||
|
||
var _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if ("value" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } };
|
||
|
||
var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
|
||
|
||
var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };
|
||
|
||
function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
|
||
|
||
function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
|
||
|
||
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
|
||
|
||
// append to string if non-empty
|
||
function _pad(str, pad) {
|
||
return str.length ? str + pad : str;
|
||
}
|
||
|
||
// Extend given object's with other objects' properties, overriding existing ones if necessary
|
||
function _extend(dst) {
|
||
for (var _len = arguments.length, sources = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
|
||
sources[_key - 1] = arguments[_key];
|
||
}
|
||
|
||
if (dst && sources) {
|
||
var _loop = function _loop(src) {
|
||
if ((typeof src === 'undefined' ? 'undefined' : _typeof(src)) === 'object') {
|
||
Object.getOwnPropertyNames(src).forEach(function (key) {
|
||
dst[key] = src[key];
|
||
});
|
||
}
|
||
};
|
||
|
||
var _iteratorNormalCompletion = true;
|
||
var _didIteratorError = false;
|
||
var _iteratorError = undefined;
|
||
|
||
try {
|
||
for (var _iterator = sources[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {
|
||
var src = _step.value;
|
||
|
||
_loop(src);
|
||
}
|
||
} catch (err) {
|
||
_didIteratorError = true;
|
||
_iteratorError = err;
|
||
} finally {
|
||
try {
|
||
if (!_iteratorNormalCompletion && _iterator.RETURN) {
|
||
_iterator.RETURN();
|
||
}
|
||
} finally {
|
||
if (_didIteratorError) {
|
||
throw _iteratorError;
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
return dst;
|
||
};
|
||
|
||
// get whether object is a plain object
|
||
function _isPlainObject(obj) {
|
||
return obj && obj.constructor.prototype === Object.prototype;
|
||
};
|
||
|
||
// get whether object is an array
|
||
function _isArray(obj) {
|
||
return obj && obj.constructor.prototype === Array.prototype;
|
||
};
|
||
|
||
// clone given item
|
||
function _clone(src) {
|
||
if (!src) {
|
||
return src;
|
||
}
|
||
|
||
if (typeof src.clone === 'function') {
|
||
return src.clone();
|
||
} else if (_isPlainObject(src) || _isArray(src)) {
|
||
var ret = new src.constructor();
|
||
|
||
Object.getOwnPropertyNames(src).forEach(function (key) {
|
||
if (typeof src[key] !== 'function') {
|
||
ret[key] = _clone(src[key]);
|
||
}
|
||
});
|
||
|
||
return ret;
|
||
} else {
|
||
return JSON.parse(JSON.stringify(src));
|
||
}
|
||
};
|
||
|
||
/**
|
||
* Register a value type handler
|
||
*
|
||
* Note: this will override any existing handler registered for this value type.
|
||
*/
|
||
function _registerValueHandler(handlers, type, handler) {
|
||
var typeofType = typeof type === 'undefined' ? 'undefined' : _typeof(type);
|
||
|
||
if (typeofType !== 'function' && typeofType !== 'string') {
|
||
throw new Error("type must be a class constructor or string");
|
||
}
|
||
|
||
if (typeof handler !== 'function') {
|
||
throw new Error("handler must be a function");
|
||
}
|
||
|
||
var _iteratorNormalCompletion2 = true;
|
||
var _didIteratorError2 = false;
|
||
var _iteratorError2 = undefined;
|
||
|
||
try {
|
||
for (var _iterator2 = handlers[Symbol.iterator](), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true) {
|
||
var typeHandler = _step2.value;
|
||
|
||
if (typeHandler.type === type) {
|
||
typeHandler.handler = handler;
|
||
|
||
return;
|
||
}
|
||
}
|
||
} catch (err) {
|
||
_didIteratorError2 = true;
|
||
_iteratorError2 = err;
|
||
} finally {
|
||
try {
|
||
if (!_iteratorNormalCompletion2 && _iterator2.RETURN) {
|
||
_iterator2.RETURN();
|
||
}
|
||
} finally {
|
||
if (_didIteratorError2) {
|
||
throw _iteratorError2;
|
||
}
|
||
}
|
||
}
|
||
|
||
handlers.push({
|
||
type: type,
|
||
handler: handler
|
||
});
|
||
};
|
||
|
||
/**
|
||
* Get value type handler for given type
|
||
*/
|
||
function getValueHandler(value, localHandlers, globalHandlers) {
|
||
return _getValueHandler(value, localHandlers) || _getValueHandler(value, globalHandlers);
|
||
};
|
||
|
||
function _getValueHandler(value, handlers) {
|
||
for (var i = 0; i < handlers.length; i++) {
|
||
var typeHandler = handlers[i];
|
||
// if type is a string then use `typeof` or else use `instanceof`
|
||
if ((typeof value === 'undefined' ? 'undefined' : _typeof(value)) === typeHandler.type || typeof typeHandler.type !== 'string' && value instanceof typeHandler.type) {
|
||
return typeHandler.handler;
|
||
}
|
||
}
|
||
};
|
||
|
||
/**
|
||
* Build base squel classes and methods
|
||
*/
|
||
function _buildSquel() {
|
||
var flavour = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;
|
||
|
||
var cls = {
|
||
// Get whether obj is a query builder
|
||
isSquelBuilder: function isSquelBuilder(obj) {
|
||
return obj && !!obj._toParamString;
|
||
}
|
||
};
|
||
|
||
// Get whether nesting should be applied for given item
|
||
var _shouldApplyNesting = function _shouldApplyNesting(obj) {
|
||
return !cls.isSquelBuilder(obj) || !obj.options.rawNesting;
|
||
};
|
||
|
||
// default query builder options
|
||
cls.DefaultQueryBuilderOptions = {
|
||
// If true then table names will be rendered inside quotes. The quote character used is configurable via the nameQuoteCharacter option.
|
||
autoQuoteTableNames: false,
|
||
// If true then field names will rendered inside quotes. The quote character used is configurable via the nameQuoteCharacter option.
|
||
autoQuoteFieldNames: false,
|
||
// If true then alias names will rendered inside quotes. The quote character used is configurable via the `tableAliasQuoteCharacter` and `fieldAliasQuoteCharacter` options.
|
||
autoQuoteAliasNames: true,
|
||
// If true then table alias names will rendered after AS keyword.
|
||
useAsForTableAliasNames: false,
|
||
// The quote character used for when quoting table and field names
|
||
nameQuoteCharacter: '`',
|
||
// The quote character used for when quoting table alias names
|
||
tableAliasQuoteCharacter: '`',
|
||
// The quote character used for when quoting table alias names
|
||
fieldAliasQuoteCharacter: '"',
|
||
// Custom value handlers where key is the value type and the value is the handler function
|
||
valueHandlers: [],
|
||
// Character used to represent a parameter value
|
||
parameterCharacter: '?',
|
||
// Numbered parameters returned from toParam() as $1, $2, etc.
|
||
numberedParameters: false,
|
||
// Numbered parameters prefix character(s)
|
||
numberedParametersPrefix: '$',
|
||
// Numbered parameters start at this number.
|
||
numberedParametersStartAt: 1,
|
||
// If true then replaces all single quotes within strings. The replacement string used is configurable via the `singleQuoteReplacement` option.
|
||
replaceSingleQuotes: false,
|
||
// The string to replace single quotes with in query strings
|
||
singleQuoteReplacement: '\'\'',
|
||
// String used to join individual blocks in a query when it's stringified
|
||
separator: ' ',
|
||
// Function for formatting string values prior to insertion into query string
|
||
stringFormatter: null,
|
||
// Whether to prevent the addition of brackets () when nesting this query builder's output
|
||
rawNesting: false
|
||
};
|
||
|
||
// Global custom value handlers for all instances of builder
|
||
cls.globalValueHandlers = [];
|
||
|
||
/*
|
||
# ---------------------------------------------------------------------------------------------------------
|
||
# ---------------------------------------------------------------------------------------------------------
|
||
# Custom value types
|
||
# ---------------------------------------------------------------------------------------------------------
|
||
# ---------------------------------------------------------------------------------------------------------
|
||
*/
|
||
|
||
// Register a new value handler
|
||
cls.registerValueHandler = function (type, handler) {
|
||
_registerValueHandler(cls.globalValueHandlers, type, handler);
|
||
};
|
||
|
||
/*
|
||
# ---------------------------------------------------------------------------------------------------------
|
||
# ---------------------------------------------------------------------------------------------------------
|
||
# Base classes
|
||
# ---------------------------------------------------------------------------------------------------------
|
||
# ---------------------------------------------------------------------------------------------------------
|
||
*/
|
||
|
||
// Base class for cloneable builders
|
||
cls.Cloneable = function () {
|
||
function _class() {
|
||
_classCallCheck(this, _class);
|
||
}
|
||
|
||
_createClass(_class, [{
|
||
key: 'clone',
|
||
|
||
/**
|
||
* Clone this builder
|
||
*/
|
||
value: function clone() {
|
||
var newInstance = new this.constructor();
|
||
|
||
return _extend(newInstance, _clone(_extend({}, this)));
|
||
}
|
||
}]);
|
||
|
||
return _class;
|
||
}();
|
||
|
||
// Base class for all builders
|
||
cls.BaseBuilder = function (_cls$Cloneable) {
|
||
_inherits(_class2, _cls$Cloneable);
|
||
|
||
/**
|
||
* Constructor.
|
||
* this.param {Object} options Overriding one or more of `cls.DefaultQueryBuilderOptions`.
|
||
*/
|
||
function _class2(options) {
|
||
_classCallCheck(this, _class2);
|
||
|
||
var _this = _possibleConstructorReturn(this, (_class2.__proto__ || Object.getPrototypeOf(_class2)).call(this));
|
||
|
||
var defaults = JSON.parse(JSON.stringify(cls.DefaultQueryBuilderOptions));
|
||
// for function values, etc we need to manually copy
|
||
['stringFormatter'].forEach(function (p) {
|
||
defaults[p] = cls.DefaultQueryBuilderOptions[p];
|
||
});
|
||
|
||
_this.options = _extend({}, defaults, options);
|
||
return _this;
|
||
}
|
||
|
||
/**
|
||
* Register a custom value handler for this builder instance.
|
||
*
|
||
* Note: this will override any globally registered handler for this value type.
|
||
*/
|
||
|
||
|
||
_createClass(_class2, [{
|
||
key: 'registerValueHandler',
|
||
value: function registerValueHandler(type, handler) {
|
||
_registerValueHandler(this.options.valueHandlers, type, handler);
|
||
return this;
|
||
}
|
||
|
||
/**
|
||
* Sanitize given expression.
|
||
*/
|
||
|
||
}, {
|
||
key: '_sanitizeExpression',
|
||
value: function _sanitizeExpression(expr) {
|
||
// If it's not a base builder instance
|
||
if (!cls.isSquelBuilder(expr)) {
|
||
// It must then be a string
|
||
if (typeof expr !== "string") {
|
||
throw new Error("expression must be a string or builder instance");
|
||
}
|
||
}
|
||
|
||
return expr;
|
||
}
|
||
|
||
/**
|
||
* Sanitize the given name.
|
||
*
|
||
* The 'type' parameter is used to construct a meaningful error message in case validation fails.
|
||
*/
|
||
|
||
}, {
|
||
key: '_sanitizeName',
|
||
value: function _sanitizeName(value, type) {
|
||
if (typeof value !== "string") {
|
||
throw new Error(type + ' must be a string');
|
||
}
|
||
|
||
return value;
|
||
}
|
||
}, {
|
||
key: '_sanitizeField',
|
||
value: function _sanitizeField(item) {
|
||
if (!cls.isSquelBuilder(item)) {
|
||
item = this._sanitizeName(item, "field name");
|
||
}
|
||
|
||
return item;
|
||
}
|
||
}, {
|
||
key: '_sanitizeBaseBuilder',
|
||
value: function _sanitizeBaseBuilder(item) {
|
||
if (cls.isSquelBuilder(item)) {
|
||
return item;
|
||
}
|
||
|
||
throw new Error("must be a builder instance");
|
||
}
|
||
}, {
|
||
key: '_sanitizeTable',
|
||
value: function _sanitizeTable(item) {
|
||
if (typeof item !== "string") {
|
||
try {
|
||
item = this._sanitizeBaseBuilder(item);
|
||
} catch (e) {
|
||
throw new Error("table name must be a string or a builder");
|
||
}
|
||
} else {
|
||
item = this._sanitizeName(item, 'table');
|
||
}
|
||
|
||
return item;
|
||
}
|
||
}, {
|
||
key: '_sanitizeTableAlias',
|
||
value: function _sanitizeTableAlias(item) {
|
||
return this._sanitizeName(item, "table alias");
|
||
}
|
||
}, {
|
||
key: '_sanitizeFieldAlias',
|
||
value: function _sanitizeFieldAlias(item) {
|
||
return this._sanitizeName(item, "field alias");
|
||
}
|
||
|
||
// Sanitize the given limit/offset value.
|
||
|
||
}, {
|
||
key: '_sanitizeLimitOffset',
|
||
value: function _sanitizeLimitOffset(value) {
|
||
value = parseInt(value);
|
||
|
||
if (0 > value || isNaN(value)) {
|
||
throw new Error("limit/offset must be >= 0");
|
||
}
|
||
|
||
return value;
|
||
}
|
||
|
||
// Santize the given field value
|
||
|
||
}, {
|
||
key: '_sanitizeValue',
|
||
value: function _sanitizeValue(item) {
|
||
var itemType = typeof item === 'undefined' ? 'undefined' : _typeof(item);
|
||
|
||
if (null === item) {
|
||
// null is allowed
|
||
} else if ("string" === itemType || "number" === itemType || "boolean" === itemType) {
|
||
// primitives are allowed
|
||
} else if (cls.isSquelBuilder(item)) {
|
||
// Builders allowed
|
||
} else {
|
||
var typeIsValid = !!getValueHandler(item, this.options.valueHandlers, cls.globalValueHandlers);
|
||
|
||
if (!typeIsValid) {
|
||
throw new Error("field value must be a string, number, boolean, null or one of the registered custom value types");
|
||
}
|
||
}
|
||
|
||
return item;
|
||
}
|
||
|
||
// Escape a string value, e.g. escape quotes and other characters within it.
|
||
|
||
}, {
|
||
key: '_escapeValue',
|
||
value: function _escapeValue(value) {
|
||
return this.options.replaceSingleQuotes && value ? value.replace(/\'/g, this.options.singleQuoteReplacement) : value;
|
||
}
|
||
}, {
|
||
key: '_formatTableName',
|
||
value: function _formatTableName(item) {
|
||
if (this.options.autoQuoteTableNames) {
|
||
var quoteChar = this.options.nameQuoteCharacter;
|
||
|
||
item = '' + quoteChar + item + quoteChar;
|
||
}
|
||
|
||
return item;
|
||
}
|
||
}, {
|
||
key: '_formatFieldAlias',
|
||
value: function _formatFieldAlias(item) {
|
||
if (this.options.autoQuoteAliasNames) {
|
||
var quoteChar = this.options.fieldAliasQuoteCharacter;
|
||
|
||
item = '' + quoteChar + item + quoteChar;
|
||
}
|
||
|
||
return item;
|
||
}
|
||
}, {
|
||
key: '_formatTableAlias',
|
||
value: function _formatTableAlias(item) {
|
||
if (this.options.autoQuoteAliasNames) {
|
||
var quoteChar = this.options.tableAliasQuoteCharacter;
|
||
|
||
item = '' + quoteChar + item + quoteChar;
|
||
}
|
||
|
||
return this.options.useAsForTableAliasNames ? 'AS ' + item : item;
|
||
}
|
||
}, {
|
||
key: '_formatFieldName',
|
||
value: function _formatFieldName(item) {
|
||
var formattingOptions = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
|
||
|
||
if (this.options.autoQuoteFieldNames) {
|
||
var quoteChar = this.options.nameQuoteCharacter;
|
||
|
||
if (formattingOptions.ignorePeriodsForFieldNameQuotes) {
|
||
// a.b.c -> `a.b.c`
|
||
item = '' + quoteChar + item + quoteChar;
|
||
} else {
|
||
// a.b.c -> `a`.`b`.`c`
|
||
item = item.split('.').map(function (v) {
|
||
// treat '*' as special case (#79)
|
||
return '*' === v ? v : '' + quoteChar + v + quoteChar;
|
||
}).join('.');
|
||
}
|
||
}
|
||
|
||
return item;
|
||
}
|
||
|
||
// Format the given custom value
|
||
|
||
}, {
|
||
key: '_formatCustomValue',
|
||
value: function _formatCustomValue(value, asParam, formattingOptions) {
|
||
// user defined custom handlers takes precedence
|
||
var customHandler = getValueHandler(value, this.options.valueHandlers, cls.globalValueHandlers);
|
||
|
||
// use the custom handler if available
|
||
if (customHandler) {
|
||
value = customHandler(value, asParam, formattingOptions);
|
||
|
||
// custom value handler can instruct caller not to process returned value
|
||
if (value && value.rawNesting) {
|
||
return {
|
||
formatted: true,
|
||
rawNesting: true,
|
||
value: value.value
|
||
};
|
||
}
|
||
}
|
||
|
||
return {
|
||
formatted: !!customHandler,
|
||
value: value
|
||
|
||
};
|
||
}
|
||
|
||
/**
|
||
* Format given value for inclusion into parameter values array.
|
||
*/
|
||
|
||
}, {
|
||
key: '_formatValueForParamArray',
|
||
value: function _formatValueForParamArray(value) {
|
||
var _this2 = this;
|
||
|
||
var formattingOptions = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
|
||
|
||
if (_isArray(value)) {
|
||
return value.map(function (v) {
|
||
return _this2._formatValueForParamArray(v, formattingOptions);
|
||
});
|
||
} else {
|
||
return this._formatCustomValue(value, true, formattingOptions).value;
|
||
}
|
||
}
|
||
|
||
/**
|
||
* Format the given field value for inclusion into the query string
|
||
*/
|
||
|
||
}, {
|
||
key: '_formatValueForQueryString',
|
||
value: function _formatValueForQueryString(initialValue) {
|
||
var _this3 = this;
|
||
|
||
var formattingOptions = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
|
||
|
||
// maybe we have a cusotm value handler
|
||
var _formatCustomValue2 = this._formatCustomValue(initialValue, false, formattingOptions),
|
||
rawNesting = _formatCustomValue2.rawNesting,
|
||
formatted = _formatCustomValue2.formatted,
|
||
value = _formatCustomValue2.value;
|
||
|
||
// if formatting took place then return it directly
|
||
|
||
|
||
if (formatted) {
|
||
if (rawNesting) {
|
||
return value;
|
||
} else {
|
||
return this._applyNestingFormatting(value, _shouldApplyNesting(initialValue));
|
||
}
|
||
}
|
||
|
||
// if it's an array then format each element separately
|
||
if (_isArray(value)) {
|
||
value = value.map(function (v) {
|
||
return _this3._formatValueForQueryString(v);
|
||
});
|
||
|
||
value = this._applyNestingFormatting(value.join(', '), _shouldApplyNesting(value));
|
||
} else {
|
||
var typeofValue = typeof value === 'undefined' ? 'undefined' : _typeof(value);
|
||
|
||
if (null === value) {
|
||
value = "NULL";
|
||
} else if (typeofValue === "boolean") {
|
||
value = value ? "TRUE" : "FALSE";
|
||
} else if (cls.isSquelBuilder(value)) {
|
||
value = this._applyNestingFormatting(value.toString(), _shouldApplyNesting(value));
|
||
} else if (typeofValue !== "number") {
|
||
// if it's a string and we have custom string formatting turned on then use that
|
||
if ('string' === typeofValue && this.options.stringFormatter) {
|
||
return this.options.stringFormatter(value);
|
||
}
|
||
|
||
if (formattingOptions.dontQuote) {
|
||
value = '' + value;
|
||
} else {
|
||
var escapedValue = this._escapeValue(value);
|
||
|
||
value = '\'' + escapedValue + '\'';
|
||
}
|
||
}
|
||
}
|
||
|
||
return value;
|
||
}
|
||
}, {
|
||
key: '_applyNestingFormatting',
|
||
value: function _applyNestingFormatting(str) {
|
||
var nesting = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
|
||
|
||
if (str && typeof str === 'string' && nesting && !this.options.rawNesting) {
|
||
// apply brackets if they're not already existing
|
||
var alreadyHasBrackets = '(' === str.charAt(0) && ')' === str.charAt(str.length - 1);
|
||
|
||
if (alreadyHasBrackets) {
|
||
// check that it's the form "((x)..(y))" rather than "(x)..(y)"
|
||
var idx = 0,
|
||
open = 1;
|
||
|
||
while (str.length - 1 > ++idx) {
|
||
var c = str.charAt(idx);
|
||
|
||
if ('(' === c) {
|
||
open++;
|
||
} else if (')' === c) {
|
||
open--;
|
||
if (1 > open) {
|
||
alreadyHasBrackets = false;
|
||
|
||
break;
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
if (!alreadyHasBrackets) {
|
||
str = '(' + str + ')';
|
||
}
|
||
}
|
||
|
||
return str;
|
||
}
|
||
|
||
/**
|
||
* Build given string and its corresponding parameter values into
|
||
* output.
|
||
*
|
||
* @param {String} str
|
||
* @param {Array} values
|
||
* @param {Object} [options] Additional options.
|
||
* @param {Boolean} [options.buildParameterized] Whether to build paramterized string. Default is false.
|
||
* @param {Boolean} [options.nested] Whether this expression is nested within another.
|
||
* @param {Boolean} [options.formattingOptions] Formatting options for values in query string.
|
||
* @return {Object}
|
||
*/
|
||
|
||
}, {
|
||
key: '_buildString',
|
||
value: function _buildString(str, values) {
|
||
var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
|
||
var nested = options.nested,
|
||
buildParameterized = options.buildParameterized,
|
||
formattingOptions = options.formattingOptions;
|
||
|
||
|
||
values = values || [];
|
||
str = str || '';
|
||
|
||
var formattedStr = '',
|
||
curValue = -1,
|
||
formattedValues = [];
|
||
|
||
var paramChar = this.options.parameterCharacter;
|
||
|
||
var idx = 0;
|
||
|
||
while (str.length > idx) {
|
||
// param char?
|
||
if (str.substr(idx, paramChar.length) === paramChar) {
|
||
var value = values[++curValue];
|
||
|
||
if (buildParameterized) {
|
||
if (cls.isSquelBuilder(value)) {
|
||
var ret = value._toParamString({
|
||
buildParameterized: buildParameterized,
|
||
nested: true
|
||
});
|
||
|
||
formattedStr += ret.text;
|
||
ret.values.forEach(function (value) {
|
||
return formattedValues.push(value);
|
||
});
|
||
} else {
|
||
value = this._formatValueForParamArray(value, formattingOptions);
|
||
|
||
if (_isArray(value)) {
|
||
// Array(6) -> "(??, ??, ??, ??, ??, ??)"
|
||
var tmpStr = value.map(function () {
|
||
return paramChar;
|
||
}).join(', ');
|
||
|
||
formattedStr += '(' + tmpStr + ')';
|
||
|
||
value.forEach(function (val) {
|
||
return formattedValues.push(val);
|
||
});
|
||
} else {
|
||
formattedStr += paramChar;
|
||
|
||
formattedValues.push(value);
|
||
}
|
||
}
|
||
} else {
|
||
formattedStr += this._formatValueForQueryString(value, formattingOptions);
|
||
}
|
||
|
||
idx += paramChar.length;
|
||
} else {
|
||
formattedStr += str.charAt(idx);
|
||
|
||
idx++;
|
||
}
|
||
}
|
||
|
||
return {
|
||
text: this._applyNestingFormatting(formattedStr, !!nested),
|
||
values: formattedValues
|
||
};
|
||
}
|
||
|
||
/**
|
||
* Build all given strings and their corresponding parameter values into
|
||
* output.
|
||
*
|
||
* @param {Array} strings
|
||
* @param {Array} strValues array of value arrays corresponding to each string.
|
||
* @param {Object} [options] Additional options.
|
||
* @param {Boolean} [options.buildParameterized] Whether to build paramterized string. Default is false.
|
||
* @param {Boolean} [options.nested] Whether this expression is nested within another.
|
||
* @return {Object}
|
||
*/
|
||
|
||
}, {
|
||
key: '_buildManyStrings',
|
||
value: function _buildManyStrings(strings, strValues) {
|
||
var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
|
||
|
||
var totalStr = [],
|
||
totalValues = [];
|
||
|
||
for (var idx = 0; strings.length > idx; ++idx) {
|
||
var inputString = strings[idx],
|
||
inputValues = strValues[idx];
|
||
|
||
var _buildString2 = this._buildString(inputString, inputValues, {
|
||
buildParameterized: options.buildParameterized,
|
||
nested: false
|
||
}),
|
||
text = _buildString2.text,
|
||
values = _buildString2.values;
|
||
|
||
totalStr.push(text);
|
||
values.forEach(function (value) {
|
||
return totalValues.push(value);
|
||
});
|
||
}
|
||
|
||
totalStr = totalStr.join(this.options.separator);
|
||
|
||
return {
|
||
text: totalStr.length ? this._applyNestingFormatting(totalStr, !!options.nested) : '',
|
||
values: totalValues
|
||
};
|
||
}
|
||
|
||
/**
|
||
* Get parameterized representation of this instance.
|
||
*
|
||
* @param {Object} [options] Options.
|
||
* @param {Boolean} [options.buildParameterized] Whether to build paramterized string. Default is false.
|
||
* @param {Boolean} [options.nested] Whether this expression is nested within another.
|
||
* @return {Object}
|
||
*/
|
||
|
||
}, {
|
||
key: '_toParamString',
|
||
value: function _toParamString(options) {
|
||
throw new Error('Not yet implemented');
|
||
}
|
||
|
||
/**
|
||
* Get the expression string.
|
||
* @return {String}
|
||
*/
|
||
|
||
}, {
|
||
key: 'toString',
|
||
value: function toString() {
|
||
var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
|
||
|
||
return this._toParamString(options).text;
|
||
}
|
||
|
||
/**
|
||
* Get the parameterized expression string.
|
||
* @return {Object}
|
||
*/
|
||
|
||
}, {
|
||
key: 'toParam',
|
||
value: function toParam() {
|
||
var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
|
||
|
||
return this._toParamString(_extend({}, options, {
|
||
buildParameterized: true
|
||
}));
|
||
}
|
||
}]);
|
||
|
||
return _class2;
|
||
}(cls.Cloneable);
|
||
|
||
/*
|
||
# ---------------------------------------------------------------------------------------------------------
|
||
# ---------------------------------------------------------------------------------------------------------
|
||
# cls.Expressions
|
||
# ---------------------------------------------------------------------------------------------------------
|
||
# ---------------------------------------------------------------------------------------------------------
|
||
*/
|
||
|
||
/**
|
||
* An SQL expression builder.
|
||
*
|
||
* SQL expressions are used in WHERE and ON clauses to filter data by various criteria.
|
||
*
|
||
* Expressions can be nested. Nested expression contains can themselves
|
||
* contain nested expressions. When rendered a nested expression will be
|
||
* fully contained within brackets.
|
||
*
|
||
* All the build methods in this object return the object instance for chained method calling purposes.
|
||
*/
|
||
cls.Expression = function (_cls$BaseBuilder) {
|
||
_inherits(_class3, _cls$BaseBuilder);
|
||
|
||
// Initialise the expression.
|
||
function _class3(options) {
|
||
_classCallCheck(this, _class3);
|
||
|
||
var _this4 = _possibleConstructorReturn(this, (_class3.__proto__ || Object.getPrototypeOf(_class3)).call(this, options));
|
||
|
||
_this4._nodes = [];
|
||
return _this4;
|
||
}
|
||
|
||
// Combine the current expression with the given expression using the intersection operator (AND).
|
||
|
||
|
||
_createClass(_class3, [{
|
||
key: 'and',
|
||
value: function and(expr) {
|
||
for (var _len2 = arguments.length, params = Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) {
|
||
params[_key2 - 1] = arguments[_key2];
|
||
}
|
||
|
||
expr = this._sanitizeExpression(expr);
|
||
|
||
this._nodes.push({
|
||
type: 'AND',
|
||
expr: expr,
|
||
para: params
|
||
});
|
||
|
||
return this;
|
||
}
|
||
|
||
// Combine the current expression with the given expression using the union operator (OR).
|
||
|
||
}, {
|
||
key: 'or',
|
||
value: function or(expr) {
|
||
for (var _len3 = arguments.length, params = Array(_len3 > 1 ? _len3 - 1 : 0), _key3 = 1; _key3 < _len3; _key3++) {
|
||
params[_key3 - 1] = arguments[_key3];
|
||
}
|
||
|
||
expr = this._sanitizeExpression(expr);
|
||
|
||
this._nodes.push({
|
||
type: 'OR',
|
||
expr: expr,
|
||
para: params
|
||
});
|
||
|
||
return this;
|
||
}
|
||
}, {
|
||
key: '_toParamString',
|
||
value: function _toParamString() {
|
||
var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
|
||
|
||
var totalStr = [],
|
||
totalValues = [];
|
||
|
||
var _iteratorNormalCompletion3 = true;
|
||
var _didIteratorError3 = false;
|
||
var _iteratorError3 = undefined;
|
||
|
||
try {
|
||
for (var _iterator3 = this._nodes[Symbol.iterator](), _step3; !(_iteratorNormalCompletion3 = (_step3 = _iterator3.next()).done); _iteratorNormalCompletion3 = true) {
|
||
var node = _step3.value;
|
||
var type = node.type,
|
||
expr = node.expr,
|
||
para = node.para;
|
||
|
||
var _ref = cls.isSquelBuilder(expr) ? expr._toParamString({
|
||
buildParameterized: options.buildParameterized,
|
||
nested: true
|
||
}) : this._buildString(expr, para, {
|
||
buildParameterized: options.buildParameterized
|
||
}),
|
||
text = _ref.text,
|
||
values = _ref.values;
|
||
|
||
if (totalStr.length) {
|
||
totalStr.push(type);
|
||
}
|
||
|
||
totalStr.push(text);
|
||
values.forEach(function (value) {
|
||
return totalValues.push(value);
|
||
});
|
||
}
|
||
} catch (err) {
|
||
_didIteratorError3 = true;
|
||
_iteratorError3 = err;
|
||
} finally {
|
||
try {
|
||
if (!_iteratorNormalCompletion3 && _iterator3.RETURN) {
|
||
_iterator3.RETURN();
|
||
}
|
||
} finally {
|
||
if (_didIteratorError3) {
|
||
throw _iteratorError3;
|
||
}
|
||
}
|
||
}
|
||
|
||
totalStr = totalStr.join(' ');
|
||
|
||
return {
|
||
text: this._applyNestingFormatting(totalStr, !!options.nested),
|
||
values: totalValues
|
||
};
|
||
}
|
||
}]);
|
||
|
||
return _class3;
|
||
}(cls.BaseBuilder);
|
||
|
||
/*
|
||
# ---------------------------------------------------------------------------------------------------------
|
||
# ---------------------------------------------------------------------------------------------------------
|
||
# cls.Case
|
||
# ---------------------------------------------------------------------------------------------------------
|
||
# ---------------------------------------------------------------------------------------------------------
|
||
*/
|
||
|
||
/**
|
||
* An SQL CASE expression builder.
|
||
*
|
||
* SQL cases are used to select proper values based on specific criteria.
|
||
*/
|
||
cls.Case = function (_cls$BaseBuilder2) {
|
||
_inherits(_class4, _cls$BaseBuilder2);
|
||
|
||
function _class4(fieldName) {
|
||
var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
|
||
|
||
_classCallCheck(this, _class4);
|
||
|
||
var _this5 = _possibleConstructorReturn(this, (_class4.__proto__ || Object.getPrototypeOf(_class4)).call(this, options));
|
||
|
||
if (_isPlainObject(fieldName)) {
|
||
options = fieldName;
|
||
|
||
fieldName = null;
|
||
}
|
||
|
||
if (fieldName) {
|
||
_this5._fieldName = _this5._sanitizeField(fieldName);
|
||
}
|
||
|
||
_this5.options = _extend({}, cls.DefaultQueryBuilderOptions, options);
|
||
|
||
_this5._cases = [];
|
||
_this5._elseValue = null;
|
||
return _this5;
|
||
}
|
||
|
||
_createClass(_class4, [{
|
||
key: 'when',
|
||
value: function when(expression) {
|
||
for (var _len4 = arguments.length, values = Array(_len4 > 1 ? _len4 - 1 : 0), _key4 = 1; _key4 < _len4; _key4++) {
|
||
values[_key4 - 1] = arguments[_key4];
|
||
}
|
||
|
||
this._cases.unshift({
|
||
expression: expression,
|
||
values: values || []
|
||
});
|
||
|
||
return this;
|
||
}
|
||
}, {
|
||
key: 'then',
|
||
value: function then(result) {
|
||
if (this._cases.length == 0) {
|
||
throw new Error("when() needs to be called first");
|
||
}
|
||
|
||
this._cases[0].result = result;
|
||
|
||
return this;
|
||
}
|
||
}, {
|
||
key: 'else',
|
||
value: function _else(elseValue) {
|
||
this._elseValue = elseValue;
|
||
|
||
return this;
|
||
}
|
||
}, {
|
||
key: '_toParamString',
|
||
value: function _toParamString() {
|
||
var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
|
||
|
||
var totalStr = '',
|
||
totalValues = [];
|
||
|
||
var _iteratorNormalCompletion4 = true;
|
||
var _didIteratorError4 = false;
|
||
var _iteratorError4 = undefined;
|
||
|
||
try {
|
||
for (var _iterator4 = this._cases[Symbol.iterator](), _step4; !(_iteratorNormalCompletion4 = (_step4 = _iterator4.next()).done); _iteratorNormalCompletion4 = true) {
|
||
var _ref2 = _step4.value;
|
||
var expression = _ref2.expression;
|
||
var _values = _ref2.values;
|
||
var result = _ref2.result;
|
||
|
||
totalStr = _pad(totalStr, ' ');
|
||
|
||
var ret = this._buildString(expression, _values, {
|
||
buildParameterized: options.buildParameterized,
|
||
nested: true
|
||
});
|
||
|
||
totalStr += 'WHEN ' + ret.text + ' THEN ' + this._formatValueForQueryString(result);
|
||
ret.values.forEach(function (value) {
|
||
return totalValues.push(value);
|
||
});
|
||
}
|
||
} catch (err) {
|
||
_didIteratorError4 = true;
|
||
_iteratorError4 = err;
|
||
} finally {
|
||
try {
|
||
if (!_iteratorNormalCompletion4 && _iterator4.RETURN) {
|
||
_iterator4.RETURN();
|
||
}
|
||
} finally {
|
||
if (_didIteratorError4) {
|
||
throw _iteratorError4;
|
||
}
|
||
}
|
||
}
|
||
|
||
if (totalStr.length) {
|
||
totalStr += ' ELSE ' + this._formatValueForQueryString(this._elseValue) + ' END';
|
||
|
||
if (this._fieldName) {
|
||
totalStr = this._fieldName + ' ' + totalStr;
|
||
}
|
||
|
||
totalStr = 'CASE ' + totalStr;
|
||
} else {
|
||
totalStr = this._formatValueForQueryString(this._elseValue);
|
||
}
|
||
|
||
return {
|
||
text: totalStr,
|
||
values: totalValues
|
||
};
|
||
}
|
||
}]);
|
||
|
||
return _class4;
|
||
}(cls.BaseBuilder);
|
||
|
||
/*
|
||
# ---------------------------------------------------------------------------------------------------------
|
||
# ---------------------------------------------------------------------------------------------------------
|
||
# Building blocks
|
||
# ---------------------------------------------------------------------------------------------------------
|
||
# ---------------------------------------------------------------------------------------------------------
|
||
*/
|
||
|
||
/*
|
||
# A building block represents a single build-step within a query building process.
|
||
#
|
||
# Query builders consist of one or more building blocks which get run in a particular order. Building blocks can
|
||
# optionally specify methods to expose through the query builder interface. They can access all the input data for
|
||
# the query builder and manipulate it as necessary, as well as append to the final query string output.
|
||
#
|
||
# If you wish to customize how queries get built or add proprietary query phrases and content then it is recommended
|
||
# that you do so using one or more custom building blocks.
|
||
#
|
||
# Original idea posted in https://github.com/hiddentao/export/issues/10#issuecomment-15016427
|
||
*/
|
||
cls.Block = function (_cls$BaseBuilder3) {
|
||
_inherits(_class5, _cls$BaseBuilder3);
|
||
|
||
function _class5(options) {
|
||
_classCallCheck(this, _class5);
|
||
|
||
return _possibleConstructorReturn(this, (_class5.__proto__ || Object.getPrototypeOf(_class5)).call(this, options));
|
||
}
|
||
|
||
/**
|
||
# Get input methods to expose within the query builder.
|
||
#
|
||
# By default all methods except the following get returned:
|
||
# methods prefixed with _
|
||
# constructor and toString()
|
||
#
|
||
# @return Object key -> function pairs
|
||
*/
|
||
|
||
|
||
_createClass(_class5, [{
|
||
key: 'exposedMethods',
|
||
value: function exposedMethods() {
|
||
var ret = {};
|
||
|
||
var obj = this;
|
||
|
||
while (obj) {
|
||
Object.getOwnPropertyNames(obj).forEach(function (prop) {
|
||
if ('constructor' !== prop && typeof obj[prop] === "function" && prop.charAt(0) !== '_' && !cls.Block.prototype[prop]) {
|
||
ret[prop] = obj[prop];
|
||
}
|
||
});
|
||
|
||
obj = Object.getPrototypeOf(obj);
|
||
};
|
||
|
||
return ret;
|
||
}
|
||
}]);
|
||
|
||
return _class5;
|
||
}(cls.BaseBuilder);
|
||
|
||
// A fixed string which always gets output
|
||
cls.StringBlock = function (_cls$Block) {
|
||
_inherits(_class6, _cls$Block);
|
||
|
||
function _class6(options, str) {
|
||
_classCallCheck(this, _class6);
|
||
|
||
var _this7 = _possibleConstructorReturn(this, (_class6.__proto__ || Object.getPrototypeOf(_class6)).call(this, options));
|
||
|
||
_this7._str = str;
|
||
return _this7;
|
||
}
|
||
|
||
_createClass(_class6, [{
|
||
key: '_toParamString',
|
||
value: function _toParamString() {
|
||
var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
|
||
|
||
return {
|
||
text: this._str,
|
||
values: []
|
||
};
|
||
}
|
||
}]);
|
||
|
||
return _class6;
|
||
}(cls.Block);
|
||
|
||
// A function string block
|
||
cls.FunctionBlock = function (_cls$Block2) {
|
||
_inherits(_class7, _cls$Block2);
|
||
|
||
function _class7(options) {
|
||
_classCallCheck(this, _class7);
|
||
|
||
var _this8 = _possibleConstructorReturn(this, (_class7.__proto__ || Object.getPrototypeOf(_class7)).call(this, options));
|
||
|
||
_this8._strings = [];
|
||
_this8._values = [];
|
||
return _this8;
|
||
}
|
||
|
||
_createClass(_class7, [{
|
||
key: 'function',
|
||
value: function _function(str) {
|
||
this._strings.push(str);
|
||
|
||
for (var _len5 = arguments.length, values = Array(_len5 > 1 ? _len5 - 1 : 0), _key5 = 1; _key5 < _len5; _key5++) {
|
||
values[_key5 - 1] = arguments[_key5];
|
||
}
|
||
|
||
this._values.push(values);
|
||
}
|
||
}, {
|
||
key: '_toParamString',
|
||
value: function _toParamString() {
|
||
var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
|
||
|
||
return this._buildManyStrings(this._strings, this._values, options);
|
||
}
|
||
}]);
|
||
|
||
return _class7;
|
||
}(cls.Block);
|
||
|
||
// value handler for FunctionValueBlock objects
|
||
cls.registerValueHandler(cls.FunctionBlock, function (value) {
|
||
var asParam = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
|
||
|
||
return asParam ? value.toParam() : value.toString();
|
||
});
|
||
|
||
/*
|
||
# Table specifier base class
|
||
*/
|
||
cls.AbstractTableBlock = function (_cls$Block3) {
|
||
_inherits(_class8, _cls$Block3);
|
||
|
||
/**
|
||
* @param {Boolean} [options.singleTable] If true then only allow one table spec.
|
||
* @param {String} [options.prefix] String prefix for output.
|
||
*/
|
||
function _class8(options, prefix) {
|
||
_classCallCheck(this, _class8);
|
||
|
||
var _this9 = _possibleConstructorReturn(this, (_class8.__proto__ || Object.getPrototypeOf(_class8)).call(this, options));
|
||
|
||
_this9._tables = [];
|
||
return _this9;
|
||
}
|
||
|
||
/**
|
||
# Update given table.
|
||
#
|
||
# An alias may also be specified for the table.
|
||
#
|
||
# Concrete subclasses should provide a method which calls this
|
||
*/
|
||
|
||
|
||
_createClass(_class8, [{
|
||
key: '_table',
|
||
value: function _table(table) {
|
||
var alias = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;
|
||
|
||
alias = alias ? this._sanitizeTableAlias(alias) : alias;
|
||
table = this._sanitizeTable(table);
|
||
|
||
if (this.options.singleTable) {
|
||
this._tables = [];
|
||
}
|
||
|
||
this._tables.push({
|
||
table: table,
|
||
alias: alias
|
||
});
|
||
}
|
||
|
||
// get whether a table has been set
|
||
|
||
}, {
|
||
key: '_hasTable',
|
||
value: function _hasTable() {
|
||
return 0 < this._tables.length;
|
||
}
|
||
|
||
/**
|
||
* @override
|
||
*/
|
||
|
||
}, {
|
||
key: '_toParamString',
|
||
value: function _toParamString() {
|
||
var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
|
||
|
||
var totalStr = '',
|
||
totalValues = [];
|
||
|
||
if (this._hasTable()) {
|
||
// retrieve the parameterised queries
|
||
var _iteratorNormalCompletion5 = true;
|
||
var _didIteratorError5 = false;
|
||
var _iteratorError5 = undefined;
|
||
|
||
try {
|
||
for (var _iterator5 = this._tables[Symbol.iterator](), _step5; !(_iteratorNormalCompletion5 = (_step5 = _iterator5.next()).done); _iteratorNormalCompletion5 = true) {
|
||
var _ref3 = _step5.value;
|
||
var table = _ref3.table;
|
||
var alias = _ref3.alias;
|
||
|
||
totalStr = _pad(totalStr, ', ');
|
||
|
||
var tableStr = void 0;
|
||
|
||
if (cls.isSquelBuilder(table)) {
|
||
var _table$_toParamString = table._toParamString({
|
||
buildParameterized: options.buildParameterized,
|
||
nested: true
|
||
}),
|
||
text = _table$_toParamString.text,
|
||
values = _table$_toParamString.values;
|
||
|
||
tableStr = text;
|
||
values.forEach(function (value) {
|
||
return totalValues.push(value);
|
||
});
|
||
} else {
|
||
tableStr = this._formatTableName(table);
|
||
}
|
||
|
||
if (alias) {
|
||
tableStr += ' ' + this._formatTableAlias(alias);
|
||
}
|
||
|
||
totalStr += tableStr;
|
||
}
|
||
} catch (err) {
|
||
_didIteratorError5 = true;
|
||
_iteratorError5 = err;
|
||
} finally {
|
||
try {
|
||
if (!_iteratorNormalCompletion5 && _iterator5.RETURN) {
|
||
_iterator5.RETURN();
|
||
}
|
||
} finally {
|
||
if (_didIteratorError5) {
|
||
throw _iteratorError5;
|
||
}
|
||
}
|
||
}
|
||
|
||
if (this.options.prefix) {
|
||
totalStr = this.options.prefix + ' ' + totalStr;
|
||
}
|
||
}
|
||
|
||
return {
|
||
text: totalStr,
|
||
values: totalValues
|
||
};
|
||
}
|
||
}]);
|
||
|
||
return _class8;
|
||
}(cls.Block);
|
||
|
||
// target table for DELETE queries, DELETE <??> FROM
|
||
cls.TargetTableBlock = function (_cls$AbstractTableBlo) {
|
||
_inherits(_class9, _cls$AbstractTableBlo);
|
||
|
||
function _class9() {
|
||
_classCallCheck(this, _class9);
|
||
|
||
return _possibleConstructorReturn(this, (_class9.__proto__ || Object.getPrototypeOf(_class9)).apply(this, arguments));
|
||
}
|
||
|
||
_createClass(_class9, [{
|
||
key: 'target',
|
||
value: function target(table) {
|
||
this._table(table);
|
||
}
|
||
}]);
|
||
|
||
return _class9;
|
||
}(cls.AbstractTableBlock);
|
||
|
||
// Update Table
|
||
cls.UpdateTableBlock = function (_cls$AbstractTableBlo2) {
|
||
_inherits(_class10, _cls$AbstractTableBlo2);
|
||
|
||
function _class10() {
|
||
_classCallCheck(this, _class10);
|
||
|
||
return _possibleConstructorReturn(this, (_class10.__proto__ || Object.getPrototypeOf(_class10)).apply(this, arguments));
|
||
}
|
||
|
||
_createClass(_class10, [{
|
||
key: 'table',
|
||
value: function table(_table2) {
|
||
var alias = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;
|
||
|
||
this._table(_table2, alias);
|
||
}
|
||
}, {
|
||
key: '_toParamString',
|
||
value: function _toParamString() {
|
||
var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
|
||
|
||
if (!this._hasTable()) {
|
||
throw new Error("table() needs to be called");
|
||
}
|
||
|
||
return _get(_class10.prototype.__proto__ || Object.getPrototypeOf(_class10.prototype), '_toParamString', this).call(this, options);
|
||
}
|
||
}]);
|
||
|
||
return _class10;
|
||
}(cls.AbstractTableBlock);
|
||
|
||
// FROM table
|
||
cls.FromTableBlock = function (_cls$AbstractTableBlo3) {
|
||
_inherits(_class11, _cls$AbstractTableBlo3);
|
||
|
||
function _class11(options) {
|
||
_classCallCheck(this, _class11);
|
||
|
||
return _possibleConstructorReturn(this, (_class11.__proto__ || Object.getPrototypeOf(_class11)).call(this, _extend({}, options, {
|
||
prefix: 'FROM'
|
||
})));
|
||
}
|
||
|
||
_createClass(_class11, [{
|
||
key: 'from',
|
||
value: function from(table) {
|
||
var alias = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;
|
||
|
||
this._table(table, alias);
|
||
}
|
||
}]);
|
||
|
||
return _class11;
|
||
}(cls.AbstractTableBlock);
|
||
|
||
// INTO table
|
||
cls.IntoTableBlock = function (_cls$AbstractTableBlo4) {
|
||
_inherits(_class12, _cls$AbstractTableBlo4);
|
||
|
||
function _class12(options) {
|
||
_classCallCheck(this, _class12);
|
||
|
||
return _possibleConstructorReturn(this, (_class12.__proto__ || Object.getPrototypeOf(_class12)).call(this, _extend({}, options, {
|
||
prefix: 'INTO',
|
||
singleTable: true
|
||
})));
|
||
}
|
||
|
||
_createClass(_class12, [{
|
||
key: 'into',
|
||
value: function into(table) {
|
||
this._table(table);
|
||
}
|
||
}, {
|
||
key: '_toParamString',
|
||
value: function _toParamString() {
|
||
var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
|
||
|
||
if (!this._hasTable()) {
|
||
throw new Error("into() needs to be called");
|
||
}
|
||
|
||
return _get(_class12.prototype.__proto__ || Object.getPrototypeOf(_class12.prototype), '_toParamString', this).call(this, options);
|
||
}
|
||
}]);
|
||
|
||
return _class12;
|
||
}(cls.AbstractTableBlock);
|
||
|
||
// (SELECT) Get field
|
||
cls.GetFieldBlock = function (_cls$Block4) {
|
||
_inherits(_class13, _cls$Block4);
|
||
|
||
function _class13(options) {
|
||
_classCallCheck(this, _class13);
|
||
|
||
var _this14 = _possibleConstructorReturn(this, (_class13.__proto__ || Object.getPrototypeOf(_class13)).call(this, options));
|
||
|
||
_this14._fields = [];
|
||
return _this14;
|
||
}
|
||
|
||
/**
|
||
# Add the given fields to the final result set.
|
||
#
|
||
# The parameter is an Object containing field names (or database functions) as the keys and aliases for the fields
|
||
# as the values. If the value for a key is null then no alias is set for that field.
|
||
#
|
||
# Internally this method simply calls the field() method of this block to add each individual field.
|
||
#
|
||
# options.ignorePeriodsForFieldNameQuotes - whether to ignore period (.) when automatically quoting the field name
|
||
*/
|
||
|
||
|
||
_createClass(_class13, [{
|
||
key: 'fields',
|
||
value: function fields(_fields) {
|
||
var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
|
||
|
||
if (_isArray(_fields)) {
|
||
var _iteratorNormalCompletion6 = true;
|
||
var _didIteratorError6 = false;
|
||
var _iteratorError6 = undefined;
|
||
|
||
try {
|
||
for (var _iterator6 = _fields[Symbol.iterator](), _step6; !(_iteratorNormalCompletion6 = (_step6 = _iterator6.next()).done); _iteratorNormalCompletion6 = true) {
|
||
var field = _step6.value;
|
||
|
||
this.field(field, null, options);
|
||
}
|
||
} catch (err) {
|
||
_didIteratorError6 = true;
|
||
_iteratorError6 = err;
|
||
} finally {
|
||
try {
|
||
if (!_iteratorNormalCompletion6 && _iterator6.RETURN) {
|
||
_iterator6.RETURN();
|
||
}
|
||
} finally {
|
||
if (_didIteratorError6) {
|
||
throw _iteratorError6;
|
||
}
|
||
}
|
||
}
|
||
} else {
|
||
for (var _field2 in _fields) {
|
||
var alias = _fields[_field2];
|
||
|
||
this.field(_field2, alias, options);
|
||
}
|
||
}
|
||
}
|
||
|
||
/**
|
||
# Add the given field to the final result set.
|
||
#
|
||
# The 'field' parameter does not necessarily have to be a fieldname. It can use database functions too,
|
||
# e.g. DATE_FORMAT(a.started, "%H")
|
||
#
|
||
# An alias may also be specified for this field.
|
||
#
|
||
# options.ignorePeriodsForFieldNameQuotes - whether to ignore period (.) when automatically quoting the field name
|
||
*/
|
||
|
||
}, {
|
||
key: 'field',
|
||
value: function field(_field) {
|
||
var alias = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;
|
||
var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
|
||
|
||
alias = alias ? this._sanitizeFieldAlias(alias) : alias;
|
||
_field = this._sanitizeField(_field);
|
||
|
||
// if field-alias combo already present then don't add
|
||
var existingField = this._fields.filter(function (f) {
|
||
return f.name === _field && f.alias === alias;
|
||
});
|
||
if (existingField.length) {
|
||
return this;
|
||
}
|
||
|
||
this._fields.push({
|
||
name: _field,
|
||
alias: alias,
|
||
options: options
|
||
});
|
||
}
|
||
}, {
|
||
key: '_toParamString',
|
||
value: function _toParamString() {
|
||
var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
|
||
var queryBuilder = options.queryBuilder,
|
||
buildParameterized = options.buildParameterized;
|
||
|
||
|
||
var totalStr = '',
|
||
totalValues = [];
|
||
|
||
var _iteratorNormalCompletion7 = true;
|
||
var _didIteratorError7 = false;
|
||
var _iteratorError7 = undefined;
|
||
|
||
try {
|
||
for (var _iterator7 = this._fields[Symbol.iterator](), _step7; !(_iteratorNormalCompletion7 = (_step7 = _iterator7.next()).done); _iteratorNormalCompletion7 = true) {
|
||
var field = _step7.value;
|
||
|
||
totalStr = _pad(totalStr, ", ");
|
||
|
||
var name = field.name,
|
||
alias = field.alias,
|
||
_options = field.options;
|
||
|
||
|
||
if (typeof name === 'string') {
|
||
totalStr += this._formatFieldName(name, _options);
|
||
} else {
|
||
var ret = name._toParamString({
|
||
nested: true,
|
||
buildParameterized: buildParameterized
|
||
});
|
||
|
||
totalStr += ret.text;
|
||
ret.values.forEach(function (value) {
|
||
return totalValues.push(value);
|
||
});
|
||
}
|
||
|
||
if (alias) {
|
||
totalStr += ' AS ' + this._formatFieldAlias(alias);
|
||
}
|
||
}
|
||
} catch (err) {
|
||
_didIteratorError7 = true;
|
||
_iteratorError7 = err;
|
||
} finally {
|
||
try {
|
||
if (!_iteratorNormalCompletion7 && _iterator7.RETURN) {
|
||
_iterator7.RETURN();
|
||
}
|
||
} finally {
|
||
if (_didIteratorError7) {
|
||
throw _iteratorError7;
|
||
}
|
||
}
|
||
}
|
||
|
||
if (!totalStr.length) {
|
||
// if select query and a table is set then all fields wanted
|
||
var fromTableBlock = queryBuilder && queryBuilder.getBlock(cls.FromTableBlock);
|
||
if (fromTableBlock && fromTableBlock._hasTable()) {
|
||
totalStr = "*";
|
||
}
|
||
}
|
||
|
||
return {
|
||
text: totalStr,
|
||
values: totalValues
|
||
};
|
||
}
|
||
}]);
|
||
|
||
return _class13;
|
||
}(cls.Block);
|
||
|
||
// Base class for setting fields to values (used for INSERT and UPDATE queries)
|
||
cls.AbstractSetFieldBlock = function (_cls$Block5) {
|
||
_inherits(_class14, _cls$Block5);
|
||
|
||
function _class14(options) {
|
||
_classCallCheck(this, _class14);
|
||
|
||
var _this15 = _possibleConstructorReturn(this, (_class14.__proto__ || Object.getPrototypeOf(_class14)).call(this, options));
|
||
|
||
_this15._reset();
|
||
return _this15;
|
||
}
|
||
|
||
_createClass(_class14, [{
|
||
key: '_reset',
|
||
value: function _reset() {
|
||
this._fields = [];
|
||
this._values = [[]];
|
||
this._valueOptions = [[]];
|
||
}
|
||
|
||
// Update the given field with the given value.
|
||
// This will override any previously set value for the given field.
|
||
|
||
}, {
|
||
key: '_set',
|
||
value: function _set(field, value) {
|
||
var valueOptions = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
|
||
|
||
if (this._values.length > 1) {
|
||
throw new Error("Cannot set multiple rows of fields this way.");
|
||
}
|
||
|
||
if (typeof value !== 'undefined') {
|
||
value = this._sanitizeValue(value);
|
||
}
|
||
|
||
field = this._sanitizeField(field);
|
||
|
||
// Explicity overwrite existing fields
|
||
var index = this._fields.indexOf(field);
|
||
|
||
// if field not defined before
|
||
if (-1 === index) {
|
||
this._fields.push(field);
|
||
index = this._fields.length - 1;
|
||
}
|
||
|
||
this._values[0][index] = value;
|
||
this._valueOptions[0][index] = valueOptions;
|
||
}
|
||
|
||
// Insert fields based on the key/value pairs in the given object
|
||
|
||
}, {
|
||
key: '_setFields',
|
||
value: function _setFields(fields) {
|
||
var valueOptions = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
|
||
|
||
if ((typeof fields === 'undefined' ? 'undefined' : _typeof(fields)) !== 'object') {
|
||
throw new Error("Expected an object but got " + (typeof fields === 'undefined' ? 'undefined' : _typeof(fields)));
|
||
}
|
||
|
||
for (var field in fields) {
|
||
this._set(field, fields[field], valueOptions);
|
||
}
|
||
}
|
||
|
||
// Insert multiple rows for the given fields. Accepts an array of objects.
|
||
// This will override all previously set values for every field.
|
||
|
||
}, {
|
||
key: '_setFieldsRows',
|
||
value: function _setFieldsRows(fieldsRows) {
|
||
var valueOptions = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
|
||
|
||
if (!_isArray(fieldsRows)) {
|
||
throw new Error("Expected an array of objects but got " + (typeof fieldsRows === 'undefined' ? 'undefined' : _typeof(fieldsRows)));
|
||
}
|
||
|
||
// Reset the objects stored fields and values
|
||
this._reset();
|
||
|
||
// for each row
|
||
for (var i = 0; fieldsRows.length > i; ++i) {
|
||
var fieldRow = fieldsRows[i];
|
||
|
||
// for each field
|
||
for (var field in fieldRow) {
|
||
var value = fieldRow[field];
|
||
|
||
field = this._sanitizeField(field);
|
||
value = this._sanitizeValue(value);
|
||
|
||
var index = this._fields.indexOf(field);
|
||
|
||
if (0 < i && -1 === index) {
|
||
throw new Error('All fields in subsequent rows must match the fields in the first row');
|
||
}
|
||
|
||
// Add field only if it hasn't been added before
|
||
if (-1 === index) {
|
||
this._fields.push(field);
|
||
index = this._fields.length - 1;
|
||
}
|
||
|
||
// The first value added needs to add the array
|
||
if (!_isArray(this._values[i])) {
|
||
this._values[i] = [];
|
||
this._valueOptions[i] = [];
|
||
}
|
||
|
||
this._values[i][index] = value;
|
||
this._valueOptions[i][index] = valueOptions;
|
||
}
|
||
}
|
||
}
|
||
}]);
|
||
|
||
return _class14;
|
||
}(cls.Block);
|
||
|
||
// (UPDATE) SET field=value
|
||
cls.SetFieldBlock = function (_cls$AbstractSetField) {
|
||
_inherits(_class15, _cls$AbstractSetField);
|
||
|
||
function _class15() {
|
||
_classCallCheck(this, _class15);
|
||
|
||
return _possibleConstructorReturn(this, (_class15.__proto__ || Object.getPrototypeOf(_class15)).apply(this, arguments));
|
||
}
|
||
|
||
_createClass(_class15, [{
|
||
key: 'set',
|
||
value: function set(field, value, options) {
|
||
this._set(field, value, options);
|
||
}
|
||
}, {
|
||
key: 'setFields',
|
||
value: function setFields(fields, valueOptions) {
|
||
this._setFields(fields, valueOptions);
|
||
}
|
||
}, {
|
||
key: '_toParamString',
|
||
value: function _toParamString() {
|
||
var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
|
||
var buildParameterized = options.buildParameterized;
|
||
|
||
|
||
if (0 >= this._fields.length) {
|
||
throw new Error("set() needs to be called");
|
||
}
|
||
|
||
var totalStr = '',
|
||
totalValues = [];
|
||
|
||
for (var i = 0; i < this._fields.length; ++i) {
|
||
totalStr = _pad(totalStr, ', ');
|
||
|
||
var field = this._formatFieldName(this._fields[i]);
|
||
var value = this._values[0][i];
|
||
|
||
// e.g. field can be an expression such as `count = count + 1`
|
||
if (0 > field.indexOf('=')) {
|
||
field = field + ' = ' + this.options.parameterCharacter;
|
||
}
|
||
|
||
var ret = this._buildString(field, [value], {
|
||
buildParameterized: buildParameterized,
|
||
formattingOptions: this._valueOptions[0][i]
|
||
});
|
||
|
||
totalStr += ret.text;
|
||
ret.values.forEach(function (value) {
|
||
return totalValues.push(value);
|
||
});
|
||
}
|
||
|
||
return {
|
||
text: 'SET ' + totalStr,
|
||
values: totalValues
|
||
};
|
||
}
|
||
}]);
|
||
|
||
return _class15;
|
||
}(cls.AbstractSetFieldBlock);
|
||
|
||
// (INSERT INTO) ... field ... value
|
||
cls.InsertFieldValueBlock = function (_cls$AbstractSetField2) {
|
||
_inherits(_class16, _cls$AbstractSetField2);
|
||
|
||
function _class16() {
|
||
_classCallCheck(this, _class16);
|
||
|
||
return _possibleConstructorReturn(this, (_class16.__proto__ || Object.getPrototypeOf(_class16)).apply(this, arguments));
|
||
}
|
||
|
||
_createClass(_class16, [{
|
||
key: 'set',
|
||
value: function set(field, value) {
|
||
var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
|
||
|
||
this._set(field, value, options);
|
||
}
|
||
}, {
|
||
key: 'setFields',
|
||
value: function setFields(fields, valueOptions) {
|
||
this._setFields(fields, valueOptions);
|
||
}
|
||
}, {
|
||
key: 'setFieldsRows',
|
||
value: function setFieldsRows(fieldsRows, valueOptions) {
|
||
this._setFieldsRows(fieldsRows, valueOptions);
|
||
}
|
||
}, {
|
||
key: '_toParamString',
|
||
value: function _toParamString() {
|
||
var _this18 = this;
|
||
|
||
var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
|
||
var buildParameterized = options.buildParameterized;
|
||
|
||
|
||
var fieldString = this._fields.map(function (f) {
|
||
return _this18._formatFieldName(f);
|
||
}).join(', ');
|
||
|
||
var valueStrings = [],
|
||
totalValues = [];
|
||
|
||
for (var i = 0; i < this._values.length; ++i) {
|
||
valueStrings[i] = '';
|
||
|
||
for (var j = 0; j < this._values[i].length; ++j) {
|
||
var ret = this._buildString(this.options.parameterCharacter, [this._values[i][j]], {
|
||
buildParameterized: buildParameterized,
|
||
formattingOptions: this._valueOptions[i][j]
|
||
});
|
||
|
||
ret.values.forEach(function (value) {
|
||
return totalValues.push(value);
|
||
});
|
||
|
||
valueStrings[i] = _pad(valueStrings[i], ', ');
|
||
valueStrings[i] += ret.text;
|
||
}
|
||
}
|
||
|
||
return {
|
||
text: fieldString.length ? '(' + fieldString + ') VALUES (' + valueStrings.join('), (') + ')' : '',
|
||
values: totalValues
|
||
};
|
||
}
|
||
}]);
|
||
|
||
return _class16;
|
||
}(cls.AbstractSetFieldBlock);
|
||
|
||
// (INSERT INTO) ... field ... (SELECT ... FROM ...)
|
||
cls.InsertFieldsFromQueryBlock = function (_cls$Block6) {
|
||
_inherits(_class17, _cls$Block6);
|
||
|
||
function _class17(options) {
|
||
_classCallCheck(this, _class17);
|
||
|
||
var _this19 = _possibleConstructorReturn(this, (_class17.__proto__ || Object.getPrototypeOf(_class17)).call(this, options));
|
||
|
||
_this19._fields = [];
|
||
_this19._query = null;
|
||
return _this19;
|
||
}
|
||
|
||
_createClass(_class17, [{
|
||
key: 'fromQuery',
|
||
value: function fromQuery(fields, selectQuery) {
|
||
var _this20 = this;
|
||
|
||
this._fields = fields.map(function (v) {
|
||
return _this20._sanitizeField(v);
|
||
});
|
||
|
||
this._query = this._sanitizeBaseBuilder(selectQuery);
|
||
}
|
||
}, {
|
||
key: '_toParamString',
|
||
value: function _toParamString() {
|
||
var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
|
||
|
||
var totalStr = '',
|
||
totalValues = [];
|
||
|
||
if (this._fields.length && this._query) {
|
||
var _query$_toParamString = this._query._toParamString({
|
||
buildParameterized: options.buildParameterized,
|
||
nested: true
|
||
}),
|
||
text = _query$_toParamString.text,
|
||
values = _query$_toParamString.values;
|
||
|
||
totalStr = '(' + this._fields.join(', ') + ') ' + this._applyNestingFormatting(text);
|
||
totalValues = values;
|
||
}
|
||
|
||
return {
|
||
text: totalStr,
|
||
values: totalValues
|
||
};
|
||
}
|
||
}]);
|
||
|
||
return _class17;
|
||
}(cls.Block);
|
||
|
||
// DISTINCT
|
||
cls.DistinctBlock = function (_cls$Block7) {
|
||
_inherits(_class18, _cls$Block7);
|
||
|
||
function _class18() {
|
||
_classCallCheck(this, _class18);
|
||
|
||
return _possibleConstructorReturn(this, (_class18.__proto__ || Object.getPrototypeOf(_class18)).apply(this, arguments));
|
||
}
|
||
|
||
_createClass(_class18, [{
|
||
key: 'distinct',
|
||
|
||
// Add the DISTINCT keyword to the query.
|
||
value: function distinct() {
|
||
this._useDistinct = true;
|
||
}
|
||
}, {
|
||
key: '_toParamString',
|
||
value: function _toParamString() {
|
||
return {
|
||
text: this._useDistinct ? "DISTINCT" : "",
|
||
values: []
|
||
};
|
||
}
|
||
}]);
|
||
|
||
return _class18;
|
||
}(cls.Block);
|
||
|
||
// GROUP BY
|
||
cls.GroupByBlock = function (_cls$Block8) {
|
||
_inherits(_class19, _cls$Block8);
|
||
|
||
function _class19(options) {
|
||
_classCallCheck(this, _class19);
|
||
|
||
var _this22 = _possibleConstructorReturn(this, (_class19.__proto__ || Object.getPrototypeOf(_class19)).call(this, options));
|
||
|
||
_this22._groups = [];
|
||
return _this22;
|
||
}
|
||
|
||
// Add a GROUP BY transformation for the given field.
|
||
|
||
|
||
_createClass(_class19, [{
|
||
key: 'group',
|
||
value: function group(field) {
|
||
this._groups.push(this._sanitizeField(field));
|
||
}
|
||
}, {
|
||
key: '_toParamString',
|
||
value: function _toParamString() {
|
||
var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
|
||
|
||
return {
|
||
text: this._groups.length ? 'GROUP BY ' + this._groups.join(', ') : '',
|
||
values: []
|
||
};
|
||
}
|
||
}]);
|
||
|
||
return _class19;
|
||
}(cls.Block);
|
||
|
||
cls.AbstractVerbSingleValueBlock = function (_cls$Block9) {
|
||
_inherits(_class20, _cls$Block9);
|
||
|
||
/**
|
||
* @param options.verb The prefix verb string.
|
||
*/
|
||
function _class20(options) {
|
||
_classCallCheck(this, _class20);
|
||
|
||
var _this23 = _possibleConstructorReturn(this, (_class20.__proto__ || Object.getPrototypeOf(_class20)).call(this, options));
|
||
|
||
_this23._value = null;
|
||
return _this23;
|
||
}
|
||
|
||
_createClass(_class20, [{
|
||
key: '_setValue',
|
||
value: function _setValue(value) {
|
||
this._value = null !== value ? this._sanitizeLimitOffset(value) : value;
|
||
}
|
||
}, {
|
||
key: '_toParamString',
|
||
value: function _toParamString() {
|
||
var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
|
||
|
||
var expr = null !== this._value ? this.options.verb + ' ' + this.options.parameterCharacter : '';
|
||
|
||
var values = null !== this._value ? [this._value] : [];
|
||
|
||
return this._buildString(expr, values, options);
|
||
}
|
||
}]);
|
||
|
||
return _class20;
|
||
}(cls.Block);
|
||
|
||
// OFFSET x
|
||
cls.OffsetBlock = function (_cls$AbstractVerbSing) {
|
||
_inherits(_class21, _cls$AbstractVerbSing);
|
||
|
||
function _class21(options) {
|
||
_classCallCheck(this, _class21);
|
||
|
||
return _possibleConstructorReturn(this, (_class21.__proto__ || Object.getPrototypeOf(_class21)).call(this, _extend({}, options, {
|
||
verb: 'OFFSET'
|
||
})));
|
||
}
|
||
|
||
/**
|
||
# Set the OFFSET transformation.
|
||
#
|
||
# Call this will override the previously set offset for this query. Also note that Passing 0 for 'max' will remove
|
||
# the offset.
|
||
*/
|
||
|
||
|
||
_createClass(_class21, [{
|
||
key: 'offset',
|
||
value: function offset(start) {
|
||
this._setValue(start);
|
||
}
|
||
}]);
|
||
|
||
return _class21;
|
||
}(cls.AbstractVerbSingleValueBlock);
|
||
|
||
// LIMIT
|
||
cls.LimitBlock = function (_cls$AbstractVerbSing2) {
|
||
_inherits(_class22, _cls$AbstractVerbSing2);
|
||
|
||
function _class22(options) {
|
||
_classCallCheck(this, _class22);
|
||
|
||
return _possibleConstructorReturn(this, (_class22.__proto__ || Object.getPrototypeOf(_class22)).call(this, _extend({}, options, {
|
||
verb: 'LIMIT'
|
||
})));
|
||
}
|
||
|
||
/**
|
||
# Set the LIMIT transformation.
|
||
#
|
||
# Call this will override the previously set limit for this query. Also note that Passing `null` will remove
|
||
# the limit.
|
||
*/
|
||
|
||
|
||
_createClass(_class22, [{
|
||
key: 'limit',
|
||
value: function limit(_limit) {
|
||
this._setValue(_limit);
|
||
}
|
||
}]);
|
||
|
||
return _class22;
|
||
}(cls.AbstractVerbSingleValueBlock);
|
||
|
||
// Abstract condition base class
|
||
cls.AbstractConditionBlock = function (_cls$Block10) {
|
||
_inherits(_class23, _cls$Block10);
|
||
|
||
/**
|
||
* @param {String} options.verb The condition verb.
|
||
*/
|
||
function _class23(options) {
|
||
_classCallCheck(this, _class23);
|
||
|
||
var _this26 = _possibleConstructorReturn(this, (_class23.__proto__ || Object.getPrototypeOf(_class23)).call(this, options));
|
||
|
||
_this26._conditions = [];
|
||
return _this26;
|
||
}
|
||
|
||
/**
|
||
# Add a condition.
|
||
#
|
||
# When the final query is constructed all the conditions are combined using the intersection (AND) operator.
|
||
#
|
||
# Concrete subclasses should provide a method which calls this
|
||
*/
|
||
|
||
|
||
_createClass(_class23, [{
|
||
key: '_condition',
|
||
value: function _condition(condition) {
|
||
condition = this._sanitizeExpression(condition);
|
||
|
||
for (var _len6 = arguments.length, values = Array(_len6 > 1 ? _len6 - 1 : 0), _key6 = 1; _key6 < _len6; _key6++) {
|
||
values[_key6 - 1] = arguments[_key6];
|
||
}
|
||
|
||
this._conditions.push({
|
||
expr: condition,
|
||
values: values || []
|
||
});
|
||
}
|
||
}, {
|
||
key: '_toParamString',
|
||
value: function _toParamString() {
|
||
var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
|
||
|
||
var totalStr = [],
|
||
totalValues = [];
|
||
|
||
var _iteratorNormalCompletion8 = true;
|
||
var _didIteratorError8 = false;
|
||
var _iteratorError8 = undefined;
|
||
|
||
try {
|
||
for (var _iterator8 = this._conditions[Symbol.iterator](), _step8; !(_iteratorNormalCompletion8 = (_step8 = _iterator8.next()).done); _iteratorNormalCompletion8 = true) {
|
||
var _ref4 = _step8.value;
|
||
var expr = _ref4.expr;
|
||
var _values2 = _ref4.values;
|
||
|
||
var ret = cls.isSquelBuilder(expr) ? expr._toParamString({
|
||
buildParameterized: options.buildParameterized
|
||
}) : this._buildString(expr, _values2, {
|
||
buildParameterized: options.buildParameterized
|
||
});
|
||
|
||
if (ret.text.length) {
|
||
totalStr.push(ret.text);
|
||
}
|
||
|
||
ret.values.forEach(function (value) {
|
||
return totalValues.push(value);
|
||
});
|
||
}
|
||
} catch (err) {
|
||
_didIteratorError8 = true;
|
||
_iteratorError8 = err;
|
||
} finally {
|
||
try {
|
||
if (!_iteratorNormalCompletion8 && _iterator8.RETURN) {
|
||
_iterator8.RETURN();
|
||
}
|
||
} finally {
|
||
if (_didIteratorError8) {
|
||
throw _iteratorError8;
|
||
}
|
||
}
|
||
}
|
||
|
||
if (totalStr.length) {
|
||
totalStr = totalStr.join(') AND (');
|
||
}
|
||
|
||
return {
|
||
text: totalStr.length ? this.options.verb + ' (' + totalStr + ')' : '',
|
||
values: totalValues
|
||
};
|
||
}
|
||
}]);
|
||
|
||
return _class23;
|
||
}(cls.Block);
|
||
|
||
// WHERE
|
||
cls.WhereBlock = function (_cls$AbstractConditio) {
|
||
_inherits(_class24, _cls$AbstractConditio);
|
||
|
||
function _class24(options) {
|
||
_classCallCheck(this, _class24);
|
||
|
||
return _possibleConstructorReturn(this, (_class24.__proto__ || Object.getPrototypeOf(_class24)).call(this, _extend({}, options, {
|
||
verb: 'WHERE'
|
||
})));
|
||
}
|
||
|
||
_createClass(_class24, [{
|
||
key: 'where',
|
||
value: function where(condition) {
|
||
for (var _len7 = arguments.length, values = Array(_len7 > 1 ? _len7 - 1 : 0), _key7 = 1; _key7 < _len7; _key7++) {
|
||
values[_key7 - 1] = arguments[_key7];
|
||
}
|
||
|
||
this._condition.apply(this, [condition].concat(values));
|
||
}
|
||
}]);
|
||
|
||
return _class24;
|
||
}(cls.AbstractConditionBlock);
|
||
|
||
// HAVING
|
||
cls.HavingBlock = function (_cls$AbstractConditio2) {
|
||
_inherits(_class25, _cls$AbstractConditio2);
|
||
|
||
function _class25(options) {
|
||
_classCallCheck(this, _class25);
|
||
|
||
return _possibleConstructorReturn(this, (_class25.__proto__ || Object.getPrototypeOf(_class25)).call(this, _extend({}, options, {
|
||
verb: 'HAVING'
|
||
})));
|
||
}
|
||
|
||
_createClass(_class25, [{
|
||
key: 'having',
|
||
value: function having(condition) {
|
||
for (var _len8 = arguments.length, values = Array(_len8 > 1 ? _len8 - 1 : 0), _key8 = 1; _key8 < _len8; _key8++) {
|
||
values[_key8 - 1] = arguments[_key8];
|
||
}
|
||
|
||
this._condition.apply(this, [condition].concat(values));
|
||
}
|
||
}]);
|
||
|
||
return _class25;
|
||
}(cls.AbstractConditionBlock);
|
||
|
||
// ORDER BY
|
||
cls.OrderByBlock = function (_cls$Block11) {
|
||
_inherits(_class26, _cls$Block11);
|
||
|
||
function _class26(options) {
|
||
_classCallCheck(this, _class26);
|
||
|
||
var _this29 = _possibleConstructorReturn(this, (_class26.__proto__ || Object.getPrototypeOf(_class26)).call(this, options));
|
||
|
||
_this29._orders = [];
|
||
return _this29;
|
||
}
|
||
|
||
/**
|
||
# Add an ORDER BY transformation for the given field in the given order.
|
||
#
|
||
# To specify descending order pass false for the 'dir' parameter.
|
||
*/
|
||
|
||
|
||
_createClass(_class26, [{
|
||
key: 'order',
|
||
value: function order(field, dir) {
|
||
field = this._sanitizeField(field);
|
||
|
||
if (!(typeof dir === 'string')) {
|
||
if (dir === undefined) {
|
||
dir = 'ASC'; // Default to asc
|
||
} else if (dir !== null) {
|
||
dir = dir ? 'ASC' : 'DESC'; // Convert truthy to asc
|
||
}
|
||
}
|
||
|
||
for (var _len9 = arguments.length, values = Array(_len9 > 2 ? _len9 - 2 : 0), _key9 = 2; _key9 < _len9; _key9++) {
|
||
values[_key9 - 2] = arguments[_key9];
|
||
}
|
||
|
||
this._orders.push({
|
||
field: field,
|
||
dir: dir,
|
||
values: values || []
|
||
});
|
||
}
|
||
}, {
|
||
key: '_toParamString',
|
||
value: function _toParamString() {
|
||
var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
|
||
|
||
var totalStr = '',
|
||
totalValues = [];
|
||
|
||
var _iteratorNormalCompletion9 = true;
|
||
var _didIteratorError9 = false;
|
||
var _iteratorError9 = undefined;
|
||
|
||
try {
|
||
for (var _iterator9 = this._orders[Symbol.iterator](), _step9; !(_iteratorNormalCompletion9 = (_step9 = _iterator9.next()).done); _iteratorNormalCompletion9 = true) {
|
||
var _ref5 = _step9.value;
|
||
var field = _ref5.field;
|
||
var dir = _ref5.dir;
|
||
var _values3 = _ref5.values;
|
||
|
||
totalStr = _pad(totalStr, ', ');
|
||
|
||
var ret = this._buildString(field, _values3, {
|
||
buildParameterized: options.buildParameterized
|
||
});
|
||
|
||
totalStr += ret.text, _isArray(ret.values) && ret.values.forEach(function (value) {
|
||
return totalValues.push(value);
|
||
});
|
||
|
||
if (dir !== null) {
|
||
totalStr += ' ' + dir;
|
||
}
|
||
}
|
||
} catch (err) {
|
||
_didIteratorError9 = true;
|
||
_iteratorError9 = err;
|
||
} finally {
|
||
try {
|
||
if (!_iteratorNormalCompletion9 && _iterator9.RETURN) {
|
||
_iterator9.RETURN();
|
||
}
|
||
} finally {
|
||
if (_didIteratorError9) {
|
||
throw _iteratorError9;
|
||
}
|
||
}
|
||
}
|
||
|
||
return {
|
||
text: totalStr.length ? 'ORDER BY ' + totalStr : '',
|
||
values: totalValues
|
||
};
|
||
}
|
||
}]);
|
||
|
||
return _class26;
|
||
}(cls.Block);
|
||
|
||
// JOIN
|
||
cls.JoinBlock = function (_cls$Block12) {
|
||
_inherits(_class27, _cls$Block12);
|
||
|
||
function _class27(options) {
|
||
_classCallCheck(this, _class27);
|
||
|
||
var _this30 = _possibleConstructorReturn(this, (_class27.__proto__ || Object.getPrototypeOf(_class27)).call(this, options));
|
||
|
||
_this30._joins = [];
|
||
return _this30;
|
||
}
|
||
|
||
/**
|
||
# Add a JOIN with the given table.
|
||
#
|
||
# 'table' is the name of the table to join with.
|
||
#
|
||
# 'alias' is an optional alias for the table name.
|
||
#
|
||
# 'condition' is an optional condition (containing an SQL expression) for the JOIN.
|
||
#
|
||
# 'type' must be either one of INNER, OUTER, LEFT or RIGHT. Default is 'INNER'.
|
||
#
|
||
*/
|
||
|
||
|
||
_createClass(_class27, [{
|
||
key: 'join',
|
||
value: function join(table) {
|
||
var alias = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;
|
||
var condition = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null;
|
||
var type = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 'INNER';
|
||
|
||
table = this._sanitizeTable(table, true);
|
||
alias = alias ? this._sanitizeTableAlias(alias) : alias;
|
||
condition = condition ? this._sanitizeExpression(condition) : condition;
|
||
|
||
this._joins.push({
|
||
type: type,
|
||
table: table,
|
||
alias: alias,
|
||
condition: condition
|
||
});
|
||
}
|
||
}, {
|
||
key: 'left_join',
|
||
value: function left_join(table) {
|
||
var alias = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;
|
||
var condition = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null;
|
||
|
||
this.join(table, alias, condition, 'LEFT');
|
||
}
|
||
}, {
|
||
key: 'right_join',
|
||
value: function right_join(table) {
|
||
var alias = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;
|
||
var condition = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null;
|
||
|
||
this.join(table, alias, condition, 'RIGHT');
|
||
}
|
||
}, {
|
||
key: 'outer_join',
|
||
value: function outer_join(table) {
|
||
var alias = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;
|
||
var condition = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null;
|
||
|
||
this.join(table, alias, condition, 'OUTER');
|
||
}
|
||
}, {
|
||
key: 'left_outer_join',
|
||
value: function left_outer_join(table) {
|
||
var alias = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;
|
||
var condition = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null;
|
||
|
||
this.join(table, alias, condition, 'LEFT OUTER');
|
||
}
|
||
}, {
|
||
key: 'full_join',
|
||
value: function full_join(table) {
|
||
var alias = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;
|
||
var condition = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null;
|
||
|
||
this.join(table, alias, condition, 'FULL');
|
||
}
|
||
}, {
|
||
key: 'cross_join',
|
||
value: function cross_join(table) {
|
||
var alias = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;
|
||
var condition = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null;
|
||
|
||
this.join(table, alias, condition, 'CROSS');
|
||
}
|
||
}, {
|
||
key: '_toParamString',
|
||
value: function _toParamString() {
|
||
var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
|
||
|
||
var totalStr = "",
|
||
totalValues = [];
|
||
|
||
var _iteratorNormalCompletion10 = true;
|
||
var _didIteratorError10 = false;
|
||
var _iteratorError10 = undefined;
|
||
|
||
try {
|
||
for (var _iterator10 = this._joins[Symbol.iterator](), _step10; !(_iteratorNormalCompletion10 = (_step10 = _iterator10.next()).done); _iteratorNormalCompletion10 = true) {
|
||
var _ref6 = _step10.value;
|
||
var type = _ref6.type;
|
||
var table = _ref6.table;
|
||
var alias = _ref6.alias;
|
||
var condition = _ref6.condition;
|
||
|
||
totalStr = _pad(totalStr, this.options.separator);
|
||
|
||
var tableStr = void 0;
|
||
|
||
if (cls.isSquelBuilder(table)) {
|
||
var ret = table._toParamString({
|
||
buildParameterized: options.buildParameterized,
|
||
nested: true
|
||
});
|
||
|
||
ret.values.forEach(function (value) {
|
||
return totalValues.push(value);
|
||
});
|
||
tableStr = ret.text;
|
||
} else {
|
||
tableStr = this._formatTableName(table);
|
||
}
|
||
|
||
totalStr += type + ' JOIN ' + tableStr;
|
||
|
||
if (alias) {
|
||
totalStr += ' ' + this._formatTableAlias(alias);
|
||
}
|
||
|
||
if (condition) {
|
||
totalStr += ' ON ';
|
||
|
||
var _ret2 = void 0;
|
||
|
||
if (cls.isSquelBuilder(condition)) {
|
||
_ret2 = condition._toParamString({
|
||
buildParameterized: options.buildParameterized
|
||
});
|
||
} else {
|
||
_ret2 = this._buildString(condition, [], {
|
||
buildParameterized: options.buildParameterized
|
||
});
|
||
}
|
||
|
||
totalStr += this._applyNestingFormatting(_ret2.text);
|
||
_ret2.values.forEach(function (value) {
|
||
return totalValues.push(value);
|
||
});
|
||
}
|
||
}
|
||
} catch (err) {
|
||
_didIteratorError10 = true;
|
||
_iteratorError10 = err;
|
||
} finally {
|
||
try {
|
||
if (!_iteratorNormalCompletion10 && _iterator10.RETURN) {
|
||
_iterator10.RETURN();
|
||
}
|
||
} finally {
|
||
if (_didIteratorError10) {
|
||
throw _iteratorError10;
|
||
}
|
||
}
|
||
}
|
||
|
||
return {
|
||
text: totalStr,
|
||
values: totalValues
|
||
};
|
||
}
|
||
}]);
|
||
|
||
return _class27;
|
||
}(cls.Block);
|
||
|
||
// UNION
|
||
cls.UnionBlock = function (_cls$Block13) {
|
||
_inherits(_class28, _cls$Block13);
|
||
|
||
function _class28(options) {
|
||
_classCallCheck(this, _class28);
|
||
|
||
var _this31 = _possibleConstructorReturn(this, (_class28.__proto__ || Object.getPrototypeOf(_class28)).call(this, options));
|
||
|
||
_this31._unions = [];
|
||
return _this31;
|
||
}
|
||
|
||
/**
|
||
# Add a UNION with the given table/query.
|
||
#
|
||
# 'table' is the name of the table or query to union with.
|
||
#
|
||
# 'type' must be either one of UNION or UNION ALL.... Default is 'UNION'.
|
||
*/
|
||
|
||
|
||
_createClass(_class28, [{
|
||
key: 'union',
|
||
value: function union(table) {
|
||
var type = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'UNION';
|
||
|
||
table = this._sanitizeTable(table);
|
||
|
||
this._unions.push({
|
||
type: type,
|
||
table: table
|
||
});
|
||
}
|
||
|
||
// Add a UNION ALL with the given table/query.
|
||
|
||
}, {
|
||
key: 'union_all',
|
||
value: function union_all(table) {
|
||
this.union(table, 'UNION ALL');
|
||
}
|
||
}, {
|
||
key: '_toParamString',
|
||
value: function _toParamString() {
|
||
var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
|
||
|
||
var totalStr = '',
|
||
totalValues = [];
|
||
|
||
var _iteratorNormalCompletion11 = true;
|
||
var _didIteratorError11 = false;
|
||
var _iteratorError11 = undefined;
|
||
|
||
try {
|
||
for (var _iterator11 = this._unions[Symbol.iterator](), _step11; !(_iteratorNormalCompletion11 = (_step11 = _iterator11.next()).done); _iteratorNormalCompletion11 = true) {
|
||
var _ref7 = _step11.value;
|
||
var type = _ref7.type;
|
||
var table = _ref7.table;
|
||
|
||
totalStr = _pad(totalStr, this.options.separator);
|
||
|
||
var tableStr = void 0;
|
||
|
||
if (table instanceof cls.BaseBuilder) {
|
||
var ret = table._toParamString({
|
||
buildParameterized: options.buildParameterized,
|
||
nested: true
|
||
});
|
||
|
||
tableStr = ret.text;
|
||
ret.values.forEach(function (value) {
|
||
return totalValues.push(value);
|
||
});
|
||
} else {
|
||
totalStr = this._formatTableName(table);
|
||
}
|
||
|
||
totalStr += type + ' ' + tableStr;
|
||
}
|
||
} catch (err) {
|
||
_didIteratorError11 = true;
|
||
_iteratorError11 = err;
|
||
} finally {
|
||
try {
|
||
if (!_iteratorNormalCompletion11 && _iterator11.RETURN) {
|
||
_iterator11.RETURN();
|
||
}
|
||
} finally {
|
||
if (_didIteratorError11) {
|
||
throw _iteratorError11;
|
||
}
|
||
}
|
||
}
|
||
|
||
return {
|
||
text: totalStr,
|
||
values: totalValues
|
||
};
|
||
}
|
||
}]);
|
||
|
||
return _class28;
|
||
}(cls.Block);
|
||
|
||
/*
|
||
# ---------------------------------------------------------------------------------------------------------
|
||
# ---------------------------------------------------------------------------------------------------------
|
||
# Query builders
|
||
# ---------------------------------------------------------------------------------------------------------
|
||
# ---------------------------------------------------------------------------------------------------------
|
||
*/
|
||
|
||
/**
|
||
# Query builder base class
|
||
#
|
||
# Note that the query builder does not check the final query string for correctness.
|
||
#
|
||
# All the build methods in this object return the object instance for chained method calling purposes.
|
||
*/
|
||
cls.QueryBuilder = function (_cls$BaseBuilder4) {
|
||
_inherits(_class29, _cls$BaseBuilder4);
|
||
|
||
/**
|
||
# Constructor
|
||
#
|
||
# blocks - array of cls.BaseBuilderBlock instances to build the query with.
|
||
*/
|
||
function _class29(options, blocks) {
|
||
_classCallCheck(this, _class29);
|
||
|
||
var _this32 = _possibleConstructorReturn(this, (_class29.__proto__ || Object.getPrototypeOf(_class29)).call(this, options));
|
||
|
||
_this32.blocks = blocks || [];
|
||
|
||
// Copy exposed methods into myself
|
||
var _iteratorNormalCompletion12 = true;
|
||
var _didIteratorError12 = false;
|
||
var _iteratorError12 = undefined;
|
||
|
||
try {
|
||
for (var _iterator12 = _this32.blocks[Symbol.iterator](), _step12; !(_iteratorNormalCompletion12 = (_step12 = _iterator12.next()).done); _iteratorNormalCompletion12 = true) {
|
||
var block = _step12.value;
|
||
|
||
var exposedMethods = block.exposedMethods();
|
||
|
||
for (var methodName in exposedMethods) {
|
||
var methodBody = exposedMethods[methodName];
|
||
|
||
if (undefined !== _this32[methodName]) {
|
||
throw new Error('Builder already has a builder method called: ' + methodName);
|
||
}
|
||
|
||
(function (block, name, body) {
|
||
_this32[name] = function () {
|
||
for (var _len10 = arguments.length, args = Array(_len10), _key10 = 0; _key10 < _len10; _key10++) {
|
||
args[_key10] = arguments[_key10];
|
||
}
|
||
|
||
body.call.apply(body, [block].concat(args));
|
||
|
||
return _this32;
|
||
};
|
||
})(block, methodName, methodBody);
|
||
}
|
||
}
|
||
} catch (err) {
|
||
_didIteratorError12 = true;
|
||
_iteratorError12 = err;
|
||
} finally {
|
||
try {
|
||
if (!_iteratorNormalCompletion12 && _iterator12.RETURN) {
|
||
_iterator12.RETURN();
|
||
}
|
||
} finally {
|
||
if (_didIteratorError12) {
|
||
throw _iteratorError12;
|
||
}
|
||
}
|
||
}
|
||
|
||
return _this32;
|
||
}
|
||
|
||
/**
|
||
# Register a custom value handler for this query builder and all its contained blocks.
|
||
#
|
||
# Note: This will override any globally registered handler for this value type.
|
||
*/
|
||
|
||
|
||
_createClass(_class29, [{
|
||
key: 'registerValueHandler',
|
||
value: function registerValueHandler(type, handler) {
|
||
var _iteratorNormalCompletion13 = true;
|
||
var _didIteratorError13 = false;
|
||
var _iteratorError13 = undefined;
|
||
|
||
try {
|
||
for (var _iterator13 = this.blocks[Symbol.iterator](), _step13; !(_iteratorNormalCompletion13 = (_step13 = _iterator13.next()).done); _iteratorNormalCompletion13 = true) {
|
||
var block = _step13.value;
|
||
|
||
block.registerValueHandler(type, handler);
|
||
}
|
||
} catch (err) {
|
||
_didIteratorError13 = true;
|
||
_iteratorError13 = err;
|
||
} finally {
|
||
try {
|
||
if (!_iteratorNormalCompletion13 && _iterator13.RETURN) {
|
||
_iterator13.RETURN();
|
||
}
|
||
} finally {
|
||
if (_didIteratorError13) {
|
||
throw _iteratorError13;
|
||
}
|
||
}
|
||
}
|
||
|
||
_get(_class29.prototype.__proto__ || Object.getPrototypeOf(_class29.prototype), 'registerValueHandler', this).call(this, type, handler);
|
||
|
||
return this;
|
||
}
|
||
|
||
/**
|
||
# Update query builder options
|
||
#
|
||
# This will update the options for all blocks too. Use this method with caution as it allows you to change the
|
||
# behaviour of your query builder mid-build.
|
||
*/
|
||
|
||
}, {
|
||
key: 'updateOptions',
|
||
value: function updateOptions(options) {
|
||
this.options = _extend({}, this.options, options);
|
||
|
||
var _iteratorNormalCompletion14 = true;
|
||
var _didIteratorError14 = false;
|
||
var _iteratorError14 = undefined;
|
||
|
||
try {
|
||
for (var _iterator14 = this.blocks[Symbol.iterator](), _step14; !(_iteratorNormalCompletion14 = (_step14 = _iterator14.next()).done); _iteratorNormalCompletion14 = true) {
|
||
var block = _step14.value;
|
||
|
||
block.options = _extend({}, block.options, options);
|
||
}
|
||
} catch (err) {
|
||
_didIteratorError14 = true;
|
||
_iteratorError14 = err;
|
||
} finally {
|
||
try {
|
||
if (!_iteratorNormalCompletion14 && _iterator14.RETURN) {
|
||
_iterator14.RETURN();
|
||
}
|
||
} finally {
|
||
if (_didIteratorError14) {
|
||
throw _iteratorError14;
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
// Get the final fully constructed query param obj.
|
||
|
||
}, {
|
||
key: '_toParamString',
|
||
value: function _toParamString() {
|
||
var _this33 = this;
|
||
|
||
var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
|
||
|
||
options = _extend({}, this.options, options);
|
||
|
||
var blockResults = this.blocks.map(function (b) {
|
||
return b._toParamString({
|
||
buildParameterized: options.buildParameterized,
|
||
queryBuilder: _this33
|
||
});
|
||
});
|
||
|
||
var blockTexts = blockResults.map(function (b) {
|
||
return b.text;
|
||
});
|
||
var blockValues = blockResults.map(function (b) {
|
||
return b.values;
|
||
});
|
||
|
||
var totalStr = blockTexts.filter(function (v) {
|
||
return 0 < v.length;
|
||
}).join(options.separator);
|
||
|
||
var totalValues = [];
|
||
blockValues.forEach(function (block) {
|
||
return block.forEach(function (value) {
|
||
return totalValues.push(value);
|
||
});
|
||
});
|
||
|
||
if (!options.nested) {
|
||
if (options.numberedParameters) {
|
||
var i = undefined !== options.numberedParametersStartAt ? options.numberedParametersStartAt : 1;
|
||
|
||
// construct regex for searching
|
||
var regex = options.parameterCharacter.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, "\\$&");
|
||
|
||
totalStr = totalStr.replace(new RegExp(regex, 'g'), function () {
|
||
return '' + options.numberedParametersPrefix + i++;
|
||
});
|
||
}
|
||
}
|
||
|
||
return {
|
||
text: this._applyNestingFormatting(totalStr, !!options.nested),
|
||
values: totalValues
|
||
};
|
||
}
|
||
|
||
// Deep clone
|
||
|
||
}, {
|
||
key: 'clone',
|
||
value: function clone() {
|
||
var blockClones = this.blocks.map(function (v) {
|
||
return v.clone();
|
||
});
|
||
|
||
return new this.constructor(this.options, blockClones);
|
||
}
|
||
|
||
// Get a specific block
|
||
|
||
}, {
|
||
key: 'getBlock',
|
||
value: function getBlock(blockType) {
|
||
var filtered = this.blocks.filter(function (b) {
|
||
return b instanceof blockType;
|
||
});
|
||
|
||
return filtered[0];
|
||
}
|
||
}]);
|
||
|
||
return _class29;
|
||
}(cls.BaseBuilder);
|
||
|
||
// SELECT query builder.
|
||
cls.Select = function (_cls$QueryBuilder) {
|
||
_inherits(_class30, _cls$QueryBuilder);
|
||
|
||
function _class30(options) {
|
||
var blocks = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;
|
||
|
||
_classCallCheck(this, _class30);
|
||
|
||
blocks = blocks || [new cls.StringBlock(options, 'SELECT'), new cls.FunctionBlock(options), new cls.DistinctBlock(options), new cls.GetFieldBlock(options), new cls.FromTableBlock(options), new cls.JoinBlock(options), new cls.WhereBlock(options), new cls.GroupByBlock(options), new cls.HavingBlock(options), new cls.OrderByBlock(options), new cls.LimitBlock(options), new cls.OffsetBlock(options), new cls.UnionBlock(options)];
|
||
|
||
return _possibleConstructorReturn(this, (_class30.__proto__ || Object.getPrototypeOf(_class30)).call(this, options, blocks));
|
||
}
|
||
|
||
return _class30;
|
||
}(cls.QueryBuilder);
|
||
|
||
// UPDATE query builder.
|
||
cls.Update = function (_cls$QueryBuilder2) {
|
||
_inherits(_class31, _cls$QueryBuilder2);
|
||
|
||
function _class31(options) {
|
||
var blocks = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;
|
||
|
||
_classCallCheck(this, _class31);
|
||
|
||
blocks = blocks || [new cls.StringBlock(options, 'UPDATE'), new cls.UpdateTableBlock(options), new cls.SetFieldBlock(options), new cls.WhereBlock(options), new cls.OrderByBlock(options), new cls.LimitBlock(options)];
|
||
|
||
return _possibleConstructorReturn(this, (_class31.__proto__ || Object.getPrototypeOf(_class31)).call(this, options, blocks));
|
||
}
|
||
|
||
return _class31;
|
||
}(cls.QueryBuilder);
|
||
|
||
// DELETE query builder.
|
||
cls.Delete = function (_cls$QueryBuilder3) {
|
||
_inherits(_class32, _cls$QueryBuilder3);
|
||
|
||
function _class32(options) {
|
||
var blocks = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;
|
||
|
||
_classCallCheck(this, _class32);
|
||
|
||
blocks = blocks || [new cls.StringBlock(options, 'DELETE'), new cls.TargetTableBlock(options), new cls.FromTableBlock(_extend({}, options, {
|
||
singleTable: true
|
||
})), new cls.JoinBlock(options), new cls.WhereBlock(options), new cls.OrderByBlock(options), new cls.LimitBlock(options)];
|
||
|
||
return _possibleConstructorReturn(this, (_class32.__proto__ || Object.getPrototypeOf(_class32)).call(this, options, blocks));
|
||
}
|
||
|
||
return _class32;
|
||
}(cls.QueryBuilder);
|
||
|
||
// An INSERT query builder.
|
||
cls.Insert = function (_cls$QueryBuilder4) {
|
||
_inherits(_class33, _cls$QueryBuilder4);
|
||
|
||
function _class33(options) {
|
||
var blocks = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;
|
||
|
||
_classCallCheck(this, _class33);
|
||
|
||
blocks = blocks || [new cls.StringBlock(options, 'INSERT'), new cls.IntoTableBlock(options), new cls.InsertFieldValueBlock(options), new cls.InsertFieldsFromQueryBlock(options)];
|
||
|
||
return _possibleConstructorReturn(this, (_class33.__proto__ || Object.getPrototypeOf(_class33)).call(this, options, blocks));
|
||
}
|
||
|
||
return _class33;
|
||
}(cls.QueryBuilder);
|
||
|
||
var _squel = {
|
||
VERSION: '5.13.1',
|
||
flavour: flavour,
|
||
expr: function expr(options) {
|
||
return new cls.Expression(options);
|
||
},
|
||
_case: function _case(name, options) {
|
||
return new cls.Case(name, options);
|
||
},
|
||
select: function select(options, blocks) {
|
||
return new cls.Select(options, blocks);
|
||
},
|
||
update: function update(options, blocks) {
|
||
return new cls.Update(options, blocks);
|
||
},
|
||
insert: function insert(options, blocks) {
|
||
return new cls.Insert(options, blocks);
|
||
},
|
||
_delete: function _delete(options, blocks) {
|
||
return new cls.Delete(options, blocks);
|
||
},
|
||
str: function str() {
|
||
var inst = new cls.FunctionBlock();
|
||
inst['function'].apply(inst, arguments);
|
||
return inst;
|
||
},
|
||
rstr: function rstr() {
|
||
var inst = new cls.FunctionBlock({
|
||
rawNesting: true
|
||
});
|
||
inst['function'].apply(inst, arguments);
|
||
return inst;
|
||
},
|
||
registerValueHandler: cls.registerValueHandler
|
||
};
|
||
|
||
// aliases
|
||
_squel.remove = _squel._delete;
|
||
|
||
// classes
|
||
_squel.cls = cls;
|
||
|
||
return _squel;
|
||
}
|
||
|
||
/**
|
||
# ---------------------------------------------------------------------------------------------------------
|
||
# ---------------------------------------------------------------------------------------------------------
|
||
# Exported instance (and for use by flavour definitions further down).
|
||
# ---------------------------------------------------------------------------------------------------------
|
||
# ---------------------------------------------------------------------------------------------------------
|
||
*/
|
||
|
||
var squel = _buildSquel();
|
||
|
||
/**
|
||
# ---------------------------------------------------------------------------------------------------------
|
||
# ---------------------------------------------------------------------------------------------------------
|
||
# Squel SQL flavours
|
||
# ---------------------------------------------------------------------------------------------------------
|
||
# ---------------------------------------------------------------------------------------------------------
|
||
*/
|
||
|
||
// Available flavours
|
||
squel.flavours = {};
|
||
|
||
// Setup Squel for a particular SQL flavour
|
||
squel.useFlavour = function () {
|
||
var flavour = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;
|
||
|
||
if (!flavour) {
|
||
return squel;
|
||
}
|
||
|
||
if (squel.flavours[flavour] instanceof Function) {
|
||
var s = _buildSquel(flavour);
|
||
|
||
squel.flavours[flavour].call(null, s);
|
||
|
||
// add in flavour methods
|
||
s.flavours = squel.flavours;
|
||
s.useFlavour = squel.useFlavour;
|
||
|
||
return s;
|
||
} else {
|
||
throw new Error('Flavour not available: ' + flavour);
|
||
}
|
||
};
|
||
return squel;
|
||
}));
|