Skip to content

Commit

Permalink
Cover more cases like timestampLiteral, timeLiteral, datetimeLiteral
Browse files Browse the repository at this point in the history
  • Loading branch information
obabichevjb committed Apr 26, 2024
1 parent 2ba3c8b commit 20f9371
Show file tree
Hide file tree
Showing 5 changed files with 295 additions and 48 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -180,7 +180,9 @@ class JavaLocalDateTimeColumnType : ColumnType<LocalDateTime>(), IDateColumnType
val dialect = currentDialect
return when {
dialect is SQLiteDialect -> "'${SQLITE_AND_ORACLE_DATE_TIME_STRING_FORMATTER.format(instant)}'"
dialect is OracleDialect || dialect.h2Mode == H2Dialect.H2CompatibilityMode.Oracle -> "'${SQLITE_AND_ORACLE_DATE_TIME_STRING_FORMATTER.format(instant)}'"
dialect is OracleDialect || dialect.h2Mode == H2Dialect.H2CompatibilityMode.Oracle ->
"TO_TIMESTAMP('${SQLITE_AND_ORACLE_DATE_TIME_STRING_FORMATTER.format(instant)}', 'YYYY-MM-DD HH24:MI:SS.FF3')"

dialect is MysqlDialect -> {
val formatter = if (dialect.isFractionDateTimeSupported()) MYSQL_FRACTION_DATE_TIME_STRING_FORMATTER else MYSQL_DATE_TIME_STRING_FORMATTER
"'${formatter.format(instant)}'"
Expand Down Expand Up @@ -248,13 +250,11 @@ class JavaLocalTimeColumnType : ColumnType<LocalTime>(), IDateColumnType {
override fun sqlType(): String = currentDialect.dataTypeProvider.timeType()

override fun nonNullValueToString(value: LocalTime): String {
val dialect = currentDialect
val formatter = if (dialect is OracleDialect || dialect.h2Mode == H2Dialect.H2CompatibilityMode.Oracle) {
ORACLE_TIME_STRING_FORMATTER
} else {
DEFAULT_TIME_STRING_FORMATTER
if (currentDialect is OracleDialect || currentDialect.h2Mode == H2Dialect.H2CompatibilityMode.Oracle) {
return "TO_TIMESTAMP('${ORACLE_TIME_STRING_FORMATTER.format(value)}', 'YYYY-MM-DD HH24:MI:SS')"
}
return "'${formatter.format(value)}'"

return "'${DEFAULT_TIME_STRING_FORMATTER.format(value)}'"
}

override fun valueFromDB(value: Any): LocalTime = when (value) {
Expand Down Expand Up @@ -302,8 +302,10 @@ class JavaInstantColumnType : ColumnType<Instant>(), IDateColumnType {
override fun nonNullValueToString(value: Instant): String {
val dialect = currentDialect
return when {
dialect is SQLiteDialect -> "'${SQLITE_AND_ORACLE_DATE_TIME_STRING_FORMATTER.format(value)}'"
dialect is OracleDialect || dialect.h2Mode == H2Dialect.H2CompatibilityMode.Oracle ->
"'${SQLITE_AND_ORACLE_DATE_TIME_STRING_FORMATTER.format(value)}'"
"TO_TIMESTAMP('${SQLITE_AND_ORACLE_DATE_TIME_STRING_FORMATTER.format(value)}', 'YYYY-MM-DD HH24:MI:SS.FF3')"

dialect is MysqlDialect -> {
val formatter = if (dialect.isFractionDateTimeSupported()) MYSQL_FRACTION_DATE_TIME_STRING_FORMATTER else MYSQL_DATE_TIME_STRING_FORMATTER
"'${formatter.format(value)}'"
Expand Down

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1,208 @@
package org.jetbrains.exposed

import org.jetbrains.exposed.dao.id.IntIdTable
import org.jetbrains.exposed.sql.insert
import org.jetbrains.exposed.sql.javatime.*
import org.jetbrains.exposed.sql.selectAll
import org.jetbrains.exposed.sql.tests.DatabaseTestsBase
import org.jetbrains.exposed.sql.tests.shared.assertEquals
import org.jetbrains.exposed.sql.update
import org.junit.Ignore
import org.junit.Test
import java.time.Instant
import java.time.LocalDate
import java.time.LocalDateTime
import java.time.LocalTime
import kotlin.test.assertNotNull

class DateTimeLiteralTest : DatabaseTestsBase() {
private val defaultDate = LocalDate.of(2000, 1, 1)
private val futureDate = LocalDate.of(3000, 1, 1)

object TableWithDate : IntIdTable() {
val date = date("date")
}

private val defaultDatetime = LocalDateTime.of(2000, 1, 1, 8, 0, 0, 100000000)
private val futureDatetime = LocalDateTime.of(3000, 1, 1, 8, 0, 0, 100000000)

object TableWithDatetime : IntIdTable() {
val datetime = datetime("datetime")
}

private val defaultTimestamp = Instant.parse("2000-01-01T01:00:00.00Z")
private val futureTimestamp = Instant.parse("3000-01-01T01:00:00.00Z")

object TableWithTimestamp : IntIdTable() {
val timestamp = timestamp("timestamp")
}

private val defaultLocalTime = LocalTime.of(1, 0, 0)
private val futureLocalTime = LocalTime.of(18, 0, 0)

object TableWithTime : IntIdTable() {
val time = time("time")
}

@Test
fun testInsertWithDateLiteral() {
withTables(TableWithDate) {
TableWithDate.insert {
it[date] = dateLiteral(defaultDate)
}
assertEquals(defaultDate, TableWithDate.selectAll().first()[TableWithDate.date])
}
}

@Test
fun testUpdateWithDateLiteral() {
withTables(TableWithDate) {
TableWithDate.insert {
it[date] = defaultDate
}

TableWithDate.update { it[date] = dateLiteral(futureDate) }
assertEquals(futureDate, TableWithDate.selectAll().first()[TableWithDate.date])
}
}

@Test
fun testSelectByDateLiteralEquality() {
withTables(TableWithDate) {
TableWithDate.insert {
it[date] = defaultDate
}

val query = TableWithDate.select(TableWithDate.date).where { TableWithDate.date eq dateLiteral(defaultDate) }
assertEquals(defaultDate, query.single()[TableWithDate.date])
}
}

@Test
fun testSelectByDateLiteralComparison() {
withTables(TableWithDate) {
TableWithDate.insert {
it[date] = defaultDate
}
val query = TableWithDate.selectAll().where { TableWithDate.date less dateLiteral(futureDate) }
assertNotNull(query.firstOrNull())
}
}

@Test
fun testInsertDatetimeLiteral() {
withTables(TableWithDatetime) {
TableWithDatetime.insert {
it[datetime] = dateTimeLiteral(defaultDatetime)
}
assertEquals(defaultDatetime, TableWithDatetime.selectAll().first()[TableWithDatetime.datetime])
}
}

@Test
fun testUpdateWithDatetimeLiteral() {
withTables(TableWithDatetime) {
TableWithDatetime.insert {
it[datetime] = defaultDatetime
}

TableWithDatetime.update { it[datetime] = dateTimeLiteral(futureDatetime) }
assertEquals(futureDatetime, TableWithDatetime.selectAll().first()[TableWithDatetime.datetime])
}
}

@Test
fun testSelectByDatetimeLiteralEquality() {
withTables(TableWithDatetime) {
TableWithDatetime.insert {
it[datetime] = defaultDatetime
}

val query = TableWithDatetime.select(TableWithDatetime.datetime).where { TableWithDatetime.datetime eq dateTimeLiteral(defaultDatetime) }
assertEquals(defaultDatetime, query.single()[TableWithDatetime.datetime])
}
}

@Test
fun testSelectByDatetimeLiteralComparison() {
withTables(TableWithDatetime) {
TableWithDatetime.insert {
it[datetime] = defaultDatetime
}
val query = TableWithDatetime.selectAll().where { TableWithDatetime.datetime less dateTimeLiteral(futureDatetime) }
assertNotNull(query.firstOrNull())
}
}

@Test
fun testInsertWithTimestampLiteral() {
withTables(TableWithTimestamp) {
TableWithTimestamp.insert {
it[timestamp] = timestampLiteral(defaultTimestamp)
}
assertEquals(defaultTimestamp, TableWithTimestamp.selectAll().first()[TableWithTimestamp.timestamp])
}
}

@Test
fun testUpdateWithTimestampLiteral() {
withTables(TableWithTimestamp) {
TableWithTimestamp.insert {
it[timestamp] = defaultTimestamp
}

TableWithTimestamp.update { it[timestamp] = timestampLiteral(futureTimestamp) }
assertEquals(futureTimestamp, TableWithTimestamp.selectAll().first()[TableWithTimestamp.timestamp])
}
}

@Test
fun testSelectByTimestampLiteralEquality() {
withTables(TableWithTimestamp) {
TableWithTimestamp.insert {
it[timestamp] = defaultTimestamp
}

val query = TableWithTimestamp.select(TableWithTimestamp.timestamp).where { TableWithTimestamp.timestamp eq timestampLiteral(defaultTimestamp) }
assertEquals(defaultTimestamp, query.single()[TableWithTimestamp.timestamp])
}
}

@Test
fun testInsertTimeLiteral() {
withTables(TableWithTime) {
TableWithTime.insert {
it[time] = timeLiteral(defaultLocalTime)
}
assertEquals(defaultLocalTime, TableWithTime.selectAll().first()[TableWithTime.time])
}
}

@Test
fun testUpdateWithTimeLiteral() {
withTables(TableWithTime) {
TableWithTime.insert {
it[time] = defaultLocalTime
}

TableWithTime.update { it[time] = timeLiteral(futureLocalTime) }
assertEquals(futureLocalTime, TableWithTime.selectAll().first()[TableWithTime.time])
}
}

@Test
@Ignore(
"Test fails with 'Collection is empty.' message. It can not find anything in db after insert. " +
"But SQL requests looks correct, and work well manually applied."
)
fun testSelectByTimeLiteralEquality() {
withTables(TableWithTime) {
TableWithTime.insert {
it[time] = defaultLocalTime
}

val query = TableWithTime.select(TableWithTime.id, TableWithTime.time).where { TableWithTime.time eq timeLiteral(defaultLocalTime) }
assertEquals(defaultLocalTime, query.single()[TableWithTime.time])
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -66,12 +66,18 @@ class DateColumnType(val time: Boolean) : ColumnType<DateTime>(), IDateColumnTyp
override fun nonNullValueToString(value: DateTime): String {
return if (time) {
when {
currentDialect is OracleDialect ->
"TO_TIMESTAMP('${DEFAULT_DATE_TIME_STRING_FORMATTER.print(value.toDateTime(DateTimeZone.getDefault()))}', 'YYYY-MM-DD HH24:MI:SS.FF3')"
(currentDialect as? MysqlDialect)?.isFractionDateTimeSupported() == false ->
"'${MYSQL_DATE_TIME_STRING_FORMATTER.print(value.toDateTime(DateTimeZone.getDefault()))}'"
else -> "'${DEFAULT_DATE_TIME_STRING_FORMATTER.print(value.toDateTime(DateTimeZone.getDefault()))}'"
}
} else {
"'${DEFAULT_DATE_STRING_FORMATTER.print(value)}'"
val formatted = DEFAULT_DATE_STRING_FORMATTER.print(value)
if (currentDialect is OracleDialect) {
return "TO_DATE('$formatted', 'YYYY-MM-DD')"
}
return "'$formatted'"
}
}

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
package org.jetbrains.exposed

import org.jetbrains.exposed.dao.id.IntIdTable
import org.jetbrains.exposed.sql.insert
import org.jetbrains.exposed.sql.jodatime.dateTimeLiteral
import org.jetbrains.exposed.sql.jodatime.datetime
import org.jetbrains.exposed.sql.selectAll
import org.jetbrains.exposed.sql.tests.DatabaseTestsBase
import org.jetbrains.exposed.sql.tests.shared.assertEquals
import org.jetbrains.exposed.sql.update
import org.joda.time.DateTime
import org.joda.time.format.DateTimeFormat
import org.junit.Test
import kotlin.test.assertNotNull

class JodaDateTimeLiteralTest : DatabaseTestsBase() {
private val pattern = "dd-mm-yyyy hh.mm.ss"

private val defaultDatetime: DateTime = DateTime.parse("01-01-2000 01.00.00", DateTimeFormat.forPattern(pattern))
private val futureDatetime: DateTime = DateTime.parse("01-01-3000 01.00.00", DateTimeFormat.forPattern(pattern))

object TableWithDatetime : IntIdTable() {
val datetime = datetime("datetime")
}

@Test
fun testInsertWithDateLiteral() {
withTables(TableWithDatetime) {
TableWithDatetime.insert {
it[datetime] = dateTimeLiteral(defaultDatetime)
}
assertEquals(defaultDatetime, TableWithDatetime.selectAll().first()[TableWithDatetime.datetime])
}
}

@Test
fun testUpdateWithDatetimeLiteral() {
withTables(TableWithDatetime) {
TableWithDatetime.insert {
it[datetime] = defaultDatetime
}

TableWithDatetime.update { it[datetime] = dateTimeLiteral(futureDatetime) }
assertEquals(futureDatetime, TableWithDatetime.selectAll().first()[TableWithDatetime.datetime])
}
}

@Test
fun testSelectByDatetimeLiteralEquality() {
withTables(TableWithDatetime) {
TableWithDatetime.insert {
it[datetime] = defaultDatetime
}

val query = TableWithDatetime.select(TableWithDatetime.datetime).where { TableWithDatetime.datetime eq dateTimeLiteral(defaultDatetime) }
assertEquals(defaultDatetime, query.single()[TableWithDatetime.datetime])
}
}

@Test
fun testSelectByDatetimeLiteralComparison() {
withTables(TableWithDatetime) {
TableWithDatetime.insert {
it[datetime] = defaultDatetime
}
val query = TableWithDatetime.selectAll().where { TableWithDatetime.datetime less dateTimeLiteral(futureDatetime) }
assertNotNull(query.firstOrNull())
}
}
}

0 comments on commit 20f9371

Please sign in to comment.