This is an automated email from the ASF dual-hosted git repository. pinal pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/atlas.git
The following commit(s) were added to refs/heads/master by this push: new 66ed19676 ATLAS-4681: Relationship Search : SortBy is not working 66ed19676 is described below commit 66ed196766ddfbca745acfe044118d4174d57206 Author: Pinal Shah <pinal.s...@freestoneinfotech.com> AuthorDate: Wed Oct 12 15:03:43 2022 +0530 ATLAS-4681: Relationship Search : SortBy is not working Signed-off-by: Pinal Shah <pinal.s...@freestoneinfotech.com> --- .../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();