package dbfit.fixture; import dbfit.api.DBEnvironment; import dbfit.diff.DataTableDiff; import dbfit.fixture.report.ReportingSystem; import dbfit.fixture.report.FitFixtureReportingSystem; import dbfit.util.DataTable; import dbfit.util.DataRow; import dbfit.util.DataCell; import dbfit.util.MatchResult; import dbfit.util.NoOpDiffListenerAdapter; import dbfit.util.SymbolUtil; import static dbfit.util.RowStructureLoader.loadRowStructure; import static dbfit.util.MatchStatus.*; import fit.Parse; public class CompareStoredQueries extends fit.Fixture { private String symbol1; private String symbol2; private DataTable dt1; private DataTable dt2; public CompareStoredQueries() { } public CompareStoredQueries(DBEnvironment environment, String symbol1, String symbol2) { this.symbol1 = symbol1; this.symbol2 = symbol2; } private void initialiseDataTables() { if (symbol1 == null || symbol2 == null) { if (args.length < 2) { throw new UnsupportedOperationException("No symbols specified to CompareStoreQueries constructor or argument list"); } symbol1 = args[0]; symbol2 = args[1]; } dt1 = SymbolUtil.getDataTable(symbol1); dt2 = SymbolUtil.getDataTable(symbol2); } @Override public void doTable(Parse table) { initialiseDataTables(); Parse lastRow = table.parts.more; if (lastRow == null) { throw new Error("Query structure missing from second row"); } DataTableDiff diff = new DataTableDiff(loadRowStructure(lastRow)); diff.addListener(getReporter(table)); diff.diff(dt1, dt2); } protected FitFixtureReporter getReporter(final Parse table) { return new FitFixtureReporter( new FitFixtureReportingSystem(this, table)); } public static class FitFixtureReporter extends NoOpDiffListenerAdapter { protected ReportingSystem reportingSystem; public FitFixtureReporter(final ReportingSystem reportingSystem) { this.reportingSystem = reportingSystem; } @Override public void endRow(MatchResult<DataRow, DataRow> result) { reportingSystem.endRow(result); } @Override public void endCell(MatchResult<DataCell, DataCell> result) { reportingSystem.addCell(result); } } }