You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ranger.apache.org by rm...@apache.org on 2025/05/27 21:07:09 UTC
(ranger) branch master updated: RANGER-5213: Add Support for isEnabled Filter and Full/Partial Text Search on Labels and Keywords in Dataset Search
This is an automated email from the ASF dual-hosted git repository.
rmani pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/ranger.git
The following commit(s) were added to refs/heads/master by this push:
new 44e27a4fe RANGER-5213: Add Support for isEnabled Filter and Full/Partial Text Search on Labels and Keywords in Dataset Search
44e27a4fe is described below
commit 44e27a4fe2d5538189c5c2c2069403e0d5f106cd
Author: Radhika Kundam <ra...@gmail.com>
AuthorDate: Tue May 20 13:56:53 2025 -0700
RANGER-5213: Add Support for isEnabled Filter and Full/Partial Text Search on Labels and Keywords in Dataset Search
Signed-off-by: Ramesh Mani <rm...@apache.org>
---
.../apache/ranger/plugin/util/SearchFilter.java | 2 ++
.../org/apache/ranger/common/RangerSearchUtil.java | 2 ++
.../main/java/org/apache/ranger/rest/GdsREST.java | 12 +++++--
.../ranger/service/RangerGdsDatasetService.java | 40 +++++++++++++++++++++-
4 files changed, 53 insertions(+), 3 deletions(-)
diff --git a/agents-common/src/main/java/org/apache/ranger/plugin/util/SearchFilter.java b/agents-common/src/main/java/org/apache/ranger/plugin/util/SearchFilter.java
index 717b94c67..3704aa3e7 100755
--- a/agents-common/src/main/java/org/apache/ranger/plugin/util/SearchFilter.java
+++ b/agents-common/src/main/java/org/apache/ranger/plugin/util/SearchFilter.java
@@ -145,6 +145,8 @@ public class SearchFilter {
public static final String VALIDITY_EXPIRY_END = "validityExpiryEnd"; // search
public static final String VALIDITY_TIME_ZONE = "timeZone";
public static final String DEFAULT_TIME_ZONE = "GMT";
+ public static final String DATASET_LABEL_MATCH_TYPE = "datasetLabelMatchType";
+ public static final String DATASET_KEYWORD_MATCH_TYPE = "datasetKeywordMatchType";
private Map<String, String> params;
private Map<String, Object[]> multiValueParams;
diff --git a/security-admin/src/main/java/org/apache/ranger/common/RangerSearchUtil.java b/security-admin/src/main/java/org/apache/ranger/common/RangerSearchUtil.java
index a76c2b5a3..79fd27568 100755
--- a/security-admin/src/main/java/org/apache/ranger/common/RangerSearchUtil.java
+++ b/security-admin/src/main/java/org/apache/ranger/common/RangerSearchUtil.java
@@ -154,6 +154,8 @@ public SearchFilter getSearchFilter(@Nonnull HttpServletRequest request, List<So
ret.setParam(SearchFilter.VALIDITY_EXPIRY_START, request.getParameter(SearchFilter.VALIDITY_EXPIRY_START));
ret.setParam(SearchFilter.VALIDITY_EXPIRY_END, request.getParameter(SearchFilter.VALIDITY_EXPIRY_END));
ret.setParam(SearchFilter.VALIDITY_TIME_ZONE, request.getParameter(SearchFilter.VALIDITY_TIME_ZONE));
+ ret.setParam(SearchFilter.DATASET_LABEL_MATCH_TYPE, request.getParameter(SearchFilter.DATASET_LABEL_MATCH_TYPE));
+ ret.setParam(SearchFilter.DATASET_KEYWORD_MATCH_TYPE, request.getParameter(SearchFilter.DATASET_KEYWORD_MATCH_TYPE));
extractCommonCriteriasForFilter(request, ret, sortFields);
diff --git a/security-admin/src/main/java/org/apache/ranger/rest/GdsREST.java b/security-admin/src/main/java/org/apache/ranger/rest/GdsREST.java
index 84009c3fa..8bcbd728b 100755
--- a/security-admin/src/main/java/org/apache/ranger/rest/GdsREST.java
+++ b/security-admin/src/main/java/org/apache/ranger/rest/GdsREST.java
@@ -393,8 +393,7 @@ public PList<RangerDataset> searchDatasets(@Context HttpServletRequest request)
filter = searchUtil.getSearchFilter(request, datasetService.sortFields);
- searchUtil.extractStringList(request, filter, SearchFilter.DATASET_LABEL, "Dataset Label List", "datasetLabels", null, null);
- searchUtil.extractStringList(request, filter, SearchFilter.DATASET_KEYWORD, "Dataset Keyword List", "datasetKeywords", null, null);
+ extractDatasetMultiValueParams(request, filter);
ret = gdsStore.searchDatasets(filter);
} catch (WebApplicationException excp) {
@@ -456,6 +455,8 @@ public PList<DatasetSummary> getDatasetSummary(@Context HttpServletRequest reque
try {
filter = searchUtil.getSearchFilter(request, datasetService.sortFields);
+ extractDatasetMultiValueParams(request, filter);
+
ret = gdsStore.getDatasetSummary(filter);
} catch (WebApplicationException we) {
throw we;
@@ -486,6 +487,8 @@ public DatasetsSummary getEnhancedDatasetSummary(@Context HttpServletRequest req
try {
filter = searchUtil.getSearchFilter(request, datasetService.sortFields);
+ extractDatasetMultiValueParams(request, filter);
+
ret = gdsStore.getEnhancedDatasetSummary(filter);
} catch (WebApplicationException we) {
throw we;
@@ -2267,4 +2270,9 @@ private RangerPolicyItem copyOf(RangerPolicyItem policyItem) {
return copy;
}
+
+ private void extractDatasetMultiValueParams(HttpServletRequest request, SearchFilter filter) {
+ searchUtil.extractStringList(request, filter, SearchFilter.DATASET_LABEL, "Dataset Label List", "datasetLabels", null, null);
+ searchUtil.extractStringList(request, filter, SearchFilter.DATASET_KEYWORD, "Dataset Keyword List", "datasetKeywords", null, null);
+ }
}
diff --git a/security-admin/src/main/java/org/apache/ranger/service/RangerGdsDatasetService.java b/security-admin/src/main/java/org/apache/ranger/service/RangerGdsDatasetService.java
index 8ace32a53..7ded325d2 100755
--- a/security-admin/src/main/java/org/apache/ranger/service/RangerGdsDatasetService.java
+++ b/security-admin/src/main/java/org/apache/ranger/service/RangerGdsDatasetService.java
@@ -40,7 +40,12 @@
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Service;
+import java.util.Arrays;
+import java.util.Collections;
import java.util.List;
+import java.util.Objects;
+import java.util.Set;
+import java.util.stream.Collectors;
@Service
@Scope("singleton")
@@ -71,6 +76,7 @@ public RangerGdsDatasetService() {
searchFields.add(new SearchField(SearchFilter.CREATED_BY, "obj.addedByUserId", SearchField.DATA_TYPE.INTEGER, SearchField.SEARCH_TYPE.FULL));
searchFields.add(new SearchField(SearchFilter.DATASET_LABEL, "obj.labels", SearchField.DATA_TYPE.STRING, SearchField.SEARCH_TYPE.PARTIAL));
searchFields.add(new SearchField(SearchFilter.DATASET_KEYWORD, "obj.keywords", SearchField.DATA_TYPE.STRING, SearchField.SEARCH_TYPE.PARTIAL));
+ searchFields.add(new SearchField(SearchFilter.IS_ENABLED, "obj.isEnabled", SearchField.DATA_TYPE.BOOLEAN, SearchField.SEARCH_TYPE.FULL));
sortFields.add(new SortField(SearchFilter.CREATE_TIME, "obj.createTime"));
sortFields.add(new SortField(SearchFilter.UPDATE_TIME, "obj.updateTime"));
@@ -214,8 +220,23 @@ public RangerDatasetList searchDatasets(SearchFilter filter) {
List<XXGdsDataset> datasets = super.searchResources(filter, searchFields, sortFields, ret);
if (datasets != null) {
+ Set<String> searchLabels = extractFilterValues(SearchFilter.DATASET_LABEL, filter);
+ Set<String> searchKeywords = extractFilterValues(SearchFilter.DATASET_KEYWORD, filter);
+ String labelMatchType = filter.getParam(SearchFilter.DATASET_LABEL_MATCH_TYPE);
+ String keywordMatchType = filter.getParam(SearchFilter.DATASET_KEYWORD_MATCH_TYPE);
for (XXGdsDataset dataset : datasets) {
- ret.getList().add(getPopulatedViewObject(dataset));
+ boolean isLabelOrKeywordMatch = CollectionUtils.isEmpty(searchLabels) && CollectionUtils.isEmpty(searchKeywords);
+ if (!isLabelOrKeywordMatch) {
+ isLabelOrKeywordMatch = isAnyMatch(labelMatchType, JsonUtils.jsonToSetString(dataset.getLabels()), searchLabels);
+ }
+
+ if (!isLabelOrKeywordMatch) {
+ isLabelOrKeywordMatch = isAnyMatch(keywordMatchType, JsonUtils.jsonToSetString(dataset.getKeywords()), searchKeywords);
+ }
+
+ if (isLabelOrKeywordMatch) {
+ ret.getList().add(getPopulatedViewObject(dataset));
+ }
}
}
@@ -223,4 +244,21 @@ public RangerDatasetList searchDatasets(SearchFilter filter) {
return ret;
}
+
+ private Set<String> extractFilterValues(String key, SearchFilter filter) {
+ Object[] multiVal = filter.getMultiValueParam(key);
+
+ return multiVal != null ? Arrays.stream(multiVal).filter(Objects::nonNull).map(Object::toString).collect(Collectors.toSet()) : Collections.emptySet();
+ }
+
+ private boolean isAnyMatch(String matchType, Set<String> values, Set<String> searchValues) {
+ if (CollectionUtils.isNotEmpty(searchValues) && CollectionUtils.isNotEmpty(values)) {
+ if (SearchField.SEARCH_TYPE.FULL.name().equalsIgnoreCase(matchType)) {
+ return searchValues.stream().anyMatch(searchValue -> values.stream().anyMatch(value -> value.equalsIgnoreCase(searchValue)));
+ } else {
+ return searchValues.stream().anyMatch(searchValue -> values.stream().anyMatch(value -> StringUtils.containsIgnoreCase(value, searchValue)));
+ }
+ }
+ return false;
+ }
}