blob: 9abaa714996c9b142e29e1c0922ae265773b9be1 [file]
/*
* Copyright DataStax, Inc.
*
* 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
*
* http://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 com.datastax.oss.driver.mapper;
import static com.datastax.oss.driver.api.mapper.annotations.SchemaHint.TargetElement;
import static com.datastax.oss.driver.internal.core.util.LoggerTest.setupTestLogger;
import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.assertThatCode;
import static org.assertj.core.api.Assertions.assertThatThrownBy;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.timeout;
import static org.mockito.Mockito.verify;
import ch.qos.logback.classic.Level;
import com.datastax.oss.driver.api.core.CqlIdentifier;
import com.datastax.oss.driver.api.core.CqlSession;
import com.datastax.oss.driver.api.core.cql.SimpleStatement;
import com.datastax.oss.driver.api.core.servererrors.InvalidQueryException;
import com.datastax.oss.driver.api.mapper.MapperContext;
import com.datastax.oss.driver.api.mapper.annotations.ClusteringColumn;
import com.datastax.oss.driver.api.mapper.annotations.Dao;
import com.datastax.oss.driver.api.mapper.annotations.DaoFactory;
import com.datastax.oss.driver.api.mapper.annotations.DaoKeyspace;
import com.datastax.oss.driver.api.mapper.annotations.Entity;
import com.datastax.oss.driver.api.mapper.annotations.Mapper;
import com.datastax.oss.driver.api.mapper.annotations.PartitionKey;
import com.datastax.oss.driver.api.mapper.annotations.QueryProvider;
import com.datastax.oss.driver.api.mapper.annotations.SchemaHint;
import com.datastax.oss.driver.api.mapper.annotations.Select;
import com.datastax.oss.driver.api.mapper.annotations.Update;
import com.datastax.oss.driver.api.mapper.entity.EntityHelper;
import com.datastax.oss.driver.api.testinfra.CassandraRequirement;
import com.datastax.oss.driver.api.testinfra.ccm.CcmRule;
import com.datastax.oss.driver.api.testinfra.session.SessionRule;
import com.datastax.oss.driver.categories.ParallelizableTests;
import com.datastax.oss.driver.internal.core.util.LoggerTest;
import java.util.Arrays;
import java.util.List;
import java.util.Objects;
import java.util.UUID;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.ClassRule;
import org.junit.Test;
import org.junit.experimental.categories.Category;
import org.junit.rules.RuleChain;
import org.junit.rules.TestRule;
@Category(ParallelizableTests.class)
@CassandraRequirement(min = "3.4", description = "Creates a SASI index")
public class SchemaValidationIT extends InventoryITBase {
private static CcmRule ccm = CcmRule.getInstance();
private static SessionRule<CqlSession> sessionRule = SessionRule.builder(ccm).build();
private static InventoryMapper mapper;
private static InventoryMapper mapperDisabledValidation;
@ClassRule public static TestRule chain = RuleChain.outerRule(ccm).around(sessionRule);
@BeforeClass
public static void setup() {
CqlSession session = sessionRule.session();
List<String> statements =
Arrays.asList(
"CREATE TABLE product_simple(id uuid PRIMARY KEY, description text, unmapped text)",
"CREATE TABLE product_simple_missing_p_k(id uuid PRIMARY KEY, description text, unmapped text)",
"CREATE TABLE product_simple_missing_clustering_column(id uuid PRIMARY KEY, description text, unmapped text)",
"CREATE TABLE product_pk_and_clustering(id uuid, c_id uuid, PRIMARY KEY (id, c_id))",
"CREATE TABLE product_wrong_type(id uuid PRIMARY KEY, wrong_type_column text)",
"CREATE TYPE dimensions_with_incorrect_name(length int, width int, height int)",
"CREATE TYPE dimensions_with_wrong_type(length int, width int, height text)",
"CREATE TYPE dimensions_with_incorrect_name_schema_hint_udt(length int, width int, height int)",
"CREATE TYPE dimensions_with_incorrect_name_schema_hint_table(length int, width int, height int)",
"CREATE TABLE product_with_incorrect_udt(id uuid PRIMARY KEY, description text, dimensions dimensions_with_incorrect_name)",
"CREATE TABLE product_with_incorrect_udt_schema_hint_udt(id uuid PRIMARY KEY, description text, dimensions dimensions_with_incorrect_name_schema_hint_udt)",
"CREATE TABLE product_with_incorrect_udt_schema_hint_table(id uuid PRIMARY KEY, description text, dimensions dimensions_with_incorrect_name_schema_hint_table)",
"CREATE TABLE product_with_udt_wrong_type(id uuid PRIMARY KEY, description text, dimensions dimensions_with_wrong_type)");
for (String query : statements) {
session.execute(
SimpleStatement.builder(query).setExecutionProfile(sessionRule.slowProfile()).build());
}
for (String query : createStatements(ccm)) {
session.execute(
SimpleStatement.builder(query).setExecutionProfile(sessionRule.slowProfile()).build());
}
mapper =
new SchemaValidationIT_InventoryMapperBuilder(session)
.withSchemaValidationEnabled(true)
.build();
mapperDisabledValidation =
new SchemaValidationIT_InventoryMapperBuilder(session)
.withSchemaValidationEnabled(false)
.build();
}
@Before
public void clearData() {
CqlSession session = sessionRule.session();
session.execute(
SimpleStatement.builder("TRUNCATE product_simple")
.setExecutionProfile(sessionRule.slowProfile())
.build());
session.execute(
SimpleStatement.builder("TRUNCATE product")
.setExecutionProfile(sessionRule.slowProfile())
.build());
session.execute(
SimpleStatement.builder("TRUNCATE product_with_incorrect_udt")
.setExecutionProfile(sessionRule.slowProfile())
.build());
session.execute(
SimpleStatement.builder("TRUNCATE product_with_incorrect_udt_schema_hint_udt")
.setExecutionProfile(sessionRule.slowProfile())
.build());
session.execute(
SimpleStatement.builder("TRUNCATE product_with_incorrect_udt_schema_hint_table")
.setExecutionProfile(sessionRule.slowProfile())
.build());
session.execute(
SimpleStatement.builder("TRUNCATE product_wrong_type")
.setExecutionProfile(sessionRule.slowProfile())
.build());
session.execute(
SimpleStatement.builder("TRUNCATE product_pk_and_clustering")
.setExecutionProfile(sessionRule.slowProfile())
.build());
session.execute(
SimpleStatement.builder("TRUNCATE product_with_udt_wrong_type")
.setExecutionProfile(sessionRule.slowProfile())
.build());
}
@Test
public void should_throw_when_use_not_properly_mapped_entity() {
assertThatThrownBy(() -> mapper.productSimpleDao(sessionRule.keyspace()))
.isInstanceOf(IllegalArgumentException.class)
.hasMessageContaining(
String.format(
"The CQL ks.table: %s.product_simple has missing columns: [description_with_incorrect_name, some_other_not_mapped_field] that are defined in the entity class: com.datastax.oss.driver.mapper.SchemaValidationIT.ProductSimple",
sessionRule.keyspace()));
}
@Test
public void
should_throw_when_use_not_properly_mapped_entity_when_ks_is_passed_as_null_extracting_ks_from_session() {
assertThatThrownBy(() -> mapper.productSimpleDao(null))
.isInstanceOf(IllegalArgumentException.class)
.hasMessageContaining(
String.format(
"The CQL ks.table: %s.product_simple has missing columns: [description_with_incorrect_name, some_other_not_mapped_field] that are defined in the entity class: com.datastax.oss.driver.mapper.SchemaValidationIT.ProductSimple",
sessionRule.keyspace()));
}
@Test
public void should_log_warn_when_entity_has_no_corresponding_cql_table() {
LoggerTest.LoggerSetup logger =
setupTestLogger(
SchemaValidationIT_ProductCqlTableMissingHelper__MapperGenerated.class, Level.WARN);
try {
assertThatThrownBy(() -> mapper.productCqlTableMissingDao(sessionRule.keyspace()))
.isInstanceOf(InvalidQueryException.class);
verify(logger.appender, timeout(500).times(1)).doAppend(logger.loggingEventCaptor.capture());
assertThat(logger.loggingEventCaptor.getValue().getMessage()).isNotNull();
assertThat(logger.loggingEventCaptor.getValue().getFormattedMessage())
.contains(
String.format(
"There is no ks.table or UDT: %s.product_cql_table_missing for the entity class: com.datastax.oss.driver.mapper.SchemaValidationIT.ProductCqlTableMissing, or metadata is out of date.",
sessionRule.keyspace()));
} finally {
logger.close();
}
}
@Test
public void should_throw_general_driver_exception_when_schema_validation_check_is_disabled() {
assertThatThrownBy(
() -> mapperDisabledValidation.productDaoValidationDisabled(sessionRule.keyspace()))
.isInstanceOf(InvalidQueryException.class)
.hasMessageContaining("Undefined column name description_with_incorrect_name");
}
@Test
public void should_not_throw_on_table_with_properly_mapped_udt_field() {
assertThatCode(() -> mapper.productDao(sessionRule.keyspace())).doesNotThrowAnyException();
}
@Test
public void should_throw_when_use_not_properly_mapped_entity_with_udt() {
assertThatThrownBy(() -> mapper.productWithIncorrectUdtDao(sessionRule.keyspace()))
.isInstanceOf(IllegalArgumentException.class)
.hasStackTraceContaining(
String.format(
"The CQL ks.udt: %s.dimensions_with_incorrect_name has missing columns: [length_not_present] that are defined in the entity class: com.datastax.oss.driver.mapper.SchemaValidationIT.DimensionsWithIncorrectName",
sessionRule.keyspace()));
}
@Test
public void should_throw_when_use_not_properly_mapped_entity_with_udt_with_udt_schema_hint() {
assertThatThrownBy(() -> mapper.productWithIncorrectUdtSchemaHintUdt(sessionRule.keyspace()))
.isInstanceOf(IllegalArgumentException.class)
.hasStackTraceContaining(
String.format(
"The CQL ks.udt: %s.dimensions_with_incorrect_name_schema_hint_udt has missing columns: [length_not_present] that are defined in the entity class: com.datastax.oss.driver.mapper.SchemaValidationIT.DimensionsWithIncorrectNameSchemaHintUdt",
sessionRule.keyspace()));
}
@Test
public void
should_warn_about_missing_table_when_use_not_properly_mapped_entity_with_udt_with_table_schema_hint() {
LoggerTest.LoggerSetup logger =
setupTestLogger(
SchemaValidationIT_DimensionsWithIncorrectNameSchemaHintTableHelper__MapperGenerated
.class,
Level.WARN);
try {
// when
mapper.productWithIncorrectUdtSchemaHintTable(sessionRule.keyspace());
verify(logger.appender, timeout(500).times(1)).doAppend(logger.loggingEventCaptor.capture());
assertThat(logger.loggingEventCaptor.getValue().getMessage()).isNotNull();
assertThat(logger.loggingEventCaptor.getValue().getFormattedMessage())
.contains(
String.format(
"There is no ks.table or UDT: %s.dimensions_with_incorrect_name_schema_hint_table for the entity class: com.datastax.oss.driver.mapper.SchemaValidationIT.DimensionsWithIncorrectNameSchemaHintTable, or metadata is out of date.",
sessionRule.keyspace()));
} finally {
logger.close();
}
}
@Test
public void should_throw_when_table_is_missing_PKs() {
assertThatThrownBy(() -> mapper.productSimpleMissingPKDao(sessionRule.keyspace()))
.isInstanceOf(IllegalArgumentException.class)
.hasMessageContaining(
String.format(
"The CQL ks.table: %s.product_simple_missing_p_k has missing Primary Key columns: [id_not_present] that are defined in the entity class: com.datastax.oss.driver.mapper.SchemaValidationIT.ProductSimpleMissingPK",
sessionRule.keyspace()));
}
@Test
public void should_throw_when_table_is_missing_clustering_column() {
assertThatThrownBy(() -> mapper.productSimpleMissingClusteringColumn(sessionRule.keyspace()))
.isInstanceOf(IllegalArgumentException.class)
.hasMessageContaining(
String.format(
"The CQL ks.table: %s.product_simple_missing_clustering_column has missing Clustering columns: [not_existing_clustering_column] that are defined in the entity class: com.datastax.oss.driver.mapper.SchemaValidationIT.ProductSimpleMissingClusteringColumn",
sessionRule.keyspace()));
}
@Test
public void should_throw_when_type_defined_in_table_does_not_match_type_from_entity() {
assertThatThrownBy(() -> mapper.productDaoWrongType(sessionRule.keyspace()))
.isInstanceOf(IllegalArgumentException.class)
.hasMessageContaining(
String.format(
"The CQL ks.table: %s.product_wrong_type defined in the entity class: com.datastax.oss.driver.mapper.SchemaValidationIT.ProductWrongType declares type mappings that are not supported by the codec registry:\n"
+ "Field: wrong_type_column, Entity Type: java.lang.Integer, CQL type: TEXT",
sessionRule.keyspace()));
}
@Test
public void should_throw_when_type_defined_in_udt_does_not_match_type_from_entity() {
assertThatThrownBy(() -> mapper.productWithUdtWrongTypeDao(sessionRule.keyspace()))
.isInstanceOf(IllegalArgumentException.class)
.hasMessageContaining(
String.format(
"The CQL ks.udt: %s.dimensions_with_wrong_type defined in the entity class: com.datastax.oss.driver.mapper.SchemaValidationIT.DimensionsWithWrongType declares type mappings that are not supported by the codec registry:\n"
+ "Field: height, Entity Type: java.lang.Integer, CQL type: TEXT",
sessionRule.keyspace()));
}
@Test
public void should_not_throw_when_have_correct_pk_and_clustering() {
assertThatCode(() -> mapper.productPkAndClusteringDao(sessionRule.keyspace()))
.doesNotThrowAnyException();
}
@Test
public void should_log_warning_when_passing_not_existing_keyspace() {
LoggerTest.LoggerSetup logger =
setupTestLogger(SchemaValidationIT_ProductSimpleHelper__MapperGenerated.class, Level.WARN);
try {
// when
assertThatThrownBy(
() -> mapper.productSimpleDao(CqlIdentifier.fromCql("not_existing_keyspace")))
.isInstanceOf(InvalidQueryException.class)
.hasMessageContaining("not_existing_keyspace does not exist");
// then
verify(logger.appender, timeout(500).times(1)).doAppend(logger.loggingEventCaptor.capture());
assertThat(logger.loggingEventCaptor.getValue().getMessage()).isNotNull();
assertThat(logger.loggingEventCaptor.getValue().getFormattedMessage())
.contains(
"Unable to validate table: product_simple for the entity class: com.datastax.oss.driver.mapper.SchemaValidationIT.ProductSimple because the session metadata has no information about the keyspace: not_existing_keyspace.");
} finally {
logger.close();
}
}
@Test
public void should_not_warn_or_throw_when_target_element_is_NONE() {
LoggerTest.LoggerSetup logger =
setupTestLogger(
SchemaValidationIT_DoesNotExistNoValidationHelper__MapperGenerated.class, Level.WARN);
// when
mapper.noValidationDao(sessionRule.keyspace());
// then
// no exceptions, no logs
verify(logger.appender, never()).doAppend(any());
}
@Mapper
public interface InventoryMapper {
@DaoFactory
ProductSimpleDao productSimpleDao(@DaoKeyspace CqlIdentifier keyspace);
@DaoFactory
ProductSimpleCqlTableMissingDao productCqlTableMissingDao(@DaoKeyspace CqlIdentifier keyspace);
@DaoFactory
ProductSimpleDaoValidationDisabledDao productDaoValidationDisabled(
@DaoKeyspace CqlIdentifier keyspace);
@DaoFactory
ProductDao productDao(@DaoKeyspace CqlIdentifier keyspace);
@DaoFactory
ProductWithIncorrectUdtDao productWithIncorrectUdtDao(@DaoKeyspace CqlIdentifier keyspace);
@DaoFactory
ProductWithIncorrectUdtSchemaHintUdtDao productWithIncorrectUdtSchemaHintUdt(
@DaoKeyspace CqlIdentifier keyspace);
@DaoFactory
ProductWithIncorrectUdtSchemaHintTableDao productWithIncorrectUdtSchemaHintTable(
@DaoKeyspace CqlIdentifier keyspace);
@DaoFactory
ProductWithUdtWrongTypeDao productWithUdtWrongTypeDao(@DaoKeyspace CqlIdentifier keyspace);
@DaoFactory
ProductSimpleMissingPKDao productSimpleMissingPKDao(@DaoKeyspace CqlIdentifier keyspace);
@DaoFactory
ProductSimpleMissingClusteringColumnDao productSimpleMissingClusteringColumn(
@DaoKeyspace CqlIdentifier keyspace);
@DaoFactory
ProductDaoWrongTypeDao productDaoWrongType(@DaoKeyspace CqlIdentifier keyspace);
@DaoFactory
ProductPkAndClusteringDao productPkAndClusteringDao(@DaoKeyspace CqlIdentifier keyspace);
@DaoFactory
NoValidationDao noValidationDao(@DaoKeyspace CqlIdentifier keyspace);
}
@Dao
public interface ProductWithIncorrectUdtDao {
@Update(customWhereClause = "id = :id")
void updateWhereId(ProductWithIncorrectUdt product, UUID id);
}
@Dao
public interface ProductWithIncorrectUdtSchemaHintUdtDao {
@Update(customWhereClause = "id = :id")
void updateWhereId(ProductWithIncorrectUdtSchemaHintUdt product, UUID id);
}
@Dao
public interface ProductWithIncorrectUdtSchemaHintTableDao {
@Update(customWhereClause = "id = :id")
void updateWhereId(ProductWithIncorrectUdtSchemaHintTable product, UUID id);
}
@Dao
public interface ProductWithUdtWrongTypeDao {
@Update(customWhereClause = "id = :id")
void updateWhereId(ProductWithUdtWrongType product, UUID id);
}
@Dao
public interface ProductDao {
@Update(customWhereClause = "id = :id")
void updateWhereId(Product product, UUID id);
}
@Dao
public interface ProductSimpleDao {
@Select
ProductSimple findById(UUID productId);
}
@Dao
public interface ProductSimpleDaoValidationDisabledDao {
@Select
ProductSimple findById(UUID productId);
}
@Dao
public interface ProductSimpleCqlTableMissingDao {
@Select
ProductCqlTableMissing findById(UUID productId);
}
@Dao
public interface ProductSimpleMissingPKDao {
@Select
ProductSimpleMissingPK findById(UUID productId);
}
@Dao
public interface ProductSimpleMissingClusteringColumnDao {
@Select
ProductSimpleMissingClusteringColumn findById(UUID productId);
}
@Dao
public interface ProductDaoWrongTypeDao {
@Select
ProductWrongType findById(UUID productId);
}
@Dao
public interface ProductPkAndClusteringDao {
@Select
ProductPkAndClustering findById(UUID productId);
}
@Dao
public interface NoValidationDao {
// Not a real query, we just need to reference the entities
@QueryProvider(
providerClass = DummyProvider.class,
entityHelpers = {DoesNotExistNoValidation.class, ProductCqlTableMissingNoValidation.class})
void doNothing();
}
@SuppressWarnings("unused")
static class DummyProvider {
DummyProvider(
MapperContext context,
EntityHelper<DoesNotExistNoValidation> helper1,
EntityHelper<ProductCqlTableMissingNoValidation> helper2) {}
void doNothing() {}
}
@Entity
public static class ProductCqlTableMissing {
@PartitionKey private UUID id;
public ProductCqlTableMissing() {}
public UUID getId() {
return id;
}
public void setId(UUID id) {
this.id = id;
}
}
@Entity
public static class ProductSimpleMissingPK {
@PartitionKey private UUID idNotPresent;
public ProductSimpleMissingPK() {}
public UUID getIdNotPresent() {
return idNotPresent;
}
public void setIdNotPresent(UUID idNotPresent) {
this.idNotPresent = idNotPresent;
}
}
@Entity
public static class ProductWrongType {
@PartitionKey private UUID id;
private Integer wrongTypeColumn;
public ProductWrongType() {}
public UUID getId() {
return id;
}
public void setId(UUID id) {
this.id = id;
}
public Integer getWrongTypeColumn() {
return wrongTypeColumn;
}
public void setWrongTypeColumn(Integer wrongTypeColumn) {
this.wrongTypeColumn = wrongTypeColumn;
}
}
@Entity
public static class ProductSimpleMissingClusteringColumn {
@PartitionKey private UUID id;
@ClusteringColumn private Integer notExistingClusteringColumn;
public ProductSimpleMissingClusteringColumn() {}
public UUID getId() {
return id;
}
public void setId(UUID id) {
this.id = id;
}
public Integer getNotExistingClusteringColumn() {
return notExistingClusteringColumn;
}
public void setNotExistingClusteringColumn(Integer notExistingClusteringColumn) {
this.notExistingClusteringColumn = notExistingClusteringColumn;
}
}
@Entity
public static class ProductPkAndClustering {
@PartitionKey private UUID id;
@ClusteringColumn private UUID cId;
public ProductPkAndClustering() {}
public UUID getId() {
return id;
}
public void setId(UUID id) {
this.id = id;
}
public UUID getcId() {
return cId;
}
public void setcId(UUID cId) {
this.cId = cId;
}
}
@Entity
public static class ProductSimple {
@PartitionKey private UUID id;
private String descriptionWithIncorrectName;
private Integer someOtherNotMappedField;
public ProductSimple() {}
public ProductSimple(
UUID id, String descriptionWithIncorrectName, Integer someOtherNotMappedField) {
this.id = id;
this.descriptionWithIncorrectName = descriptionWithIncorrectName;
this.someOtherNotMappedField = someOtherNotMappedField;
}
public UUID getId() {
return id;
}
public void setId(UUID id) {
this.id = id;
}
public String getDescriptionWithIncorrectName() {
return descriptionWithIncorrectName;
}
public void setDescriptionWithIncorrectName(String descriptionWithIncorrectName) {
this.descriptionWithIncorrectName = descriptionWithIncorrectName;
}
public Integer getSomeOtherNotMappedField() {
return someOtherNotMappedField;
}
public void setSomeOtherNotMappedField(Integer someOtherNotMappedField) {
this.someOtherNotMappedField = someOtherNotMappedField;
}
@Override
public boolean equals(Object o) {
if (this == o) {
return true;
}
if (!(o instanceof ProductSimple)) {
return false;
}
ProductSimple that = (ProductSimple) o;
return this.id.equals(that.id)
&& this.someOtherNotMappedField.equals(that.someOtherNotMappedField)
&& this.descriptionWithIncorrectName.equals(that.descriptionWithIncorrectName);
}
@Override
public int hashCode() {
return Objects.hash(id, descriptionWithIncorrectName, someOtherNotMappedField);
}
@Override
public String toString() {
return "ProductSimple{"
+ "id="
+ id
+ ", descriptionWithIncorrectName='"
+ descriptionWithIncorrectName
+ '\''
+ ", someOtherNotMappedField="
+ someOtherNotMappedField
+ '}';
}
}
@Entity
public static class ProductWithIncorrectUdt {
@PartitionKey private UUID id;
private String description;
private DimensionsWithIncorrectName dimensions;
public ProductWithIncorrectUdt() {}
public ProductWithIncorrectUdt(
UUID id, String description, DimensionsWithIncorrectName dimensions) {
this.id = id;
this.description = description;
this.dimensions = dimensions;
}
public UUID getId() {
return id;
}
public void setId(UUID id) {
this.id = id;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
public DimensionsWithIncorrectName getDimensions() {
return dimensions;
}
public void setDimensions(DimensionsWithIncorrectName dimensions) {
this.dimensions = dimensions;
}
@Override
public boolean equals(Object o) {
if (this == o) {
return true;
}
if (!(o instanceof ProductWithIncorrectUdt)) {
return false;
}
ProductWithIncorrectUdt that = (ProductWithIncorrectUdt) o;
return this.id.equals(that.id)
&& this.description.equals(that.description)
&& this.dimensions.equals(that.dimensions);
}
@Override
public int hashCode() {
return Objects.hash(id, description, dimensions);
}
@Override
public String toString() {
return "ProductWithIncorrectUdt{"
+ "id="
+ id
+ ", description='"
+ description
+ '\''
+ ", dimensions="
+ dimensions
+ '}';
}
}
@Entity
public static class ProductWithUdtWrongType {
@PartitionKey private UUID id;
private String description;
private DimensionsWithWrongType dimensions;
public ProductWithUdtWrongType() {}
public ProductWithUdtWrongType(
UUID id, String description, DimensionsWithWrongType dimensions) {
this.id = id;
this.description = description;
this.dimensions = dimensions;
}
public UUID getId() {
return id;
}
public void setId(UUID id) {
this.id = id;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
public DimensionsWithWrongType getDimensions() {
return dimensions;
}
public void setDimensions(DimensionsWithWrongType dimensions) {
this.dimensions = dimensions;
}
@Override
public boolean equals(Object o) {
if (this == o) {
return true;
}
if (!(o instanceof ProductWithUdtWrongType)) {
return false;
}
ProductWithUdtWrongType that = (ProductWithUdtWrongType) o;
return this.id.equals(that.id)
&& this.description.equals(that.description)
&& this.dimensions.equals(that.dimensions);
}
@Override
public int hashCode() {
return Objects.hash(id, description, dimensions);
}
@Override
public String toString() {
return "ProductWithUdtWrongType{"
+ "id="
+ id
+ ", description='"
+ description
+ '\''
+ ", dimensions="
+ dimensions
+ '}';
}
}
@Entity
public static class ProductWithIncorrectUdtSchemaHintUdt {
@PartitionKey private UUID id;
private String description;
private DimensionsWithIncorrectNameSchemaHintUdt dimensions;
public ProductWithIncorrectUdtSchemaHintUdt() {}
public ProductWithIncorrectUdtSchemaHintUdt(
UUID id, String description, DimensionsWithIncorrectNameSchemaHintUdt dimensions) {
this.id = id;
this.description = description;
this.dimensions = dimensions;
}
public UUID getId() {
return id;
}
public void setId(UUID id) {
this.id = id;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
public DimensionsWithIncorrectNameSchemaHintUdt getDimensions() {
return dimensions;
}
public void setDimensions(DimensionsWithIncorrectNameSchemaHintUdt dimensions) {
this.dimensions = dimensions;
}
@Override
public boolean equals(Object o) {
if (this == o) {
return true;
}
if (!(o instanceof ProductWithIncorrectUdtSchemaHintUdt)) {
return false;
}
ProductWithIncorrectUdtSchemaHintUdt that = (ProductWithIncorrectUdtSchemaHintUdt) o;
return this.id.equals(that.id)
&& this.description.equals(that.description)
&& this.dimensions.equals(that.dimensions);
}
@Override
public int hashCode() {
return Objects.hash(id, description, dimensions);
}
@Override
public String toString() {
return "ProductWithIncorrectUdtSchemaHint{"
+ "id="
+ id
+ ", description='"
+ description
+ '\''
+ ", dimensions="
+ dimensions
+ '}';
}
}
@Entity
public static class ProductWithIncorrectUdtSchemaHintTable {
@PartitionKey private UUID id;
private String description;
private DimensionsWithIncorrectNameSchemaHintTable dimensions;
public ProductWithIncorrectUdtSchemaHintTable() {}
public ProductWithIncorrectUdtSchemaHintTable(
UUID id, String description, DimensionsWithIncorrectNameSchemaHintTable dimensions) {
this.id = id;
this.description = description;
this.dimensions = dimensions;
}
public UUID getId() {
return id;
}
public void setId(UUID id) {
this.id = id;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
public DimensionsWithIncorrectNameSchemaHintTable getDimensions() {
return dimensions;
}
public void setDimensions(DimensionsWithIncorrectNameSchemaHintTable dimensions) {
this.dimensions = dimensions;
}
@Override
public boolean equals(Object o) {
if (this == o) {
return true;
}
if (!(o instanceof ProductWithIncorrectUdtSchemaHintTable)) {
return false;
}
ProductWithIncorrectUdtSchemaHintTable that = (ProductWithIncorrectUdtSchemaHintTable) o;
return this.id.equals(that.id)
&& this.description.equals(that.description)
&& this.dimensions.equals(that.dimensions);
}
@Override
public int hashCode() {
return Objects.hash(id, description, dimensions);
}
@Override
public String toString() {
return "ProductWithIncorrectUdtSchemaHintTable{"
+ "id="
+ id
+ ", description='"
+ description
+ '\''
+ ", dimensions="
+ dimensions
+ '}';
}
}
@Entity
public static class DimensionsWithIncorrectName {
private int lengthNotPresent;
private int width;
private int height;
public DimensionsWithIncorrectName() {}
public DimensionsWithIncorrectName(int lengthNotPresent, int width, int height) {
this.lengthNotPresent = lengthNotPresent;
this.width = width;
this.height = height;
}
public int getLengthNotPresent() {
return lengthNotPresent;
}
public void setLengthNotPresent(int lengthNotPresent) {
this.lengthNotPresent = lengthNotPresent;
}
public int getWidth() {
return width;
}
public void setWidth(int width) {
this.width = width;
}
public int getHeight() {
return height;
}
public void setHeight(int height) {
this.height = height;
}
@Override
public boolean equals(Object o) {
if (this == o) {
return true;
}
if (!(o instanceof DimensionsWithIncorrectName)) {
return false;
}
DimensionsWithIncorrectName that = (DimensionsWithIncorrectName) o;
return this.lengthNotPresent == that.lengthNotPresent
&& this.height == that.height
&& this.width == that.width;
}
@Override
public int hashCode() {
return Objects.hash(lengthNotPresent, width, height);
}
@Override
public String toString() {
return "DimensionsWithIncorrectName{"
+ "lengthNotPresent="
+ lengthNotPresent
+ ", width="
+ width
+ ", height="
+ height
+ '}';
}
}
@Entity
public static class DimensionsWithWrongType {
private int length;
private int width;
private int height;
public DimensionsWithWrongType() {}
public DimensionsWithWrongType(int length, int width, int height) {
this.length = length;
this.width = width;
this.height = height;
}
public int getLength() {
return length;
}
public void setLength(int length) {
this.length = length;
}
public int getWidth() {
return width;
}
public void setWidth(int width) {
this.width = width;
}
public int getHeight() {
return height;
}
public void setHeight(int height) {
this.height = height;
}
@Override
public boolean equals(Object o) {
if (this == o) {
return true;
}
if (!(o instanceof DimensionsWithWrongType)) {
return false;
}
DimensionsWithWrongType that = (DimensionsWithWrongType) o;
return this.length == that.length && this.height == that.height && this.width == that.width;
}
@Override
public int hashCode() {
return Objects.hash(length, width, height);
}
@Override
public String toString() {
return "DimensionsWithWrongType{"
+ "length="
+ length
+ ", width="
+ width
+ ", height="
+ height
+ '}';
}
}
@Entity
@SchemaHint(targetElement = TargetElement.UDT)
public static class DimensionsWithIncorrectNameSchemaHintUdt {
private int lengthNotPresent;
private int width;
private int height;
public DimensionsWithIncorrectNameSchemaHintUdt() {}
public DimensionsWithIncorrectNameSchemaHintUdt(int lengthNotPresent, int width, int height) {
this.lengthNotPresent = lengthNotPresent;
this.width = width;
this.height = height;
}
public int getLengthNotPresent() {
return lengthNotPresent;
}
public void setLengthNotPresent(int lengthNotPresent) {
this.lengthNotPresent = lengthNotPresent;
}
public int getWidth() {
return width;
}
public void setWidth(int width) {
this.width = width;
}
public int getHeight() {
return height;
}
public void setHeight(int height) {
this.height = height;
}
@Override
public boolean equals(Object o) {
if (this == o) {
return true;
}
if (!(o instanceof DimensionsWithIncorrectNameSchemaHintUdt)) {
return false;
}
DimensionsWithIncorrectNameSchemaHintUdt that = (DimensionsWithIncorrectNameSchemaHintUdt) o;
return this.lengthNotPresent == that.lengthNotPresent
&& this.height == that.height
&& this.width == that.width;
}
@Override
public int hashCode() {
return Objects.hash(lengthNotPresent, width, height);
}
@Override
public String toString() {
return "DimensionsWithIncorrectNameSchemaHintUdt{"
+ "lengthNotPresent="
+ lengthNotPresent
+ ", width="
+ width
+ ", height="
+ height
+ '}';
}
}
@Entity
@SchemaHint(targetElement = TargetElement.TABLE)
public static class DimensionsWithIncorrectNameSchemaHintTable {
private int lengthNotPresent;
private int width;
private int height;
public DimensionsWithIncorrectNameSchemaHintTable() {}
public DimensionsWithIncorrectNameSchemaHintTable(int lengthNotPresent, int width, int height) {
this.lengthNotPresent = lengthNotPresent;
this.width = width;
this.height = height;
}
public int getLengthNotPresent() {
return lengthNotPresent;
}
public void setLengthNotPresent(int lengthNotPresent) {
this.lengthNotPresent = lengthNotPresent;
}
public int getWidth() {
return width;
}
public void setWidth(int width) {
this.width = width;
}
public int getHeight() {
return height;
}
public void setHeight(int height) {
this.height = height;
}
@Override
public boolean equals(Object o) {
if (this == o) {
return true;
}
if (!(o instanceof DimensionsWithIncorrectNameSchemaHintTable)) {
return false;
}
DimensionsWithIncorrectNameSchemaHintTable that =
(DimensionsWithIncorrectNameSchemaHintTable) o;
return this.lengthNotPresent == that.lengthNotPresent
&& this.height == that.height
&& this.width == that.width;
}
@Override
public int hashCode() {
return Objects.hash(lengthNotPresent, width, height);
}
@Override
public String toString() {
return "DimensionsWithIncorrectNameSchemaHintTable{"
+ "lengthNotPresent="
+ lengthNotPresent
+ ", width="
+ width
+ ", height="
+ height
+ '}';
}
}
@Entity
@SchemaHint(targetElement = TargetElement.NONE)
public static class DoesNotExistNoValidation {
private int k;
public int getK() {
return k;
}
public void setK(int k) {
this.k = k;
}
}
@Entity
@SchemaHint(targetElement = TargetElement.NONE)
public static class ProductCqlTableMissingNoValidation extends ProductCqlTableMissing {}
}