json-sql
Advanced tools
Comparing version 0.3.5 to 0.3.6
'use strict'; | ||
var _ = require('underscore'); | ||
var ValuesStore = require('../../valuesStore'); | ||
var ValuesStore = require('../../utils/valuesStore'); | ||
@@ -344,2 +344,3 @@ var templatesInit = require('./templates'); | ||
} else { | ||
if (self.blocks.has(type + ':' + block)) block = type + ':' + block; | ||
return self.buildBlock(block, params) + space; | ||
@@ -346,0 +347,0 @@ } |
'use strict'; | ||
var _ = require('underscore'); | ||
var templateChecks = require('../../utils/templateChecks'); | ||
@@ -14,4 +15,4 @@ module.exports = function(dialect) { | ||
validate: function(type, params) { | ||
checkRequiredProp(type, params, 'queryBody'); | ||
checkPropType(type, params, 'queryBody', 'object'); | ||
templateChecks.requiredProp(type, params, 'queryBody'); | ||
templateChecks.propType(type, params, 'queryBody', 'object'); | ||
} | ||
@@ -24,4 +25,4 @@ }); | ||
validate: function(type, params) { | ||
checkRequiredProp(type, params, 'queryBody'); | ||
checkPropType(type, params, 'queryBody', 'object'); | ||
templateChecks.requiredProp(type, params, 'queryBody'); | ||
templateChecks.propType(type, params, 'queryBody', 'object'); | ||
} | ||
@@ -34,15 +35,15 @@ }); | ||
validate: function(type, params) { | ||
checkOnlyOneOfProps(type, params, ['with', 'withRecursive']); | ||
checkPropType(type, params, 'with', 'object'); | ||
checkPropType(type, params, 'withRecursive', 'object'); | ||
templateChecks.onlyOneOfProps(type, params, ['with', 'withRecursive']); | ||
templateChecks.propType(type, params, 'with', 'object'); | ||
templateChecks.propType(type, params, 'withRecursive', 'object'); | ||
checkRequiredProp(type, params, 'queries'); | ||
checkPropType(type, params, 'queries', 'array'); | ||
checkMinPropLength(type, params, 'queries', 2); | ||
templateChecks.requiredProp(type, params, 'queries'); | ||
templateChecks.propType(type, params, 'queries', 'array'); | ||
templateChecks.minPropLength(type, params, 'queries', 2); | ||
checkPropType(type, params, 'sort', ['string', 'array', 'object']); | ||
templateChecks.propType(type, params, 'sort', ['string', 'array', 'object']); | ||
checkPropType(type, params, 'limit', ['number', 'string']); | ||
templateChecks.propType(type, params, 'limit', ['number', 'string']); | ||
checkPropType(type, params, 'offset', ['number', 'string']); | ||
templateChecks.propType(type, params, 'offset', ['number', 'string']); | ||
} | ||
@@ -55,9 +56,9 @@ }); | ||
validate: function(type, params) { | ||
checkRequiredProp('values', params, 'fields'); | ||
checkPropType('values', params, 'fields', 'array'); | ||
checkMinPropLength('values', params, 'fields', 1); | ||
templateChecks.requiredProp('values', params, 'fields'); | ||
templateChecks.propType('values', params, 'fields', 'array'); | ||
templateChecks.minPropLength('values', params, 'fields', 1); | ||
checkRequiredProp('values', params, 'fieldValues'); | ||
checkPropType('values', params, 'fieldValues', 'array'); | ||
checkMinPropLength('values', params, 'fieldValues', 1); | ||
templateChecks.requiredProp('values', params, 'fieldValues'); | ||
templateChecks.propType('values', params, 'fieldValues', 'array'); | ||
templateChecks.minPropLength('values', params, 'fieldValues', 1); | ||
} | ||
@@ -70,4 +71,4 @@ }); | ||
validate: function(type, params) { | ||
checkPropType('join', params, 'type', 'string'); | ||
checkCustomProp('join', params, 'type', function(value) { | ||
templateChecks.propType('join', params, 'type', 'string'); | ||
templateChecks.customProp('join', params, 'type', function(value) { | ||
var splitType = _(value.toLowerCase().split(' ')).compact(); | ||
@@ -77,13 +78,13 @@ return !_.difference(splitType, availableJoinTypes).length; | ||
checkAtLeastOneOfProps('join', params, ['table', 'query', 'select', 'expression']); | ||
checkOnlyOneOfProps('join', params, ['table', 'query', 'select', 'expression']); | ||
templateChecks.atLeastOneOfProps('join', params, ['table', 'query', 'select', 'expression']); | ||
templateChecks.onlyOneOfProps('join', params, ['table', 'query', 'select', 'expression']); | ||
checkPropType('join', params, 'table', 'string'); | ||
checkPropType('join', params, 'query', 'object'); | ||
checkPropType('join', params, 'select', 'object'); | ||
checkPropType('join', params, 'expression', ['string', 'object']); | ||
templateChecks.propType('join', params, 'table', 'string'); | ||
templateChecks.propType('join', params, 'query', 'object'); | ||
templateChecks.propType('join', params, 'select', 'object'); | ||
templateChecks.propType('join', params, 'expression', ['string', 'object']); | ||
checkPropType('join', params, 'alias', ['string', 'object']); | ||
templateChecks.propType('join', params, 'alias', ['string', 'object']); | ||
checkPropType('join', params, 'on', ['array', 'object']); | ||
templateChecks.propType('join', params, 'on', ['array', 'object']); | ||
} | ||
@@ -96,13 +97,13 @@ }); | ||
validate: function(type, params) { | ||
checkRequiredProp('with', params, 'name'); | ||
checkPropType('with', params, 'name', 'string'); | ||
templateChecks.requiredProp('with', params, 'name'); | ||
templateChecks.propType('with', params, 'name', 'string'); | ||
checkPropType(type, params, 'fields', ['array', 'object']); | ||
templateChecks.propType(type, params, 'fields', ['array', 'object']); | ||
checkAtLeastOneOfProps('with', params, ['query', 'select', 'expression']); | ||
checkOnlyOneOfProps('with', params, ['query', 'select', 'expression']); | ||
templateChecks.atLeastOneOfProps('with', params, ['query', 'select', 'expression']); | ||
templateChecks.onlyOneOfProps('with', params, ['query', 'select', 'expression']); | ||
checkPropType('with', params, 'query', 'object'); | ||
checkPropType('with', params, 'select', 'object'); | ||
checkPropType('with', params, 'expression', ['string', 'object']); | ||
templateChecks.propType('with', params, 'query', 'object'); | ||
templateChecks.propType('with', params, 'select', 'object'); | ||
templateChecks.propType('with', params, 'expression', ['string', 'object']); | ||
} | ||
@@ -115,11 +116,11 @@ }); | ||
validate: function(type, params) { | ||
checkAtLeastOneOfProps('from', params, ['table', 'query', 'select', 'expression']); | ||
checkOnlyOneOfProps('from', params, ['table', 'query', 'select', 'expression']); | ||
templateChecks.atLeastOneOfProps('from', params, ['table', 'query', 'select', 'expression']); | ||
templateChecks.onlyOneOfProps('from', params, ['table', 'query', 'select', 'expression']); | ||
checkPropType('from', params, 'table', 'string'); | ||
checkPropType('from', params, 'query', 'object'); | ||
checkPropType('from', params, 'select', 'object'); | ||
checkPropType('from', params, 'expression', ['string', 'object']); | ||
templateChecks.propType('from', params, 'table', 'string'); | ||
templateChecks.propType('from', params, 'query', 'object'); | ||
templateChecks.propType('from', params, 'select', 'object'); | ||
templateChecks.propType('from', params, 'expression', ['string', 'object']); | ||
checkPropType('from', params, 'alias', ['string', 'object']); | ||
templateChecks.propType('from', params, 'alias', ['string', 'object']); | ||
} | ||
@@ -139,33 +140,33 @@ }); | ||
validate: function(type, params) { | ||
checkOnlyOneOfProps(type, params, ['with', 'withRecursive']); | ||
checkPropType(type, params, 'with', 'object'); | ||
checkPropType(type, params, 'withRecursive', 'object'); | ||
templateChecks.onlyOneOfProps(type, params, ['with', 'withRecursive']); | ||
templateChecks.propType(type, params, 'with', 'object'); | ||
templateChecks.propType(type, params, 'withRecursive', 'object'); | ||
checkPropType(type, params, 'distinct', 'boolean'); | ||
templateChecks.propType(type, params, 'distinct', 'boolean'); | ||
checkPropType(type, params, 'fields', ['array', 'object']); | ||
templateChecks.propType(type, params, 'fields', ['array', 'object']); | ||
checkPropType(type, params, 'from', ['string', 'array', 'object']); | ||
templateChecks.propType(type, params, 'from', ['string', 'array', 'object']); | ||
checkAtLeastOneOfProps(type, params, ['table', 'query', 'select', 'expression']); | ||
checkOnlyOneOfProps(type, params, ['table', 'query', 'select', 'expression']); | ||
templateChecks.atLeastOneOfProps(type, params, ['table', 'query', 'select', 'expression']); | ||
templateChecks.onlyOneOfProps(type, params, ['table', 'query', 'select', 'expression']); | ||
checkPropType(type, params, 'table', 'string'); | ||
checkPropType(type, params, 'query', 'object'); | ||
checkPropType(type, params, 'select', 'object'); | ||
checkPropType(type, params, 'expression', ['string', 'object']); | ||
templateChecks.propType(type, params, 'table', 'string'); | ||
templateChecks.propType(type, params, 'query', 'object'); | ||
templateChecks.propType(type, params, 'select', 'object'); | ||
templateChecks.propType(type, params, 'expression', ['string', 'object']); | ||
checkPropType(type, params, 'alias', ['string', 'object']); | ||
templateChecks.propType(type, params, 'alias', ['string', 'object']); | ||
checkPropType(type, params, 'join', ['array', 'object']); | ||
templateChecks.propType(type, params, 'join', ['array', 'object']); | ||
checkPropType(type, params, 'condition', ['array', 'object']); | ||
templateChecks.propType(type, params, 'condition', ['array', 'object']); | ||
checkPropType(type, params, 'group', ['string', 'array']); | ||
templateChecks.propType(type, params, 'group', ['string', 'array']); | ||
checkPropType(type, params, 'sort', ['string', 'array', 'object']); | ||
templateChecks.propType(type, params, 'sort', ['string', 'array', 'object']); | ||
checkPropType(type, params, 'limit', ['number', 'string']); | ||
templateChecks.propType(type, params, 'limit', ['number', 'string']); | ||
checkPropType(type, params, 'offset', ['number', 'string']); | ||
templateChecks.propType(type, params, 'offset', ['number', 'string']); | ||
} | ||
@@ -178,18 +179,18 @@ }); | ||
validate: function(type, params) { | ||
checkOnlyOneOfProps(type, params, ['with', 'withRecursive']); | ||
checkPropType(type, params, 'with', 'object'); | ||
checkPropType(type, params, 'withRecursive', 'object'); | ||
templateChecks.onlyOneOfProps(type, params, ['with', 'withRecursive']); | ||
templateChecks.propType(type, params, 'with', 'object'); | ||
templateChecks.propType(type, params, 'withRecursive', 'object'); | ||
checkPropType(type, params, 'or', 'string'); | ||
checkPropMatch(type, params, 'or', orRegExp); | ||
templateChecks.propType(type, params, 'or', 'string'); | ||
templateChecks.propMatch(type, params, 'or', orRegExp); | ||
checkRequiredProp(type, params, 'table'); | ||
checkPropType(type, params, 'table', 'string'); | ||
templateChecks.requiredProp(type, params, 'table'); | ||
templateChecks.propType(type, params, 'table', 'string'); | ||
checkRequiredProp(type, params, 'values'); | ||
checkPropType(type, params, 'values', ['array', 'object']); | ||
templateChecks.requiredProp(type, params, 'values'); | ||
templateChecks.propType(type, params, 'values', ['array', 'object']); | ||
checkPropType(type, params, 'condition', ['array', 'object']); | ||
templateChecks.propType(type, params, 'condition', ['array', 'object']); | ||
checkPropType(type, params, 'returning', ['array', 'object']); | ||
templateChecks.propType(type, params, 'returning', ['array', 'object']); | ||
} | ||
@@ -202,18 +203,18 @@ }); | ||
validate: function(type, params) { | ||
checkOnlyOneOfProps(type, params, ['with', 'withRecursive']); | ||
checkPropType(type, params, 'with', 'object'); | ||
checkPropType(type, params, 'withRecursive', 'object'); | ||
templateChecks.onlyOneOfProps(type, params, ['with', 'withRecursive']); | ||
templateChecks.propType(type, params, 'with', 'object'); | ||
templateChecks.propType(type, params, 'withRecursive', 'object'); | ||
checkPropType(type, params, 'or', 'string'); | ||
checkPropMatch(type, params, 'or', orRegExp); | ||
templateChecks.propType(type, params, 'or', 'string'); | ||
templateChecks.propMatch(type, params, 'or', orRegExp); | ||
checkRequiredProp(type, params, 'table'); | ||
checkPropType(type, params, 'table', 'string'); | ||
templateChecks.requiredProp(type, params, 'table'); | ||
templateChecks.propType(type, params, 'table', 'string'); | ||
checkRequiredProp(type, params, 'modifier'); | ||
checkPropType(type, params, 'modifier', 'object'); | ||
templateChecks.requiredProp(type, params, 'modifier'); | ||
templateChecks.propType(type, params, 'modifier', 'object'); | ||
checkPropType(type, params, 'condition', ['array', 'object']); | ||
templateChecks.propType(type, params, 'condition', ['array', 'object']); | ||
checkPropType(type, params, 'returning', ['array', 'object']); | ||
templateChecks.propType(type, params, 'returning', ['array', 'object']); | ||
} | ||
@@ -226,12 +227,12 @@ }); | ||
validate: function(type, params) { | ||
checkOnlyOneOfProps(type, params, ['with', 'withRecursive']); | ||
checkPropType(type, params, 'with', 'object'); | ||
checkPropType(type, params, 'withRecursive', 'object'); | ||
templateChecks.onlyOneOfProps(type, params, ['with', 'withRecursive']); | ||
templateChecks.propType(type, params, 'with', 'object'); | ||
templateChecks.propType(type, params, 'withRecursive', 'object'); | ||
checkRequiredProp(type, params, 'table'); | ||
checkPropType(type, params, 'table', 'string'); | ||
templateChecks.requiredProp(type, params, 'table'); | ||
templateChecks.propType(type, params, 'table', 'string'); | ||
checkPropType(type, params, 'condition', ['array', 'object']); | ||
templateChecks.propType(type, params, 'condition', ['array', 'object']); | ||
checkPropType(type, params, 'returning', ['array', 'object']); | ||
templateChecks.propType(type, params, 'returning', ['array', 'object']); | ||
} | ||
@@ -248,74 +249,2 @@ }); | ||
dialect.templates.add('except', dialect.templates.get('queriesCombination')); | ||
// validation helpers | ||
function checkRequiredProp(type, params, propName) { | ||
if (_.isUndefined(params[propName])) { | ||
throw new Error('`' + propName + '` property is not set in `' + type + '` clause'); | ||
} | ||
} | ||
function checkAtLeastOneOfProps(type, params, expectedPropNames) { | ||
var propNames = _(params).chain().keys().intersection(expectedPropNames).value(); | ||
if (!propNames.length) { | ||
throw new Error('Neither `' + expectedPropNames.join('`, `') + | ||
'` properties are not set in `' + type + '` clause'); | ||
} | ||
} | ||
function checkOnlyOneOfProps(type, params, expectedPropNames) { | ||
var propNames = _(params).chain().keys().intersection(expectedPropNames).value(); | ||
if (propNames.length > 1) { | ||
throw new Error('Wrong using `' + propNames.join('`, `') + '` properties together in `' + | ||
type + '` clause'); | ||
} | ||
} | ||
function checkPropType(type, params, propName, expectedTypes) { | ||
if (_.isUndefined(params[propName])) return; | ||
var propValue = params[propName]; | ||
if (!_.isArray(expectedTypes)) expectedTypes = [expectedTypes]; | ||
var hasSomeType = _(expectedTypes).some(function(expectedType) { | ||
return _['is' + expectedType.charAt(0).toUpperCase() + expectedType.slice(1)](propValue); | ||
}); | ||
if (!hasSomeType) { | ||
throw new Error('`' + propName + '` property should have ' + | ||
(expectedTypes.length > 1 ? 'one of expected types:' : 'type') + | ||
' "' + expectedTypes.join('", "') + '" in `' + type + '` clause'); | ||
} | ||
} | ||
function checkMinPropLength(type, params, propName, length) { | ||
if (_.isUndefined(params[propName])) return; | ||
if (params[propName].length < length) { | ||
throw new Error('`' + propName + '` property should not have length less than ' + length + | ||
' in `' + type + '` clause'); | ||
} | ||
} | ||
function checkPropMatch(type, params, propName, regExp) { | ||
if (_.isUndefined(params[propName])) return; | ||
if (!params[propName].match(regExp)) { | ||
throw new Error('Invalid `' + propName + '` property value "' + params[propName] + '" in `' + | ||
type + '` clause'); | ||
} | ||
} | ||
function checkCustomProp(type, params, propName, fn) { | ||
if (_.isUndefined(params[propName])) return; | ||
if (!fn(params[propName])) { | ||
throw new Error('Invalid `' + propName + '` property value "' + params[propName] + '" in `' + | ||
type + '` clause'); | ||
} | ||
} | ||
}; |
@@ -23,2 +23,23 @@ 'use strict'; | ||
}); | ||
dialect.blocks.add('explain:options', function(params) { | ||
return '(' + | ||
_(params.options) | ||
.chain() | ||
.pick(['analyze', 'verbose', 'costs', 'buffers', 'timing', 'format']) | ||
.map(function(value, key) { | ||
return key + ' ' + value; | ||
}) | ||
.value() | ||
.join(', ') + | ||
')'; | ||
}); | ||
dialect.blocks.add('explain:analyze', function() { | ||
return 'analyze'; | ||
}); | ||
dialect.blocks.add('explain:verbose', function() { | ||
return 'verbose'; | ||
}); | ||
}; |
@@ -7,2 +7,3 @@ 'use strict'; | ||
var templatesInit = require('./templates'); | ||
var blocksInit = require('./blocks'); | ||
@@ -14,2 +15,5 @@ var operatorsInit = require('./operators'); | ||
// init templates | ||
templatesInit(this); | ||
// init blocks | ||
@@ -16,0 +20,0 @@ blocksInit(this); |
{ | ||
"name": "json-sql", | ||
"description": "node.js json to sql queries mapper", | ||
"version": "0.3.5", | ||
"version": "0.3.6", | ||
"author": "Artem Zhukov <artzhuchka@gmail.com>", | ||
@@ -6,0 +6,0 @@ "repository": { |
55821
28
1501