Skip to content

Commit c4e0215

Browse files
committed
Improve row sorting following primary key values
1 parent 6f324d4 commit c4e0215

18 files changed

Lines changed: 382 additions & 65 deletions

src/main/java/org/stdg/DatasetRowComparatorBuilder.java

Lines changed: 20 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -44,27 +44,36 @@ public int compare(DatasetRow datasetRow1, DatasetRow datasetRow2) {
4444
}
4545

4646
String tableName = datasetRow1.getTableName();
47-
List<String> primaryColumns = primaryKeyColumnsFinder.findPrimaryColumnsOf(tableName);
47+
List<String> primaryKeyColumns = primaryKeyColumnsFinder.findPrimaryColumnsOf(tableName);
4848

49-
String primaryKey1 = computePrimaryKeyAsString(datasetRow1, primaryColumns);
50-
String primaryKey2 = computePrimaryKeyAsString(datasetRow2, primaryColumns);
49+
for (String primaryKeyColumn : primaryKeyColumns) {
50+
int intComparison = compareIntPkValues(primaryKeyColumn, datasetRow1, datasetRow2);
51+
if(intComparison != 0) {
52+
return intComparison;
53+
}
54+
}
5155

52-
return primaryKey1.compareTo(primaryKey2);
56+
return 0;
5357

5458
}
5559

5660
private boolean sameTableNames(DatasetRow datasetRow1, DatasetRow datasetRow2) {
5761
return datasetRow1.getTableName().equals(datasetRow2.getTableName());
5862
}
5963

60-
private String computePrimaryKeyAsString(DatasetRow datasetRow1, List<String> primaryColumns) {
61-
StringBuilder resultAsStringBuilder = new StringBuilder();
62-
for (String primaryColumn : primaryColumns) {
63-
Object primaryKeyValue = datasetRow1.getValueOf(primaryColumn);
64-
String primaryKeyValueAsString = primaryKeyValue.toString();
65-
resultAsStringBuilder.append(primaryKeyValueAsString);
64+
private int compareIntPkValues(String primaryKeyColumn, DatasetRow datasetRow1, DatasetRow datasetRow2) {
65+
Object pkValue1 = datasetRow1.getValueOf(primaryKeyColumn);
66+
Object pkValue2 = datasetRow2.getValueOf(primaryKeyColumn);
67+
boolean integerPrimaryKey = pkValue1 instanceof Integer
68+
|| pkValue1 instanceof Long;
69+
if(integerPrimaryKey) {
70+
Number pkValue1AsNumber = (Number) pkValue1;
71+
Number pkValue2AsNumber = (Number) pkValue2;
72+
long pkValue1AsLong = pkValue1AsNumber.longValue();
73+
long pkValue2AsLong = pkValue2AsNumber.longValue();
74+
return Long.compare(pkValue1AsLong, pkValue2AsLong );
6675
}
67-
return resultAsStringBuilder.toString();
76+
return 0;
6877
}
6978

7079
}

src/test/java/org/stdg/test/DatasetRowApiTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@
2222
import static org.stdg.test.TestTable.TestTableAssert.assertThat;
2323
import static org.stdg.test.TestTable.buildUniqueTable;
2424

25-
public class DatasetRowApiTest extends H2Configuration {
25+
public class DatasetRowApiTest extends H2Config {
2626

2727
@Test public void
2828
should_generate_working_insert_from_a_dataset_row() {

src/test/java/org/stdg/test/DatasetRowsMergingTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@
2020

2121
import static org.stdg.test.TestTable.TestTableAssert.assertThat;
2222

23-
public class DatasetRowsMergingTest extends H2Configuration {
23+
public class DatasetRowsMergingTest extends H2Config {
2424

2525
@Test public void
2626
should_merge_dataset_rows_if_columns_in_common_have_same_values() {

src/test/java/org/stdg/test/DeleteTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@
1919
import static org.stdg.test.TestTable.TestTableAssert.assertThat;
2020
import static org.stdg.test.TestTable.buildUniqueTable;
2121

22-
public class DeleteTest extends H2Configuration {
22+
public class DeleteTest extends H2Config {
2323

2424
@Test
2525
public void

src/test/java/org/stdg/test/FastTestSuite.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
, DeleteTest.class
2929
, InsertTest.class
3030
, SortInsertStatementsTest.class
31+
, SortInsertStatementsWithPkTest.class
3132
, DatasetRowsMergingTest.class
3233
, JdbcRoundtripTest.class} )
3334
public class FastTestSuite {

src/test/java/org/stdg/test/H2Configuration.java renamed to src/test/java/org/stdg/test/H2Config.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@
2121
import static org.quickperf.sql.config.QuickPerfSqlDataSourceBuilder.aDataSourceBuilder;
2222

2323
@QuickPerfTest
24-
class H2Configuration {
24+
class H2Config {
2525

2626
static DataSource DATA_SOURCE;
2727

src/test/java/org/stdg/test/H2Test.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@
2222
import static org.stdg.test.TestTable.*;
2323
import static org.stdg.test.TestTable.TestTableAssert.assertThat;
2424

25-
public class H2Test extends H2Configuration {
25+
public class H2Test extends H2Config {
2626

2727
@Test public void
2828
should_generate_an_insert_statement_with_columns_declared_in_the_same_order_as_in_the_table() {

src/test/java/org/stdg/test/HsqlDbTest.java

Lines changed: 42 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,8 @@
1414
package org.stdg.test;
1515

1616
import org.junit.jupiter.api.*;
17+
import org.junit.jupiter.params.ParameterizedTest;
18+
import org.junit.jupiter.params.provider.ValueSource;
1719
import org.stdg.SqlTestDataGenerator;
1820

1921
import javax.sql.DataSource;
@@ -22,6 +24,7 @@
2224

2325
import static org.assertj.core.api.Assertions.assertThat;
2426
import static org.stdg.test.TestTable.TestTableAssert.assertThat;
27+
import static org.stdg.test.TestTable.buildUniqueTable;
2528

2629
public class HsqlDbTest {
2730

@@ -225,8 +228,46 @@ private int generateRandomPositiveInt() {
225228

226229
}
227230

231+
@ParameterizedTest
232+
@ValueSource(strings = {"INT", "TINYINT", "SMALLINT", "BIGINT"})
233+
public void
234+
should_sort_insert_statements_following_an_integer_primary_key(String intType) {
235+
236+
TestTable table =
237+
buildUniqueTable(DATA_SOURCE
238+
, "table_with_int_pk"
239+
, "col_id " + intType + "," +
240+
"colA varchar(20), " +
241+
"colB varchar(20), " +
242+
"constraint int_pk" + generateRandomPositiveInt() + " primary key (col_id)"
243+
)
244+
.create()
245+
.insertValues("2, 'A', 'B'")
246+
.insertValues("10, 'C', 'D'")
247+
.insertValues("1, 'E', 'F'");
248+
249+
String selectAll = "SELECT * FROM " + table.getTableName();
250+
SqlTestDataGenerator sqlTestDataGenerator = SqlTestDataGenerator.buildFrom(DATA_SOURCE);
251+
252+
// WHEN
253+
List<String> insertStatements = sqlTestDataGenerator.generateInsertListFor(selectAll);
254+
255+
// THEN
256+
String insertStatementsAsString = insertStatements.toString();
257+
258+
String firstQuery = insertStatements.get(0);
259+
assertThat(firstQuery).as(insertStatementsAsString).contains("VALUES(1");
260+
261+
String secondQuery = insertStatements.get(1);
262+
assertThat(secondQuery).as(insertStatementsAsString).contains("VALUES(2");
263+
264+
String thirdQuery = insertStatements.get(2);
265+
assertThat(thirdQuery).as(insertStatementsAsString).contains("VALUES(10");
266+
267+
}
268+
228269
@RepeatedTest(9) public void
229-
should_sort_insert_statements_following_the_primary_key_values() {
270+
should_sort_insert_statements_following_a_composite_primary_key() {
230271

231272
// GIVEN
232273
TestTable table =

src/test/java/org/stdg/test/InsertTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@
1919

2020
import static org.assertj.core.api.Assertions.assertThat;
2121

22-
public class InsertTest extends H2Configuration {
22+
public class InsertTest extends H2Config {
2323

2424
@Test public void
2525
should_generate_an_empty_insert_script_for_an_insert_input() {

src/test/java/org/stdg/test/JdbcRoundtripTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@
2323

2424
import static org.stdg.test.TestTable.TestTableAssert.assertThat;
2525

26-
public class JdbcRoundtripTest extends H2Configuration {
26+
public class JdbcRoundtripTest extends H2Config {
2727

2828
private TestTable t1Table;
2929
private TestTable t2Table;

0 commit comments

Comments
 (0)