You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@atlas.apache.org by pi...@apache.org on 2022/10/17 05:15:14 UTC

[atlas] branch branch-2.0 updated: ATLAS-4681: Relationship Search : SortBy is not working

This is an automated email from the ASF dual-hosted git repository.

pinal pushed a commit to branch branch-2.0
in repository https://gitbox.apache.org/repos/asf/atlas.git


The following commit(s) were added to refs/heads/branch-2.0 by this push:
     new 36fd6c52c ATLAS-4681: Relationship Search : SortBy is not working
36fd6c52c is described below

commit 36fd6c52cc88092630373eb909240cfdbc831cba
Author: Pinal Shah <pi...@freestoneinfotech.com>
AuthorDate: Wed Oct 12 15:03:43 2022 +0530

    ATLAS-4681: Relationship Search : SortBy is not working
    
    Signed-off-by: Pinal Shah <pi...@freestoneinfotech.com>
    (cherry picked from commit 66ed196766ddfbca745acfe044118d4174d57206)
---
 .../atlas/discovery/RelationshipSearchProcessor.java    | 17 +++++++++++++++++
 .../org/apache/atlas/discovery/SearchProcessor.java     |  8 +++++---
 .../discovery/RelationshipSearchProcessorTest.java      | 15 +++++++++++++++
 3 files changed, 37 insertions(+), 3 deletions(-)

diff --git a/repository/src/main/java/org/apache/atlas/discovery/RelationshipSearchProcessor.java b/repository/src/main/java/org/apache/atlas/discovery/RelationshipSearchProcessor.java
index e4c07988d..5e40aa03b 100644
--- a/repository/src/main/java/org/apache/atlas/discovery/RelationshipSearchProcessor.java
+++ b/repository/src/main/java/org/apache/atlas/discovery/RelationshipSearchProcessor.java
@@ -17,6 +17,7 @@
  */
 package org.apache.atlas.discovery;
 
+import org.apache.atlas.SortOrder;
 import org.apache.atlas.model.discovery.SearchParameters;
 import org.apache.atlas.repository.Constants;
 import org.apache.atlas.repository.graphdb.AtlasEdge;
@@ -30,6 +31,7 @@ import org.apache.atlas.utils.AtlasPerfTracer;
 import org.apache.commons.collections.CollectionUtils;
 import org.apache.commons.collections.Predicate;
 import org.apache.commons.collections.PredicateUtils;
+import org.apache.commons.lang.StringUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -43,6 +45,8 @@ import java.util.Set;
 import java.util.stream.Collectors;
 
 import static org.apache.atlas.repository.Constants.RELATIONSHIP_TYPE_PROPERTY_KEY;
+import static org.apache.atlas.repository.graphdb.AtlasGraphQuery.SortOrder.ASC;
+import static org.apache.atlas.repository.graphdb.AtlasGraphQuery.SortOrder.DESC;
 
 public class RelationshipSearchProcessor extends SearchProcessor {
     private static final Logger LOG      = LoggerFactory.getLogger(RelationshipSearchProcessor.class);
@@ -63,6 +67,8 @@ public class RelationshipSearchProcessor extends SearchProcessor {
         final Set<String> typeNames                          = CollectionUtils.isNotEmpty(types) ? types.stream().map(AtlasRelationshipType::getTypeName).collect(Collectors.toSet()) : null;
         final String      typeAndSubTypesQryStr              = AtlasStructType.AtlasAttribute.escapeIndexQueryValue(typeNames, true);
         final Predicate   typeNamePredicate                  = SearchPredicateUtil.generateIsRelationshipEdgePredicate(context.getTypeRegistry());
+        final String      sortBy                             = context.getSearchParameters().getSortBy();
+        final SortOrder   sortOrder                          = context.getSearchParameters().getSortOrder();
         inMemoryPredicate = typeNamePredicate;
 
         processSearchAttributes(types, filterCriteria, indexAttributes, graphAttributes, allAttributes);
@@ -112,6 +118,17 @@ public class RelationshipSearchProcessor extends SearchProcessor {
             if (attributePredicate != null) {
                 inMemoryPredicate = PredicateUtils.andPredicate(inMemoryPredicate, attributePredicate);
             }
+
+            if (StringUtils.isNotEmpty(sortBy)) {
+                final AtlasRelationshipType relationshipType   = types.iterator().next();
+                AtlasStructType.AtlasAttribute sortByAttribute = relationshipType.getAttribute(sortBy);
+
+                if (sortByAttribute != null && StringUtils.isNotEmpty(sortByAttribute.getVertexPropertyName())) {
+                    AtlasGraphQuery.SortOrder qrySortOrder = sortOrder == SortOrder.ASCENDING ? ASC : DESC;
+
+                    graphQuery.orderBy(sortByAttribute.getVertexPropertyName(), qrySortOrder);
+                }
+            }
         } else {
             graphQuery = null;
         }
diff --git a/repository/src/main/java/org/apache/atlas/discovery/SearchProcessor.java b/repository/src/main/java/org/apache/atlas/discovery/SearchProcessor.java
index 7b36c6c75..49091dcf3 100644
--- a/repository/src/main/java/org/apache/atlas/discovery/SearchProcessor.java
+++ b/repository/src/main/java/org/apache/atlas/discovery/SearchProcessor.java
@@ -1366,10 +1366,12 @@ public abstract class SearchProcessor {
     }
 
     protected static Iterator<AtlasIndexQuery.Result> executeIndexQueryForEdge(SearchContext context, AtlasIndexQuery indexQuery, int qryOffset, int limit) {
-        String sortBy = getSortByAttribute(context);
-        if (sortBy != null && !sortBy.isEmpty()) {
+        final AtlasRelationshipType relationshipType   = context.getRelationshipTypes().iterator().next();
+        AtlasStructType.AtlasAttribute sortByAttribute = relationshipType.getAttribute(context.getSearchParameters().getSortBy());
+
+        if (sortByAttribute != null && StringUtils.isNotEmpty(sortByAttribute.getVertexPropertyName())) {
             Order sortOrder = getSortOrderAttribute(context);
-            return indexQuery.edges(qryOffset, limit, sortBy, sortOrder);
+            return indexQuery.edges(qryOffset, limit, sortByAttribute.getVertexPropertyName(), sortOrder);
         }
         return indexQuery.edges(qryOffset, limit);
     }
diff --git a/repository/src/test/java/org/apache/atlas/discovery/RelationshipSearchProcessorTest.java b/repository/src/test/java/org/apache/atlas/discovery/RelationshipSearchProcessorTest.java
index 3b2b59863..035b44348 100644
--- a/repository/src/test/java/org/apache/atlas/discovery/RelationshipSearchProcessorTest.java
+++ b/repository/src/test/java/org/apache/atlas/discovery/RelationshipSearchProcessorTest.java
@@ -131,6 +131,21 @@ public class RelationshipSearchProcessorTest extends BasicTestSetup {
         assertEquals("ganeshchaturthi-post@Divya",edges.get(0).getProperty("user_post.post_name", String.class));
     }
 
+    @Test
+    public void sortByReaction() throws AtlasBaseException {
+        SearchParameters params = new SearchParameters();
+        params.setRelationshipName("user_post");
+        params.setRelationshipFilters(getSingleFilterCondition("user_name", SearchParameters.Operator.CONTAINS, "Ajay"));
+        params.setLimit(20);
+        params.setSortBy("reaction");
+        params.setSortOrder(SortOrder.DESCENDING);
+
+        List<AtlasEdge> edges = executeAndAssert(params, 7);
+
+        assertEquals("wow", edges.get(0).getProperty("user_post.reaction", String.class));
+        assertEquals("create", edges.get(6).getProperty("user_post.reaction", String.class));
+
+    }
     @Test
     public void searchBymultipleTypes() throws AtlasBaseException {
         SearchParameters params = new SearchParameters();