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:38:39 UTC

[syncope] branch 2_1_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_1_X
in repository https://gitbox.apache.org/repos/asf/syncope.git


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

commit b7c49f3eb03ea168fb883202860c7d26589afe1d
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  | 12 ++++--
 .../core/persistence/jpa/inner/AnySearchTest.java  | 19 ++++++++++
 .../org/apache/syncope/fit/core/SearchITCase.java  | 43 ++++++++++++++++------
 3 files changed, 58 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 def529c..d0b958b 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
@@ -974,8 +974,10 @@ public class JPAAnySearchDAO extends AbstractAnySearchDAO {
         StringBuilder query = new StringBuilder("SELECT DISTINCT any_id FROM ");
         switch (cond.getType()) {
             case ISNOTNULL:
-                query.append(svs.asSearchViewSupport().attr().name).append(" WHERE schema_id=").
-                        append("'").append(checked.getLeft().getKey()).append("'");
+                query.append(checked.getLeft().isUniqueConstraint()
+                        ? svs.asSearchViewSupport().uniqueAttr().name
+                        : svs.asSearchViewSupport().attr().name).
+                        append(" WHERE schema_id=").append("'").append(checked.getLeft().getKey()).append("'");
                 break;
 
             case ISNULL:
@@ -983,8 +985,10 @@ public class JPAAnySearchDAO extends AbstractAnySearchDAO {
                         append(" WHERE any_id NOT IN ").
                         append("(").
                         append("SELECT DISTINCT any_id FROM ").
-                        append(svs.asSearchViewSupport().attr().name).append(" WHERE schema_id=").
-                        append("'").append(checked.getLeft().getKey()).append("'").
+                        append(checked.getLeft().isUniqueConstraint()
+                                ? svs.asSearchViewSupport().uniqueAttr().name
+                                : svs.asSearchViewSupport().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 1dae5c1..4223282 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
@@ -769,6 +769,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 b93463f..53cc50a 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
@@ -287,17 +287,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-26T00:00:00+0300").
-                        and("username").equalTo("rossini").query()).
-                orderBy(SyncopeClient.getOrderByClauseBuilder().asc("loginDate").build()).
-                build());
-        assertEquals(1, issueSYNCOPE1416.getSize());
-        assertEquals("rossini", issueSYNCOPE1416.getResult().get(0).getUsername());
     }
 
     @Test
@@ -559,6 +548,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).
@@ -589,6 +608,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());
     }
 }