You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@syncope.apache.org by fm...@apache.org on 2018/12/27 11:28:20 UTC

[syncope] branch 2_0_X updated: [SYNCOPE-1416] fixes searches for unique attributes

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

fmartelli pushed a commit to branch 2_0_X
in repository https://gitbox.apache.org/repos/asf/syncope.git


The following commit(s) were added to refs/heads/2_0_X by this push:
     new dbd6d8c  [SYNCOPE-1416] fixes searches for unique attributes
dbd6d8c is described below

commit dbd6d8c9ef09b2f665fb16ccae856af561101919
Author: fmartelli <fa...@gmail.com>
AuthorDate: Thu Dec 27 12:28:03 2018 +0100

    [SYNCOPE-1416] fixes searches for unique attributes
---
 .../core/persistence/jpa/dao/JPAAnySearchDAO.java  |  9 +++--
 .../core/persistence/jpa/inner/AnySearchTest.java  | 19 ++++++++++
 .../org/apache/syncope/fit/core/SearchITCase.java  | 43 ++++++++++++++++------
 3 files changed, 55 insertions(+), 16 deletions(-)

diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAAnySearchDAO.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAAnySearchDAO.java
index 7762937..2afe7f8 100644
--- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAAnySearchDAO.java
+++ b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAAnySearchDAO.java
@@ -892,16 +892,17 @@ public class JPAAnySearchDAO extends AbstractAnySearchDAO {
         StringBuilder query = new StringBuilder("SELECT DISTINCT any_id FROM ");
         switch (cond.getType()) {
             case ISNOTNULL:
-                query.append(svs.attr().name).append(" WHERE schema_id=").
-                        append("'").append(checked.getLeft().getKey()).append("'");
+                query.append(checked.getLeft().isUniqueConstraint() ? svs.uniqueAttr().name : svs.attr().name).
+                        append(" WHERE schema_id=").append("'").append(checked.getLeft().getKey()).append("'");
                 break;
 
             case ISNULL:
                 query.append(svs.field().name).
                         append(" WHERE any_id NOT IN ").
                         append("(").
-                        append("SELECT DISTINCT any_id FROM ").append(svs.attr().name).append(" WHERE schema_id=").
-                        append("'").append(checked.getLeft().getKey()).append("'").
+                        append("SELECT DISTINCT any_id FROM ").
+                        append(checked.getLeft().isUniqueConstraint() ? svs.uniqueAttr().name : svs.attr().name).
+                        append(" WHERE schema_id=").append("'").append(checked.getLeft().getKey()).append("'").
                         append(")");
                 break;
 
diff --git a/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/AnySearchTest.java b/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/AnySearchTest.java
index bb37273..ac43c15 100644
--- a/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/AnySearchTest.java
+++ b/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/AnySearchTest.java
@@ -803,6 +803,25 @@ public class AnySearchTest extends AbstractTest {
         assertEquals(
                 searchDAO.count(SyncopeConstants.FULL_ADMIN_REALMS, searchCondition, AnyTypeKind.USER),
                 users.size());
+        
+        // search by attribute with unique constraint
+        AttributeCond fullnameCond = new AttributeCond(AttributeCond.Type.ISNOTNULL);
+        fullnameCond.setSchema("fullname");
+
+        SearchCond cond = SearchCond.getLeafCond(fullnameCond);
+        assertTrue(cond.isValid());
+
+        users = searchDAO.search(cond, AnyTypeKind.USER);
+        assertEquals(5, users.size());
+        
+        fullnameCond = new AttributeCond(AttributeCond.Type.ISNULL);
+        fullnameCond.setSchema("fullname");
+
+        cond = SearchCond.getLeafCond(fullnameCond);
+        assertTrue(cond.isValid());
+
+        users = searchDAO.search(cond, AnyTypeKind.USER);
+        assertTrue(users.isEmpty());
     }
 
     @Test
diff --git a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/SearchITCase.java b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/SearchITCase.java
index 49b1723..696d8c2 100644
--- a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/SearchITCase.java
+++ b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/SearchITCase.java
@@ -308,17 +308,6 @@ public class SearchITCase extends AbstractITCase {
                         and("username").equalTo("bellini").query()).
                 build());
         assertEquals(users, issueSYNCOPE1321);
-
-        // SYNCOPE-1416 (check the search for attributes of type different from stringvalue)
-        PagedResult<UserTO> issueSYNCOPE1416 = userService.search(new AnyQuery.Builder().
-                realm(SyncopeConstants.ROOT_REALM).
-                fiql(SyncopeClient.getUserSearchConditionBuilder().
-                        is("loginDate").lexicalNotBefore("2009-05-26").
-                        and("username").equalTo("rossini").query()).
-                orderBy(SyncopeClient.getOrderByClauseBuilder().asc("loginDate").build()).
-                build());
-        assertEquals(1, issueSYNCOPE1416.getSize());
-        assertEquals("rossini", issueSYNCOPE1416.getResult().get(0).getUsername());
     }
 
     @Test
@@ -631,6 +620,36 @@ public class SearchITCase extends AbstractITCase {
     }
 
     @Test
+    public void issueSYNCOPE1416() {
+        // check the search for attributes of type different from stringvalue
+        PagedResult<UserTO> issueSYNCOPE1416 = userService.search(new AnyQuery.Builder().
+                realm(SyncopeConstants.ROOT_REALM).
+                fiql(SyncopeClient.getUserSearchConditionBuilder().
+                        is("loginDate").lexicalNotBefore("2009-05-26").
+                        and("username").equalTo("rossini").query()).
+                orderBy(SyncopeClient.getOrderByClauseBuilder().asc("loginDate").build()).
+                build());
+        assertEquals(1, issueSYNCOPE1416.getSize());
+        assertEquals("rossini", issueSYNCOPE1416.getResult().get(0).getUsername());
+        
+        // search by attribute with unique constraint
+        issueSYNCOPE1416 = userService.search(new AnyQuery.Builder().
+                realm(SyncopeConstants.ROOT_REALM).
+                fiql(SyncopeClient.getUserSearchConditionBuilder().isNotNull("fullname").query()).
+                orderBy(SyncopeClient.getOrderByClauseBuilder().asc("loginDate").build()).
+                build());
+        // some identities could have been imported by pull tasks executions
+        assertTrue(issueSYNCOPE1416.getSize() >= 5);
+        
+        issueSYNCOPE1416 = userService.search(new AnyQuery.Builder().
+                realm(SyncopeConstants.ROOT_REALM).
+                fiql(SyncopeClient.getUserSearchConditionBuilder().isNull("fullname").query()).
+                orderBy(SyncopeClient.getOrderByClauseBuilder().asc("loginDate").build()).
+                build());
+        assertEquals(0, issueSYNCOPE1416.getSize());
+    }
+    
+    @Test
     public void issueSYNCOPE1417() {
         try {
             userService.search(new AnyQuery.Builder().realm(SyncopeConstants.ROOT_REALM).
@@ -661,6 +680,6 @@ public class SearchITCase extends AbstractITCase {
                                 is("loginDate").notEqualTo("2009-05-26").query()).page(1).size(1).build());
         assertTrue(unmatching.getSize() > 0);
 
-        assertEquals(total.getTotalCount(), matching.getTotalCount() + unmatching.getTotalCount());;
+        assertEquals(total.getTotalCount(), matching.getTotalCount() + unmatching.getTotalCount());
     }
 }