diff --git a/AbstractSQLCompiler.d.ts b/AbstractSQLCompiler.d.ts index 1ec1eeb5..6d361000 100644 --- a/AbstractSQLCompiler.d.ts +++ b/AbstractSQLCompiler.d.ts @@ -1,3 +1,4 @@ +/// import { Binding, SqlResult } from './AbstractSQLRules2SQL'; export { Binding, SqlResult } from './AbstractSQLRules2SQL'; import * as _ from 'lodash'; @@ -41,31 +42,34 @@ export interface Relationship { export interface AbstractSqlQuery extends Array { } export interface AbstractSqlModel { - synonyms: { - [synonym: string]: string; - }; - relationships: { - [resourceName: string]: Relationship; - }; - tables: { - [resourceName: string]: AbstractSqlTable; - }; + synonyms: ResourceMap; + relationships: ResourceMap; + tables: ResourceMap; rules: AbstractSqlQuery[]; } export interface SqlModel { - synonyms: { - [synonym: string]: string; - }; - relationships: { - [resourceName: string]: Relationship; - }; - tables: { - [resourceName: string]: AbstractSqlTable; - }; + synonyms: ResourceMap; + relationships: ResourceMap; + tables: ResourceMap; rules: SqlRule[]; createSchema: string[]; dropSchema: string[]; } +export interface HasDependants { + [dependant: string]: true; +} +export interface SchemaDependencyMap { + [tableName: string]: { + resourceName: string; + primitive: AbstractSqlTable['primitive']; + createSQL: string; + dropSQL: string; + depends: string[]; + }; +} +export interface ResourceMap { + [resourceName: string]: T; +} export interface ModifiedFields { table: string; fields?: {}[]; @@ -73,7 +77,7 @@ export interface ModifiedFields { export declare enum Engines { postgres = "postgres", mysql = "mysql", - websql = "websql" + websql = "websql", } export interface EngineInstance { compileSchema: (abstractSqlModel: AbstractSqlModel) => SqlModel; @@ -85,6 +89,7 @@ export interface EngineInstance { export declare const postgres: { compileSchema: _.Function1; compileRule: _.Function1; + diffSchemas: _.Function2; dataTypeValidate: (value: any, field: AbstractSqlField) => any; getReferencedFields: (ruleBody: AbstractSqlQuery) => ReferencedFields; getModifiedFields: (abstractSqlQuery: AbstractSqlQuery) => ModifiedFields | (ModifiedFields | undefined)[] | undefined; @@ -92,6 +97,7 @@ export declare const postgres: { export declare const mysql: { compileSchema: _.Function1; compileRule: _.Function1; + diffSchemas: _.Function2; dataTypeValidate: (value: any, field: AbstractSqlField) => any; getReferencedFields: (ruleBody: AbstractSqlQuery) => ReferencedFields; getModifiedFields: (abstractSqlQuery: AbstractSqlQuery) => ModifiedFields | (ModifiedFields | undefined)[] | undefined; @@ -99,6 +105,7 @@ export declare const mysql: { export declare const websql: { compileSchema: _.Function1; compileRule: _.Function1; + diffSchemas: _.Function2; dataTypeValidate: (value: any, field: AbstractSqlField) => any; getReferencedFields: (ruleBody: AbstractSqlQuery) => ReferencedFields; getModifiedFields: (abstractSqlQuery: AbstractSqlQuery) => ModifiedFields | (ModifiedFields | undefined)[] | undefined; diff --git a/AbstractSQLCompiler.js b/AbstractSQLCompiler.js index 27488575..d5bdfd63 100644 --- a/AbstractSQLCompiler.js +++ b/AbstractSQLCompiler.js @@ -149,7 +149,7 @@ var compileRule = function (abstractSQL, engine) { compiler.engine = engine; return compiler.match(abstractSQL, 'Process'); }; -var compileSchema = function (abstractSqlModel, engine, ifNotExists) { +var mkSchemaDependencyMap = function (tables, engine, ifNotExists) { var ifNotExistsStr; if (ifNotExists) { ifNotExistsStr = 'IF NOT EXISTS '; @@ -159,7 +159,7 @@ var compileSchema = function (abstractSqlModel, engine, ifNotExists) { } var hasDependants = {}; var schemaDependencyMap = {}; - _.forOwn(abstractSqlModel.tables, function (table, resourceName) { + _.forOwn(tables, function (table, resourceName) { if (_.isString(table)) { return; } @@ -179,7 +179,7 @@ var compileSchema = function (abstractSqlModel, engine, ifNotExists) { } for (var _b = 0, foreignKeys_1 = foreignKeys; _b < foreignKeys_1.length; _b++) { var _c = foreignKeys_1[_b], fieldName = _c.fieldName, references = _c.references; - var referencedTable = abstractSqlModel.tables[references.resourceName]; + var referencedTable = tables[references.resourceName]; createSQL += "FOREIGN KEY (\"" + fieldName + "\") REFERENCES \"" + referencedTable.name + "\" (\"" + references.fieldName + "\")\n,\t"; } for (var _d = 0, _e = table.indexes; _d < _e.length; _d++) { @@ -195,6 +195,10 @@ var compileSchema = function (abstractSqlModel, engine, ifNotExists) { depends: depends }; }); + return { hasDependants: hasDependants, schemaDependencyMap: schemaDependencyMap }; +}; +var compileSchema = function (abstractSqlModel, engine, ifNotExists) { + var _a = mkSchemaDependencyMap(abstractSqlModel.tables, engine, ifNotExists), hasDependants = _a.hasDependants, schemaDependencyMap = _a.schemaDependencyMap; var createSchemaStatements = []; var dropSchemaStatements = []; var resourceNames = []; @@ -203,8 +207,8 @@ var compileSchema = function (abstractSqlModel, engine, ifNotExists) { var resourceName = resourceNames_1[_i]; var schemaInfo = schemaDependencyMap[resourceName]; var unsolvedDependency = false; - for (var _a = 0, _b = schemaInfo.depends; _a < _b.length; _a++) { - var dependency = _b[_a]; + for (var _b = 0, _c = schemaInfo.depends; _b < _c.length; _b++) { + var dependency = _c[_b]; if (dependency !== resourceName && schemaDependencyMap.hasOwnProperty(dependency)) { unsolvedDependency = true; break; @@ -269,10 +273,134 @@ var compileSchema = function (abstractSqlModel, engine, ifNotExists) { rules: ruleStatements }; }; +var generateSplit = function (src, dst, matchFn) { + var modified = []; + return _.reduce(src, function (acc, value) { + var match = matchFn(acc.inserted, value); + if (match == null) { + return acc; + } + else { + acc.inserted = _.without(acc.inserted, match); + acc.deleted = _.without(acc.deleted, value); + acc.modified.push({ src: value, dst: match }); + return acc; + } + }, { inserted: dst, deleted: src, modified: modified }); +}; +var generateDiff = function (insFn, delFn, modFn, matchFn, src, dst) { + var split = generateSplit(src, dst, matchFn); + var diff = _.map(split.modified, modFn) + .concat(_.map(split.deleted, delFn)) + .concat(_.map(split.inserted, insFn)); + return _.reject(diff, _.isNil); +}; +var diffFields = function (src, dst, mappings, engine, ifNotExists) { + var ifNotExistsStr; + var ifExistsStr; + if (ifNotExists) { + ifNotExistsStr = 'IF NOT EXISTS '; + ifExistsStr = 'IF EXISTS '; + } + else { + ifNotExistsStr = ''; + ifExistsStr = ''; + } + var matchFn = function (fieldArray, field) { + var match = _.find(fieldArray, { fieldName: field.fieldName }); + if (match != null) { + return match; + } + else { + if (_.isString(mappings[field.fieldName])) { + return _.find(fieldArray, { fieldName: mappings[field.fieldName] }); + } + } + }; + var insFn = function (field) { + return 'ADD COLUMN ' + ifNotExistsStr + '"' + field.fieldName + '" ' + dataTypeGen(engine, field) + ';'; + }; + var delFn = function (field) { + return 'DROP COLUMN ' + ifExistsStr + '"' + field.fieldName + '";'; + }; + var modFn = function (_a) { + var src = _a.src, dst = _a.dst; + if (_.isEqual(src, dst)) { + return; + } + if (_.isEqual(_.omit(src, ['fieldName', 'references']), _.omit(dst, ['fieldName', 'references']))) { + return 'RENAME COLUMN "' + src.fieldName + '" TO "' + dst.fieldName + '";'; + } + throw Error("Can not migrate pre-existing field " + src.fieldName + " of type " + src.dataType + " to " + dst.fieldName + " of type " + dst.dataType); + }; + return generateDiff(insFn, delFn, modFn, matchFn, src, dst); +}; +var diffSchemas = function (src, dst, engine, ifNotExists) { + var srcSDM = mkSchemaDependencyMap(src.tables, engine, ifNotExists).schemaDependencyMap; + var dstSDM = mkSchemaDependencyMap(dst.tables, engine, ifNotExists).schemaDependencyMap; + var matchFn = function (tables, srcTable) { + var match = _.find(tables, { name: srcTable.name }); + if (match != null) { + return match; + } + else { + var relations_1 = src.relationships[srcTable.name]; + if (relations_1 == null) { + return; + } + else { + return _.find(tables, function (dstTable) { + var verb = dstTable.name.split('-').slice(1, -1).join(' '); + return relations_1[verb] != null; + }); + } + } + }; + var insFn = function (table) { + if (!_.isString(table) && !table.primitive) { + return dstSDM[table.name].createSQL; + } + }; + var delFn = function (table) { + if (!_.isString(table) && !table.primitive) { + return srcSDM[table.name].dropSQL; + } + }; + var modFn = function (_a) { + var srcTbl = _a.src, dstTbl = _a.dst; + if (_.isEqual(srcTbl, dstTbl)) { + return; + } + else if (_.isEqual(_.omit(srcTbl, 'fields'), _.omit(dstTbl, 'fields'))) { + var fields = diffFields(srcTbl.fields, dstTbl.fields, _.invert(src.synonyms), engine, ifNotExists); + var alterTbl_1 = 'ALTER TABLE "' + srcTbl.name + '"\n\t'; + return _.map(fields, function (field) { return alterTbl_1 + field; }).join('\n'); + } + else { + var _b = extractMappings(srcTbl.name), srcResource = _b[0], srcRest = _b[1]; + var _c = extractMappings(dstTbl.name), dstResource = _c[0], dstRest = _c[1]; + var mappings = (_d = {}, + _d[srcResource] = dstRest, + _d[srcRest] = dstResource, + _d); + var fields = diffFields(srcTbl.fields, dstTbl.fields, mappings, engine, ifNotExists); + var renameTable = "ALTER TABLE \"" + srcTbl.name + "\"\n\tRENAME TO \"" + dstTbl.name + "\";"; + var alterTbl_2 = 'ALTER TABLE "' + dstTbl.name + '"\n\t'; + return _.concat(renameTable, _.map(fields, function (field) { return alterTbl_2 + field; })).join('\n'); + } + var _d; + }; + return generateDiff(insFn, delFn, modFn, matchFn, _.values(src.tables), _.values(dst.tables)); +}; +var extractMappings = function (resource) { + var _a = resource.split('-'), subject = _a[0], rest = _a.slice(1); + return [subject, rest.join('-')]; +}; var generateExport = function (engine, ifNotExists) { return { compileSchema: _.partial(compileSchema, _, engine, ifNotExists), compileRule: _.partial(compileRule, _, engine), + diffSchemas: _.partial(diffSchemas, _, _, engine, ifNotExists), dataTypeValidate: dataTypeValidate, getReferencedFields: getReferencedFields, getModifiedFields: getModifiedFields diff --git a/AbstractSQLCompiler.js.map b/AbstractSQLCompiler.js.map index 3229189b..48f6458c 100644 --- a/AbstractSQLCompiler.js.map +++ b/AbstractSQLCompiler.js.map @@ -1 +1 @@ -{"version":3,"file":"AbstractSQLCompiler.js","sourceRoot":"","sources":["AbstractSQLCompiler.ts"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"AbstractSQLCompiler.js","sourceRoot":"","sources":["AbstractSQLCompiler.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/AbstractSQLCompiler.ts b/AbstractSQLCompiler.ts index e0bf406d..ba8e9033 100644 --- a/AbstractSQLCompiler.ts +++ b/AbstractSQLCompiler.ts @@ -53,37 +53,48 @@ export interface Relationship { } export interface AbstractSqlQuery extends Array {} export interface AbstractSqlModel { - synonyms: { - [ synonym: string ]: string - } - relationships: { - [ resourceName: string ]: Relationship - } - tables: { - [ resourceName: string ]: AbstractSqlTable - } + synonyms: ResourceMap + relationships: ResourceMap + tables: ResourceMap rules: AbstractSqlQuery[] } export interface SqlModel { - synonyms: { - [ synonym: string ]: string - } - relationships: { - [ resourceName: string ]: Relationship - } - tables: { - [ resourceName: string ]: AbstractSqlTable - } + synonyms: ResourceMap + relationships: ResourceMap + tables: ResourceMap rules: SqlRule[] createSchema: string[] dropSchema: string[] } +export interface HasDependants { + [dependant: string]: true +} + +export interface SchemaDependencyMap { + [tableName: string]: { + resourceName: string + primitive: AbstractSqlTable['primitive'] + createSQL: string + dropSQL: string + depends: string[] + } +} + +export interface ResourceMap { + [ resourceName: string ]: T +} + export interface ModifiedFields { table: string fields?: {}[] } +type ToSQLFn = (element: T) => string | undefined +type MatchFn = (haystack:Array, needle:T) => (T | undefined) +interface Pair { src: T, dst: T } +interface Split { inserted: Array, deleted: Array, modified: Array> } + export enum Engines { postgres = 'postgres', mysql = 'mysql', @@ -240,26 +251,17 @@ const compileRule = (abstractSQL: AbstractSqlQuery, engine: Engines) => { return compiler.match(abstractSQL, 'Process') } -const compileSchema = (abstractSqlModel: AbstractSqlModel, engine: Engines, ifNotExists: boolean): SqlModel => { +const mkSchemaDependencyMap = (tables: ResourceMap, engine: Engines, ifNotExists: boolean) => { let ifNotExistsStr: string if (ifNotExists) { ifNotExistsStr = 'IF NOT EXISTS ' } else { ifNotExistsStr = '' } - const hasDependants: { - [dependant: string]: true - } = {} - const schemaDependencyMap: { - [resourceName: string]: { - resourceName: string - primitive: AbstractSqlTable['primitive'] - createSQL: string - dropSQL: string - depends: string[] - } - } = {} - _.forOwn(abstractSqlModel.tables, (table, resourceName) => { + const hasDependants: HasDependants = {} + const schemaDependencyMap: SchemaDependencyMap = {} + + _.forOwn(tables, (table, resourceName) => { if (_.isString(table)) { return } @@ -279,7 +281,7 @@ const compileSchema = (abstractSqlModel: AbstractSqlModel, engine: Engines, ifNo } for (const { fieldName, references } of foreignKeys) { - const referencedTable = abstractSqlModel.tables[references.resourceName] + const referencedTable = tables[references.resourceName] createSQL += `FOREIGN KEY ("${fieldName}") REFERENCES "${referencedTable.name}" ("${references.fieldName}")\n,\t` } for (const index of table.indexes) { @@ -295,6 +297,12 @@ const compileSchema = (abstractSqlModel: AbstractSqlModel, engine: Engines, ifNo } }) + return { hasDependants, schemaDependencyMap } +} + +const compileSchema = (abstractSqlModel: AbstractSqlModel, engine: Engines, ifNotExists: boolean): SqlModel => { + const { hasDependants, schemaDependencyMap } = mkSchemaDependencyMap(abstractSqlModel.tables, engine, ifNotExists) + const createSchemaStatements = [] let dropSchemaStatements = [] let resourceNames: string[] = [] @@ -371,10 +379,150 @@ const compileSchema = (abstractSqlModel: AbstractSqlModel, engine: Engines, ifNo } } +const generateSplit = (src:Array, dst: Array, matchFn: MatchFn): Split => { + const modified: Array> = [] + return _.reduce(src, (acc, value) => { + const match = matchFn(acc.inserted, value) + if (match == null) { + return acc + } else { + acc.inserted = _.without(acc.inserted, match) + acc.deleted = _.without(acc.deleted, value) + acc.modified.push( { src: value, dst: match } ) + return acc + } + } + , { inserted: dst, deleted: src, modified: modified } ) +} +// genDiff expects src and dst arrays formatted as described in +// genSplit, and three functions to be called in the case of +// insertion, deletion or modification. +// The match function describes how to find the corresponding T inside a T[]. +// The result of the match function will be either the element that should be matched to +// the argument or undefined if no such element is found. +const generateDiff = (insFn: ToSQLFn, delFn: ToSQLFn, modFn: ToSQLFn>, matchFn: MatchFn, src: Array, dst: Array) => { + const split = generateSplit(src, dst, matchFn) + + const diff = _.map(split.modified, modFn) + .concat(_.map(split.deleted, delFn)) + .concat(_.map(split.inserted, insFn)) + + return _.reject(diff, _.isNil) +} + +const diffFields = (src: AbstractSqlField[], dst: AbstractSqlField[], mappings: ResourceMap, engine: Engines, ifNotExists: boolean) => { + let ifNotExistsStr: string + let ifExistsStr: string + + if (ifNotExists) { + ifNotExistsStr = 'IF NOT EXISTS ' + ifExistsStr = 'IF EXISTS ' + } else { + ifNotExistsStr = '' + ifExistsStr = '' + } + + const matchFn: MatchFn = (fieldArray, field) => { + const match = _.find(fieldArray, { fieldName: field.fieldName }) + if (match != null) { + return match + } + else { + if (_.isString(mappings[field.fieldName])) { + return _.find(fieldArray, { fieldName: mappings[field.fieldName] } ) + } + } + } + + const insFn: ToSQLFn = (field) => { + return 'ADD COLUMN ' + ifNotExistsStr + '"' + field.fieldName + '" ' + dataTypeGen(engine, field) + ';' + } + + const delFn: ToSQLFn = (field) => { + return 'DROP COLUMN ' + ifExistsStr + '"' + field.fieldName + '";' + } + + const modFn: ToSQLFn> = ({src, dst}) => { + if (_.isEqual(src, dst)) { + return + } + if (_.isEqual(_.omit(src, ['fieldName', 'references']), _.omit(dst, ['fieldName', 'references']))) { + return 'RENAME COLUMN "' + src.fieldName + '" TO "' + dst.fieldName + '";' + } + throw Error(`Can not migrate pre-existing field ${src.fieldName} of type ${src.dataType} to ${dst.fieldName} of type ${dst.dataType}`) + } + + return generateDiff(insFn, delFn, modFn, matchFn, src, dst) +} + +const diffSchemas = (src: AbstractSqlModel, dst: AbstractSqlModel, engine: Engines, ifNotExists: boolean) => { + const srcSDM = mkSchemaDependencyMap(src.tables, engine, ifNotExists).schemaDependencyMap + const dstSDM = mkSchemaDependencyMap(dst.tables, engine, ifNotExists).schemaDependencyMap + + const matchFn:MatchFn = (tables, srcTable) => { + const match = _.find(tables, { name: srcTable.name }) + if (match != null) { + return match + } else { + const relations = src.relationships[srcTable.name] + if (relations == null) { + return + } else { + return _.find(tables, (dstTable) => { + const verb = dstTable.name.split('-').slice(1, -1).join(' ') + return relations[verb] != null + }) + } + + } + } + + const insFn: ToSQLFn = (table) => { + if (!_.isString(table) && !table.primitive) { + return dstSDM[table.name].createSQL + } + } + + const delFn: ToSQLFn = (table) => { + if (!_.isString(table) && !table.primitive) { + return srcSDM[table.name].dropSQL + } + } + + const modFn: ToSQLFn> = ({ src: srcTbl, dst: dstTbl }) => { + if (_.isEqual(srcTbl, dstTbl)) { + return + } else if (_.isEqual(_.omit(srcTbl, 'fields'), _.omit(dstTbl, 'fields'))) { + const fields = diffFields(srcTbl.fields, dstTbl.fields, _.invert(src.synonyms), engine, ifNotExists) + const alterTbl = 'ALTER TABLE "' + srcTbl.name + '"\n\t' + return _.map(fields, (field) => alterTbl + field).join('\n') + } else { + const [srcResource, srcRest] = extractMappings(srcTbl.name) + const [dstResource, dstRest] = extractMappings(dstTbl.name) + + const mappings = { + [srcResource]: dstRest, + [srcRest]: dstResource + } + const fields = diffFields(srcTbl.fields, dstTbl.fields, mappings, engine, ifNotExists) + const renameTable = `ALTER TABLE "${srcTbl.name}"\n\tRENAME TO "${dstTbl.name}";` + const alterTbl = 'ALTER TABLE "' + dstTbl.name + '"\n\t' + return _.concat(renameTable, _.map(fields, (field) => alterTbl + field)).join('\n') + } + } + + return generateDiff(insFn, delFn, modFn, matchFn, _.values(src.tables), _.values(dst.tables)) +} + +const extractMappings = (resource:string):[string, string] => { + const [ subject, ...rest ] = resource.split('-') + return [ subject, rest.join('-') ] +} const generateExport = (engine: Engines, ifNotExists: boolean) => { return { compileSchema: _.partial(compileSchema, _, engine, ifNotExists), compileRule: _.partial(compileRule, _, engine), + diffSchemas: _.partial(diffSchemas, _, _, engine, ifNotExists), dataTypeValidate, getReferencedFields, getModifiedFields, diff --git a/AbstractSQLOptimiser.js b/AbstractSQLOptimiser.js index 566028df..a78019fa 100644 --- a/AbstractSQLOptimiser.js +++ b/AbstractSQLOptimiser.js @@ -1132,8 +1132,7 @@ this._pred(!_(duration).omit("negative").isEmpty()); return [ "Duration", duration ]; } - }); - (exports.AbstractSQLOptimiser = AbstractSQLValidator._extend({ + }), AbstractSQLOptimiser = exports.AbstractSQLOptimiser = AbstractSQLValidator._extend({ FieldNotEquals: function() { var $elf = this, _fromIdx = this.input.idx, comp1, comp2; this._form(function() { @@ -1204,7 +1203,7 @@ conditions = []; return this._many1(function() { return this._or(function() { - or = AbstractSQLValidator._superApply(this, "Or"); + or = AbstractSQLValidator._superApplyWithArgs(this, "Or"); conditions = conditions.concat(or.slice(1)); return this._apply("SetHelped"); }, function() { @@ -1215,7 +1214,7 @@ }); return [ "Or" ].concat(conditions); }, function() { - return AbstractSQLValidator._superApply(this, "Or"); + return AbstractSQLValidator._superApplyWithArgs(this, "Or"); }); }, And: function() { @@ -1258,7 +1257,7 @@ }); return [ "And" ].concat(conditions); }, function() { - return AbstractSQLValidator._superApply(this, "And"); + return AbstractSQLValidator._superApplyWithArgs(this, "And"); }); }, Not: function() { @@ -1297,7 +1296,7 @@ this._apply("SetHelped"); return boolStatement; }, function() { - return AbstractSQLValidator._superApply(this, "Not"); + return AbstractSQLValidator._superApplyWithArgs(this, "Not"); }); }, NotEquals: function() { @@ -1316,7 +1315,7 @@ this._apply("SetHelped"); return [ "Exists", value ]; }, function() { - return AbstractSQLValidator._superApply(this, "NotEquals"); + return AbstractSQLValidator._superApplyWithArgs(this, "NotEquals"); }); }, Equals: function() { @@ -1335,7 +1334,7 @@ this._apply("SetHelped"); return [ "Not", [ "Exists", value ] ]; }, function() { - return AbstractSQLValidator._superApply(this, "Equals"); + return AbstractSQLValidator._superApplyWithArgs(this, "Equals"); }); }, BooleanValue: function() { @@ -1347,7 +1346,7 @@ }, function() { return this._apply("EndsWith"); }, function() { - return AbstractSQLValidator._superApply(this, "BooleanValue"); + return AbstractSQLValidator._superApplyWithArgs(this, "BooleanValue"); }); }, Contains: function() { @@ -1391,7 +1390,7 @@ }, Helped: function(disableMemoisationHack) { var $elf = this, _fromIdx = this.input.idx; - this._pred(!0 === this.helped); + this._pred(this.helped === !0); return this.helped = !1; }, SetHelped: function() { @@ -1432,7 +1431,8 @@ }); return query; } - })).initialize = function() { + }); + AbstractSQLOptimiser.initialize = function() { this.helped = !1; }; }); \ No newline at end of file diff --git a/AbstractSQLRules2SQL.js b/AbstractSQLRules2SQL.js index 871eb032..ddb051ce 100644 --- a/AbstractSQLRules2SQL.js +++ b/AbstractSQLRules2SQL.js @@ -41,8 +41,7 @@ }, Fractionalseconds: fractionalSecondsFormat, Totalseconds: basicDateFormat("SECOND") - }; - (exports.AbstractSQLRules2SQL = OMeta._extend({ + }, AbstractSQLRules2SQL = exports.AbstractSQLRules2SQL = OMeta._extend({ NestedIndent: function(indent) { var $elf = this, _fromIdx = this.input.idx; return indent + "\t"; @@ -1158,13 +1157,14 @@ }; }); } - })).AddBind = function(bind) { + }); + AbstractSQLRules2SQL.AddBind = function(bind) { if ("postgres" === this.engine) { if ("Bind" === bind[0]) { var existingBindIndex = _.findIndex(this.fieldOrderings, function(existingBind) { return _.isEqual(bind, existingBind); }); - if (-1 !== existingBindIndex) { + if (existingBindIndex !== -1) { existingBindIndex += 1; return "$" + existingBindIndex; } diff --git a/test/sbvr/migrations.coffee b/test/sbvr/migrations.coffee new file mode 100644 index 00000000..25918f56 --- /dev/null +++ b/test/sbvr/migrations.coffee @@ -0,0 +1,113 @@ +fs = require('fs') +typeVocab = fs.readFileSync(require.resolve('@resin/sbvr-types/Type.sbvr')) +test = require('./test')(typeVocab) + +describe 'migrations', -> + console.log(test) + test.skip ''' + Term: name + Concept Type: Short Text (Type) + Term: person + + Fact Type: person has name + Necessity: each person has exactly one name + ''', + ''' + Term: person + ''', [ ''' + ALTER TABLE "person" + DROP COLUMN IF EXISTS "name"; + ''' ] + + test.migration ''' + Term: person + ''', ''' + Term: name + Concept Type: Short Text (Type) + Term: person + + Fact Type: person has name + Necessity: each person has exactly one name + ''', [ ''' + ALTER TABLE "person" + ADD COLUMN IF NOT EXISTS "name" VARCHAR(255) NOT NULL; + ''' ] + + test.migration ''' + Term: name + Synonym: full name + Concept Type: Short Text (Type) + Term: person + + Fact Type: person has name + Necessity: each person has exactly one name + ''', ''' + Term: full name + Concept Type: Short Text (Type) + Term: person + + Fact Type: person has full name + Necessity: each person has exactly one full name + ''', [ ''' + ALTER TABLE "person" + RENAME COLUMN "name" TO "full name"; + ''' ] + + test.migration ''' + Term: name + Concept Type: Short Text (Type) + Term: person + Fact Type: person has name + Necessity: each person has exactly one name + ''', + ''' + Term: name + Concept Type: Short Text (Type) + Term: years of experience + Concept Type: Integer (Type) + Term: person + Fact Type: person has name + Necessity: each person has exactly one name + Fact Type: person has years of experience + Necessity: each person has exactly one years of experience + ''', [ ''' + ALTER TABLE "person" + ADD COLUMN IF NOT EXISTS "years of experience" INTEGER NOT NULL; + ''' ] + + test.migration ''' + Term: actor + ''', + ''' + Term: actor + Term: user + Concept Type: actor + ''', [ ''' + CREATE TABLE IF NOT EXISTS "user" ( + "created at" TIMESTAMP DEFAULT CURRENT_TIMESTAMP NOT NULL + , "id" SERIAL NOT NULL PRIMARY KEY + , "actor" INTEGER NOT NULL + , FOREIGN KEY ("actor") REFERENCES "actor" ("id") + ); + ''' ] + + test.migration ''' + Term: pilot + Term: plane + + Fact type: pilot can fly plane + Synonymous Form: plane can be flown by pilot + ''', + ''' + Term: pilot + Term: plane + + Fact type: plane can be flown by pilot + ''', [ ''' + ALTER TABLE "pilot-can fly-plane" + RENAME TO "plane-can be flown by-pilot"; + ALTER TABLE "plane-can be flown by-pilot" + RENAME COLUMN "pilot" TO "can be flown by-pilot"; + ALTER TABLE "plane-can be flown by-pilot" + RENAME COLUMN "can fly-plane" TO "plane"; + ''' ] diff --git a/test/sbvr/pilots.coffee b/test/sbvr/pilots.coffee index 396053a3..04f9f844 100644 --- a/test/sbvr/pilots.coffee +++ b/test/sbvr/pilots.coffee @@ -2,6 +2,7 @@ typeVocab = require('fs').readFileSync(require.resolve('@resin/sbvr-types/Type.s test = require('./test')(typeVocab) describe 'pilots', -> + console.log(test) test ''' Term: name Concept Type: Short Text (Type) diff --git a/test/sbvr/test.coffee b/test/sbvr/test.coffee index f0ced208..b23dc717 100644 --- a/test/sbvr/test.coffee +++ b/test/sbvr/test.coffee @@ -28,6 +28,20 @@ module.exports = exports = (builtInVocab = false) -> return expectation(result) + runMigration = (it, src, dst, expectation) -> + it 'Vocabulary: src\n' + src + '\n\nVocabulary: dst\n' + dst, -> + SBVRParser.reset() + srcLf = SBVRParser.matchAll(src, 'Process') + srcSchema = LF2AbstractSQLTranslator(srcLf, 'Process') + + SBVRParser.reset() + dstLf = SBVRParser.matchAll(dst, 'Process') + dstSchema = LF2AbstractSQLTranslator(dstLf, 'Process') + + migration = AbstractSQLCompiler.postgres.diffSchemas(srcSchema, dstSchema) + + expect(migration).to.deep.equal(expectation) + runSchema = (it, input, expectation) -> runExpectation it, input, (result) -> seSoFar += input + '\n' @@ -59,4 +73,5 @@ module.exports = exports = (builtInVocab = false) -> ret.rule = runRule.bind(null, it) ret.rule.skip = runRule.bind(null, it.skip) ret.rule.only = runRule.bind(null, it.only) + ret.migration = runMigration.bind(null, it) return ret