Skip to content

Commit af929d3

Browse files
authored
Manage time types with HSQLDB
1 parent 84a5815 commit af929d3

File tree

2 files changed

+208
-0
lines changed

2 files changed

+208
-0
lines changed

src/main/java/org/stdg/ColumnValueFormatter.java

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,9 @@
1313

1414
package org.stdg;
1515

16+
import java.time.OffsetDateTime;
17+
import java.time.format.DateTimeFormatter;
18+
import java.time.format.DateTimeFormatterBuilder;
1619
import org.stdg.dbtype.DatabaseType;
1720

1821
import java.sql.Time;
@@ -36,6 +39,10 @@ String formatColumnValue(Object columnValue, DatabaseType dbType) {
3639
} else if(DatabaseType.ORACLE.equals(dbType)
3740
&& isOracleSqlTimestamp(columnValue)) {
3841
return buildOracleToTimeStampFunctionFor(columnValue);
42+
}else if(DatabaseType.HSQLDB.equals(dbType)
43+
&& columnValue instanceof OffsetDateTime){
44+
OffsetDateTime offsetDateTime = (OffsetDateTime) columnValue;
45+
return formatForHsqlDBOffsetDateTime(offsetDateTime);
3946
} else if (columnValue instanceof String
4047
|| columnValue instanceof java.sql.Date
4148
|| columnValue instanceof Timestamp
@@ -55,6 +62,15 @@ private boolean isMicrosoftDateTimeOffset(Object columnValue) {
5562
return "microsoft.sql.DateTimeOffset".equals(classCanonicalName);
5663
}
5764

65+
private String formatForHsqlDBOffsetDateTime(OffsetDateTime offsetDateTime) {
66+
DateTimeFormatter fmt = new DateTimeFormatterBuilder()
67+
.appendPattern("yyyy-MM-dd HH:mm:ss")
68+
.parseLenient()
69+
.appendOffset("+HH:MM", "Z")
70+
.toFormatter();
71+
return "'" + fmt.format(offsetDateTime) + "'";
72+
}
73+
5874
private String buildOracleToDateFunctionFor(Timestamp timeStamp) {
5975
//https://stackoverflow.com/questions/9180014/using-oracle-to-date-function-for-date-string-with-milliseconds
6076
// "An Oracle DATE does not store times with more precision than a second."

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

Lines changed: 192 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,8 @@
1313

1414
package org.stdg.test;
1515

16+
import java.time.OffsetTime;
17+
import org.assertj.core.api.Assertions;
1618
import org.junit.jupiter.api.*;
1719
import org.junit.jupiter.params.ParameterizedTest;
1820
import org.junit.jupiter.params.provider.ValueSource;
@@ -309,4 +311,194 @@ private int generateRandomPositiveInt() {
309311

310312
}
311313

314+
315+
@Test public void
316+
should_generate_an_insert_statement_with_a_date_type() {
317+
318+
// GIVEN
319+
TestTable playerTable =
320+
buildUniqueTable( DATA_SOURCE
321+
, "Table"
322+
, "date Date"
323+
)
324+
.create()
325+
.insertValues("'2012-09-17'");
326+
327+
// WHEN
328+
String playerTableName = playerTable.getTableName();
329+
String select = "SELECT * FROM " + playerTableName;
330+
SqlTestDataGenerator sqlTestDataGenerator = SqlTestDataGenerator.buildFrom(DATA_SOURCE);
331+
String insertScript = sqlTestDataGenerator.generateInsertScriptFor(select);
332+
333+
// THEN
334+
playerTable.recreate();
335+
SQL_EXECUTOR.execute(insertScript);
336+
assertThat(playerTable).withScript(insertScript)
337+
.hasNumberOfRows(1)
338+
.row(0).hasValues("2012-09-17");
339+
340+
}
341+
342+
@Test public void
343+
should_generate_an_insert_statement_with_a_timestamp_type() {
344+
345+
// GIVEN
346+
TestTable playerTable =
347+
buildUniqueTable( DATA_SOURCE
348+
, "Table"
349+
, "timestampCol TIMESTAMP"
350+
)
351+
.create()
352+
.insertValues("'2012-09-17 19:56:47.32'");
353+
354+
// WHEN
355+
String playerTableName = playerTable.getTableName();
356+
String select = "SELECT * FROM " + playerTableName;
357+
SqlTestDataGenerator sqlTestDataGenerator = SqlTestDataGenerator.buildFrom(DATA_SOURCE);
358+
String insertScript = sqlTestDataGenerator.generateInsertScriptFor(select);
359+
360+
// THEN
361+
playerTable.recreate();
362+
SQL_EXECUTOR.execute(insertScript);
363+
assertThat(playerTable).withScript(insertScript)
364+
.hasNumberOfRows(1);
365+
Assertions.assertThat(insertScript).contains("'2012-09-17 19:56:47.32'");
366+
367+
}
368+
369+
@Test public void
370+
should_generate_an_insert_statement_with_a_timestamp_without_declared_time_zone_type() {
371+
372+
// GIVEN
373+
TestTable playerTable =
374+
buildUniqueTable( DATA_SOURCE
375+
, "Table"
376+
, "timestampCol TIMESTAMP WITHOUT TIME ZONE"
377+
)
378+
.create()
379+
.insertValues("'2012-09-17 19:56:47.32'");
380+
381+
// WHEN
382+
String playerTableName = playerTable.getTableName();
383+
String select = "SELECT * FROM " + playerTableName;
384+
SqlTestDataGenerator sqlTestDataGenerator = SqlTestDataGenerator.buildFrom(DATA_SOURCE);
385+
String insertScript = sqlTestDataGenerator.generateInsertScriptFor(select);
386+
387+
// THEN
388+
playerTable.recreate();
389+
SQL_EXECUTOR.execute(insertScript);
390+
assertThat(playerTable).withScript(insertScript)
391+
.hasNumberOfRows(1);
392+
Assertions.assertThat(insertScript).contains("'2012-09-17 19:56:47.32'");
393+
394+
}
395+
396+
@Test public void
397+
should_generate_an_insert_statement_with_a_timestamp_with_time_zone_type() {
398+
399+
// GIVEN
400+
TestTable playerTable =
401+
buildUniqueTable( DATA_SOURCE
402+
, "Table"
403+
, "col TIMESTAMP WITH TIME ZONE"
404+
)
405+
.create()
406+
.insertValues("'2008-08-28 10:28:38+8:00'");
407+
408+
// WHEN
409+
String playerTableName = playerTable.getTableName();
410+
String select = "SELECT * FROM " + playerTableName;
411+
SqlTestDataGenerator sqlTestDataGenerator = SqlTestDataGenerator.buildFrom(DATA_SOURCE);
412+
String insertScript = sqlTestDataGenerator.generateInsertScriptFor(select);
413+
414+
// THEN
415+
playerTable.recreate();
416+
SQL_EXECUTOR.execute(insertScript);
417+
assertThat(playerTable).withScript(insertScript)
418+
.hasNumberOfRows(1);
419+
Assertions.assertThat(insertScript).contains("'2008-08-28 10:28:38+08:00'");
420+
}
421+
422+
423+
@Test public void
424+
should_generate_an_insert_statement_with_a_time_without_declared_time_zone_type() {
425+
426+
// GIVEN
427+
TestTable playerTable =
428+
buildUniqueTable( DATA_SOURCE
429+
, "Table"
430+
, "col TIME WITHOUT TIME ZONE"
431+
)
432+
.create()
433+
.insertValues("'23:59:59'");
434+
435+
// WHEN
436+
String playerTableName = playerTable.getTableName();
437+
String select = "SELECT * FROM " + playerTableName;
438+
SqlTestDataGenerator sqlTestDataGenerator = SqlTestDataGenerator.buildFrom(DATA_SOURCE);
439+
String insertScript = sqlTestDataGenerator.generateInsertScriptFor(select);
440+
441+
// THEN
442+
playerTable.recreate();
443+
SQL_EXECUTOR.execute(insertScript);
444+
assertThat(playerTable).withScript(insertScript)
445+
.hasNumberOfRows(1)
446+
.row(0).hasValues("23:59:59");
447+
448+
}
449+
450+
@Test public void
451+
should_generate_an_insert_statement_with_a_time_with_timezone_type() {
452+
453+
// GIVEN
454+
TestTable playerTable =
455+
buildUniqueTable(DATA_SOURCE
456+
, "Table"
457+
, "col TIME WITH TIME ZONE"
458+
)
459+
.create()
460+
.insertValues("'23:59:59+8:00'");
461+
462+
// WHEN
463+
String playerTableName = playerTable.getTableName();
464+
String select = "SELECT * FROM " + playerTableName;
465+
SqlTestDataGenerator sqlTestDataGenerator = SqlTestDataGenerator.buildFrom(DATA_SOURCE);
466+
String insertScript = sqlTestDataGenerator.generateInsertScriptFor(select);
467+
468+
// THEN
469+
playerTable.recreate();
470+
SQL_EXECUTOR.execute(insertScript);
471+
assertThat(playerTable).withScript(insertScript)
472+
.hasNumberOfRows(1)
473+
.row(0).hasValues(OffsetTime.parse("23:59:59+08:00"));
474+
}
475+
476+
477+
@Test public void
478+
should_generate_an_insert_statement_with_a_time_type() {
479+
480+
// GIVEN
481+
TestTable playerTable =
482+
buildUniqueTable( DATA_SOURCE
483+
, "Table"
484+
, "col TIME"
485+
)
486+
.create()
487+
.insertValues("'23:59:59'");
488+
489+
// WHEN
490+
String playerTableName = playerTable.getTableName();
491+
String select = "SELECT * FROM " + playerTableName;
492+
SqlTestDataGenerator sqlTestDataGenerator = SqlTestDataGenerator.buildFrom(DATA_SOURCE);
493+
String insertScript = sqlTestDataGenerator.generateInsertScriptFor(select);
494+
495+
// THEN
496+
playerTable.recreate();
497+
SQL_EXECUTOR.execute(insertScript);
498+
assertThat(playerTable).withScript(insertScript)
499+
.hasNumberOfRows(1)
500+
.row(0).hasValues("23:59:59");
501+
502+
}
503+
312504
}

0 commit comments

Comments
 (0)