From 56dd5a2aea47616a0adcd595c62490477a25c615 Mon Sep 17 00:00:00 2001 From: "khurelkhuyag.m" Date: Thu, 24 Oct 2019 17:19:44 +0800 Subject: [PATCH] DATACASS-694 - Fix Cassandra time to LocalTime conversion. LocalTime now correctly uses nanoseconds. Original pull request: #166. --- .../convert/CassandraJsr310Converters.java | 4 +- .../CassandraJsr310ConvertersUnitTests.java | 4 +- .../CassandraTypeMappingIntegrationTests.java | 47 +++++++++++++------ 3 files changed, 36 insertions(+), 19 deletions(-) diff --git a/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/core/convert/CassandraJsr310Converters.java b/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/core/convert/CassandraJsr310Converters.java index b3375b756..302774dd4 100644 --- a/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/core/convert/CassandraJsr310Converters.java +++ b/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/core/convert/CassandraJsr310Converters.java @@ -106,7 +106,7 @@ public abstract class CassandraJsr310Converters { @Override public LocalTime convert(Long source) { - return LocalTime.ofNanoOfDay(TimeUnit.MILLISECONDS.toNanos(source)); + return LocalTime.ofNanoOfDay(source); } } @@ -124,7 +124,7 @@ public abstract class CassandraJsr310Converters { @Override public Long convert(LocalTime source) { - return source.getLong(ChronoField.MILLI_OF_DAY); + return source.getLong(ChronoField.NANO_OF_DAY); } } } diff --git a/spring-data-cassandra/src/test/java/org/springframework/data/cassandra/core/convert/CassandraJsr310ConvertersUnitTests.java b/spring-data-cassandra/src/test/java/org/springframework/data/cassandra/core/convert/CassandraJsr310ConvertersUnitTests.java index b9f7071dd..f3668dbf5 100644 --- a/spring-data-cassandra/src/test/java/org/springframework/data/cassandra/core/convert/CassandraJsr310ConvertersUnitTests.java +++ b/spring-data-cassandra/src/test/java/org/springframework/data/cassandra/core/convert/CassandraJsr310ConvertersUnitTests.java @@ -34,7 +34,7 @@ public class CassandraJsr310ConvertersUnitTests { @Test // DATACASS-302 public void shouldConvertLongToLocalTime() { - assertThat(MillisOfDayToLocalTimeConverter.INSTANCE.convert(3723000L)) + assertThat(MillisOfDayToLocalTimeConverter.INSTANCE.convert(3_723_000_000_000L)) .isEqualTo(LocalTime.of(1, 2, 3)); } @@ -43,6 +43,6 @@ public class CassandraJsr310ConvertersUnitTests { assertThat(LocalTimeToMillisOfDayConverter.INSTANCE.convert(LocalTime.MIDNIGHT)).isZero(); assertThat(LocalTimeToMillisOfDayConverter.INSTANCE.convert(LocalTime.of(1, 2, 3))) - .isEqualTo(3723000L); + .isEqualTo(3_723_000_000_000L); } } diff --git a/spring-data-cassandra/src/test/java/org/springframework/data/cassandra/core/convert/CassandraTypeMappingIntegrationTests.java b/spring-data-cassandra/src/test/java/org/springframework/data/cassandra/core/convert/CassandraTypeMappingIntegrationTests.java index 41522633f..8639c198b 100755 --- a/spring-data-cassandra/src/test/java/org/springframework/data/cassandra/core/convert/CassandraTypeMappingIntegrationTests.java +++ b/spring-data-cassandra/src/test/java/org/springframework/data/cassandra/core/convert/CassandraTypeMappingIntegrationTests.java @@ -22,15 +22,10 @@ import java.math.BigDecimal; import java.math.BigInteger; import java.net.InetAddress; import java.nio.ByteBuffer; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collections; -import java.util.Date; -import java.util.HashMap; -import java.util.HashSet; -import java.util.List; -import java.util.UUID; +import java.time.LocalTime; +import java.util.*; +import com.datastax.driver.core.*; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; @@ -48,13 +43,6 @@ import org.springframework.data.cassandra.support.CassandraVersion; import org.springframework.data.cassandra.test.util.AbstractKeyspaceCreatingIntegrationTest; import org.springframework.data.util.Version; -import com.datastax.driver.core.DataType; -import com.datastax.driver.core.Duration; -import com.datastax.driver.core.LocalDate; -import com.datastax.driver.core.SimpleStatement; -import com.datastax.driver.core.TupleType; -import com.datastax.driver.core.TupleValue; - /** * Integration tests for type mapping using {@link CassandraOperations}. * @@ -551,6 +539,35 @@ public class CassandraTypeMappingIntegrationTests extends AbstractKeyspaceCreati assertThat(loaded.getLocalTime()).isEqualTo(entity.getLocalTime()); } + @Test + public void shouldReadLocalTimeFromDriver(){ + assumeTrue(cassandraVersion.isGreaterThanOrEqualTo(VERSION_3_10)); + AllPossibleTypes entity = new AllPossibleTypes("1"); + + entity.setLocalTime(java.time.LocalTime.of(1, 2, 3)); + + operations.insert(entity); + + ResultSet resultSet = session.execute("SELECT localTime FROM AllPossibleTypes WHERE id = '1'"); + Iterator rowIt = resultSet.iterator(); + while (rowIt.hasNext()){ + Row row = rowIt.next(); + long timeNanos = row.getTime(0); + assertThat(timeNanos).isEqualTo(3_723_000_000_000L); + } + } + + @Test + public void shouldWriteLocalTimeThroughDriver(){ + assumeTrue(cassandraVersion.isGreaterThanOrEqualTo(VERSION_3_10)); + + session.execute("INSERT INTO AllPossibleTypes(id,localTime) VALUES('1','01:02:03.000')"); + + AllPossibleTypes entity = operations.selectOne("SELECT localTime FROM AllPossibleTypes WHERE id = '1'", AllPossibleTypes.class); + + assertThat(entity).hasFieldOrProperty("localTime").isEqualTo(LocalTime.of(1, 2, 3)); + } + @Test // DATACASS-296, DATACASS-563 public void shouldReadAndWriteJodaLocalTime() {