diff --git a/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/core/convert/BasicCassandraRowValueProvider.java b/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/core/convert/BasicCassandraRowValueProvider.java index a329e909a..0ea86feab 100644 --- a/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/core/convert/BasicCassandraRowValueProvider.java +++ b/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/core/convert/BasicCassandraRowValueProvider.java @@ -84,10 +84,6 @@ public class BasicCassandraRowValueProvider implements CassandraRowValueProvider : (T) this.reader.get(property.getRequiredColumnName()); } - /* (non-Javadoc) - * @see org.springframework.data.cassandra.core.convert.CassandraRowValueProvider#getRow() - */ - @Override public Row getRow() { return this.reader.getRow(); } @@ -100,6 +96,6 @@ public class BasicCassandraRowValueProvider implements CassandraRowValueProvider Assert.notNull(property, "CassandraPersistentProperty must not be null"); - return getRow().getColumnDefinitions().contains(property.getRequiredColumnName().toCql()); + return this.reader.contains(property.getRequiredColumnName()); } } diff --git a/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/core/convert/CassandraConverters.java b/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/core/convert/CassandraConverters.java index 10d8016ce..74a4c4209 100644 --- a/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/core/convert/CassandraConverters.java +++ b/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/core/convert/CassandraConverters.java @@ -17,6 +17,8 @@ package org.springframework.data.cassandra.core.convert; import java.net.InetAddress; +import java.time.Instant; +import java.time.LocalDate; import java.util.ArrayList; import java.util.Collection; import java.util.Date; @@ -31,8 +33,7 @@ import org.springframework.data.convert.ReadingConverter; import org.springframework.util.Assert; import org.springframework.util.NumberUtils; -import com.datastax.driver.core.LocalDate; -import com.datastax.driver.core.Row; +import com.datastax.oss.driver.api.core.cql.Row; /** * Wrapper class to contain useful converters for the usage with Cassandra. @@ -56,6 +57,7 @@ abstract class CassandraConverters { converters.add(RowToCassandraLocalDateConverter.INSTANCE); converters.add(RowToBooleanConverter.INSTANCE); + converters.add(RowToInstantConverter.INSTANCE); converters.add(RowToDateConverter.INSTANCE); converters.add(RowToInetAddressConverter.INSTANCE); converters.add(RowToListConverter.INSTANCE); @@ -74,7 +76,7 @@ abstract class CassandraConverters { @Override public Boolean convert(Row row) { - return row.getBool(0); + return row.getBoolean(0); } } @@ -90,7 +92,23 @@ abstract class CassandraConverters { @Override public Date convert(Row row) { - return row.getTimestamp(0); + return Date.from(row.getInstant(0)); + } + } + + /** + * Simple singleton to convert {@link Row}s to their {@link Instant} representation. + * + * @author Mark Paluch + */ + @ReadingConverter + public enum RowToInstantConverter implements Converter { + + INSTANCE; + + @Override + public Instant convert(Row row) { + return row.getInstant(0); } } @@ -106,7 +124,7 @@ abstract class CassandraConverters { @Override public InetAddress convert(Row row) { - return row.getInet(0); + return row.getInetAddress(0); } } @@ -182,7 +200,7 @@ abstract class CassandraConverters { @Override public UUID convert(Row row) { - return row.getUUID(0); + return row.getUuid(0); } } @@ -198,7 +216,7 @@ abstract class CassandraConverters { @Override public LocalDate convert(Row row) { - return row.getDate(0); + return row.getLocalDate(0); } } } diff --git a/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/core/convert/CassandraRowValueProvider.java b/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/core/convert/CassandraRowValueProvider.java index c5c8407ba..31daca2d9 100644 --- a/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/core/convert/CassandraRowValueProvider.java +++ b/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/core/convert/CassandraRowValueProvider.java @@ -25,8 +25,4 @@ import com.datastax.driver.core.Row; */ public interface CassandraRowValueProvider extends CassandraValueProvider { - /** - * @return the underlying {@link Row}. - */ - Row getRow(); } diff --git a/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/core/convert/ColumnReader.java b/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/core/convert/ColumnReader.java index 839f7058e..297a49743 100644 --- a/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/core/convert/ColumnReader.java +++ b/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/core/convert/ColumnReader.java @@ -170,4 +170,8 @@ public class ColumnReader { public Row getRow() { return row; } + + public boolean contains(CqlIdentifier columnName) { + return row.getColumnDefinitions().contains(columnName.toCql()); + } } diff --git a/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/core/convert/MappingCassandraConverter.java b/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/core/convert/MappingCassandraConverter.java index a8651c537..55e2f9344 100644 --- a/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/core/convert/MappingCassandraConverter.java +++ b/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/core/convert/MappingCassandraConverter.java @@ -233,12 +233,22 @@ public class MappingCassandraConverter extends AbstractCassandraConverter return (R) row; } + if (com.datastax.oss.driver.api.core.cql.Row.class.isAssignableFrom(rawType)) { + return (R) row; + } + if (getCustomConversions().hasCustomReadTarget(Row.class, rawType) || getConversionService().canConvert(Row.class, rawType)) { return getConversionService().convert(row, rawType); } + if (getCustomConversions().hasCustomReadTarget(com.datastax.oss.driver.api.core.cql.Row.class, rawType) + || getConversionService().canConvert(com.datastax.oss.driver.api.core.cql.Row.class, rawType)) { + + return getConversionService().convert(row, rawType); + } + if (typeInfo.isCollectionLike() || typeInfo.isMap()) { return getConversionService().convert(row, type); } @@ -246,7 +256,15 @@ public class MappingCassandraConverter extends AbstractCassandraConverter CassandraPersistentEntity persistentEntity = (CassandraPersistentEntity) getMappingContext() .getRequiredPersistentEntity(typeInfo); - return readEntityFromRow(persistentEntity, row); + if (row instanceof Row) { + return readEntityFromRow(persistentEntity, row); + } + + return readEntityFromRow(persistentEntity, (com.datastax.oss.driver.api.core.cql.Row) row); + } + + private S readEntityFromRow(CassandraPersistentEntity entity, com.datastax.oss.driver.api.core.cql.Row row) { + return doReadEntity(entity, row, expressionEvaluator -> new RowValueProvider(row, expressionEvaluator)); } private S readEntityFromRow(CassandraPersistentEntity entity, Row row) { diff --git a/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/core/convert/RowReaderPropertyAccessor.java b/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/core/convert/RowReaderPropertyAccessor.java index 0ad7bfa51..3b9ed4097 100644 --- a/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/core/convert/RowReaderPropertyAccessor.java +++ b/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/core/convert/RowReaderPropertyAccessor.java @@ -20,7 +20,7 @@ import org.springframework.expression.PropertyAccessor; import org.springframework.expression.TypedValue; import org.springframework.lang.Nullable; -import com.datastax.driver.core.Row; +import com.datastax.oss.driver.api.core.cql.Row; /** * {@link PropertyAccessor} to read values from a {@link Row}. diff --git a/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/core/cql/CqlIdentifier.java b/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/core/cql/CqlIdentifier.java index a7e6cdb19..a6b251b02 100644 --- a/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/core/cql/CqlIdentifier.java +++ b/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/core/cql/CqlIdentifier.java @@ -36,7 +36,9 @@ import com.datastax.driver.core.TableMetadata; * @author John Blum * @see #toCql() * @see #toString() + * @deprecated since 3.0, use {@link com.datastax.oss.driver.api.core.CqlIdentifier} instead. */ +@Deprecated public final class CqlIdentifier implements Comparable, Serializable { private static final long serialVersionUID = -974441606330912437L; diff --git a/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/core/cql/converter/AbstractResultSetToBasicFixedTypeConverter.java b/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/core/cql/converter/AbstractResultSetToBasicFixedTypeConverter.java index 478560b95..5227bb5e5 100644 --- a/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/core/cql/converter/AbstractResultSetToBasicFixedTypeConverter.java +++ b/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/core/cql/converter/AbstractResultSetToBasicFixedTypeConverter.java @@ -17,6 +17,7 @@ package org.springframework.data.cassandra.core.cql.converter; import org.springframework.core.convert.ConversionService; import org.springframework.core.convert.support.DefaultConversionService; +import org.springframework.core.convert.support.GenericConversionService; /** * Thin wrapper that allows subclasses to delegate conversion of the given value to a {@link DefaultConversionService}. @@ -26,5 +27,5 @@ import org.springframework.core.convert.support.DefaultConversionService; */ public abstract class AbstractResultSetToBasicFixedTypeConverter extends AbstractResultSetConverter { - protected static final ConversionService CONVERTER = new DefaultConversionService(); + protected static final ConversionService CONVERTER = DefaultConversionService.getSharedInstance(); } diff --git a/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/core/mapping/UserTypeResolver.java b/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/core/mapping/UserTypeResolver.java index efdbcf11e..b8b1c9c20 100644 --- a/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/core/mapping/UserTypeResolver.java +++ b/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/core/mapping/UserTypeResolver.java @@ -19,6 +19,7 @@ import org.springframework.data.cassandra.core.cql.CqlIdentifier; import org.springframework.lang.Nullable; import com.datastax.driver.core.UserType; +import com.datastax.oss.driver.api.core.type.UserDefinedType; /** * Strategy interface to resolve {@link UserType} by {@link String name}. @@ -42,4 +43,17 @@ public interface UserTypeResolver { @Nullable UserType resolveType(CqlIdentifier typeName); + /** + * Resolve a {@link UserType} by {@link String name}. + * + * @param typeName {@link String name} of the {@link UserType} to resolve; must not be {@literal null}. + * @return the resolved {@link UserType} or {@literal null} if not found. + * @see UserDefinedType + */ + @Nullable + default UserDefinedType resolveType(com.datastax.oss.driver.api.core.CqlIdentifier typeName) { + // TODO + return null; + } + }