DATACASS-694 - Fix Cassandra time to LocalTime conversion.

LocalTime now correctly uses nanoseconds.

Original pull request: #166.
This commit is contained in:
khurelkhuyag.m
2019-10-24 17:19:44 +08:00
committed by Mark Paluch
parent 86c8d40c54
commit 56dd5a2aea
3 changed files with 36 additions and 19 deletions

View File

@@ -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);
}
}
}

View File

@@ -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);
}
}

View File

@@ -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<Row> 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() {