Skip to content

Commit 1647104

Browse files
author
mmoczulski
committed
* loader will only load added / removed / same columns - it won't try to guess if a column name has been changed
* Column names modifications are now found by a renaming dictionary
1 parent 1ec69b5 commit 1647104

File tree

4 files changed

+63
-29
lines changed

4 files changed

+63
-29
lines changed

lib/definitionLoader.js

+3-7
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@ exports.loadSqlFiles = function(leftFiles, rightFiles, done) {
99

1010
var commonFiles = findCommonFilesInTwoDirectories();
1111

12-
// done(loadSqlDefinition(commonFiles[1]));
1312
done(commonFiles.map(loadSqlDefinition));
1413

1514
function findCommonFilesInTwoDirectories() {
@@ -55,15 +54,12 @@ function loadSqlDefinition(commonFile) {
5554
return rightColumnNames.indexOf(column.name) === -1;
5655
});
5756

58-
var changedColumns = tryFindChangedNamesIn(addedColumns, removedColumns);
59-
6057
return {
6158
oldTableName: leftFile.name,
6259
newTableName: rightFile.name,
6360
addedColumns: addedColumns,
6461
removedColumns: removedColumns,
65-
columnsWithSameNames: sameColumns,
66-
columnsWithChangedNames: changedColumns
62+
columnsWithSameNames: sameColumns
6763
};
6864
}
6965

@@ -192,9 +188,9 @@ function parseColumn(column) {
192188
var columnDefinition = column.substring(/\w/i.exec(column).index);
193189
var definition = columnDefinition.split(/\s+/i);
194190
return {
195-
name: definition[0],
191+
name: definition[0].replace("]", ""),
196192
type: definition[1],
197193
mandatory: /(NOT\s+NULL)|(PRIMARY\s+KEY)/i.test(columnDefinition),
198-
columnDefinition: columnDefinition
194+
columnDefinition: columnDefinition.replace("]", "")
199195
};
200196
}

lib/diff.js

+6-1
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,13 @@ var reporter = require("./csvReport");
66

77
exports.findDifferences = function (options) {
88
loader.loadSqlFiles(options.left, options.right, function(sqlDefinitions) {
9+
var differences = [];
910

10-
var differences = sqlDefinitions.map(processor.processSqlDefinitions);
11+
sqlDefinitions.forEach(function (sqlDefinition) {
12+
processor.processRenamedColumns(sqlDefinition, options.renamingDictionary);
13+
14+
differences.push(processor.processSqlDefinitions(sqlDefinition));
15+
});
1116

1217
reporter.generate(differences, options.output, function (err) {
1318
if (err) {

lib/diffProcessor.js

+41-21
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,43 @@
22

33
var constants = require("./constants");
44

5+
exports.processRenamedColumns = function(sqlDefinition, renamingDictionary) {
6+
var potentialRenamings = Object.keys(renamingDictionary);
7+
var columnsWithChangesNames = [];
8+
var addedColumnNames = sqlDefinition.addedColumns.map(function (column) {
9+
return column.name;
10+
});
11+
var removedColumnNames = sqlDefinition.removedColumns.map(function (column) {
12+
return column.name;
13+
});
14+
15+
addedColumnNames.forEach(function(addedColumnName) {
16+
removedColumnNames.forEach(function(removedColumnName) {
17+
if (potentialRenamings.indexOf(removedColumnName) !== -1 &&
18+
renamingDictionary[removedColumnName] === addedColumnName) {
19+
20+
columnsWithChangesNames.push({
21+
from: sqlDefinition.removedColumns.filter(function (column) {
22+
return column.name === removedColumnName;
23+
})[0],
24+
to: sqlDefinition.addedColumns.filter(function (column) {
25+
return column.name === addedColumnName;
26+
})[0]
27+
});
28+
}
29+
});
30+
});
31+
32+
columnsWithChangesNames.forEach(function (duplicate) {
33+
sqlDefinition.addedColumns.splice(sqlDefinition.addedColumns.indexOf(duplicate.to), 1);
34+
addedColumnNames.splice(addedColumnNames.indexOf(duplicate.to.name), 1);
35+
sqlDefinition.removedColumns.splice(sqlDefinition.removedColumns.indexOf(duplicate.from), 1);
36+
removedColumnNames.splice(removedColumnNames.indexOf(duplicate.from.name), 1);
37+
});
38+
39+
sqlDefinition.columnsWithSameNames = sqlDefinition.columnsWithSameNames.concat(columnsWithChangesNames);
40+
};
41+
542
exports.processSqlDefinitions = function(sqlDefinition) {
643
var diff = [];
744
diff.tableName = sqlDefinition.newTableName;
@@ -27,32 +64,15 @@ exports.processSqlDefinitions = function(sqlDefinition) {
2764
name: removedColumn.name
2865
});
2966
});
30-
sqlDefinition.columnsWithChangedNames.forEach(function (changedColumn) {
31-
diff.push({
32-
type: constants.CHANGED_COLUMN_NAME,
33-
name: changedColumn.to.name,
34-
from: changedColumn.from.name
35-
});
3667

37-
if (changedColumn.from.type !== changedColumn.to.type) {
38-
diff.push({
39-
type: constants.CHANGED_COLUMN_TYPE,
40-
name: changedColumn.to.name,
41-
from: changedColumn.from.type,
42-
to: changedColumn.to.type
43-
});
44-
}
45-
if (changedColumn.from.mandatory !== changedColumn.to.mandatory) {
68+
sqlDefinition.columnsWithSameNames.forEach(function (changedColumn) {
69+
if (changedColumn.from.name !== changedColumn.to.name) {
4670
diff.push({
47-
type: constants.CHANGED_COLUMN_OBLIGATION,
71+
type: constants.CHANGED_COLUMN_NAME,
4872
name: changedColumn.to.name,
49-
from: changedColumn.from.mandatory,
50-
to: changedColumn.to.mandatory
73+
from: changedColumn.from.name
5174
});
5275
}
53-
});
54-
55-
sqlDefinition.columnsWithSameNames.forEach(function (changedColumn) {
5676
if (changedColumn.from.type !== changedColumn.to.type) {
5777
diff.push({
5878
type: constants.CHANGED_COLUMN_TYPE,

sql-diff.js

+13
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@ var args = require("optimist").
99
describe("left", "Left folder (earlier one) to compare").
1010
describe("right", "Right folder (later one) to compare").
1111
describe("output", "The name of file, to which report will be generated").
12+
describe("rd", "Path to a dictionary which holds all possible renamings - should be a JSON file, where keys are " +
13+
"old names and values - new names").
1214
argv;
1315

1416

@@ -38,10 +40,21 @@ async.each([leftDir, rightDir], directoryExists, function(err) {
3840
var leftDirectory = directories[0];
3941
var rightDirectory = directories[1];
4042

43+
var renamingDictionary;
44+
45+
if (args.rd) {
46+
if (fs.existsSync(args.rd)) {
47+
renamingDictionary = JSON.parse(fs.readFileSync(args.rd));
48+
} else {
49+
console.warn("Path to Renaming dictionary file has been provided, but this file does not exist. Ignoring");
50+
}
51+
}
52+
4153
diff.findDifferences({
4254
left: leftDirectory,
4355
right: rightDirectory,
4456
output: args.output,
57+
renamingDictionary: renamingDictionary,
4558
done: function () {
4659
console.log("Job finished successfully");
4760
}

0 commit comments

Comments
 (0)