This is an automated email from the ASF dual-hosted git repository.

ilyak pushed a commit to branch ignite-2.9
in repository https://gitbox.apache.org/repos/asf/ignite.git


The following commit(s) were added to refs/heads/ignite-2.9 by this push:
     new 4092768  IGNITE-13216 "Name" parameter of QuerySqlField annotation 
that was ignored during uniqueness validation of field's name - Fixes #7993.
4092768 is described below

commit 4092768357fb3ae9ece52c18277a398914b509b4
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");
+    }
 }

Reply via email to