@@ -0,0 +1,2341 @@
+package sqlancer.common.schema;%0A%0Aimport java.util.List;%0Aimport java.util.Map;%0Aimport java.util.stream.Collectors;%0A%0Apublic abstract class AbstractRowValue%3CT extends AbstractTables%3C?, C%3E, C extends AbstractTableColumn%3C?, ?%3E, O%3E %7B%0A%0A    private final T tables;%0A    private final Map%3CC, O%3E values;%0A%0A    protected AbstractRowValue(T tables, Map%3CC, O%3E values) %7B%0A        this.tables = tables;%0A        this.values = values;%0A    %7D%0A%0A    public T getTable() %7B%0A        return tables;%0A    %7D%0A%0A    public Map%3CC, O%3E getValues() %7B%0A        return values;%0A    %7D%0A%0A    @Override%0A    public String toString() %7B%0A        StringBuffer sb = new StringBuffer();%0A        int i = 0;%0A        for (C c : tables.getColumns()) %7B%0A            if (i++ != 0) %7B%0A                sb.append(%22, %22);%0A            %7D%0A            sb.append(values.get(c));%0A        %7D%0A        return sb.toString();%0A    %7D%0A%0A    public String getRowValuesAsString() %7B%0A        List%3CC%3E columnsToCheck = tables.getColumns();%0A        return getRowValuesAsString(columnsToCheck);%0A    %7D%0A%0A    public String getRowValuesAsString(List%3CC%3E columnsToCheck) %7B%0A        StringBuilder sb = new StringBuilder();%0A        Map%3CC, O%3E expectedValues = getValues();%0A        for (int i = 0; i %3C columnsToCheck.size(); i++) %7B%0A            if (i != 0) %7B%0A                sb.append(%22, %22);%0A            %7D%0A            O expectedColumnValue = expectedValues.get(columnsToCheck.get(i));%0A            sb.append(expectedColumnValue);%0A        %7D%0A        return sb.toString();%0A    %7D%0A%0A    public String asStringGroupedByTables() %7B%0A        StringBuilder sb = new StringBuilder();%0A        List%3CC%3E columnList = getValues().keySet().stream().collect(Collectors.toList());%0A        List%3CAbstractTable%3C?, ?%3E%3E tableList = columnList.stream().map(c -%3E c.getTable()).distinct().sorted()%0A                .collect(Collectors.toList());%0A        for (AbstractTable%3C?, ?%3E t : tableList) %7B%0A            sb.append(%22-- %22 + t.getName() + %22%5Cn%22);%0A            List%3CC%3E columnsForTable = columnList.stream().filter(c -%3E c.getTable().equals(t))%0A                    .collect(Collectors.toList());%0A            for (C c : columnsForTable) %7B%0A                sb.append(%22--%5Ct%22);%0A                sb.append(c);%0A                sb.append(%22=%22);%0A                sb.append(getValues().get(c));%0A                sb.append(%22%5Cn%22);%0A            %7D%0A        %7D%0A        return sb.toString();%0A    %7D%0A%0A%7D%0A

Add a common row value class for PQS