[SYNCOPE-1304] Correct referece to userOwner_id / groupOwner_id in ORDER BY statements
Project: http://git-wip-us.apache.org/repos/asf/syncope/repo Commit: http://git-wip-us.apache.org/repos/asf/syncope/commit/9e9002f4 Tree: http://git-wip-us.apache.org/repos/asf/syncope/tree/9e9002f4 Diff: http://git-wip-us.apache.org/repos/asf/syncope/diff/9e9002f4 Branch: refs/heads/master Commit: 9e9002f4b2ae437b4c10f32d3dab513f2e3d9bb5 Parents: d11be0d Author: Francesco Chicchiriccò <[email protected]> Authored: Mon Apr 23 16:26:11 2018 +0200 Committer: Francesco Chicchiriccò <[email protected]> Committed: Mon Apr 23 16:29:00 2018 +0200 ---------------------------------------------------------------------- .../persistence/jpa/dao/JPAAnySearchDAO.java | 37 +++++++++++--------- .../apache/syncope/fit/core/SearchITCase.java | 8 +++++ 2 files changed, 29 insertions(+), 16 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/syncope/blob/9e9002f4/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAAnySearchDAO.java ---------------------------------------------------------------------- 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 7d0ba9f..3ce2702 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 @@ -27,6 +27,7 @@ import java.util.Set; import java.util.stream.Collectors; import javax.persistence.Query; import javax.persistence.TemporalType; +import org.apache.commons.lang3.ArrayUtils; import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.tuple.Pair; import org.apache.commons.lang3.tuple.Triple; @@ -64,6 +65,8 @@ public class JPAAnySearchDAO extends AbstractAnySearchDAO { private static final String EMPTY_QUERY = "SELECT any_id FROM user_search_attr WHERE 1=2"; + private static final String[] RELATIONSHIP_FIELDS = new String[] { "realm", "userOwner", "groupOwner" }; + private Pair<String, Set<String>> getAdminRealmsFilter( final Set<String> adminRealms, final SearchSupport svs, @@ -223,9 +226,9 @@ public class JPAAnySearchDAO extends AbstractAnySearchDAO { private StringBuilder buildSelect(final OrderBySupport obs) { final StringBuilder select = new StringBuilder("SELECT u.any_id"); - for (OrderBySupport.Item item : obs.items) { + obs.items.forEach(item -> { select.append(',').append(item.select); - } + }); select.append(" FROM "); return select; @@ -233,7 +236,7 @@ public class JPAAnySearchDAO extends AbstractAnySearchDAO { private StringBuilder buildWhere(final SearchSupport svs, final OrderBySupport obs) { StringBuilder where = new StringBuilder(" u"); - for (SearchSupport.SearchView searchView : obs.views) { + obs.views.forEach(searchView -> { where.append(','); if (searchView.name.equals(svs.attr().name)) { where.append(" (SELECT * FROM ").append(searchView.name); @@ -247,17 +250,17 @@ public class JPAAnySearchDAO extends AbstractAnySearchDAO { where.append(searchView.name); } where.append(' ').append(searchView.alias); - } + }); where.append(" WHERE "); - for (SearchSupport.SearchView searchView : obs.views) { + obs.views.forEach(searchView -> { where.append("u.any_id=").append(searchView.alias).append(".any_id AND "); - } + }); - for (OrderBySupport.Item item : obs.items) { - if (StringUtils.isNotBlank(item.where)) { - where.append(item.where).append(" AND "); - } - } + obs.items.stream(). + filter(item -> StringUtils.isNotBlank(item.where)). + forEachOrdered((item) -> { + where.append(item.where).append(" AND "); + }); return where; } @@ -265,9 +268,9 @@ public class JPAAnySearchDAO extends AbstractAnySearchDAO { private StringBuilder buildOrderBy(final OrderBySupport obs) { StringBuilder orderBy = new StringBuilder(); - for (OrderBySupport.Item item : obs.items) { + obs.items.forEach(item -> { orderBy.append(item.orderBy).append(','); - } + }); if (!obs.items.isEmpty()) { orderBy.insert(0, " ORDER BY "); orderBy.deleteCharAt(orderBy.length() - 1); @@ -283,7 +286,7 @@ public class JPAAnySearchDAO extends AbstractAnySearchDAO { OrderBySupport obs = new OrderBySupport(); - for (OrderByClause clause : filterOrderBy(orderBy)) { + filterOrderBy(orderBy).forEach(clause -> { OrderBySupport.Item item = new OrderBySupport.Item(); // Manage difference among external key attribute and internal JPA @Id @@ -319,7 +322,9 @@ public class JPAAnySearchDAO extends AbstractAnySearchDAO { } } else { // Adjust field name to column name - fieldName = "realm".equals(fieldName) ? "realm_id" : fieldName; + if (ArrayUtils.contains(RELATIONSHIP_FIELDS, fieldName)) { + fieldName += "_id"; + } obs.views.add(svs.field()); @@ -333,7 +338,7 @@ public class JPAAnySearchDAO extends AbstractAnySearchDAO { } else { obs.items.add(item); } - } + }); return obs; } http://git-wip-us.apache.org/repos/asf/syncope/blob/9e9002f4/fit/core-reference/src/test/java/org/apache/syncope/fit/core/SearchITCase.java ---------------------------------------------------------------------- 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 bc743ab..8d20639 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 @@ -525,4 +525,12 @@ public class SearchITCase extends AbstractITCase { userService.update(patch); } } + + @Test + public void issueSYNCOPE1304() { + PagedResult<GroupTO> groups = groupService.search(new AnyQuery.Builder().realm(SyncopeConstants.ROOT_REALM). + orderBy("userOwner DESC").build()); + assertNotNull(groups); + assertFalse(groups.getResult().isEmpty()); + } }
