@@ -137,17 +137,18 @@ private void registerDiffRecords(String summaryId, MdInfoDiff baseInfo, MdInfoDi
137137 List <String > compareColumnNames = new ArrayList <>();
138138 List <String > baseDynamicColumnNames = new ArrayList <>();
139139 List <String > compareDynamicColumnNames = new ArrayList <>();
140- List <String > realColumnNames = new ArrayList <>();
140+ List <String > hashedPrimaryColumnNames = new ArrayList <>();
141+ List <String > hashedColumnNames = new ArrayList <>();
141142 for (MdInfoDiffColumn column : baseInfo .getRealColumns ()) {
142143 baseColumnNames .add (
143144 String .format (
144- "md_b2c.cl_ %s as mdb_%s" ,
145+ "b. %s as mdb_%s" ,
145146 column .getColumnName (),
146147 column .getColumnName ()));
147148
148149 compareColumnNames .add (
149150 String .format (
150- "md_c2b.cl_ %s as mdc_%s" ,
151+ "c. %s as mdc_%s" ,
151152 column .getColumnName (),
152153 column .getColumnName ()));
153154
@@ -161,67 +162,77 @@ private void registerDiffRecords(String summaryId, MdInfoDiff baseInfo, MdInfoDi
161162 column .getColumnName (),
162163 column .getColumnName ()));
163164
165+ hashedColumnNames .add (String .format (
166+ "MD5(IFNULL(`%s`, '<NULL>'))" ,
167+ column .getColumnName ()));
168+ }
169+
170+ List <String > joinBaseConditions = new ArrayList <>();
171+ List <String > joinCompareConditions = new ArrayList <>();
172+ for (MdInfoDiffColumn column : baseInfo .getPrimaryColumns ()) {
173+ String joinBaseCondition = String .format (
174+ "p.%s = b.%s" ,
175+ column .getColumnName (),
176+ column .getColumnName ());
177+ String joinCompareCondition = String .format (
178+ "p.%s = c.%s" ,
179+ column .getColumnName (),
180+ column .getColumnName ());
164181 if (column .hasCollation ()) {
165- realColumnNames .add (String .format (
166- "`%s` collate %s as cl_%s" ,
182+ joinBaseCondition = String .format ("%s collate %s" , joinBaseCondition ,
183+ column .getBinaryCollationName ());
184+ joinCompareCondition = String .format ("%s collate %s" , joinCompareCondition ,
185+ column .getBinaryCollationName ());
186+ }
187+ joinBaseConditions .add (joinBaseCondition );
188+ joinCompareConditions .add (joinCompareCondition );
189+
190+ if (column .hasCollation ()) {
191+ hashedPrimaryColumnNames .add (String .format (
192+ "`%s` collate %s as %s" ,
167193 column .getColumnName (),
168194 column .getBinaryCollationName (),
169195 column .getColumnName ()));
170196 } else {
171- realColumnNames .add (String .format (
172- "`%s` as cl_ %s" ,
197+ hashedPrimaryColumnNames .add (String .format (
198+ "`%s` as %s" ,
173199 column .getColumnName (),
174200 column .getColumnName ()));
175201 }
176202 }
177203
178- List <String > conditions = new ArrayList <>();
179- for (MdInfoDiffColumn column : baseInfo .getPrimaryColumns ()) {
180- String condition = String .format (
181- "md_b2c.cl_%s = md_c2b.cl_%s" ,
182- column .getColumnName (),
183- column .getColumnName ());
184- if (column .hasCollation ()) {
185- condition = String .format ("%s collate %s" , condition , column .getBinaryCollationName ());
186- }
187- conditions .add (condition );
188- }
189-
190204 String seqExpression ;
191205 String dynamicExpression ;
192- String additionalExpression = "" ;
193206 if (con .getDbType () == DbType .MYSQL ) {
194207 seqExpression = "`magentadesk`.`nextDiffSeq`()" ;
195208 dynamicExpression = "JSON_OBJECT" ;
196- additionalExpression = String .format (
197- "WHERE JSON_OBJECT(%s) != JSON_OBJECT(%s)" ,
198- MdUtils .join (baseDynamicColumnNames , ", " ),
199- MdUtils .join (compareDynamicColumnNames , ", " )
200- );
201-
202209 } else {
203210 seqExpression = "nextval(`magentadesk`.`diffSequence`)" ;
204211 dynamicExpression = "COLUMN_CREATE" ;
205212 }
206213
214+ String hashedColumns = MdUtils .join (hashedPrimaryColumnNames , ", " );
215+ if (hashedColumnNames .size () > 0 ) {
216+ hashedColumns += ", " + String .format ("MD5(CONCAT(%s)) as md_row_hash" ,
217+ MdUtils .join (hashedColumnNames , ", " ));
218+ }
219+
207220 String sql = String .format (
208221 "INSERT INTO `magentadesk`.`diffRecord` (`summaryId`, `tableName`, `diffSeq`, `baseValues`, `compareValues`) "
209222 +
210223 "WITH " +
211- "md_b2c AS (" +
224+ "md_b2c_hash AS (" +
212225 " SELECT %s FROM `%s`.`%s` %s EXCEPT SELECT %s FROM `%s`.`%s` %s" +
213226 ")," +
214- "md_c2b AS (" +
227+ "md_c2b_hash AS (" +
215228 " SELECT %s FROM `%s`.`%s` %s EXCEPT SELECT %s FROM `%s`.`%s` %s" +
216229 ")," +
217- "md_left AS (" +
218- " SELECT %s, %s FROM md_b2c LEFT OUTER JOIN md_c2b ON %s " +
230+ "md_cmn_pk AS (" +
231+ " SELECT %s FROM md_b2c_hash UNION SELECT %s FROM md_c2b_hash " +
219232 ")," +
220- "md_right AS (" +
221- " SELECT %s, %s FROM md_b2c RIGHT OUTER JOIN md_c2b ON %s" +
222- "), " +
223233 "md_full AS (" +
224- " SELECT * FROM md_left UNION SELECT * FROM md_right" +
234+ " SELECT %s, %s FROM md_cmn_pk as p LEFT OUTER JOIN `%s`.`%s` as b ON %s LEFT OUTER JOIN `%s`.`%s` as c ON %s"
235+ +
225236 ") " +
226237 "SELECT " +
227238 " '%s' as summaryId, " +
@@ -230,43 +241,45 @@ private void registerDiffRecords(String summaryId, MdInfoDiff baseInfo, MdInfoDi
230241 " %s(%s) as baseValues, " +
231242 " %s(%s) as compareValues " +
232243 "FROM " +
233- " md_full " +
234- "%s" ,
235- // md_b2c
236- MdUtils .join (realColumnNames , ", " ),
244+ " md_full" ,
245+ // md_b2c_hash
246+ hashedColumns ,
237247 baseInfo .getDatabase (),
238248 baseInfo .getTableName (),
239249 baseInfo .getWhereExpression (),
240- MdUtils . join ( realColumnNames , ", " ) ,
250+ hashedColumns ,
241251 compareInfo .getDatabase (),
242252 compareInfo .getTableName (),
243253 compareInfo .getWhereExpression (),
244- // md_c2b
245- MdUtils . join ( realColumnNames , ", " ) ,
254+ // md_c2b_hash
255+ hashedColumns ,
246256 compareInfo .getDatabase (),
247257 compareInfo .getTableName (),
248258 compareInfo .getWhereExpression (),
249- MdUtils . join ( realColumnNames , ", " ) ,
259+ hashedColumns ,
250260 baseInfo .getDatabase (),
251261 baseInfo .getTableName (),
252262 baseInfo .getWhereExpression (),
253- // md_left
263+ // md_cmn_pk
264+ MdUtils .join (hashedPrimaryColumnNames , ", " ),
265+ MdUtils .join (hashedPrimaryColumnNames , ", " ),
266+ // md_full
254267 MdUtils .join (baseColumnNames , ", " ),
255268 MdUtils .join (compareColumnNames , ", " ),
256- MdUtils .join (conditions , " AND " ),
257- // md_right
258- MdUtils .join (baseColumnNames , ", " ),
259- MdUtils .join (compareColumnNames , ", " ),
260- MdUtils .join (conditions , " AND " ),
269+ baseInfo .getDatabase (),
270+ baseInfo .getTableName (),
271+ MdUtils .join (joinBaseConditions , " AND " ),
272+ compareInfo .getDatabase (),
273+ compareInfo .getTableName (),
274+ MdUtils .join (joinCompareConditions , " AND " ),
261275 // SELECT
262276 summaryId ,
263277 baseInfo .getTableName (),
264278 seqExpression ,
265279 dynamicExpression ,
266280 MdUtils .join (baseDynamicColumnNames , ", " ),
267281 dynamicExpression ,
268- MdUtils .join (compareDynamicColumnNames , ", " ),
269- additionalExpression );
282+ MdUtils .join (compareDynamicColumnNames , ", " ));
270283 con .execute (sql );
271284 }
272285}
0 commit comments