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 <[email protected]>
AuthorDate: Wed Oct 12 15:03:43 2022 +0530
ATLAS-4681: Relationship Search : SortBy is not working
Signed-off-by: Pinal Shah <[email protected]>
(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();