11package com .geckotechnology .mySqlDataCompare ;
22
33import java .sql .ResultSet ;
4+ import java .sql .SQLException ;
45import java .sql .Statement ;
56import java .util .ArrayList ;
67
@@ -36,113 +37,37 @@ 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- //remove all master rows if required
72- if (masterRows .size () > 0 ) {
73- for (OneRow unmatchedMasterOneRow :masterRows ) {
74- dataDifferences .add (new SchemaDifference (Criticality .ERROR ,
75- table .getTableName (),
76- DifferenceType .DATA_ROW_MISSING_IN_SLAVE_TABLE ,
77- pkColumnsTuple + "=(" + unmatchedMasterOneRow .getPk () + ")" ));
78- }
79- masterRows = new ArrayList <OneRow >();
80- }
81- }
82- else {
83- //no matching PK, so add to masterRows
84- masterRows .add (masterOneRow );
85- }
49+ processOneRow (table , pkColumnsTuple , true , masterResultSet , unmatchedMasterRows , unmatchedSlaveRows );
8650 }
8751 else
8852 hasMasterResultSetNext = false ;
89-
9053 //Get 1 row from slave DB
9154 if (hasSlaveResultSetNext && slaveResultSet .next ()) {
92- OneRow slaveOneRow = new OneRow (slaveResultSet .getString (1 ), slaveResultSet .getString (2 ));
9355 slaveTotalRetrievedRows ++;
94- int masterRowIndex = masterRows .indexOf (slaveOneRow );
95- if (masterRowIndex != -1 ) {
96- //slave row matching PK has been found
97- OneRow masterOneRow = masterRows .get (masterRowIndex );
98- if (!slaveOneRow .getMd5 ().equals (masterOneRow .getMd5 ())) {
99- //PK are same but the MD5 are different
100- dataDifferences .add (new SchemaDifference (Criticality .ERROR ,
101- table .getTableName (),
102- DifferenceType .DATA_ROW_DIFFERENT_MD5 ,
103- pkColumnsTuple + "=(" + masterOneRow .getPk () + ")" ));
104- }
105- masterRows .remove (masterRowIndex );
106- if (masterRowIndex != 0 ) {
107- //we found older records, meaning it was not matched
108- for (int i = 0 ; i <masterRowIndex ; i ++) {
109- OneRow removedMasterOneRaw = masterRows .remove (0 );
110- dataDifferences .add (new SchemaDifference (Criticality .ERROR ,
111- table .getTableName (),
112- DifferenceType .DATA_ROW_MISSING_IN_SLAVE_TABLE ,
113- pkColumnsTuple + "=(" + removedMasterOneRaw .getPk () + ")" ));
114- }
115- }
116- //remove all slave rows if required
117- if (slaveRows .size () > 0 ) {
118- for (OneRow unmatchedSlaveOneRow :slaveRows ) {
119- dataDifferences .add (new SchemaDifference (Criticality .ERROR ,
120- table .getTableName (),
121- DifferenceType .DATA_ROW_EXCESS_IN_SLAVE_TABLE ,
122- pkColumnsTuple + "=(" + unmatchedSlaveOneRow .getPk () + ")" ));
123- }
124- slaveRows = new ArrayList <OneRow >();
125- }
126- }
127- else {
128- //no matching PK, so add to slaveRows
129- slaveRows .add (slaveOneRow );
130- }
56+ processOneRow (table , pkColumnsTuple , false , slaveResultSet , unmatchedSlaveRows , unmatchedMasterRows );
13157 }
13258 else
13359 hasSlaveResultSetNext = false ;
134-
13560 }
13661
13762 //rows not found in slave table
138- for (OneRow unmatchedMasterOneRow :masterRows ) {
63+ for (OneRow unmatchedMasterOneRow :unmatchedMasterRows ) {
13964 dataDifferences .add (new SchemaDifference (Criticality .ERROR ,
14065 table .getTableName (),
14166 DifferenceType .DATA_ROW_MISSING_IN_SLAVE_TABLE ,
14267 pkColumnsTuple + "=(" + unmatchedMasterOneRow .getPk () + ")" ));
14368 }
14469 //rows not found in master table
145- for (OneRow unmatchedSlaveOneRow :slaveRows ) {
70+ for (OneRow unmatchedSlaveOneRow :unmatchedSlaveRows ) {
14671 dataDifferences .add (new SchemaDifference (Criticality .ERROR ,
14772 table .getTableName (),
14873 DifferenceType .DATA_ROW_EXCESS_IN_SLAVE_TABLE ,
@@ -153,6 +78,47 @@ public void compareTable(Table table) throws Exception {
15378 masterResultSet .close ();
15479 masterStatement .close ();
15580 }
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+ }
156122
157123 public int calculateCriticalityCount (SchemaDifference .Criticality criticality ) {
158124 int count = 0 ;
@@ -172,5 +138,4 @@ public void printDataDifferenceDetails() {
172138 }
173139 }
174140
175-
176141}
0 commit comments