11package com .geckotechnology .mySqlDataCompare ;
22
33import java .sql .ResultSet ;
4+ import java .sql .SQLException ;
45import java .sql .Statement ;
56import 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