Skip to content

Commit 82786d2

Browse files
author
Harsh Garg
committed
Separating metadata filtering for pagination strategies
Signed-off-by: Harsh Garg <[email protected]>
1 parent ede0700 commit 82786d2

File tree

2 files changed

+54
-18
lines changed

2 files changed

+54
-18
lines changed

server/src/main/java/org/opensearch/action/pagination/IndexPaginationStrategy.java

Lines changed: 16 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -54,8 +54,7 @@ public IndexPaginationStrategy(PageParams pageParams, ClusterState clusterState)
5454
clusterState,
5555
pageParams.getSort(),
5656
Objects.isNull(requestedToken) ? null : requestedToken.lastIndexName,
57-
Objects.isNull(requestedToken) ? null : requestedToken.lastIndexCreationTime,
58-
false
57+
Objects.isNull(requestedToken) ? null : requestedToken.lastIndexCreationTime
5958
);
6059

6160
// Trim sortedIndicesList to get the list of indices metadata to be sent as response
@@ -69,12 +68,11 @@ public IndexPaginationStrategy(PageParams pageParams, ClusterState clusterState)
6968
);
7069
}
7170

72-
protected static List<IndexMetadata> getEligibleIndices(
71+
private static List<IndexMetadata> getEligibleIndices(
7372
ClusterState clusterState,
7473
String sortOrder,
7574
String lastIndexName,
76-
Long lastIndexCreationTime,
77-
boolean includeLastIndex
75+
Long lastIndexCreationTime
7876
) {
7977
if (Objects.isNull(lastIndexName) || Objects.isNull(lastIndexCreationTime)) {
8078
return PaginationStrategy.getSortedIndexMetadata(
@@ -84,25 +82,28 @@ protected static List<IndexMetadata> getEligibleIndices(
8482
}
8583
return PaginationStrategy.getSortedIndexMetadata(
8684
clusterState,
87-
getMetadataFilter(sortOrder, lastIndexName, lastIndexCreationTime, includeLastIndex),
85+
getMetadataFilter(sortOrder, lastIndexName, lastIndexCreationTime),
8886
PageParams.PARAM_ASC_SORT_VALUE.equals(sortOrder) ? ASC_COMPARATOR : DESC_COMPARATOR
8987
);
9088
}
9189

92-
protected static Predicate<IndexMetadata> getMetadataFilter(
93-
String sortOrder,
94-
String lastIndexName,
95-
Long lastIndexCreationTime,
96-
boolean includeLastIndex
97-
) {
90+
private static Predicate<IndexMetadata> getMetadataFilter(String sortOrder, String lastIndexName, Long lastIndexCreationTime) {
9891
if (Objects.isNull(lastIndexName) || Objects.isNull(lastIndexCreationTime)) {
9992
return indexMetadata -> true;
10093
}
101-
boolean isAscendingSort = sortOrder.equals(PageParams.PARAM_ASC_SORT_VALUE);
10294
return metadata -> {
10395
if (metadata.getIndex().getName().equals(lastIndexName)) {
104-
return includeLastIndex;
105-
} else if (metadata.getCreationDate() == lastIndexCreationTime) {
96+
return false;
97+
} else {
98+
return getIndexCreateTimeFilter(sortOrder, lastIndexName, lastIndexCreationTime).test(metadata);
99+
}
100+
};
101+
}
102+
103+
protected static Predicate<IndexMetadata> getIndexCreateTimeFilter(String sortOrder, String lastIndexName, Long lastIndexCreationTime) {
104+
boolean isAscendingSort = sortOrder.equals(PageParams.PARAM_ASC_SORT_VALUE);
105+
return metadata -> {
106+
if (metadata.getCreationDate() == lastIndexCreationTime) {
106107
return isAscendingSort
107108
? metadata.getIndex().getName().compareTo(lastIndexName) > 0
108109
: metadata.getIndex().getName().compareTo(lastIndexName) < 0;

server/src/main/java/org/opensearch/action/pagination/ShardPaginationStrategy.java

Lines changed: 38 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,10 @@
1919
import java.util.List;
2020
import java.util.Map;
2121
import java.util.Objects;
22+
import java.util.function.Predicate;
23+
24+
import static org.opensearch.action.pagination.IndexPaginationStrategy.ASC_COMPARATOR;
25+
import static org.opensearch.action.pagination.IndexPaginationStrategy.DESC_COMPARATOR;
2226

2327
/**
2428
* This strategy can be used by the Rest APIs wanting to paginate the responses based on Shards.
@@ -35,12 +39,11 @@ public class ShardPaginationStrategy implements PaginationStrategy<ShardRouting>
3539
public ShardPaginationStrategy(PageParams pageParams, ClusterState clusterState) {
3640
ShardStrategyToken shardStrategyToken = getShardStrategyToken(pageParams.getRequestedToken());
3741
// Get list of indices metadata sorted by their creation time and filtered by the last sent index
38-
List<IndexMetadata> filteredIndices = IndexPaginationStrategy.getEligibleIndices(
42+
List<IndexMetadata> filteredIndices = getEligibleIndices(
3943
clusterState,
4044
pageParams.getSort(),
4145
Objects.isNull(shardStrategyToken) ? null : shardStrategyToken.lastIndexName,
42-
Objects.isNull(shardStrategyToken) ? null : shardStrategyToken.lastIndexCreationTime,
43-
true
46+
Objects.isNull(shardStrategyToken) ? null : shardStrategyToken.lastIndexCreationTime
4447
);
4548
// Get the list of shards and indices belonging to current page.
4649
this.pageData = getPageData(
@@ -51,6 +54,38 @@ public ShardPaginationStrategy(PageParams pageParams, ClusterState clusterState)
5154
);
5255
}
5356

57+
private static List<IndexMetadata> getEligibleIndices(
58+
ClusterState clusterState,
59+
String sortOrder,
60+
String lastIndexName,
61+
Long lastIndexCreationTime
62+
) {
63+
if (Objects.isNull(lastIndexName) || Objects.isNull(lastIndexCreationTime)) {
64+
return PaginationStrategy.getSortedIndexMetadata(
65+
clusterState,
66+
PageParams.PARAM_ASC_SORT_VALUE.equals(sortOrder) ? ASC_COMPARATOR : DESC_COMPARATOR
67+
);
68+
}
69+
return PaginationStrategy.getSortedIndexMetadata(
70+
clusterState,
71+
getMetadataFilter(sortOrder, lastIndexName, lastIndexCreationTime),
72+
PageParams.PARAM_ASC_SORT_VALUE.equals(sortOrder) ? ASC_COMPARATOR : DESC_COMPARATOR
73+
);
74+
}
75+
76+
private static Predicate<IndexMetadata> getMetadataFilter(String sortOrder, String lastIndexName, Long lastIndexCreationTime) {
77+
if (Objects.isNull(lastIndexName) || Objects.isNull(lastIndexCreationTime)) {
78+
return indexMetadata -> true;
79+
}
80+
return metadata -> {
81+
if (metadata.getIndex().getName().equals(lastIndexName)) {
82+
return true;
83+
} else {
84+
return IndexPaginationStrategy.getIndexCreateTimeFilter(sortOrder, lastIndexName, lastIndexCreationTime).test(metadata);
85+
}
86+
};
87+
}
88+
5489
/**
5590
* Will be used to get the list of shards and respective indices to which they belong,
5691
* which are to be displayed in a page.

0 commit comments

Comments
 (0)