Skip to content

Commit 44e27a4

Browse files
rkundamRamesh Mani
authored andcommitted
RANGER-5213: Add Support for isEnabled Filter and Full/Partial Text Search on Labels and Keywords in Dataset Search
Signed-off-by: Ramesh Mani <rmani@apache.org>
1 parent c1f915e commit 44e27a4

4 files changed

Lines changed: 53 additions & 3 deletions

File tree

agents-common/src/main/java/org/apache/ranger/plugin/util/SearchFilter.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -145,6 +145,8 @@ public class SearchFilter {
145145
public static final String VALIDITY_EXPIRY_END = "validityExpiryEnd"; // search
146146
public static final String VALIDITY_TIME_ZONE = "timeZone";
147147
public static final String DEFAULT_TIME_ZONE = "GMT";
148+
public static final String DATASET_LABEL_MATCH_TYPE = "datasetLabelMatchType";
149+
public static final String DATASET_KEYWORD_MATCH_TYPE = "datasetKeywordMatchType";
148150

149151
private Map<String, String> params;
150152
private Map<String, Object[]> multiValueParams;

security-admin/src/main/java/org/apache/ranger/common/RangerSearchUtil.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -154,6 +154,8 @@ public SearchFilter getSearchFilter(@Nonnull HttpServletRequest request, List<So
154154
ret.setParam(SearchFilter.VALIDITY_EXPIRY_START, request.getParameter(SearchFilter.VALIDITY_EXPIRY_START));
155155
ret.setParam(SearchFilter.VALIDITY_EXPIRY_END, request.getParameter(SearchFilter.VALIDITY_EXPIRY_END));
156156
ret.setParam(SearchFilter.VALIDITY_TIME_ZONE, request.getParameter(SearchFilter.VALIDITY_TIME_ZONE));
157+
ret.setParam(SearchFilter.DATASET_LABEL_MATCH_TYPE, request.getParameter(SearchFilter.DATASET_LABEL_MATCH_TYPE));
158+
ret.setParam(SearchFilter.DATASET_KEYWORD_MATCH_TYPE, request.getParameter(SearchFilter.DATASET_KEYWORD_MATCH_TYPE));
157159

158160
extractCommonCriteriasForFilter(request, ret, sortFields);
159161

security-admin/src/main/java/org/apache/ranger/rest/GdsREST.java

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -393,8 +393,7 @@ public PList<RangerDataset> searchDatasets(@Context HttpServletRequest request)
393393

394394
filter = searchUtil.getSearchFilter(request, datasetService.sortFields);
395395

396-
searchUtil.extractStringList(request, filter, SearchFilter.DATASET_LABEL, "Dataset Label List", "datasetLabels", null, null);
397-
searchUtil.extractStringList(request, filter, SearchFilter.DATASET_KEYWORD, "Dataset Keyword List", "datasetKeywords", null, null);
396+
extractDatasetMultiValueParams(request, filter);
398397

399398
ret = gdsStore.searchDatasets(filter);
400399
} catch (WebApplicationException excp) {
@@ -456,6 +455,8 @@ public PList<DatasetSummary> getDatasetSummary(@Context HttpServletRequest reque
456455
try {
457456
filter = searchUtil.getSearchFilter(request, datasetService.sortFields);
458457

458+
extractDatasetMultiValueParams(request, filter);
459+
459460
ret = gdsStore.getDatasetSummary(filter);
460461
} catch (WebApplicationException we) {
461462
throw we;
@@ -486,6 +487,8 @@ public DatasetsSummary getEnhancedDatasetSummary(@Context HttpServletRequest req
486487
try {
487488
filter = searchUtil.getSearchFilter(request, datasetService.sortFields);
488489

490+
extractDatasetMultiValueParams(request, filter);
491+
489492
ret = gdsStore.getEnhancedDatasetSummary(filter);
490493
} catch (WebApplicationException we) {
491494
throw we;
@@ -2267,4 +2270,9 @@ private RangerPolicyItem copyOf(RangerPolicyItem policyItem) {
22672270

22682271
return copy;
22692272
}
2273+
2274+
private void extractDatasetMultiValueParams(HttpServletRequest request, SearchFilter filter) {
2275+
searchUtil.extractStringList(request, filter, SearchFilter.DATASET_LABEL, "Dataset Label List", "datasetLabels", null, null);
2276+
searchUtil.extractStringList(request, filter, SearchFilter.DATASET_KEYWORD, "Dataset Keyword List", "datasetKeywords", null, null);
2277+
}
22702278
}

security-admin/src/main/java/org/apache/ranger/service/RangerGdsDatasetService.java

Lines changed: 39 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,12 @@
4040
import org.springframework.context.annotation.Scope;
4141
import org.springframework.stereotype.Service;
4242

43+
import java.util.Arrays;
44+
import java.util.Collections;
4345
import java.util.List;
46+
import java.util.Objects;
47+
import java.util.Set;
48+
import java.util.stream.Collectors;
4449

4550
@Service
4651
@Scope("singleton")
@@ -71,6 +76,7 @@ public RangerGdsDatasetService() {
7176
searchFields.add(new SearchField(SearchFilter.CREATED_BY, "obj.addedByUserId", SearchField.DATA_TYPE.INTEGER, SearchField.SEARCH_TYPE.FULL));
7277
searchFields.add(new SearchField(SearchFilter.DATASET_LABEL, "obj.labels", SearchField.DATA_TYPE.STRING, SearchField.SEARCH_TYPE.PARTIAL));
7378
searchFields.add(new SearchField(SearchFilter.DATASET_KEYWORD, "obj.keywords", SearchField.DATA_TYPE.STRING, SearchField.SEARCH_TYPE.PARTIAL));
79+
searchFields.add(new SearchField(SearchFilter.IS_ENABLED, "obj.isEnabled", SearchField.DATA_TYPE.BOOLEAN, SearchField.SEARCH_TYPE.FULL));
7480

7581
sortFields.add(new SortField(SearchFilter.CREATE_TIME, "obj.createTime"));
7682
sortFields.add(new SortField(SearchFilter.UPDATE_TIME, "obj.updateTime"));
@@ -214,13 +220,45 @@ public RangerDatasetList searchDatasets(SearchFilter filter) {
214220
List<XXGdsDataset> datasets = super.searchResources(filter, searchFields, sortFields, ret);
215221

216222
if (datasets != null) {
223+
Set<String> searchLabels = extractFilterValues(SearchFilter.DATASET_LABEL, filter);
224+
Set<String> searchKeywords = extractFilterValues(SearchFilter.DATASET_KEYWORD, filter);
225+
String labelMatchType = filter.getParam(SearchFilter.DATASET_LABEL_MATCH_TYPE);
226+
String keywordMatchType = filter.getParam(SearchFilter.DATASET_KEYWORD_MATCH_TYPE);
217227
for (XXGdsDataset dataset : datasets) {
218-
ret.getList().add(getPopulatedViewObject(dataset));
228+
boolean isLabelOrKeywordMatch = CollectionUtils.isEmpty(searchLabels) && CollectionUtils.isEmpty(searchKeywords);
229+
if (!isLabelOrKeywordMatch) {
230+
isLabelOrKeywordMatch = isAnyMatch(labelMatchType, JsonUtils.jsonToSetString(dataset.getLabels()), searchLabels);
231+
}
232+
233+
if (!isLabelOrKeywordMatch) {
234+
isLabelOrKeywordMatch = isAnyMatch(keywordMatchType, JsonUtils.jsonToSetString(dataset.getKeywords()), searchKeywords);
235+
}
236+
237+
if (isLabelOrKeywordMatch) {
238+
ret.getList().add(getPopulatedViewObject(dataset));
239+
}
219240
}
220241
}
221242

222243
LOG.debug("<== searchDatasets({}): ret={}", filter, ret);
223244

224245
return ret;
225246
}
247+
248+
private Set<String> extractFilterValues(String key, SearchFilter filter) {
249+
Object[] multiVal = filter.getMultiValueParam(key);
250+
251+
return multiVal != null ? Arrays.stream(multiVal).filter(Objects::nonNull).map(Object::toString).collect(Collectors.toSet()) : Collections.emptySet();
252+
}
253+
254+
private boolean isAnyMatch(String matchType, Set<String> values, Set<String> searchValues) {
255+
if (CollectionUtils.isNotEmpty(searchValues) && CollectionUtils.isNotEmpty(values)) {
256+
if (SearchField.SEARCH_TYPE.FULL.name().equalsIgnoreCase(matchType)) {
257+
return searchValues.stream().anyMatch(searchValue -> values.stream().anyMatch(value -> value.equalsIgnoreCase(searchValue)));
258+
} else {
259+
return searchValues.stream().anyMatch(searchValue -> values.stream().anyMatch(value -> StringUtils.containsIgnoreCase(value, searchValue)));
260+
}
261+
}
262+
return false;
263+
}
226264
}

0 commit comments

Comments
 (0)