UNPKG

@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
// Generated by CoffeeScript 1.12.7 (function() { var _, forEachUniqueTable, getResourceName, sbvrTypes; _ = require('lodash'); sbvrTypes = require('@resin/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