package dbfit.diff;
import dbfit.util.DefaultDataTableProcessor;
import dbfit.util.MatchableDataTable;
import dbfit.util.DataTable;
import dbfit.util.DataRow;
import dbfit.util.MatchResult;
import dbfit.util.RowStructure;
import dbfit.util.DataRowProcessor;
import dbfit.util.MatchingMaskBuilder;
public class DataTableDiff extends CompositeDiff<DataTable, DataRow> {
private RowStructure rowStructure;
public DataTableDiff(RowStructure rowStructure) {
this(rowStructure, new DataRowDiff(rowStructure.getColumnNames()));
}
public DataTableDiff(RowStructure rowStructure, DataRowDiff rowDiff) {
super(rowDiff);
this.rowStructure = rowStructure;
}
@Override
protected Class getType() {
return DataTable.class;
}
@Override
protected Class getChildType() {
return DataRow.class;
}
@Override
protected DiffRunner getDiffRunner(MatchResult<DataTable, DataTable> request) {
return new DataTableDiffRunner(request);
}
class DataTableDiffRunner extends CompositeDiffRunner implements DataRowProcessor {
private MatchingMaskBuilder mmb = new MatchingMaskBuilder(rowStructure);
private MatchableDataTable mdt2;
public DataTableDiffRunner(MatchResult<DataTable, DataTable> request) {
super(request);
this.mdt2 = new MatchableDataTable(obj2);
}
@Override
protected void uncheckedDiff() {
new DefaultDataTableProcessor(this).process(obj1);
for (DataRow dr: mdt2.getUnprocessedRows()) {
getChildDiff().diff(null, dr);
}
}
@Override
public void process(final DataRow row1) {
DataRow row2 = mdt2.findMatchingNothrow(mmb.buildMatchingMask(row1));
getChildDiff().diff(row1, row2);
mdt2.markProcessed(row2);
}
}
}