Skip to content

Commit 7d3aee9

Browse files
committed
Fix Oracle insert statements sorting following primary key values
1 parent 372a9b2 commit 7d3aee9

File tree

2 files changed

+83
-1
lines changed

2 files changed

+83
-1
lines changed

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

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313

1414
package org.stdg;
1515

16+
import java.math.BigDecimal;
1617
import java.util.Comparator;
1718
import java.util.List;
1819

@@ -65,7 +66,8 @@ private int compareIntPkValues(String primaryKeyColumn, DatasetRow datasetRow1,
6566
Object pkValue1 = datasetRow1.getValueOf(primaryKeyColumn);
6667
Object pkValue2 = datasetRow2.getValueOf(primaryKeyColumn);
6768
boolean integerPrimaryKey = pkValue1 instanceof Integer
68-
|| pkValue1 instanceof Long;
69+
|| pkValue1 instanceof Long
70+
|| pkValue1 instanceof BigDecimal;
6971
if(integerPrimaryKey) {
7072
Number pkValue1AsNumber = (Number) pkValue1;
7173
Number pkValue2AsNumber = (Number) pkValue2;

src/test/java/org/stdg/test/OracleTest.java

Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -245,6 +245,86 @@ public void should_generate_working_insert() {
245245
.hasNumberOfRows(1);
246246
}
247247

248+
@RepeatedTest(9) public void
249+
should_sort_insert_statements_following_primary_keys() {
250+
251+
// GIVEN
252+
TestTable table =
253+
buildUniqueTable(DATA_SOURCE
254+
, "comp_pk"
255+
, "col_id1 integer," +
256+
"col_id2 integer, " +
257+
"colA varchar(20), " +
258+
"colB varchar(20), " +
259+
"constraint comp_pk_pk" + generateRandomPositiveInt() + " primary key (col_id2, col_id1)"
260+
)
261+
.create()
262+
.insertValues("1, 2, 'colA_r1_value', 'colB_r1_value'")
263+
.insertValues("1, 1, 'colA_r1_value', 'colB_r1_value'")
264+
.insertValues("2, 2, 'colA_r1_value', 'colB_r1_value'")
265+
.insertValues("2, 1, 'colA_r1_value', 'colB_r1_value'");
266+
267+
// WHEN
268+
String selectAll = "SELECT * FROM " + table.getTableName();
269+
SqlTestDataGenerator sqlTestDataGenerator = SqlTestDataGenerator.buildFrom(DATA_SOURCE);
270+
List<String> insertStatements = sqlTestDataGenerator.generateInsertListFor(selectAll);
271+
272+
// THEN
273+
String insertQueriesAsString = insertStatements.toString();
274+
275+
String firstInsert = insertStatements.get(0);
276+
Assertions.assertThat(firstInsert).as(insertQueriesAsString).contains("VALUES(1, 1");
277+
278+
String secondInsert = insertStatements.get(1);
279+
Assertions.assertThat(secondInsert).as(insertQueriesAsString).contains("VALUES(2, 1");
280+
281+
String thirdInsert = insertStatements.get(2);
282+
Assertions.assertThat(thirdInsert).as(insertQueriesAsString).contains("VALUES(1, 2");
283+
284+
String fourthInsert = insertStatements.get(3);
285+
Assertions.assertThat(fourthInsert).as(insertQueriesAsString).contains("VALUES(2, 2");
286+
287+
}
288+
289+
// Not possible to both repeat and parameterize a JUnit 5 test
290+
@ParameterizedTest
291+
@ValueSource(strings = {"INTEGER", "SMALLINT"})
292+
public void
293+
should_sort_insert_statements_following_an_integer_primary_key(String intType) {
294+
295+
TestTable table =
296+
buildUniqueTable(DATA_SOURCE
297+
, "table_with_int_pk"
298+
, "col_id " + intType + "," +
299+
"colA varchar(20), " +
300+
"colB varchar(20), " +
301+
"constraint int_pk" + generateRandomPositiveInt() + " primary key (col_id)"
302+
)
303+
.create()
304+
.insertValues("2, 'A', 'B'")
305+
.insertValues("10, 'C', 'D'")
306+
.insertValues("1, 'E', 'F'");
307+
308+
String selectAll = "SELECT * FROM " + table.getTableName();
309+
SqlTestDataGenerator sqlTestDataGenerator = SqlTestDataGenerator.buildFrom(DATA_SOURCE);
310+
311+
// WHEN
312+
List<String> insertStatements = sqlTestDataGenerator.generateInsertListFor(selectAll);
313+
314+
// THEN
315+
String insertStatementsAsString = insertStatements.toString();
316+
317+
String firstQuery = insertStatements.get(0);
318+
Assertions.assertThat(firstQuery).as(insertStatementsAsString).contains("VALUES(1");
319+
320+
String secondQuery = insertStatements.get(1);
321+
Assertions.assertThat(secondQuery).as(insertStatementsAsString).contains("VALUES(2");
322+
323+
String thirdQuery = insertStatements.get(2);
324+
Assertions.assertThat(thirdQuery).as(insertStatementsAsString).contains("VALUES(10");
325+
326+
}
327+
248328
private int generateRandomPositiveInt() {
249329
Random random = new Random();
250330
return Math.abs(random.nextInt());

0 commit comments

Comments
 (0)