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