Polishing.

Add missing generics. Inline superfluous methods.

See #1384
This commit is contained in:
Mark Paluch
2023-05-25 14:24:44 +02:00
parent 7e831fda94
commit e87125436a
5 changed files with 348 additions and 60 deletions

View File

@@ -39,12 +39,15 @@ import org.springframework.dao.InvalidDataAccessApiUsageException;
import org.springframework.data.cassandra.core.mapping.*;
import org.springframework.data.cassandra.core.mapping.Embedded.OnEmpty;
import org.springframework.data.convert.CustomConversions;
import org.springframework.data.mapping.AccessOptions;
import org.springframework.data.mapping.InstanceCreatorMetadata;
import org.springframework.data.mapping.MappingException;
import org.springframework.data.mapping.Parameter;
import org.springframework.data.mapping.PersistentEntity;
import org.springframework.data.mapping.PersistentProperty;
import org.springframework.data.mapping.PersistentPropertyAccessor;
import org.springframework.data.mapping.PersistentPropertyPath;
import org.springframework.data.mapping.PersistentPropertyPathAccessor;
import org.springframework.data.mapping.context.MappingContext;
import org.springframework.data.mapping.model.ConvertingPropertyAccessor;
import org.springframework.data.mapping.model.DefaultSpELExpressionEvaluator;
@@ -283,6 +286,7 @@ public class MappingCassandraConverter extends AbstractCassandraConverter
}
@Override
@SuppressWarnings("unchecked")
public <R> R project(EntityProjection<R, ?> projection, Row row) {
if (!projection.isProjection()) {
@@ -665,7 +669,7 @@ public class MappingCassandraConverter extends AbstractCassandraConverter
? getMappingContext().getRequiredPersistentEntity(compositeIdProperty)
: entity;
writeWhere(MapId.class.cast(id), sink, whereEntity);
writeWhere((MapId) id, sink, whereEntity);
return;
}
@@ -725,18 +729,6 @@ public class MappingCassandraConverter extends AbstractCassandraConverter
}
}
private void writeWhere(ConvertingPropertyAccessor<?> accessor, Where sink, CassandraPersistentEntity<?> entity) {
Assert.isTrue(entity.isCompositePrimaryKey(),
() -> String.format("Entity [%s] is not a composite primary key", entity.getName()));
for (CassandraPersistentProperty property : entity) {
TypeCodec<Object> codec = getCodec(property);
Object value = accessor.getProperty(property, codec.getJavaType().getRawType());
sink.put(property.getRequiredColumnName(), value);
}
}
private void writeTupleValue(ConvertingPropertyAccessor<?> propertyAccessor, TupleValue tupleValue,
CassandraPersistentEntity<?> entity) {
@@ -863,7 +855,7 @@ public class MappingCassandraConverter extends AbstractCassandraConverter
*/
@Nullable
@SuppressWarnings("unchecked")
private <T> T getWriteValue(CassandraPersistentProperty property, ConvertingPropertyAccessor propertyAccessor) {
private <T> T getWriteValue(CassandraPersistentProperty property, ConvertingPropertyAccessor<?> propertyAccessor) {
ColumnType cassandraTypeDescriptor = cassandraTypeResolver.resolve(property);
@@ -914,7 +906,7 @@ public class MappingCassandraConverter extends AbstractCassandraConverter
return writeMapInternal((Map<Object, Object>) value, columnType);
}
TypeInformation<?> type = TypeInformation.of((Class) value.getClass());
TypeInformation<?> type = TypeInformation.of((Class<?>) value.getClass());
TypeInformation<?> actualType = type.getRequiredActualType();
BasicCassandraPersistentEntity<?> entity = getMappingContext().getPersistentEntity(actualType.getType());
@@ -989,7 +981,6 @@ public class MappingCassandraConverter extends AbstractCassandraConverter
* @param requestedTargetType must not be {@literal null}.
* @see org.springframework.data.cassandra.core.mapping.CassandraType
*/
@SuppressWarnings("unchecked")
@Nullable
private Object getPotentiallyConvertedSimpleValue(@Nullable Object value, @Nullable Class<?> requestedTargetType) {
@@ -1237,7 +1228,7 @@ public class MappingCassandraConverter extends AbstractCassandraConverter
* Extension of {@link SpELExpressionParameterValueProvider} to recursively trigger value conversion on the raw
* resolved SpEL value.
*/
private class ConverterAwareSpELExpressionParameterValueProvider
private static class ConverterAwareSpELExpressionParameterValueProvider
extends SpELExpressionParameterValueProvider<CassandraPersistentProperty> {
private final ConversionContext context;
@@ -1450,16 +1441,8 @@ public class MappingCassandraConverter extends AbstractCassandraConverter
}
}
private static class PropertyTranslatingPropertyAccessor<T> implements PersistentPropertyPathAccessor<T> {
private final PersistentPropertyAccessor<T> delegate;
private final PersistentPropertyTranslator propertyTranslator;
private PropertyTranslatingPropertyAccessor(PersistentPropertyAccessor<T> delegate,
PersistentPropertyTranslator propertyTranslator) {
this.delegate = delegate;
this.propertyTranslator = propertyTranslator;
}
private record PropertyTranslatingPropertyAccessor<T> (PersistentPropertyAccessor<T> delegate,
PersistentPropertyTranslator propertyTranslator) implements PersistentPropertyPathAccessor<T> {
static <T> PersistentPropertyAccessor<T> create(PersistentPropertyAccessor<T> delegate,
PersistentPropertyTranslator propertyTranslator) {
@@ -1566,7 +1549,7 @@ public class MappingCassandraConverter extends AbstractCassandraConverter
Map<String, Object> map = new LinkedHashMap<>();
@Override
public void setProperty(PersistentProperty<?> persistentProperty, Object o) {
public void setProperty(PersistentProperty<?> persistentProperty, @Nullable Object o) {
map.put(persistentProperty.getName(), o);
}

View File

@@ -17,8 +17,6 @@ package org.springframework.data.cassandra.repository.query;
import org.springframework.core.convert.converter.Converter;
import org.springframework.data.cassandra.core.CassandraOperations;
import org.springframework.data.cassandra.core.convert.CassandraConverter;
import org.springframework.data.cassandra.core.mapping.CassandraMappingContext;
import org.springframework.data.cassandra.repository.query.CassandraQueryExecution.CollectionExecution;
import org.springframework.data.cassandra.repository.query.CassandraQueryExecution.ExistsExecution;
import org.springframework.data.cassandra.repository.query.CassandraQueryExecution.ResultProcessingConverter;
@@ -31,7 +29,6 @@ import org.springframework.data.repository.query.ParameterAccessor;
import org.springframework.data.repository.query.RepositoryQuery;
import org.springframework.data.repository.query.ResultProcessor;
import org.springframework.lang.Nullable;
import org.springframework.util.Assert;
import com.datastax.oss.driver.api.core.cql.SimpleStatement;
import com.datastax.oss.driver.api.core.cql.Statement;
@@ -56,7 +53,7 @@ public abstract class AbstractCassandraQuery extends CassandraRepositoryQuerySup
*/
public AbstractCassandraQuery(CassandraQueryMethod queryMethod, CassandraOperations operations) {
super(queryMethod, toMappingContext(operations));
super(queryMethod, operations.getConverter().getMappingContext());
this.operations = operations;
}
@@ -81,7 +78,7 @@ public abstract class AbstractCassandraQuery extends CassandraRepositoryQuerySup
Statement<?> statement = createQuery(parameterAccessor);
CassandraQueryExecution queryExecution = getExecution(parameterAccessor,
new ResultProcessingConverter(resultProcessor, toMappingContext(getOperations()), getEntityInstantiators()));
new ResultProcessingConverter(resultProcessor, getMappingContext(), getEntityInstantiators()));
Class<?> resultType = resolveResultType(resultProcessor);
@@ -170,14 +167,4 @@ public abstract class AbstractCassandraQuery extends CassandraRepositoryQuerySup
*/
protected abstract boolean isModifyingQuery();
private static CassandraConverter toConverter(CassandraOperations operations) {
Assert.notNull(operations, "CassandraOperations must not be null");
return operations.getConverter();
}
private static CassandraMappingContext toMappingContext(CassandraOperations operations) {
return toConverter(operations).getMappingContext();
}
}

View File

@@ -22,8 +22,6 @@ import org.springframework.core.convert.converter.Converter;
import org.springframework.data.cassandra.ReactiveResultSet;
import org.springframework.data.cassandra.core.CassandraOperations;
import org.springframework.data.cassandra.core.ReactiveCassandraOperations;
import org.springframework.data.cassandra.core.convert.CassandraConverter;
import org.springframework.data.cassandra.core.mapping.CassandraMappingContext;
import org.springframework.data.cassandra.repository.query.ReactiveCassandraQueryExecution.CollectionExecution;
import org.springframework.data.cassandra.repository.query.ReactiveCassandraQueryExecution.ExistsExecution;
import org.springframework.data.cassandra.repository.query.ReactiveCassandraQueryExecution.ResultProcessingConverter;
@@ -33,7 +31,6 @@ import org.springframework.data.cassandra.repository.query.ReactiveCassandraQuer
import org.springframework.data.repository.query.ParameterAccessor;
import org.springframework.data.repository.query.RepositoryQuery;
import org.springframework.data.repository.query.ResultProcessor;
import org.springframework.util.Assert;
import com.datastax.oss.driver.api.core.cql.SimpleStatement;
@@ -58,7 +55,7 @@ public abstract class AbstractReactiveCassandraQuery extends CassandraRepository
*/
public AbstractReactiveCassandraQuery(ReactiveCassandraQueryMethod method, ReactiveCassandraOperations operations) {
super(method, getRequiredMappingContext(operations));
super(method, operations.getConverter().getMappingContext());
this.operations = operations;
}
@@ -83,8 +80,8 @@ public abstract class AbstractReactiveCassandraQuery extends CassandraRepository
Mono<SimpleStatement> statement = createQuery(parameterAccessor);
ResultProcessor resultProcessor = getQueryMethod().getResultProcessor().withDynamicProjection(parameterAccessor);
ReactiveCassandraQueryExecution queryExecution = getExecution(parameterAccessor, new ResultProcessingConverter(
resultProcessor, getRequiredMappingContext(getReactiveCassandraOperations()), getEntityInstantiators()));
ReactiveCassandraQueryExecution queryExecution = getExecution(parameterAccessor,
new ResultProcessingConverter(resultProcessor, getMappingContext(), getEntityInstantiators()));
Class<?> resultType = resolveResultType(resultProcessor);
@@ -94,7 +91,7 @@ public abstract class AbstractReactiveCassandraQuery extends CassandraRepository
private Class<?> resolveResultType(ResultProcessor resultProcessor) {
CassandraReturnedType returnedType = new CassandraReturnedType(resultProcessor.getReturnedType(),
getRequiredConverter(getReactiveCassandraOperations()).getCustomConversions());
getReactiveCassandraOperations().getConverter().getCustomConversions());
return returnedType.getResultType();
}
@@ -173,14 +170,4 @@ public abstract class AbstractReactiveCassandraQuery extends CassandraRepository
*/
protected abstract boolean isModifyingQuery();
private static CassandraConverter getRequiredConverter(ReactiveCassandraOperations operations) {
Assert.notNull(operations, "ReactiveCassandraOperations must not be null");
return operations.getConverter();
}
private static CassandraMappingContext getRequiredMappingContext(ReactiveCassandraOperations operations) {
return getRequiredConverter(operations).getMappingContext();
}
}

View File

@@ -49,6 +49,8 @@ public abstract class CassandraRepositoryQuerySupport implements RepositoryQuery
private final QueryStatementCreator queryStatementCreator;
private final MappingContext<? extends CassandraPersistentEntity<?>, CassandraPersistentProperty> mappingContext;
/**
* Create a new {@link AbstractCassandraQuery} from the given {@link CassandraQueryMethod} and
* {@link CassandraOperations}.
@@ -78,6 +80,7 @@ public abstract class CassandraRepositoryQuerySupport implements RepositoryQuery
this.queryMethod = queryMethod;
this.instantiators = new EntityInstantiators();
this.queryStatementCreator = new QueryStatementCreator(queryMethod, mappingContext);
this.mappingContext = mappingContext;
}
@Override
@@ -93,6 +96,10 @@ public abstract class CassandraRepositoryQuerySupport implements RepositoryQuery
return this.queryStatementCreator;
}
protected MappingContext<? extends CassandraPersistentEntity<?>, CassandraPersistentProperty> getMappingContext() {
return mappingContext;
}
class CassandraReturnedType {
private final ReturnedType returnedType;

View File

@@ -0,0 +1,324 @@
/*
* Copyright 2023 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* https://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.springframework.data.cassandra;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.EqualsAndHashCode;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import lombok.ToString;
import org.springframework.data.cassandra.core.cql.PrimaryKeyType;
import org.springframework.data.cassandra.core.mapping.CassandraType;
import org.springframework.data.cassandra.core.mapping.Column;
import org.springframework.data.cassandra.core.mapping.PrimaryKey;
import org.springframework.data.cassandra.core.mapping.PrimaryKeyClass;
import org.springframework.data.cassandra.core.mapping.PrimaryKeyColumn;
import org.springframework.data.cassandra.core.mapping.Table;
import org.springframework.data.cassandra.core.mapping.UserDefinedType;
import java.util.Date;
@lombok.Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
@Table(Attachment.TABLE_NAME)
public class Attachment {
public static final String TABLE_NAME = "attachment";
public static final String PARENT_ID = "parent_id";
public static final String DATA = "data";
@Getter
@Setter
@PrimaryKey
private Key id;
@Getter
@Setter
@CassandraType(type = CassandraType.Name.BIGINT)
@Column(PARENT_ID)
private Long parentId;
@Getter
@Setter
@Column(DATA)
private AttachmentData data;
@lombok.Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
@PrimaryKeyClass
public static class Key {
public static final String MESSAGE_ID = "message_id";
public static final String ATTACHMENT_ID = "attachment_id";
/**
* ID сообщения.
*
* {@code GEPS.ATTACHMENT.MESSAGE_ID}
*/
@PrimaryKeyColumn(value = MESSAGE_ID, type = PrimaryKeyType.PARTITIONED, ordinal = 0)
private long messageId;
/**
* ID вложения.
*
* {@code GEPS.ATTACHMENT.ATTACHMENT_ID}
*/
@PrimaryKeyColumn(value = ATTACHMENT_ID, type = PrimaryKeyType.CLUSTERED, ordinal = 1)
private long attachmentId;
}
@Builder
@AllArgsConstructor
@NoArgsConstructor
@EqualsAndHashCode
@ToString
@UserDefinedType(value = Attachment.AttachmentData.TYPE_NAME)
public static class AttachmentData {
public static final String TYPE_NAME = "attachment_data";
public static final String DT_FILE_NAME = "file_name";
public static final String DT_FILE_SIZE = "file_size";
public static final String DT_MIME_TYPE = "mime_type";
public static final String DT_SPF_BLANK_ID = "spf_blank_id";
public static final String DT_STATUS = "status";
public static final String DT_EXTERNAL_LINK = "external_link";
public static final String DT_CREATE_DATE = "create_date";
public static final String DT_UPDATE_DATE = "update_date";
public static final String DT_BASE_DIR_ID = "base_dir_id";
/**
* Исходное имя файла вложения.
*
* {@code GEPS.ATTACHMENT_FILE_NAME}
*/
@Getter
@Setter
@CassandraType(type = CassandraType.Name.VARCHAR)
@Column(DT_FILE_NAME)
private String fileName;
/**
* Размер файла вложения.
* Может быть не заполнен т.к. размер не известен на этапе добавления сообщения в БД (при скачивании из ИС ПР).
*
* {@code GEPS.ATTACHMENT.FILE_SIZE}.
*/
@Getter
@Setter
@CassandraType(type = CassandraType.Name.BIGINT)
@Column(DT_FILE_SIZE)
private Long fileSize;
/**
* MIME-type файла вложения.
*
* {@code GEPS.ATTACHMENT.MIME_TYPE}
*/
@Getter
@Setter
@CassandraType(type = CassandraType.Name.VARCHAR)
@Column(DT_MIME_TYPE)
private String mimeType;
/**
* Код бланка сервера печатных форм для создания pdf представления вложения.
*
* {@code GEPS.ATTACHMENT.SPF_BLANK_ID}.
*/
@Getter
@Setter
@CassandraType(type = CassandraType.Name.VARCHAR)
@Column(DT_SPF_BLANK_ID)
private String spfBlankId;
/**
* Статус загрузки вложения.
* {@code GEPS.ATTACHMENT.STATUS}.
*/
@Getter
@Setter
@CassandraType(type = CassandraType.Name.ASCII)
@Column(DT_STATUS)
private String status;
/**
* Ссылка на внешний файл вложения.
*
* {@code GEPS.ATTACHMENT.EXTERNAL_LINK}.
*/
@Getter
@Setter
@CassandraType(type = CassandraType.Name.VARCHAR)
@Column(DT_EXTERNAL_LINK)
private String externalLink;
/**
* ID маппера для сохранения вложений.
*
* {@code GEPS.ATTACHMENT.BASE_DIR_ID}.
*/
@Getter
@Setter
@CassandraType(type = CassandraType.Name.SMALLINT)
@Column(DT_BASE_DIR_ID)
private Short baseDirId;
/**
* Время создания (используется при переносе из Oracle)
*
* {@code GEPS.ATTACHMENT_SIGNATURE.CREATE_DATE}.
*/
@Getter
@Setter
@CassandraType(type = CassandraType.Name.TIMESTAMP)
@Column(DT_CREATE_DATE)
private Date createDate;
/**
* Время обновления (используется при переносе из Oracle)
*
* {@code GEPS.ATTACHMENT_SIGNATURE.UPDATE_DATE}.
*/
@Getter
@Setter
@CassandraType(type = CassandraType.Name.TIMESTAMP)
@Column(DT_UPDATE_DATE)
private Date updateDate;
}
@Builder
@AllArgsConstructor
@NoArgsConstructor
@EqualsAndHashCode
@ToString
@UserDefinedType(value = Attachment.AttachmentSignature.TYPE_NAME)
public static class AttachmentSignature {
public static final String TYPE_NAME = "attachment_signature";
public static final String DT_STATUS = "eds_status";
public static final String DT_START_DATE = "eds_start_date";
public static final String DT_FINISH_DATE = "eds_finish_date";
public static final String DT_CREATE_DATE = "create_date";
public static final String DT_UPDATE_DATE = "update_date";
public static final String DT_FILE_NAME = "file_name";
public static final String DT_BASE_DIR_ID = "eds_base_dir";
/**
* Статус EDS-верификации вложения.
* GET_DICTIONARY_ELEMENT_MNEMONIC(EDS_STATUS)
* GEPS.ATTACHMENT_SIGNATURE.EDS_STATUS
*
* <table>
* <tr>
* <td>NEW</td><td>EDS-верификации не запускалась</td>
* </tr>
* <tr>
* <td>RUNNING</td><td>EDS-верификация подписи вложении запущена, продолжается</td>
* </tr>
* <tr>
* <td>OK</td><td>EDS-верификация подписи вложения успешно проведена в ГУЦ СМЭВ3</td>
* </tr>
* <tr>
* <td>ERROR</td><td>EDS-верификация завершилась с ошибкой</td>
* </tr>
* </table>
*
* {@code GEPS.ATTACHMENT_SIGNATURE.EDS_STATUS}.
*/
@Getter
@Setter
@CassandraType(type = CassandraType.Name.ASCII)
@Column(DT_STATUS)
private String edsStatus;
/**
* Время запуска EDS-проверки.
*
* {@code GEPS.ATTACHMENT_SIGNATURE.EDS_START_DATE}.
*/
@Getter
@Setter
@CassandraType(type = CassandraType.Name.TIMESTAMP)
@Column(DT_START_DATE)
private Date edsStartDate;
/**
* Время завершения EDS-проверки.
*
* {@code GEPS.ATTACHMENT_SIGNATURE.EDS_FINISH_DATE}.
*/
@Getter
@Setter
@CassandraType(type = CassandraType.Name.TIMESTAMP)
@Column(DT_FINISH_DATE)
private Date edsFinishDate;
/**
* {@code GEPS.ATTACHMENT.CREATE_DATE}.
*/
@Getter
@Setter
@CassandraType(type = CassandraType.Name.TIMESTAMP)
@Column(DT_CREATE_DATE)
private Date createDate;
/**
* {@code GEPS.ATTACHMENT.UPDATE_DATE}.
*/
@Getter
@Setter
@CassandraType(type = CassandraType.Name.TIMESTAMP)
@Column(DT_UPDATE_DATE)
private Date updateDate;
/**
* Имя файла eds-подписи вложения.
*
* {@code GEPS.ATTACHMENT_SIGNATURE.FILE_NAME}
*/
@Getter
@Setter
@CassandraType(type = CassandraType.Name.VARCHAR)
@Column(DT_FILE_NAME)
private String edsFileName;
/**
* ID маппера для сохранения EDS-подписи вложений.
*
* {@code GEPS.ATTACHMENT_SIGNATURE.EDS_BASE_DIR_ID}.
*/
@Getter
@Setter
@CassandraType(type = CassandraType.Name.SMALLINT)
@Column(DT_BASE_DIR_ID)
private Short edsBaseDirId;
}
}