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());
}
}