Merge pull request #8 from strongloop/id-fix

Allows custom name of the id property for the memory connector
This commit is contained in:
Raymond Feng 2013-08-30 10:59:50 -07:00
commit bfcd850dfe
2 changed files with 66 additions and 19 deletions

View File

@ -37,21 +37,63 @@ Memory.prototype.define = function defineModel(descr) {
this.ids[m] = 1; this.ids[m] = 1;
}; };
/**
* Get the id property name for the given model
* @param {String} model The model name
* @returns {String} The id property name
*
* @private
*/
Memory.prototype.idName = function(model) {
return (this.dataSource && this.dataSource.idName && this.dataSource.idName(model)) || 'id';
};
/**
* Get the id value for the given model
* @param {String} model The model name
* @param {Object} data The model instance data
* @returns {*} The id value
*
* @private
*/
Memory.prototype.getIdValue = function(model, data) {
return data && data[this.idName(model)];
};
/**
* Set the id value for the given model
* @param {String} model The model name
* @param {Object} data The model instance data
* @param {*} value The id value
*
* @private
*/
Memory.prototype.setIdValue = function(model, data, value) {
if(data) {
data[this.idName(model)] = value;
}
};
Memory.prototype.create = function create(model, data, callback) { Memory.prototype.create = function create(model, data, callback) {
// FIXME: [rfeng] We need to generate unique ids based on the id type
// FIXME: [rfeng] We don't support composite ids yet
var currentId = this.ids[model]; var currentId = this.ids[model];
if(currentId === undefined) { if(currentId === undefined) {
// First time // First time
this.ids[model] = 1; this.ids[model] = 1;
currentId = 1; currentId = 1;
} }
var id = data.id || currentId; var id = this.getIdValue(model, data) || currentId;
if(id > currentId) { if(id > currentId) {
// If the id is passed in and the value is greater than the current id // If the id is passed in and the value is greater than the current id
currentId = id; currentId = id;
} }
this.ids[model] = currentId + 1; this.ids[model] = Number(currentId) + 1;
data.id = id; var props = this._models[model].properties;
var idName = this.idName(model);
id = (props[idName] && props[idName].type && props[idName].type(id)) || id;
this.setIdValue(model, data, id);
this.cache[model][id] = JSON.stringify(data); this.cache[model][id] = JSON.stringify(data);
process.nextTick(function() { process.nextTick(function() {
callback(null, id); callback(null, id);
@ -59,13 +101,13 @@ Memory.prototype.create = function create(model, data, callback) {
}; };
Memory.prototype.updateOrCreate = function (model, data, callback) { Memory.prototype.updateOrCreate = function (model, data, callback) {
var mem = this; var self = this;
this.exists(model, data.id, function (err, exists) { this.exists(model, self.getIdValue(model, data), function (err, exists) {
if (exists) { if (exists) {
mem.save(model, data, callback); self.save(model, data, callback);
} else { } else {
mem.create(model, data, function (err, id) { self.create(model, data, function (err, id) {
data.id = id; self.setIdValue(model, data, id);
callback(err, data); callback(err, data);
}); });
} }
@ -73,7 +115,7 @@ Memory.prototype.updateOrCreate = function (model, data, callback) {
}; };
Memory.prototype.save = function save(model, data, callback) { Memory.prototype.save = function save(model, data, callback) {
this.cache[model][data.id] = JSON.stringify(data); this.cache[model][this.getIdValue(model, data)] = JSON.stringify(data);
process.nextTick(function () { process.nextTick(function () {
callback(null, data); callback(null, data);
}); });
@ -81,11 +123,12 @@ Memory.prototype.save = function save(model, data, callback) {
Memory.prototype.exists = function exists(model, id, callback) { Memory.prototype.exists = function exists(model, id, callback) {
process.nextTick(function () { process.nextTick(function () {
callback(null, this.cache[model].hasOwnProperty(id)); callback(null, this.cache[model] && this.cache[model].hasOwnProperty(id));
}.bind(this)); }.bind(this));
}; };
Memory.prototype.find = function find(model, id, callback) { Memory.prototype.find = function find(model, id, callback) {
var self = this;
process.nextTick(function () { process.nextTick(function () {
callback(null, id in this.cache[model] && this.fromDb(model, this.cache[model][id])); callback(null, id in this.cache[model] && this.fromDb(model, this.cache[model][id]));
}.bind(this)); }.bind(this));
@ -111,7 +154,10 @@ Memory.prototype.fromDb = function(model, data) {
val = new Date(val.toString().replace(/GMT.*$/, 'GMT')); val = new Date(val.toString().replace(/GMT.*$/, 'GMT'));
break; break;
case 'Boolean': case 'Boolean':
val = new Boolean(val); val = Boolean(val);
break;
case 'Number':
val = Number(val);
break; break;
} }
} }
@ -125,12 +171,10 @@ Memory.prototype.all = function all(model, filter, callback) {
var nodes = Object.keys(this.cache[model]).map(function (key) { var nodes = Object.keys(this.cache[model]).map(function (key) {
return this.fromDb(model, this.cache[model][key]); return this.fromDb(model, this.cache[model][key]);
}.bind(this)); }.bind(this));
var isGeo = false;
if (filter) { if (filter) {
// do we need some sorting? // do we need some sorting?
if (filter.order) { if (filter.order) {
var props = this._models[model].properties;
var orders = filter.order; var orders = filter.order;
if (typeof filter.order === "string") { if (typeof filter.order === "string") {
orders = [filter.order]; orders = [filter.order];
@ -161,7 +205,7 @@ Memory.prototype.all = function all(model, filter, callback) {
// field selection // field selection
if(filter.fields) { if(filter.fields) {
nodes = nodes.map(utils.selectFields(filter.fields)) nodes = nodes.map(utils.selectFields(filter.fields));
} }
// limit/skip // limit/skip
@ -260,7 +304,7 @@ Memory.prototype.destroyAll = function destroyAll(model, where, callback) {
Memory.prototype.count = function count(model, callback, where) { Memory.prototype.count = function count(model, callback, where) {
var cache = this.cache[model]; var cache = this.cache[model];
var data = Object.keys(cache) var data = Object.keys(cache);
if (where) { if (where) {
var filter = {where: where}; var filter = {where: where};
data = data.map(function (id) { data = data.map(function (id) {
@ -283,7 +327,7 @@ Memory.prototype.updateAttributes = function updateAttributes(model, id, data, c
} }
} }
data.id = id; this.setIdValue(model, data, id);
var cachedModels = this.cache[model]; var cachedModels = this.cache[model];
var modelAsString = cachedModels && this.cache[model][id]; var modelAsString = cachedModels && this.cache[model][id];

View File

@ -1255,6 +1255,9 @@ DataSource.prototype.idColumnName = function(modelName) {
*/ */
DataSource.prototype.idName = function(modelName) { DataSource.prototype.idName = function(modelName) {
var props = this.definitions[modelName].properties; var props = this.definitions[modelName].properties;
if(props.id && props.id.id) {
return 'id';
}
for(var key in props) { for(var key in props) {
if(props[key].id) { if(props[key].id) {
return key; return key;