@resin/pinejs
Version:
Pine.js is a sophisticated rules-driven API engine that enables you to define rules in a structured subset of English. Those rules are used in order for Pine.js to generate a database schema and the associated [OData](http://www.odata.org/) API. This make
166 lines (157 loc) • 7.47 kB
JavaScript
// Generated by CoffeeScript 1.12.7
(function() {
var _, forEachUniqueTable, getResourceName, sbvrTypes;
_ = require('lodash');
sbvrTypes = require('/sbvr-types');
getResourceName = function(resourceName) {
var idPart, idParts;
idParts = resourceName.split('-');
return ((function() {
var i, len, results;
results = [];
for (i = 0, len = idParts.length; i < len; i++) {
idPart = idParts[i];
results.push(idPart.split(/[ -]/).join('_'));
}
return results;
})()).join('__');
};
forEachUniqueTable = function(model, callback) {
var key, results, table, usedTableNames;
usedTableNames = {};
results = [];
for (key in model) {
table = model[key];
if (!(!_.isString(model[key]) && !table.primitive && !usedTableNames[table.name])) {
continue;
}
usedTableNames[table.name] = true;
results.push(callback(key, table));
}
return results;
};
module.exports = function(vocabulary, sqlModel) {
var associations, cardinality, complexType, complexTypes, ends, model, name, resolveDataType, resourceName, typeName;
complexTypes = {};
resolveDataType = function(fieldType) {
if (sbvrTypes[fieldType] != null) {
if (sbvrTypes[fieldType].types.odata.complexType != null) {
complexTypes[fieldType] = sbvrTypes[fieldType].types.odata.complexType;
}
return sbvrTypes[fieldType].types.odata.name;
} else {
console.error('Could not resolve type', fieldType);
throw new Error('Could not resolve type' + fieldType);
}
};
model = sqlModel.tables;
associations = [];
forEachUniqueTable(model, function(key, arg) {
var dataType, fields, i, len, ref, referencedResource, references, required, resourceName, results;
resourceName = arg.name, fields = arg.fields;
resourceName = getResourceName(resourceName);
results = [];
for (i = 0, len = fields.length; i < len; i++) {
ref = fields[i], dataType = ref.dataType, required = ref.required, references = ref.references;
if (!(dataType === 'ForeignKey')) {
continue;
}
referencedResource = references.resourceName;
results.push(associations.push({
name: resourceName + referencedResource,
ends: [
{
resourceName: resourceName,
cardinality: required ? '1' : '0..1'
}, {
resourceName: referencedResource,
cardinality: '*'
}
]
}));
}
return results;
});
return ("<?xml version=\"1.0\" encoding=\"iso-8859-1\" standalone=\"yes\"?>\n<edmx:Edmx Version=\"1.0\" xmlns:edmx=\"http://schemas.microsoft.com/ado/2007/06/edmx\">\n <edmx:DataServices xmlns:m=\"http://schemas.microsoft.com/ado/2007/08/dataservices/metadata\" m:DataServiceVersion=\"2.0\">\n <Schema Namespace=\"" + vocabulary + "\"\n xmlns:d=\"http://schemas.microsoft.com/ado/2007/08/dataservices\"\n xmlns:m=\"http://schemas.microsoft.com/ado/2007/08/dataservices/metadata\"\n xmlns=\"http://schemas.microsoft.com/ado/2008/09/edm\">\n") + forEachUniqueTable(model, function(key, arg) {
var dataType, fieldName, fields, idField, referencedResource, references, required, resourceName;
idField = arg.idField, resourceName = arg.name, fields = arg.fields;
resourceName = getResourceName(resourceName);
return ("<EntityType Name=\"" + resourceName + "\">\n <Key>\n <PropertyRef Name=\"" + idField + "\" />\n </Key>\n") + ((function() {
var i, len, ref, results;
results = [];
for (i = 0, len = fields.length; i < len; i++) {
ref = fields[i], dataType = ref.dataType, fieldName = ref.fieldName, required = ref.required;
if (!(dataType !== 'ForeignKey')) {
continue;
}
dataType = resolveDataType(dataType);
fieldName = getResourceName(fieldName);
results.push("<Property Name=\"" + fieldName + "\" Type=\"" + dataType + "\" Nullable=\"" + (!required) + "\" />");
}
return results;
})()).join('\n') + '\n' + ((function() {
var i, len, ref, results;
results = [];
for (i = 0, len = fields.length; i < len; i++) {
ref = fields[i], dataType = ref.dataType, fieldName = ref.fieldName, references = ref.references;
if (!(dataType === 'ForeignKey')) {
continue;
}
referencedResource = references.tableName;
fieldName = getResourceName(fieldName);
results.push("<NavigationProperty Name=\"" + fieldName + "\" Relationship=\"" + vocabulary + "." + (resourceName + referencedResource) + "\" FromRole=\"" + resourceName + "\" ToRole=\"" + referencedResource + "\" />");
}
return results;
})()).join('\n') + '\n' + '</EntityType>';
}).join('\n\n') + ((function() {
var i, len, ref, results;
results = [];
for (i = 0, len = associations.length; i < len; i++) {
ref = associations[i], name = ref.name, ends = ref.ends;
name = getResourceName(name);
results.push(("<Association Name=\"" + name + "\">") + '\n\t' + ((function() {
var j, len1, ref1, results1;
results1 = [];
for (j = 0, len1 = ends.length; j < len1; j++) {
ref1 = ends[j], resourceName = ref1.resourceName, cardinality = ref1.cardinality;
results1.push("<End Role=\"" + resourceName + "\" Type=\"" + vocabulary + "." + resourceName + "\" Multiplicity=\"" + cardinality + "\" />");
}
return results1;
})()).join('\n\t') + '\n' + '</Association>');
}
return results;
})()).join('\n') + ("<EntityContainer Name=\"" + vocabulary + "Service\" m:IsDefaultEntityContainer=\"true\">\n") + forEachUniqueTable(model, function(key, arg) {
var resourceName;
resourceName = arg.name;
resourceName = getResourceName(resourceName);
return "<EntitySet Name=\"" + resourceName + "\" EntityType=\"" + vocabulary + "." + resourceName + "\" />";
}).join('\n') + '\n' + ((function() {
var i, len, ref, results;
results = [];
for (i = 0, len = associations.length; i < len; i++) {
ref = associations[i], name = ref.name, ends = ref.ends;
name = getResourceName(name);
results.push(("<AssociationSet Name=\"" + name + "\" Association=\"" + vocabulary + "." + name + "\">") + '\n\t' + ((function() {
var j, len1, ref1, results1;
results1 = [];
for (j = 0, len1 = ends.length; j < len1; j++) {
ref1 = ends[j], resourceName = ref1.resourceName, cardinality = ref1.cardinality;
results1.push("<End Role=\"" + resourceName + "\" EntitySet=\"" + vocabulary + "." + resourceName + "\" />");
}
return results1;
})()).join('\n\t') + '</AssociationSet>');
}
return results;
})()).join('\n') + '</EntityContainer>' + ((function() {
var results;
results = [];
for (typeName in complexTypes) {
complexType = complexTypes[typeName];
results.push(complexType);
}
return results;
})()).join('\n') + ' </Schema>\n </edmx:DataServices>\n</edmx:Edmx>';
};
module.exports.version = require('../../package.json').version;
}).call(this);
//# sourceMappingURL=ODataMetadataGenerator.js.map