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

Reply via email to