This is an automated email from the ASF dual-hosted git repository. ilyak pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/ignite.git
The following commit(s) were added to refs/heads/master by this push: new 48700d9 IGNITE-13216 "Name" parameter of QuerySqlField annotation that was ignored during uniqueness validation of field's name - Fixes #7993. 48700d9 is described below commit 48700d96b3810603af0b1101e642ee1af927972b Author: Evgeniy Rudenko <erude...@gridgain.com> AuthorDate: Tue Jul 7 12:15:05 2020 +0300 IGNITE-13216 "Name" parameter of QuerySqlField annotation that was ignored during uniqueness validation of field's name - Fixes #7993. Signed-off-by: Ilya Kasnacheev <ilya.kasnach...@gmail.com> --- .../java/org/apache/ignite/cache/QueryEntity.java | 2 +- .../cache/query/QueryEntityTypeDescriptor.java | 14 ++++- .../cache/index/QueryEntityValidationSelfTest.java | 68 ++++++++++++++++++++++ 3 files changed, 80 insertions(+), 4 deletions(-) diff --git a/modules/core/src/main/java/org/apache/ignite/cache/QueryEntity.java b/modules/core/src/main/java/org/apache/ignite/cache/QueryEntity.java index 249c249..affff27 100644 --- a/modules/core/src/main/java/org/apache/ignite/cache/QueryEntity.java +++ b/modules/core/src/main/java/org/apache/ignite/cache/QueryEntity.java @@ -826,7 +826,7 @@ public class QueryEntity implements Serializable { // resulting parent column comes before columns corresponding to those // nested properties in the resulting table - that way nested // properties override will happen properly (first parent, then children). - type.addProperty(prop, key, true); + type.addProperty(prop, sqlAnn, key, true); processAnnotation(key, sqlAnn, txtAnn, cls, c, field.getType(), prop, type); } diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/query/QueryEntityTypeDescriptor.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/query/QueryEntityTypeDescriptor.java index acdcb20..d9c680b 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/query/QueryEntityTypeDescriptor.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/query/QueryEntityTypeDescriptor.java @@ -26,9 +26,11 @@ import java.util.Set; import javax.cache.CacheException; import org.apache.ignite.cache.QueryIndex; import org.apache.ignite.cache.QueryIndexType; +import org.apache.ignite.cache.query.annotations.QuerySqlField; import org.apache.ignite.internal.processors.query.GridQueryIndexDescriptor; import org.apache.ignite.internal.util.tostring.GridToStringExclude; import org.apache.ignite.internal.util.tostring.GridToStringInclude; +import org.apache.ignite.internal.util.typedef.F; import org.apache.ignite.internal.util.typedef.internal.S; import org.jetbrains.annotations.NotNull; @@ -162,12 +164,18 @@ public class QueryEntityTypeDescriptor { * Adds property to the type descriptor. * * @param prop Property. + * @param sqlAnn SQL annotation, can be {@code null}. * @param key Property ownership flag (key or not). * @param failOnDuplicate Fail on duplicate flag. */ - public void addProperty(QueryEntityClassProperty prop, boolean key, boolean failOnDuplicate) { - if (props.put(prop.name(), prop) != null && failOnDuplicate) { - throw new CacheException("Property with name '" + prop.name() + "' already exists for " + + public void addProperty(QueryEntityClassProperty prop, QuerySqlField sqlAnn, boolean key, boolean failOnDuplicate) { + String propName = prop.name(); + + if (sqlAnn != null && !F.isEmpty(sqlAnn.name())) + propName = sqlAnn.name(); + + if (props.put(propName, prop) != null && failOnDuplicate) { + throw new CacheException("Property with name '" + propName + "' already exists for " + (key ? "key" : "value") + ": " + "QueryEntity [key=" + keyCls.getName() + ", value=" + valCls.getName() + ']'); } diff --git a/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/index/QueryEntityValidationSelfTest.java b/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/index/QueryEntityValidationSelfTest.java index e72899c..4bcfd82 100644 --- a/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/index/QueryEntityValidationSelfTest.java +++ b/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/index/QueryEntityValidationSelfTest.java @@ -200,4 +200,72 @@ public class QueryEntityValidationSelfTest extends AbstractIndexingCommonTest { } }, CacheException.class, "Property with name 'notUniqueId' already exists"); } + + /** + * Test class for sql queryable test key with unique annotation's name property. + */ + private static class TestKeyWithUniqueName { + /** Non-unique id. */ + @QuerySqlField(name = "Name1") + int notUniqueId; + } + + /** + * Test class for sql queryable test value with unique annotation's name property. + */ + private static class TestValueWithUniqueName { + /** Not unique id. */ + @QuerySqlField(name = "Name2") + int notUniqueId; + } + + /** + * Test to check validation of known fields names with unique QuerySqlField annotation's name properties + * + * Steps: + * 1) Create 2 classes with same field name, but with different name property for QuerySqlField annotation + * 2) Check that CacheConfiguration.setIndexedTypes() works correctly + */ + @Test + public void testUniqueNameInAnnotation() { + final CacheConfiguration<TestKeyWithUniqueName, TestValueWithUniqueName> ccfg = new CacheConfiguration<TestKeyWithUniqueName, TestValueWithUniqueName>().setName(CACHE_NAME); + + assertNotNull(ccfg.setIndexedTypes(TestKeyWithUniqueName.class, TestValueWithUniqueName.class)); + } + + /** + * Test class for sql queryable test key with not unique annotation's name property. + */ + private static class TestKeyWithNotUniqueName { + /** Unique id. */ + @QuerySqlField(name = "Name3") + int uniqueId1; + } + + /** + * Test class for sql queryable test value with not unique annotation's name property. + */ + private static class TestValueWithNotUniqueName { + /** Unique id. */ + @QuerySqlField(name = "Name3") + int uniqueId2; + } + + /** + * Test to check validation of known fields names with not unique QuerySqlField annotation's name properties + * + * Steps: + * 1) Create 2 classes with different field names and with same name property for QuerySqlField annotation + * 2) Check that CacheConfiguration.setIndexedTypes() fails with "Property with name ... already exists" exception + */ + @Test + public void testNotUniqueNameInAnnotation() { + final CacheConfiguration<TestKeyWithNotUniqueName, TestValueWithNotUniqueName> ccfg = new CacheConfiguration<TestKeyWithNotUniqueName, TestValueWithNotUniqueName>().setName(CACHE_NAME); + + GridTestUtils.assertThrows(log, (Callable<Void>)() -> { + ccfg.setIndexedTypes(TestKeyWithNotUniqueName.class, TestValueWithNotUniqueName.class); + + return null; + }, CacheException.class, "Property with name 'Name3' already exists"); + } }