You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@syncope.apache.org by il...@apache.org on 2017/05/09 10:13:04 UTC

[2/2] syncope git commit: [SYNCOPE-1077] Enhancing sort support

[SYNCOPE-1077] Enhancing sort support


Project: http://git-wip-us.apache.org/repos/asf/syncope/repo
Commit: http://git-wip-us.apache.org/repos/asf/syncope/commit/268e6ffc
Tree: http://git-wip-us.apache.org/repos/asf/syncope/tree/268e6ffc
Diff: http://git-wip-us.apache.org/repos/asf/syncope/diff/268e6ffc

Branch: refs/heads/master
Commit: 268e6ffcd3f6fc41b831534ad95fb1d6c2ba54cf
Parents: 648c454
Author: Francesco Chicchiriccò <il...@apache.org>
Authored: Tue May 9 12:12:06 2017 +0200
Committer: Francesco Chicchiriccò <il...@apache.org>
Committed: Tue May 9 12:12:50 2017 +0200

----------------------------------------------------------------------
 .../persistence/jpa/dao/JPAAnySearchDAO.java    |  4 +-
 .../jpa/dao/ElasticsearchAnySearchDAO.java      | 45 ++++++++++++++++++--
 2 files changed, 44 insertions(+), 5 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/syncope/blob/268e6ffc/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 276b570..61d4a7f 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
@@ -251,10 +251,10 @@ public class JPAAnySearchDAO extends AbstractAnySearchDAO {
         return orderBy;
     }
 
-    private OrderBySupport parseOrderBy(final AnyTypeKind type, final SearchSupport svs,
+    private OrderBySupport parseOrderBy(final AnyTypeKind kind, final SearchSupport svs,
             final List<OrderByClause> orderByClauses) {
 
-        final AnyUtils attrUtils = anyUtilsFactory.getInstance(type);
+        AnyUtils attrUtils = anyUtilsFactory.getInstance(kind);
 
         OrderBySupport obs = new OrderBySupport();
 

http://git-wip-us.apache.org/repos/asf/syncope/blob/268e6ffc/ext/elasticsearch/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/ElasticsearchAnySearchDAO.java
----------------------------------------------------------------------
diff --git a/ext/elasticsearch/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/ElasticsearchAnySearchDAO.java b/ext/elasticsearch/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/ElasticsearchAnySearchDAO.java
index d2beabc..0675254 100644
--- a/ext/elasticsearch/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/ElasticsearchAnySearchDAO.java
+++ b/ext/elasticsearch/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/ElasticsearchAnySearchDAO.java
@@ -18,6 +18,9 @@
  */
 package org.apache.syncope.core.persistence.jpa.dao;
 
+import static org.apache.syncope.core.persistence.jpa.dao.AbstractDAO.LOG;
+
+import java.lang.reflect.Field;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.List;
@@ -42,6 +45,7 @@ import org.apache.syncope.core.persistence.api.dao.search.ResourceCond;
 import org.apache.syncope.core.persistence.api.dao.search.RoleCond;
 import org.apache.syncope.core.persistence.api.dao.search.SearchCond;
 import org.apache.syncope.core.persistence.api.entity.Any;
+import org.apache.syncope.core.persistence.api.entity.AnyUtils;
 import org.apache.syncope.core.persistence.api.entity.PlainAttrValue;
 import org.apache.syncope.core.persistence.api.entity.PlainSchema;
 import org.apache.syncope.core.persistence.api.entity.Realm;
@@ -58,6 +62,7 @@ import org.elasticsearch.index.query.QueryBuilders;
 import org.elasticsearch.search.SearchHit;
 import org.elasticsearch.search.sort.SortOrder;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.util.ReflectionUtils;
 
 /**
  * Search engine implementation for users, groups and any objects, based on Elasticsearch.
@@ -112,6 +117,42 @@ public class ElasticsearchAnySearchDAO extends AbstractAnySearchDAO {
         return (int) builder.get().getHits().getTotalHits();
     }
 
+    private void addSort(
+            final SearchRequestBuilder builder,
+            final AnyTypeKind kind,
+            final List<OrderByClause> orderBy) {
+
+        AnyUtils attrUtils = anyUtilsFactory.getInstance(kind);
+
+        for (OrderByClause clause : orderBy) {
+            String sortName = null;
+
+            // Manage difference among external key attribute and internal JPA @Id
+            String fieldName = "key".equals(clause.getField()) ? "id" : clause.getField();
+
+            Field anyField = ReflectionUtils.findField(attrUtils.anyClass(), fieldName);
+            if (anyField == null) {
+                PlainSchema schema = schemaDAO.find(fieldName);
+                if (schema != null) {
+                    sortName = schema.getType() == AttrSchemaType.String
+                            || schema.getType() == AttrSchemaType.Enum
+                            ? fieldName + ".keyword"
+                            : fieldName;
+                }
+            } else {
+                sortName = anyField.getType().equals(String.class)
+                        ? fieldName + ".keyword"
+                        : fieldName;
+            }
+
+            if (sortName == null) {
+                LOG.warn("Cannot build any valid clause from {}", clause);
+            } else {
+                builder.addSort(sortName, SortOrder.valueOf(clause.getDirection().name()));
+            }
+        }
+    }
+
     @Override
     protected <T extends Any<?>> List<T> doSearch(
             final Set<String> adminRealms,
@@ -124,9 +165,7 @@ public class ElasticsearchAnySearchDAO extends AbstractAnySearchDAO {
         SearchRequestBuilder builder = searchRequestBuilder(adminRealms, cond, kind).
                 setFrom(page <= 0 ? 0 : page - 1).
                 setSize(itemsPerPage < 0 ? elasticsearchUtils.getIndexMaxResultWindow() : itemsPerPage);
-        for (OrderByClause clause : orderBy) {
-            builder.addSort(clause.getField(), SortOrder.valueOf(clause.getDirection().name()));
-        }
+        addSort(builder, kind, orderBy);
 
         return buildResult(
                 CollectionUtils.collect(Arrays.asList(builder.get().getHits().getHits()),