Comparing version 2.0.6 to 2.0.7
@@ -219,3 +219,3 @@ var schemaUtil = require(__dirname+'/schema.js'); | ||
Document.prototype.validateAll = function(options, modelToValidate) { | ||
var validateAll = (modelToValidate === undefined) ? true: false; | ||
var validateAll = modelToValidate === undefined; | ||
modelToValidate = modelToValidate || {}; | ||
@@ -269,39 +269,44 @@ | ||
if (util.recurse(key, joins, modelToValidate, validateAll, validatedModel)) { | ||
if (((joins[key].type === 'hasOne') || (joins[key].type === 'belongsTo'))) { | ||
if (util.isPlainObject(self[key])) { | ||
if (self[key] instanceof Document === false) { | ||
self[key] = new self._getModel()._joins[key].model(self[key]); | ||
switch (joins[key].type) { | ||
case 'hasOne': | ||
case 'belongsTo': | ||
if (util.isPlainObject(self[key])) { | ||
if (self[key] instanceof Document === false) { | ||
self[key] = new self._getModel()._joins[key].model(self[key]); | ||
} | ||
// We do not propagate the options of this document, but only those given to validate | ||
var promise = self[key].validate(options, modelToValidate[key], validateAll, validatedModel, prefix+'['+key+']'); | ||
if (promise instanceof Promise) { | ||
promises.push(promise); | ||
promise = null; | ||
} | ||
} | ||
// We do not propagate the options of this document, but only those given to validate | ||
var promise = self[key].validate(options, modelToValidate[key], validateAll, validatedModel, prefix+'['+key+']'); | ||
if (promise instanceof Promise) { | ||
promises.push(promise); | ||
promise = null; | ||
else if (self[key] != null) { | ||
throw new Errors.ValidationError("Joined field "+prefix+"["+key+"] should be `undefined`, `null` or an `Object`") | ||
} | ||
} | ||
else if (self[key] != null) { | ||
throw new Errors.ValidationError("Joined field "+prefix+"["+key+"] should be `undefined`, `null` or an `Object`") | ||
} | ||
} | ||
else if (((joins[key].type === 'hasMany') || (joins[key].type === 'hasAndBelongsToMany'))) { | ||
if (Array.isArray(self[key])) { | ||
for(var i=0; i<self[key].length; i++) { | ||
if (util.isPlainObject(self[key][i])) { | ||
if (self[key][i] instanceof Document === false) { | ||
self[key][i] = new self._getModel()._joins[key].model(self[key][i]); | ||
break; | ||
case 'hasMany': | ||
case 'hasAndBelongsToMany': | ||
if (Array.isArray(self[key])) { | ||
for(var i=0; i<self[key].length; i++) { | ||
if (util.isPlainObject(self[key][i])) { | ||
if (self[key][i] instanceof Document === false) { | ||
self[key][i] = new self._getModel()._joins[key].model(self[key][i]); | ||
} | ||
promise = self[key][i].validate(options, modelToValidate[key], validateAll, validatedModel, prefix+'['+key+']['+i+']'); | ||
if (promise instanceof Promise) { | ||
promises.push(promise); | ||
promise = null; | ||
} | ||
} | ||
promise = self[key][i].validate(options, modelToValidate[key], validateAll, validatedModel, prefix+'['+key+']['+i+']'); | ||
if (promise instanceof Promise) { | ||
promises.push(promise); | ||
promise = null; | ||
else { | ||
throw new Errors.ValidationError("Joined field "+prefix+"["+key+"]["+i+"] should be `undefined`, `null` or an `Array`") | ||
} | ||
} | ||
else { | ||
throw new Errors.ValidationError("Joined field "+prefix+"["+key+"]["+i+"] should be `undefined`, `null` or an `Array`") | ||
} | ||
} | ||
} | ||
else if (self[key] != null) { | ||
throw new Errors.ValidationError("Joined field "+prefix+"["+key+"] should be `undefined`, `null` or an `Array`") | ||
} | ||
else if (self[key] != null) { | ||
throw new Errors.ValidationError("Joined field "+prefix+"["+key+"] should be `undefined`, `null` or an `Array`") | ||
} | ||
break; | ||
} | ||
@@ -393,3 +398,3 @@ } | ||
else { | ||
saveAll = (docToSave === undefined) ? true: false; | ||
saveAll = docToSave === undefined; | ||
docToSave = docToSave || {}; | ||
@@ -817,28 +822,27 @@ } | ||
if (result.first_error != null) { | ||
reject(new Error(result.first_error)); | ||
return reject(new Error(result.first_error)); | ||
} | ||
else { | ||
util.tryCatch(function() { // Validate the doc, replace it, and tag it as saved | ||
if (Array.isArray(result.changes) && result.changes.length > 0) { | ||
self._merge(result.changes[0].new_val); | ||
self._setOldValue(util.deepCopy(result.changes[0].old_val)); | ||
} | ||
if (self._getModel().needToGenerateFields === true) { | ||
self._generateDefault(); | ||
} | ||
self.setSaved(); | ||
self.emit('saved', self); | ||
util.tryCatch(function() { // Validate the doc, replace it, and tag it as saved | ||
if (Array.isArray(result.changes) && result.changes.length > 0) { | ||
self._merge(result.changes[0].new_val); | ||
self._setOldValue(util.deepCopy(result.changes[0].old_val)); | ||
} | ||
var promise = self.validate(); | ||
if (promise instanceof Promise) { | ||
promise.then(function() { | ||
self._saveMany(docToSave, saveAll, savedModel, resolve, reject) | ||
}).error(reject); | ||
} | ||
else { | ||
if (self._getModel().needToGenerateFields === true) { | ||
self._generateDefault(); | ||
} | ||
self.setSaved(); | ||
self.emit('saved', self); | ||
var promise = self.validate(); | ||
if (promise instanceof Promise) { | ||
promise.then(function() { | ||
self._saveMany(docToSave, saveAll, savedModel, resolve, reject) | ||
} | ||
}, reject); | ||
} | ||
}).error(reject); | ||
} | ||
else { | ||
self._saveMany(docToSave, saveAll, savedModel, resolve, reject) | ||
} | ||
}, reject); | ||
} | ||
@@ -923,3 +927,3 @@ | ||
self.__proto__._hasMany[key] = []; | ||
for(var i=0; i<self[key].length; i++) { | ||
@@ -1071,3 +1075,3 @@ self[key][i][joins[key].rightKey] = self[joins[key].leftKey]; | ||
} | ||
(function(key, link) { | ||
@@ -1156,31 +1160,36 @@ promisesLink.push(new Promise(function(resolve, reject) { | ||
self.__proto__._saved = true; | ||
if (all === true) { | ||
if (all !== true) return; | ||
util.loopKeys(self._getModel()._joins, function(joins, key) { | ||
if (joins[key].type === 'hasOne') { | ||
if (self[key] instanceof Document) { | ||
self[key].setSaved(true); | ||
} | ||
} | ||
else if (joins[key].type === 'belongsTo') { | ||
if (self[key] instanceof Document) { | ||
self[key].setSaved(true); | ||
} | ||
} | ||
else if (joins[key].type === 'hasMany') { | ||
if (Array.isArray(self[key])) { | ||
for(var i=0; i<self[key].length; i++) { | ||
if (self[key][i] instanceof Document) { | ||
self[key][i].setSaved(true); | ||
switch (joins[key].type) { | ||
case 'hasOne': | ||
if (self[key] instanceof Document) { | ||
self[key].setSaved(true); | ||
} | ||
break; | ||
case 'belongsTo': | ||
if (self[key] instanceof Document) { | ||
self[key].setSaved(true); | ||
} | ||
break; | ||
case 'hasMany': | ||
if (Array.isArray(self[key])) { | ||
for(var i=0; i<self[key].length; i++) { | ||
if (self[key][i] instanceof Document) { | ||
self[key][i].setSaved(true); | ||
} | ||
} | ||
} | ||
} | ||
} | ||
else if (joins[key].type === 'hasAndBelongsToMany') { | ||
if (Array.isArray(self[key])) { | ||
for(var i=0; i<self[key].length; i++) { | ||
if (self[key][i] instanceof Document) { | ||
self[key][i].setSaved(true); | ||
break; | ||
case 'hasAndBelongsToMany': | ||
if (Array.isArray(self[key])) { | ||
for(var i=0; i<self[key].length; i++) { | ||
if (self[key][i] instanceof Document) { | ||
self[key][i].setSaved(true); | ||
} | ||
} | ||
} | ||
} | ||
break; | ||
} | ||
@@ -1191,4 +1200,5 @@ }); | ||
util.loopKeys(self._getModel()._joins, function(joins, key) { | ||
if (self[key] != null) { | ||
if (joins[key].type === 'hasOne') { | ||
if (self[key] == null) return; | ||
switch (joins[key].type) { | ||
case 'hasOne': | ||
if (self[key].isSaved()) { | ||
@@ -1208,4 +1218,5 @@ self.__proto__._hasOne[key] = { | ||
}); | ||
} | ||
else if (joins[key].type === 'belongsTo') { | ||
break; | ||
case 'belongsTo': | ||
if (self[key].__proto__._parents._belongsTo[self._getModel()._name] == null) { | ||
@@ -1220,4 +1231,5 @@ self[key].__proto__._parents._belongsTo[self._getModel()._name] = []; | ||
self.__proto__._belongsTo[key] = true; | ||
} | ||
else if (joins[key].type === 'hasMany') { | ||
break; | ||
case 'hasMany': | ||
self.__proto__._hasMany[key] = [] | ||
@@ -1242,4 +1254,5 @@ | ||
} | ||
} | ||
else if (joins[key].type === 'hasAndBelongsToMany') { | ||
break; | ||
case 'hasAndBelongsToMany': | ||
if (self.__proto__._links[self._getModel()._joins[key].link] === undefined) { | ||
@@ -1263,8 +1276,6 @@ self.__proto__._links[self._getModel()._joins[key].link] = {} | ||
} | ||
} | ||
break; | ||
} | ||
}); | ||
} | ||
} | ||
@@ -1299,3 +1310,3 @@ | ||
* It will also update the joined documents by removing the foreign key for | ||
* `hasOne`/`hasMany` joined documents, and remove the links for | ||
* `hasOne`/`hasMany` joined documents, and remove the links for | ||
* `hasAndBelongsToMany` joined documents if the link is built on the primary | ||
@@ -1316,3 +1327,3 @@ * key. | ||
else { | ||
deleteAll = (docToDelete === undefined) ? true: false; | ||
deleteAll = docToDelete === undefined; | ||
docToDelete = docToDelete || {}; | ||
@@ -1464,3 +1475,3 @@ } | ||
docsToDelete.push(self[key][i]); | ||
// We are going to do a range delete, but we still have to recurse | ||
// We are going to do a range delete, but we still have to recurse | ||
promises.push(self[key][i]._delete(docToDelete[key], deleteAll, deletedDocs, true, false)) | ||
@@ -1556,3 +1567,3 @@ | ||
}).error(function(error) { | ||
reject(error) | ||
reject(error) | ||
}); | ||
@@ -1559,0 +1570,0 @@ }) |
@@ -103,25 +103,25 @@ var Promise = require('bluebird'); | ||
} | ||
return; | ||
} | ||
else { | ||
util.tryCatch(function() { | ||
if (data.new_val !== null) { | ||
self.model._parse(data.new_val).then(function(doc) { | ||
doc._setOldValue(data.old_val); | ||
self._eventEmitter.emit('data', doc); | ||
}).error(function(err) { | ||
self._eventEmitter.emit('error', err); | ||
}); | ||
} | ||
else if (data.old_val !== null) { // new_val is null | ||
self.model._parse(data.old_val).then(function(doc) { | ||
doc._setUnSaved(); | ||
self._eventEmitter.emit('data', doc); | ||
}).error(function(err) { | ||
self._eventEmitter.emit('error', err); | ||
}); | ||
} | ||
}, function(err) { | ||
self._eventEmitter.emit('error', err); | ||
}) | ||
} | ||
util.tryCatch(function() { | ||
if (data.new_val !== null) { | ||
self.model._parse(data.new_val).then(function(doc) { | ||
doc._setOldValue(data.old_val); | ||
self._eventEmitter.emit('data', doc); | ||
}).error(function(err) { | ||
self._eventEmitter.emit('error', err); | ||
}); | ||
} | ||
else if (data.old_val !== null) { // new_val is null | ||
self.model._parse(data.old_val).then(function(doc) { | ||
doc._setUnSaved(); | ||
self._eventEmitter.emit('data', doc); | ||
}).error(function(err) { | ||
self._eventEmitter.emit('error', err); | ||
}); | ||
} | ||
}, function(err) { | ||
self._eventEmitter.emit('error', err); | ||
}) | ||
} | ||
@@ -128,0 +128,0 @@ |
@@ -266,3 +266,3 @@ var util = require(__dirname+'/util.js'); | ||
r.table(self.getTableName()).indexList().do(function(indexes) { | ||
return r.table(self.getTableName()).indexWait(r.args(indexes)) | ||
return r.table(self.getTableName()).indexWait(r.args(indexes)) | ||
}).run().then(function(indexes) { | ||
@@ -326,3 +326,3 @@ for(var i=0; i<indexes.length; i++) { | ||
).run().then(function(result) { | ||
self._getModel()._indexes[name] = true; | ||
self._getModel()._indexes[name] = true; | ||
self._indexWasCreated('local'); | ||
@@ -521,3 +521,3 @@ | ||
) | ||
if (self._getModel()._tableCreated === true) { | ||
@@ -591,3 +591,3 @@ query.run().then(function(result) { | ||
joinedModel._getModel()._localKeys[rightKey] = true; | ||
options = options || {}; | ||
@@ -896,57 +896,58 @@ if (options.init !== false) { | ||
util.loopKeys(Term, function(Term, key) { | ||
if ((Term.hasOwnProperty(key)) && (key !== 'run') && (key[0] !== '_')) { | ||
(function(key) { | ||
switch (key) { | ||
case 'orderBy': | ||
Model.prototype[key] = function() { | ||
var query = new Query(this); | ||
if ((arguments.length === 1) | ||
&& (typeof arguments[0] === 'string') | ||
&& (this._getModel()._indexes[arguments[0]] === true)) { | ||
if (!Term.hasOwnProperty(key)) return; | ||
if (key === 'run' || key[0] === '_') return; | ||
query = query[key]({index: arguments[0]}); | ||
return query; | ||
} | ||
else { | ||
query = query[key].apply(query, arguments); | ||
(function(key) { | ||
switch (key) { | ||
case 'orderBy': | ||
Model.prototype[key] = function() { | ||
var query = new Query(this); | ||
if ((arguments.length === 1) | ||
&& (typeof arguments[0] === 'string') | ||
&& (this._getModel()._indexes[arguments[0]] === true)) { | ||
query = query[key]({index: arguments[0]}); | ||
return query; | ||
} | ||
} | ||
break; | ||
case 'filter': | ||
Model.prototype[key] = function() { | ||
var query = new Query(this); | ||
if ((arguments.length === 1) | ||
&& (util.isPlainObject(arguments[0]))) { | ||
else { | ||
query = query[key].apply(query, arguments); | ||
return query; | ||
} | ||
} | ||
break; | ||
case 'filter': | ||
Model.prototype[key] = function() { | ||
var query = new Query(this); | ||
if ((arguments.length === 1) | ||
&& (util.isPlainObject(arguments[0]))) { | ||
// Optimize a filter with an object | ||
// We replace the first key that match an index name | ||
var filter = arguments[0]; | ||
// Optimize a filter with an object | ||
// We replace the first key that match an index name | ||
var filter = arguments[0]; | ||
var keys = Object.keys(filter).sort(); // Lexicographical order | ||
for(var i=0 ; i<keys.length; i++) { | ||
var index = keys[i]; | ||
var keys = Object.keys(filter).sort(); // Lexicographical order | ||
for(var i=0 ; i<keys.length; i++) { | ||
var index = keys[i]; | ||
if (this._getModel()._indexes[index] === true) { // Index found | ||
query = query.getAll(filter[index], {index: index}); | ||
delete filter[index]; | ||
break; | ||
} | ||
if (this._getModel()._indexes[index] === true) { // Index found | ||
query = query.getAll(filter[index], {index: index}); | ||
delete filter[index]; | ||
break; | ||
} | ||
} | ||
} | ||
query = query[key].apply(query, arguments); | ||
return query; | ||
} | ||
break; | ||
default: | ||
Model.prototype[key] = function() { | ||
var query = new Query(this); | ||
query = query[key].apply(query, arguments); | ||
return query; | ||
} | ||
query = query[key].apply(query, arguments); | ||
return query; | ||
} | ||
break; | ||
default: | ||
Model.prototype[key] = function() { | ||
var query = new Query(this); | ||
query = query[key].apply(query, arguments); | ||
return query; | ||
} | ||
} | ||
})(key); | ||
} | ||
})(key); | ||
}); | ||
@@ -1128,3 +1129,3 @@ })(); | ||
var newError = new Error("The results could not be converted to instances of `"+self.getTableName()+"`\nDetailed error: "+error.message); | ||
return reject(newError); | ||
@@ -1131,0 +1132,0 @@ }); |
297
lib/query.js
@@ -298,3 +298,3 @@ var Promise = require('bluebird'); | ||
var getAll = (modelToGet === undefined) ? true: false; | ||
var getAll = modelToGet === undefined; | ||
if (util.isPlainObject(modelToGet) === false) { | ||
@@ -310,124 +310,104 @@ modelToGet = {}; | ||
if (util.recurse(key, joins, modelToGet, getAll, gotModel)) { | ||
if (joins[key].type === 'hasOne') { | ||
self._query = self._query.merge(function(doc) { | ||
return r.branch( | ||
doc.hasFields(joins[key].leftKey), | ||
r.table(joins[key].model.getTableName()).getAll(doc(joins[key].leftKey), {index: joins[key].rightKey}).coerceTo("ARRAY").do(function(result) { | ||
innerQuery = new Query(joins[key].model, result.nth(0)); | ||
switch (joins[key].type) { | ||
case 'hasOne': | ||
case 'belongsTo': | ||
self._query = self._query.merge(function(doc) { | ||
return r.branch( | ||
doc.hasFields(joins[key].leftKey), | ||
r.table(joins[key].model.getTableName()).getAll(doc(joins[key].leftKey), {index: joins[key].rightKey}).coerceTo("ARRAY").do(function(result) { | ||
innerQuery = new Query(joins[key].model, result.nth(0)); | ||
if ((modelToGet[key] != null) && (typeof modelToGet[key]._apply === 'function')) { | ||
innerQuery = modelToGet[key]._apply(innerQuery); | ||
} | ||
innerQuery = innerQuery.getJoin(modelToGet[key], getAll, gotModel)._query; | ||
return r.branch( | ||
result.count().eq(1), | ||
r.object(key, innerQuery), | ||
r.branch( | ||
result.count().eq(0), | ||
{}, | ||
r.error(r.expr("More than one element found for ").add(doc.coerceTo("STRING")).add(r.expr("for the field ").add(key))) | ||
if ((modelToGet[key] != null) && (typeof modelToGet[key]._apply === 'function')) { | ||
innerQuery = modelToGet[key]._apply(innerQuery); | ||
} | ||
innerQuery = innerQuery.getJoin(modelToGet[key], getAll, gotModel)._query; | ||
return r.branch( | ||
result.count().eq(1), | ||
r.object(key, innerQuery), | ||
r.branch( | ||
result.count().eq(0), | ||
{}, | ||
r.error(r.expr("More than one element found for ").add(doc.coerceTo("STRING")).add(r.expr("for the field ").add(key))) | ||
) | ||
) | ||
) | ||
}), | ||
{} | ||
) | ||
}); | ||
} | ||
else if (joins[key].type === 'belongsTo') { | ||
self._query = self._query.merge(function(doc) { | ||
return r.branch( | ||
doc.hasFields(joins[key].leftKey), | ||
r.table(joins[key].model.getTableName()).getAll(doc(joins[key].leftKey), {index: joins[key].rightKey}).coerceTo("ARRAY").do(function(result) { | ||
innerQuery = new Query(joins[key].model, result.nth(0)); | ||
}), | ||
{} | ||
) | ||
}); | ||
break; | ||
if ((modelToGet[key] != null) && (typeof modelToGet[key]._apply === 'function')) { | ||
innerQuery = modelToGet[key]._apply(innerQuery); | ||
} | ||
innerQuery = innerQuery.getJoin(modelToGet[key], getAll, gotModel)._query; | ||
return r.branch( | ||
result.count().eq(1), | ||
r.object(key, innerQuery), | ||
r.branch( | ||
result.count().eq(0), | ||
{}, | ||
r.error(r.expr("More than one element found for ").add(doc.coerceTo("STRING")).add(r.expr("for the field ").add(key))) | ||
) | ||
) | ||
}), | ||
{} | ||
) | ||
}); | ||
} | ||
else if (joins[key].type === 'hasMany') { | ||
self._query = self._query.merge(function(doc) { | ||
innerQuery = new Query(joins[key].model, | ||
r.table(joins[key].model.getTableName()) | ||
.getAll(doc(joins[key].leftKey), {index: joins[key].rightKey})) | ||
case 'hasMany': | ||
self._query = self._query.merge(function(doc) { | ||
innerQuery = new Query(joins[key].model, | ||
r.table(joins[key].model.getTableName()) | ||
.getAll(doc(joins[key].leftKey), {index: joins[key].rightKey})) | ||
if ((modelToGet[key] != null) && (typeof modelToGet[key]._apply === 'function')) { | ||
innerQuery = modelToGet[key]._apply(innerQuery); | ||
} | ||
innerQuery = innerQuery.getJoin(modelToGet[key], getAll, gotModel); | ||
if ((modelToGet[key] == null) || (modelToGet[key]._array !== false)) { | ||
innerQuery = innerQuery.coerceTo("ARRAY"); | ||
} | ||
innerQuery = innerQuery._query; | ||
return r.branch( | ||
doc.hasFields(joins[key].leftKey), | ||
r.object(key, innerQuery), | ||
{} | ||
) | ||
}); | ||
} | ||
else if (joins[key].type === 'hasAndBelongsToMany') { | ||
self._query = self._query.merge(function(doc) { | ||
if ((model.getTableName() === joins[key].model.getTableName()) && (joins[key].leftKey === joins[key].rightKey)) { | ||
// In case the model is linked with itself on the same key | ||
innerQuery = r.table(joins[key].link).getAll(doc(joins[key].leftKey), {index: joins[key].leftKey+"_"+joins[key].leftKey}).concatMap(function(link) { | ||
return r.table(joins[key].model.getTableName()).getAll( | ||
r.branch( | ||
doc(joins[key].leftKey).eq(link(joins[key].leftKey+"_"+joins[key].leftKey).nth(0)), | ||
link(joins[key].leftKey+"_"+joins[key].leftKey).nth(1), | ||
link(joins[key].leftKey+"_"+joins[key].leftKey).nth(0) | ||
) | ||
, {index: joins[key].rightKey}) | ||
}); | ||
if ((modelToGet[key] != null) && (typeof modelToGet[key]._apply === 'function')) { | ||
innerQuery = modelToGet[key]._apply(innerQuery); | ||
} | ||
innerQuery = innerQuery.getJoin(modelToGet[key], getAll, gotModel); | ||
if ((modelToGet[key] == null) || (modelToGet[key]._array !== false)) { | ||
innerQuery = innerQuery.coerceTo("ARRAY"); | ||
} | ||
innerQuery = innerQuery._query; | ||
return r.branch( | ||
doc.hasFields(joins[key].leftKey), | ||
r.object(key, new Query(joins[key].model, innerQuery).getJoin(modelToGet[key], getAll, gotModel)._query), | ||
r.object(key, innerQuery), | ||
{} | ||
) | ||
} | ||
else { | ||
innerQuery = r.table(joins[key].link).getAll(doc(joins[key].leftKey), {index: model.getTableName()+"_"+joins[key].leftKey}).concatMap(function(link) { | ||
return r.table(joins[key].model.getTableName()).getAll(link(joins[key].model.getTableName()+"_"+joins[key].rightKey), {index: joins[key].rightKey}) | ||
}); | ||
}); | ||
break; | ||
if ((modelToGet[key] != null) && (typeof modelToGet[key]._apply === 'function')) { | ||
innerQuery = modelToGet[key]._apply(innerQuery) | ||
case 'hasAndBelongsToMany': | ||
self._query = self._query.merge(function(doc) { | ||
if ((model.getTableName() === joins[key].model.getTableName()) && (joins[key].leftKey === joins[key].rightKey)) { | ||
// In case the model is linked with itself on the same key | ||
innerQuery = r.table(joins[key].link).getAll(doc(joins[key].leftKey), {index: joins[key].leftKey+"_"+joins[key].leftKey}).concatMap(function(link) { | ||
return r.table(joins[key].model.getTableName()).getAll( | ||
r.branch( | ||
doc(joins[key].leftKey).eq(link(joins[key].leftKey+"_"+joins[key].leftKey).nth(0)), | ||
link(joins[key].leftKey+"_"+joins[key].leftKey).nth(1), | ||
link(joins[key].leftKey+"_"+joins[key].leftKey).nth(0) | ||
) | ||
, {index: joins[key].rightKey}) | ||
}); | ||
if ((modelToGet[key] != null) && (typeof modelToGet[key]._apply === 'function')) { | ||
innerQuery = modelToGet[key]._apply(innerQuery); | ||
} | ||
if ((modelToGet[key] == null) || (modelToGet[key]._array !== false)) { | ||
innerQuery = innerQuery.coerceTo("ARRAY"); | ||
} | ||
return r.branch( | ||
doc.hasFields(joins[key].leftKey), | ||
r.object(key, new Query(joins[key].model, innerQuery).getJoin(modelToGet[key], getAll, gotModel)._query), | ||
{} | ||
) | ||
} | ||
else { | ||
innerQuery = r.table(joins[key].link).getAll(doc(joins[key].leftKey), {index: model.getTableName()+"_"+joins[key].leftKey}).concatMap(function(link) { | ||
return r.table(joins[key].model.getTableName()).getAll(link(joins[key].model.getTableName()+"_"+joins[key].rightKey), {index: joins[key].rightKey}) | ||
}); | ||
if ((modelToGet[key] == null) || (modelToGet[key]._array !== false)) { | ||
innerQuery = innerQuery.coerceTo("ARRAY"); | ||
if ((modelToGet[key] != null) && (typeof modelToGet[key]._apply === 'function')) { | ||
innerQuery = modelToGet[key]._apply(innerQuery) | ||
} | ||
if ((modelToGet[key] == null) || (modelToGet[key]._array !== false)) { | ||
innerQuery = innerQuery.coerceTo("ARRAY"); | ||
} | ||
return r.branch( | ||
doc.hasFields(joins[key].leftKey), | ||
r.object(key, | ||
new Query(joins[key].model, innerQuery).getJoin(modelToGet[key], getAll, gotModel)._query), | ||
{} | ||
) | ||
} | ||
return r.branch( | ||
doc.hasFields(joins[key].leftKey), | ||
r.object(key, | ||
new Query(joins[key].model, innerQuery).getJoin(modelToGet[key], getAll, gotModel)._query), | ||
{} | ||
) | ||
} | ||
}); | ||
}); | ||
break; | ||
} | ||
@@ -454,38 +434,43 @@ } | ||
} | ||
if ((join.type === 'hasOne') || (join.type === 'hasMany')) { | ||
queries.push(self._query(join.leftKey).do(function(keys) { | ||
return self._r.branch( | ||
self._r.expr(["ARRAY", "STREAM", "TABLE_SLICE"]).contains(keys.typeOf()).not(), | ||
// keys is a single value | ||
join.model.getAll(keys, {index: join.rightKey}).replace(function(row) { | ||
return row.without(join.rightKey) | ||
})._query, | ||
self._r.branch( // keys.typeOf().eq("ARRAY") | ||
keys.isEmpty(), | ||
{errors: 0}, | ||
join.model.getAll(self._r.args(keys), {index: join.rightKey}).replace(function(row) { | ||
switch (join.type) { | ||
case 'hasOne': | ||
case 'hasMany': | ||
queries.push(self._query(join.leftKey).do(function(keys) { | ||
return self._r.branch( | ||
self._r.expr(["ARRAY", "STREAM", "TABLE_SLICE"]).contains(keys.typeOf()).not(), | ||
// keys is a single value | ||
join.model.getAll(keys, {index: join.rightKey}).replace(function(row) { | ||
return row.without(join.rightKey) | ||
})._query | ||
})._query, | ||
self._r.branch( // keys.typeOf().eq("ARRAY") | ||
keys.isEmpty(), | ||
{errors: 0}, | ||
join.model.getAll(self._r.args(keys), {index: join.rightKey}).replace(function(row) { | ||
return row.without(join.rightKey) | ||
})._query | ||
) | ||
) | ||
) | ||
})) | ||
} | ||
else if (join.type === 'belongsTo') { | ||
queries.push(self._query.replace(function(row) { | ||
return row.without(join.leftKey) | ||
})); | ||
} | ||
else if (join.type === 'hasAndBelongsToMany') { | ||
queries.push(self._query(join.leftKey).do(function(keys) { | ||
return self._r.branch( | ||
self._r.expr(["ARRAY", "STREAM", "TABLE_SLICE"]).contains(keys.typeOf()).not(), | ||
// keys is a single value | ||
self._r.table(join.link).getAll(keys, {index: self._model.getTableName()+"_"+join.leftKey}).delete(), | ||
self._r.branch( // keys.typeOf().eq("ARRAY") | ||
keys.isEmpty(), | ||
{errors: 0}, | ||
self._r.table(join.link).getAll(self._r.args(keys), {index: self._model.getTableName()+"_"+join.leftKey}).delete() | ||
})) | ||
break; | ||
case 'belongsTo': | ||
queries.push(self._query.replace(function(row) { | ||
return row.without(join.leftKey) | ||
})); | ||
break; | ||
case 'hasAndBelongsToMany': | ||
queries.push(self._query(join.leftKey).do(function(keys) { | ||
return self._r.branch( | ||
self._r.expr(["ARRAY", "STREAM", "TABLE_SLICE"]).contains(keys.typeOf()).not(), | ||
// keys is a single value | ||
self._r.table(join.link).getAll(keys, {index: self._model.getTableName()+"_"+join.leftKey}).delete(), | ||
self._r.branch( // keys.typeOf().eq("ARRAY") | ||
keys.isEmpty(), | ||
{errors: 0}, | ||
self._r.table(join.link).getAll(self._r.args(keys), {index: self._model.getTableName()+"_"+join.leftKey}).delete() | ||
) | ||
) | ||
) | ||
})); | ||
})); | ||
break; | ||
} | ||
@@ -519,5 +504,6 @@ }); | ||
util.loopKeys(Term, function(Term, key) { | ||
if (key === 'run' || key[0] === '_') return; | ||
// Note: We suppose that no method has an empty name | ||
if ((key !== 'run') && (key[0] !== '_')) { | ||
if (key === 'get') { | ||
switch (key) { | ||
case 'get': | ||
// `get` in thinky returns an error if the document is not found. | ||
@@ -530,4 +516,6 @@ // The driver currently just returns `null`. | ||
})(key); | ||
} | ||
else if ((key === 'update') || (key === 'replace')) { | ||
break; | ||
case 'update': | ||
case 'replace': | ||
// `update` and `replace` can be used. A partial validation is performed before | ||
@@ -549,12 +537,8 @@ // sending the query, and a full validation is performed after the query. If the | ||
}); | ||
if (error === null) { | ||
return new Query(this._model, this._query[key].call(this._query, value, options), true); | ||
} | ||
else { | ||
return new Query(this._model, this._query[key].call(this._query, value, options), true, error); | ||
} | ||
return new Query(this._model, this._query[key].call(this._query, value, options), true, error); | ||
} | ||
})(key); | ||
} | ||
else if (key === 'changes') { | ||
break; | ||
case 'changes': | ||
(function(key) { | ||
@@ -570,4 +554,8 @@ Query.prototype[key] = function() { | ||
})(key); | ||
} | ||
else if ((key === 'then') || (key === 'error') || (key === 'catch') || (key === 'finally')) { | ||
break; | ||
case 'then': | ||
case 'error': | ||
case 'catch': | ||
case 'finally': | ||
(function(key) { | ||
@@ -579,4 +567,5 @@ Query.prototype[key] = function() { | ||
})(key); | ||
} | ||
else { | ||
break; | ||
default: | ||
(function(key) { | ||
@@ -588,4 +577,4 @@ Query.prototype[key] = function() { | ||
})(key); | ||
break; | ||
} | ||
} | ||
}); | ||
@@ -592,0 +581,0 @@ })(); |
@@ -26,3 +26,3 @@ var rethinkdbdash = require('rethinkdbdash'); | ||
config.db = config.db || 'test'; // We need the default db to create it. | ||
self._options = {}; | ||
@@ -84,3 +84,3 @@ // Option passed to each model we are going to create. | ||
} | ||
}); | ||
}); | ||
} | ||
@@ -87,0 +87,0 @@ |
@@ -13,3 +13,3 @@ var util = require(__dirname+'/../util.js'); | ||
} | ||
TypeAny.prototype.validator = function(min) { | ||
TypeAny.prototype.validator = function(fn) { | ||
this._validator = fn; | ||
@@ -16,0 +16,0 @@ } |
@@ -134,9 +134,9 @@ var util = require(__dirname+'/../util.js'); | ||
if ((this._min !== -1) && (this._min > array.length)){ | ||
throw new Errors.ValidationError("Value for "+prefix+" must have at least "+this._min+" elements.") | ||
throw new Errors.ValidationError("Value for "+prefix+" must have at least "+this._min+" elements.") | ||
} | ||
if ((this._max !== -1) && (this._max < array.length)){ | ||
throw new Errors.ValidationError("Value for "+prefix+" must have at most "+this._max+" elements.") | ||
throw new Errors.ValidationError("Value for "+prefix+" must have at most "+this._max+" elements.") | ||
} | ||
if ((this._length !== -1) && (this._length !== array.length)){ | ||
throw new Errors.ValidationError("Value for "+prefix+" must be an array with "+this._length+" elements.") | ||
throw new Errors.ValidationError("Value for "+prefix+" must be an array with "+this._length+" elements.") | ||
} | ||
@@ -143,0 +143,0 @@ |
@@ -139,6 +139,6 @@ var util = require(__dirname+'/../util.js'); | ||
if ((this._min instanceof Date) && (this._min > jsDate)){ | ||
throw new Errors.ValidationError("Value for "+prefix+" must be after "+this._min+".") | ||
throw new Errors.ValidationError("Value for "+prefix+" must be after "+this._min+".") | ||
} | ||
if ((this._max instanceof Date) && (this._max < jsDate)){ | ||
throw new Errors.ValidationError("Value for "+prefix+" must be before "+this._max+".") | ||
throw new Errors.ValidationError("Value for "+prefix+" must be before "+this._max+".") | ||
} | ||
@@ -145,0 +145,0 @@ } |
@@ -107,3 +107,3 @@ var util = require(__dirname+'/../util.js'); | ||
if (util.validateIfUndefined(number, prefix, "number", options)) return; | ||
if ((typeof this._validator === "function") && (this._validator(number) === false)) { | ||
@@ -126,9 +126,9 @@ throw new Errors.ValidationError("Validator for the field "+prefix+" returned `false`."); | ||
if ((this._min !== -1) && (this._min > number)){ | ||
throw new Errors.ValidationError("Value for "+prefix+" must be greater than "+this._min+".") | ||
throw new Errors.ValidationError("Value for "+prefix+" must be greater than "+this._min+".") | ||
} | ||
if ((this._max !== -1) && (this._max < number)){ | ||
throw new Errors.ValidationError("Value for "+prefix+" must be less than "+this._max+".") | ||
throw new Errors.ValidationError("Value for "+prefix+" must be less than "+this._max+".") | ||
} | ||
if ((this._integer === true) && (number%1 !== 0)){ | ||
throw new Errors.ValidationError("Value for "+prefix+" must be an integer.") | ||
throw new Errors.ValidationError("Value for "+prefix+" must be an integer.") | ||
} | ||
@@ -135,0 +135,0 @@ } |
@@ -258,3 +258,3 @@ var util = require(__dirname+'/../util.js'); | ||
* should return a boolean whether the field is valid or not. | ||
* @param {function} fn | ||
* @param {function} fn | ||
* @return {TypeString} | ||
@@ -273,3 +273,3 @@ */ | ||
* or an array of strings. | ||
* @param {...string|Array.<string>} fn | ||
* @param {...string|Array.<string>} fn | ||
* @return {TypeString} | ||
@@ -325,24 +325,24 @@ */ | ||
if ((this._min !== -1) && (this._min > str.length)){ | ||
throw new Errors.ValidationError("Value for "+prefix+" must be longer than "+this._min+".") | ||
throw new Errors.ValidationError("Value for "+prefix+" must be longer than "+this._min+".") | ||
} | ||
if ((this._max !== -1) && (this._max < str.length)){ | ||
throw new Errors.ValidationError("Value for "+prefix+" must be shorter than "+this._max+".") | ||
throw new Errors.ValidationError("Value for "+prefix+" must be shorter than "+this._max+".") | ||
} | ||
if ((this._length !== -1) && (this._length !== str.length)){ | ||
throw new Errors.ValidationError("Value for "+prefix+" must be a string with "+this._length+" characters.") | ||
throw new Errors.ValidationError("Value for "+prefix+" must be a string with "+this._length+" characters.") | ||
} | ||
if ((this._regex instanceof RegExp) && (this._regex.test(str) === false)) { | ||
throw new Errors.ValidationError("Value for "+prefix+" must match the regex.") | ||
throw new Errors.ValidationError("Value for "+prefix+" must match the regex.") | ||
} | ||
if ((this._alphanum === true) && (validator.isAlphanumeric(str) === false)) { | ||
throw new Errors.ValidationError("Value for "+prefix+" must be an alphanumeric string.") | ||
throw new Errors.ValidationError("Value for "+prefix+" must be an alphanumeric string.") | ||
} | ||
if ((this._email === true) && (validator.isEmail(str) === false)) { | ||
throw new Errors.ValidationError("Value for "+prefix+" must be a valid email.") | ||
throw new Errors.ValidationError("Value for "+prefix+" must be a valid email.") | ||
} | ||
if ((this._lowercase === true) && (validator.isLowercase(str) === false)) { | ||
throw new Errors.ValidationError("Value for "+prefix+" must be a lowercase string.") | ||
throw new Errors.ValidationError("Value for "+prefix+" must be a lowercase string.") | ||
} | ||
if ((this._uppercase === true) && (validator.isUppercase(str) === false)) { | ||
throw new Errors.ValidationError("Value for "+prefix+" must be a uppercase string.") | ||
throw new Errors.ValidationError("Value for "+prefix+" must be a uppercase string.") | ||
} | ||
@@ -349,0 +349,0 @@ if ((this._enum !== undefined) && (this._enum[str] !== true)) { |
@@ -31,3 +31,4 @@ var util = require('util'); | ||
} | ||
else if (isPlainObject(value) === true) { | ||
if (isPlainObject(value) === true) { | ||
result = {}; | ||
@@ -41,3 +42,4 @@ loopKeys(value, function(_value, key) { | ||
} | ||
else if (Array.isArray(value)) { | ||
if (Array.isArray(value)) { | ||
result = [] | ||
@@ -49,5 +51,4 @@ for(var i=0; i<value.length; i++) { | ||
} | ||
else { | ||
return value; | ||
} | ||
return value; | ||
} | ||
@@ -82,3 +83,3 @@ util.deepCopy = deepCopy; | ||
* - fnArgs {Array} arguments for `fn` | ||
* @return {Promise=} | ||
* @return {Promise=} | ||
*/ | ||
@@ -112,12 +113,10 @@ function hook(options) { | ||
} | ||
else { | ||
return _syncHook({ | ||
preHooks: preHooks, | ||
postHooks: postHooks, | ||
doc: doc, | ||
fn: fn, | ||
fnArgs: fnArgs | ||
}); | ||
} | ||
return _syncHook({ | ||
preHooks: preHooks, | ||
postHooks: postHooks, | ||
doc: doc, | ||
fn: fn, | ||
fnArgs: fnArgs | ||
}); | ||
} | ||
@@ -171,5 +170,3 @@ function _syncHook(args) { | ||
} | ||
else { | ||
return executeHooks(0, postHooks, doc, reject, nextPost); | ||
} | ||
return executeHooks(0, postHooks, doc, reject, nextPost); | ||
} | ||
@@ -254,5 +251,3 @@ | ||
} | ||
else { | ||
return options; | ||
} | ||
return options; | ||
} | ||
@@ -266,9 +261,6 @@ util.mergeOptions = mergeOptions; | ||
} | ||
else if (newValue !== null) { | ||
if (newValue !== null) { | ||
return newValue[primaryKey]; | ||
} | ||
else { | ||
return undefined; | ||
} | ||
return undefined; | ||
} | ||
@@ -289,5 +281,3 @@ util.extractPrimaryKey = extractPrimaryKey; | ||
} | ||
else { | ||
throw new Errors.ValidationError("Value for "+prefix+" must be a "+expected+".") | ||
} | ||
throw new Errors.ValidationError("Value for "+prefix+" must be a "+expected+".") | ||
} | ||
@@ -301,5 +291,3 @@ util.strictType = strictType; | ||
} | ||
else { | ||
throw new Errors.ValidationError("Extra field `"+key+"` in "+prefix+" not allowed.") | ||
} | ||
throw new Errors.ValidationError("Extra field `"+key+"` in "+prefix+" not allowed.") | ||
} | ||
@@ -313,5 +301,3 @@ util.extraField = extraField; | ||
} | ||
else { | ||
throw new Errors.ValidationError("Value for "+prefix+" must be a "+expected+" or null.") | ||
} | ||
throw new Errors.ValidationError("Value for "+prefix+" must be a "+expected+" or null.") | ||
} | ||
@@ -318,0 +304,0 @@ util.looseType = looseType; |
{ | ||
"name": "thinky", | ||
"version": "2.0.6", | ||
"version": "2.0.7", | ||
"description": "RethinkDB ORM for Node.js", | ||
@@ -27,3 +27,3 @@ "main": "lib/thinky.js", | ||
"dependencies":{ | ||
"rethinkdbdash": "~2.0.0", | ||
"rethinkdbdash": "~2.0.13", | ||
"bluebird": "~2.1.3", | ||
@@ -30,0 +30,0 @@ "validator": "~ 3.22.1" |
214883
5822
Updatedrethinkdbdash@~2.0.13