Add a ModelDefinition class
This commit is contained in:
parent
77952d5e43
commit
92cd7d15a6
|
@ -0,0 +1,179 @@
|
||||||
|
var assert = require('assert');
|
||||||
|
var util = require('util');
|
||||||
|
var EventEmitter = require('events').EventEmitter;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Model definition
|
||||||
|
*/
|
||||||
|
module.exports = ModelDefinition;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Constructor for ModelDefinition
|
||||||
|
* @param name
|
||||||
|
* @param properties
|
||||||
|
* @param settings
|
||||||
|
* @returns {ModelDefinition}
|
||||||
|
* @constructor
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
function ModelDefinition(name, properties, settings) {
|
||||||
|
if (!(this instanceof ModelDefinition)) {
|
||||||
|
return new ModelDefinition(name, properties, settings);
|
||||||
|
}
|
||||||
|
assert(name, 'name is missing');
|
||||||
|
|
||||||
|
if (arguments.length === 1 && typeof name === 'object') {
|
||||||
|
this.name = name.name;
|
||||||
|
this.properties = name.properties || {};
|
||||||
|
this.settings = name.settings || {};
|
||||||
|
} else {
|
||||||
|
assert(typeof name === 'string', 'name must be a string');
|
||||||
|
this.name = name;
|
||||||
|
this.properties = properties || {};
|
||||||
|
this.settings = settings || {};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
util.inherits(ModelDefinition, EventEmitter);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Convert to a plain JSON Object
|
||||||
|
* @returns {Object}
|
||||||
|
*/
|
||||||
|
ModelDefinition.prototype.toJSON = function () {
|
||||||
|
return this;
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @returns {*}
|
||||||
|
*/
|
||||||
|
ModelDefinition.prototype.build = function () {
|
||||||
|
if(this.model) {
|
||||||
|
return this.model;
|
||||||
|
}
|
||||||
|
return this;
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return table name for specified `modelName`
|
||||||
|
* @param {String} connectorType The connector type, such as 'oracle' or 'mongodb'
|
||||||
|
*/
|
||||||
|
ModelDefinition.prototype.tableName = function (connectorType) {
|
||||||
|
var settings = this.settings;
|
||||||
|
if(settings[connectorType]) {
|
||||||
|
return settings[connectorType].table || this.name;
|
||||||
|
} else {
|
||||||
|
return this.name;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return column name for specified modelName and propertyName
|
||||||
|
* @param {String} connectorType The connector type, such as 'oracle' or 'mongodb'
|
||||||
|
* @param propertyName The property name
|
||||||
|
* @returns {String} columnName
|
||||||
|
*/
|
||||||
|
ModelDefinition.prototype.columnName = function (connectorType, propertyName) {
|
||||||
|
if(!propertyName) {
|
||||||
|
return propertyName;
|
||||||
|
}
|
||||||
|
var property = this.properties[propertyName];
|
||||||
|
if(property && property[connectorType]) {
|
||||||
|
return property[connectorType].columnName || propertyName;
|
||||||
|
} else {
|
||||||
|
return propertyName;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return column metadata for specified modelName and propertyName
|
||||||
|
* @param {String} connectorType The connector type, such as 'oracle' or 'mongodb'
|
||||||
|
* @param propertyName The property name
|
||||||
|
* @returns {Object} column metadata
|
||||||
|
*/
|
||||||
|
ModelDefinition.prototype.columnMetadata = function (connectorType, propertyName) {
|
||||||
|
if(!propertyName) {
|
||||||
|
return propertyName;
|
||||||
|
}
|
||||||
|
var property = this.properties[propertyName];
|
||||||
|
if(property && property[connectorType]) {
|
||||||
|
return property[connectorType];
|
||||||
|
} else {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return column names for specified modelName
|
||||||
|
* @param {String} connectorType The connector type, such as 'oracle' or 'mongodb'
|
||||||
|
* @returns {String[]} column names
|
||||||
|
*/
|
||||||
|
ModelDefinition.prototype.columnNames = function (connectorType) {
|
||||||
|
var props = this.properties;
|
||||||
|
var cols = [];
|
||||||
|
for(var p in props) {
|
||||||
|
if(props[p][connectorType]) {
|
||||||
|
cols.push(props[p][connectorType].columnName || p);
|
||||||
|
} else {
|
||||||
|
cols.push(p);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return cols;
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Find the ID properties sorted by the index
|
||||||
|
* @returns {Object[]} property name/index for IDs
|
||||||
|
*/
|
||||||
|
ModelDefinition.prototype.ids = function () {
|
||||||
|
if(this.ids) {
|
||||||
|
return this.ids;
|
||||||
|
}
|
||||||
|
var ids = [];
|
||||||
|
var props = this.properties;
|
||||||
|
for (var key in props) {
|
||||||
|
var id = props[key].id;
|
||||||
|
if(!id) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if(typeof id !== 'number') {
|
||||||
|
id = 1;
|
||||||
|
}
|
||||||
|
ids.push({name: key, id: id});
|
||||||
|
}
|
||||||
|
ids.sort(function (a, b) {
|
||||||
|
return a.key - b.key;
|
||||||
|
});
|
||||||
|
return ids;
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Find the ID column name
|
||||||
|
* @param {String} modelName The model name
|
||||||
|
* @returns {String} columnName for ID
|
||||||
|
*/
|
||||||
|
ModelDefinition.prototype.idColumnName = function(connectorType) {
|
||||||
|
return this.columnName(connectorType, this.idName());
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Find the ID property name
|
||||||
|
* @returns {String} property name for ID
|
||||||
|
*/
|
||||||
|
ModelDefinition.prototype.idName = function() {
|
||||||
|
var id = this.ids[0];
|
||||||
|
return id && id.name;
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Find the ID property names sorted by the index
|
||||||
|
* @returns {String[]} property names for IDs
|
||||||
|
*/
|
||||||
|
ModelDefinition.prototype.idNames = function () {
|
||||||
|
var ids = this.ids;
|
||||||
|
var names = ids.map(function (id) {
|
||||||
|
return id.name;
|
||||||
|
});
|
||||||
|
return names;
|
||||||
|
};
|
Loading…
Reference in New Issue