Skip to content

Commit 38be518

Browse files
committed
2 parents 6b5860b + 87d11c9 commit 38be518

File tree

1 file changed

+51
-66
lines changed

1 file changed

+51
-66
lines changed
Lines changed: 51 additions & 66 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package com.geckotechnology.mySqlDataCompare;
22

33
import java.sql.ResultSet;
4+
import java.sql.SQLException;
45
import java.sql.Statement;
56
import java.util.ArrayList;
67

@@ -36,103 +37,88 @@ public void compareTable(Table table) throws Exception {
3637
ResultSet masterResultSet = masterStatement.executeQuery(selectSQL.toString());
3738
Statement slaveStatement = slaveSchemaReader.createStatement();
3839
ResultSet slaveResultSet = slaveStatement.executeQuery(selectSQL.toString());
39-
ArrayList<OneRow> masterRows = new ArrayList<OneRow>();
40-
ArrayList<OneRow> slaveRows = new ArrayList<OneRow>();
40+
ArrayList<OneRow> unmatchedMasterRows = new ArrayList<OneRow>();
41+
ArrayList<OneRow> unmatchedSlaveRows = new ArrayList<OneRow>();
4142
boolean hasMasterResultSetNext = true;
4243
boolean hasSlaveResultSetNext = true;
44+
4345
while(hasMasterResultSetNext && hasSlaveResultSetNext) {
44-
4546
//Get 1 row from master DB
4647
if(hasMasterResultSetNext && masterResultSet.next()) {
47-
OneRow masterOneRow = new OneRow(masterResultSet.getString(1), masterResultSet.getString(2));
4848
masterTotalRetrievedRows++;
49-
int slaveRowIndex = slaveRows.indexOf(masterOneRow);
50-
if(slaveRowIndex != -1) {
51-
//slave row matching PK has been found
52-
OneRow slaveOneRow = slaveRows.get(slaveRowIndex);
53-
if(!slaveOneRow.getMd5().equals(masterOneRow.getMd5())) {
54-
//PK are same but the MD5 are different
55-
dataDifferences.add(new SchemaDifference(Criticality.ERROR,
56-
table.getTableName(),
57-
DifferenceType.DATA_ROW_DIFFERENT_MD5,
58-
pkColumnsTuple + "=("+ masterOneRow.getPk() + ")"));
59-
}
60-
slaveRows.remove(slaveRowIndex);
61-
if(slaveRowIndex != 0) {
62-
//we found older records, meaning it was not matched
63-
for(int i = 0; i<slaveRowIndex; i++) {
64-
OneRow removedSlaveOneRaw = slaveRows.remove(0);
65-
dataDifferences.add(new SchemaDifference(Criticality.ERROR,
66-
table.getTableName(),
67-
DifferenceType.DATA_ROW_EXCESS_IN_SLAVE_TABLE,
68-
pkColumnsTuple + "=("+ removedSlaveOneRaw.getPk() + ")"));
69-
}
70-
}
71-
}
72-
else {
73-
//no matching PK, so add to masterRows
74-
masterRows.add(masterOneRow);
75-
}
49+
processOneRow(table, pkColumnsTuple, true, masterResultSet, unmatchedMasterRows, unmatchedSlaveRows);
7650
}
7751
else
7852
hasMasterResultSetNext = false;
79-
8053
//Get 1 row from slave DB
8154
if(hasSlaveResultSetNext && slaveResultSet.next()) {
82-
OneRow slaveOneRow = new OneRow(slaveResultSet.getString(1), slaveResultSet.getString(2));
8355
slaveTotalRetrievedRows++;
84-
int masterRowIndex = masterRows.indexOf(slaveOneRow);
85-
if(masterRowIndex != -1) {
86-
//slave row matching PK has been found
87-
OneRow masterOneRow = masterRows.get(masterRowIndex);
88-
if(!slaveOneRow.getMd5().equals(masterOneRow.getMd5())) {
89-
//PK are same but the MD5 are different
90-
dataDifferences.add(new SchemaDifference(Criticality.ERROR,
91-
table.getTableName(),
92-
DifferenceType.DATA_ROW_DIFFERENT_MD5,
93-
pkColumnsTuple + "=("+ masterOneRow.getPk() + ")"));
94-
}
95-
masterRows.remove(masterRowIndex);
96-
if(masterRowIndex != 0) {
97-
//we found older records, meaning it was not matched
98-
for(int i = 0; i<masterRowIndex; i++) {
99-
OneRow removedMasterOneRaw = masterRows.remove(0);
100-
dataDifferences.add(new SchemaDifference(Criticality.ERROR,
101-
table.getTableName(),
102-
DifferenceType.DATA_ROW_MISSING_IN_SLAVE_TABLE,
103-
pkColumnsTuple + "=("+ removedMasterOneRaw.getPk() + ")"));
104-
}
105-
}
106-
}
107-
else {
108-
//no matching PK, so add to slaveRows
109-
slaveRows.add(slaveOneRow);
110-
}
56+
processOneRow(table, pkColumnsTuple, false, slaveResultSet, unmatchedSlaveRows, unmatchedMasterRows);
11157
}
11258
else
11359
hasSlaveResultSetNext = false;
114-
11560
}
11661

11762
//rows not found in slave table
118-
for(OneRow masterOneRow:masterRows) {
63+
for(OneRow unmatchedMasterOneRow:unmatchedMasterRows) {
11964
dataDifferences.add(new SchemaDifference(Criticality.ERROR,
12065
table.getTableName(),
12166
DifferenceType.DATA_ROW_MISSING_IN_SLAVE_TABLE,
122-
pkColumnsTuple + "=("+ masterOneRow.getPk() + ")"));
67+
pkColumnsTuple + "=("+ unmatchedMasterOneRow.getPk() + ")"));
12368
}
12469
//rows not found in master table
125-
for(OneRow slaveOneRow:slaveRows) {
70+
for(OneRow unmatchedSlaveOneRow:unmatchedSlaveRows) {
12671
dataDifferences.add(new SchemaDifference(Criticality.ERROR,
12772
table.getTableName(),
12873
DifferenceType.DATA_ROW_EXCESS_IN_SLAVE_TABLE,
129-
pkColumnsTuple + "=("+ slaveOneRow.getPk() + ")"));
74+
pkColumnsTuple + "=("+ unmatchedSlaveOneRow.getPk() + ")"));
13075
}
13176
slaveResultSet.close();
13277
slaveStatement.close();
13378
masterResultSet.close();
13479
masterStatement.close();
13580
}
81+
82+
private void processOneRow(Table table, String pkColumnsTuple, boolean isSourceMaster,
83+
ResultSet sourceResultSet, ArrayList<OneRow> unmatchedSourceRows, ArrayList<OneRow> unmatchedTargetRows) throws SQLException {
84+
OneRow sourceOneRow = new OneRow(sourceResultSet.getString(1), sourceResultSet.getString(2));
85+
int targetRowIndex = unmatchedTargetRows.indexOf(sourceOneRow);
86+
if(targetRowIndex != -1) {
87+
//target row matching PK has been found, it can be removed immediately from targetRows
88+
OneRow targetOneRow = unmatchedTargetRows.remove(targetRowIndex);
89+
if(!targetOneRow.getMd5().equals(sourceOneRow.getMd5())) {
90+
//PK are same but the MD5 are different
91+
dataDifferences.add(new SchemaDifference(Criticality.ERROR,
92+
table.getTableName(),
93+
DifferenceType.DATA_ROW_DIFFERENT_MD5,
94+
pkColumnsTuple + "=("+ sourceOneRow.getPk() + ")"));
95+
}
96+
if(targetRowIndex != 0) {
97+
//we found older records, meaning it was not matched
98+
for(int i = 0; i<targetRowIndex; i++) {
99+
OneRow removedTargetOneRaw = unmatchedTargetRows.remove(0);
100+
dataDifferences.add(new SchemaDifference(Criticality.ERROR,
101+
table.getTableName(),
102+
(isSourceMaster ? DifferenceType.DATA_ROW_EXCESS_IN_SLAVE_TABLE : DifferenceType.DATA_ROW_MISSING_IN_SLAVE_TABLE),
103+
pkColumnsTuple + "=("+ removedTargetOneRaw.getPk() + ")"));
104+
}
105+
}
106+
//remove all source rows if required
107+
if(unmatchedSourceRows.size() > 0) {
108+
for(OneRow unmatchedSourceOneRow:unmatchedSourceRows) {
109+
dataDifferences.add(new SchemaDifference(Criticality.ERROR,
110+
table.getTableName(),
111+
(isSourceMaster ? DifferenceType.DATA_ROW_MISSING_IN_SLAVE_TABLE : DifferenceType.DATA_ROW_EXCESS_IN_SLAVE_TABLE),
112+
pkColumnsTuple + "=("+ unmatchedSourceOneRow.getPk() + ")"));
113+
}
114+
unmatchedSourceRows.clear();
115+
}
116+
}
117+
else {
118+
//no matching PK, so add to source rows
119+
unmatchedSourceRows.add(sourceOneRow);
120+
}
121+
}
136122

137123
public int calculateCriticalityCount(SchemaDifference.Criticality criticality) {
138124
int count = 0;
@@ -152,5 +138,4 @@ public void printDataDifferenceDetails() {
152138
}
153139
}
154140

155-
156141
}

0 commit comments

Comments
 (0)