This is an automated email from the ASF dual-hosted git repository.
pinal pushed a commit to branch atlas-2.5
in repository https://gitbox.apache.org/repos/asf/atlas.git
The following commit(s) were added to refs/heads/atlas-2.5 by this push:
new 498412c24 ATLAS-5053: Add recursive validation in Basic Search API to
fix regression issue (#373)
498412c24 is described below
commit 498412c24d1f080aa34588b79ea805a87206af8d
Author: Aditya Gupta <[email protected]>
AuthorDate: Tue Jul 15 11:50:32 2025 +0530
ATLAS-5053: Add recursive validation in Basic Search API to fix regression
issue (#373)
(cherry picked from commit cb1e53abb1451252064b7b8aa8e20a7e177a4da9)
---
.../org/apache/atlas/web/rest/DiscoveryREST.java | 35 +++-
.../atlas/web/integration/BasicSearchIT.java | 88 ++++++++-
.../json/search-parameters/attribute-filters.json | 1 +
.../json/search-parameters/attribute-name.json | 189 +++++++++++++++----
.../json/search-parameters/attribute-value.json | 202 +++++++++++++++++----
.../resources/json/search-parameters/operator.json | 196 ++++++++++++++------
.../json/search-parameters/tag-filters.json | 14 ++
7 files changed, 583 insertions(+), 142 deletions(-)
diff --git a/webapp/src/main/java/org/apache/atlas/web/rest/DiscoveryREST.java
b/webapp/src/main/java/org/apache/atlas/web/rest/DiscoveryREST.java
index 773b38765..f18600944 100644
--- a/webapp/src/main/java/org/apache/atlas/web/rest/DiscoveryREST.java
+++ b/webapp/src/main/java/org/apache/atlas/web/rest/DiscoveryREST.java
@@ -891,28 +891,43 @@ public class DiscoveryREST {
}
private void validateEntityFilter(SearchParameters parameters) throws
AtlasBaseException {
- FilterCriteria entityFilter = parameters.getEntityFilters();
+ validateNestedCriteria(parameters.getEntityFilters());
+ validateNestedCriteria(parameters.getTagFilters());
+ }
+
+ private void validateNestedCriteria(SearchParameters.FilterCriteria
criteria) throws AtlasBaseException {
+ if (criteria == null) {
+ return; // Nothing to validate
+ }
- if (entityFilter == null) {
+ boolean hasComposite = criteria.getCriterion() != null &&
!criteria.getCriterion().isEmpty();
+ boolean hasLeaf = StringUtils.isNotEmpty(criteria.getAttributeName())
+ || criteria.getOperator() != null
+ || StringUtils.isNotEmpty(criteria.getAttributeValue());
+
+ if (!hasComposite && !hasLeaf) {
+ // It's an empty filter object — skip (backward compatibility)
return;
}
- if (entityFilter.getCriterion() != null &&
- !entityFilter.getCriterion().isEmpty()) {
- if (entityFilter.getCondition() == null ||
StringUtils.isEmpty(entityFilter.getCondition().toString())) {
+ if (hasComposite) {
+ if (criteria.getCondition() == null ||
StringUtils.isEmpty(criteria.getCondition().toString())) {
throw new AtlasBaseException("Condition (AND/OR) must be
specified when using multiple filters.");
}
- for (FilterCriteria filterCriteria : entityFilter.getCriterion()) {
- validateCriteria(filterCriteria);
+ for (FilterCriteria filterCriteria : criteria.getCriterion()) {
+ if (filterCriteria != null) {
+ validateNestedCriteria(filterCriteria); // Recursive check
+ }
}
}
- else {
- validateCriteria(entityFilter);
+
+ if (hasLeaf) {
+ validateLeafFilterCriteria(criteria);
}
}
- private void validateCriteria(SearchParameters.FilterCriteria criteria)
throws AtlasBaseException {
+ private void validateLeafFilterCriteria(SearchParameters.FilterCriteria
criteria) throws AtlasBaseException {
if (criteria.getOperator() == null) {
throw new AtlasBaseException(AtlasErrorCode.INVALID_OPERATOR,
criteria.getAttributeName());
}
diff --git
a/webapp/src/test/java/org/apache/atlas/web/integration/BasicSearchIT.java
b/webapp/src/test/java/org/apache/atlas/web/integration/BasicSearchIT.java
index b851608f9..2709afdcb 100644
--- a/webapp/src/test/java/org/apache/atlas/web/integration/BasicSearchIT.java
+++ b/webapp/src/test/java/org/apache/atlas/web/integration/BasicSearchIT.java
@@ -35,6 +35,7 @@ import org.apache.atlas.model.typedef.AtlasClassificationDef;
import org.apache.atlas.model.typedef.AtlasTypesDef;
import org.apache.atlas.type.AtlasTypeUtil;
import org.apache.atlas.utils.TestResourceFileUtils;
+import org.apache.commons.lang.StringUtils;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.DataProvider;
import org.testng.annotations.Test;
@@ -46,7 +47,6 @@ import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
-import java.util.function.Predicate;
import static com.fasterxml.jackson.annotation.JsonAutoDetect.Visibility.NONE;
import static
com.fasterxml.jackson.annotation.JsonAutoDetect.Visibility.PUBLIC_ONLY;
@@ -228,21 +228,33 @@ public class BasicSearchIT extends BaseResourceIT {
}
@Test
- public void testAttributeSearchInvalidOperator() {
- runNegativeSearchTest("search-parameters/operator",
"ATLAS-400-00-103", parameters -> parameters.getEntityFilters() != null &&
parameters.getEntityFilters().getOperator() != null);
+ public void testComplexFilterInvalidOperator() {
+ runNegativeSearchTestForBasicSearch("search-parameters/operator",
"ATLAS-400-00-103",
+ parameters -> (parameters.getEntityFilters() != null &&
containsAnyOperator(parameters.getEntityFilters())) ||
+ (parameters.getTagFilters() != null &&
containsAnyOperator(parameters.getTagFilters())));
+ runNegativeSearchTestForQuickSearch("search-parameters/operator",
"ATLAS-400-00-103",
+ parameters -> parameters.getEntityFilters() != null &&
containsAnyOperator(parameters.getEntityFilters()));
}
@Test
- public void testAttributeSearchEmptyNameAttribute() {
- runNegativeSearchTest("search-parameters/attribute-name",
"ATLAS-400-00-104", parameters -> parameters.getEntityFilters() != null &&
parameters.getEntityFilters().getAttributeName() != null);
+ public void testComplexFilterEmptyAttributeName() {
+
runNegativeSearchTestForBasicSearch("search-parameters/attribute-name",
"ATLAS-400-00-104",
+ parameters -> (parameters.getEntityFilters() != null &&
containsAnyAttributeName(parameters.getEntityFilters())) ||
+ (parameters.getTagFilters() != null &&
containsAnyAttributeName(parameters.getTagFilters())));
+
runNegativeSearchTestForQuickSearch("search-parameters/attribute-name",
"ATLAS-400-00-104",
+ parameters -> parameters.getEntityFilters() != null &&
containsAnyAttributeName(parameters.getEntityFilters()));
}
@Test
- public void testAttributeSearchEmptyValueAttribute() {
- runNegativeSearchTest("search-parameters/attribute-value",
"ATLAS-400-00-105", parameters -> parameters.getEntityFilters() != null &&
parameters.getEntityFilters().getAttributeValue() != null);
+ public void testComplexFilterEmptyAttributeValue() {
+
runNegativeSearchTestForBasicSearch("search-parameters/attribute-value",
"ATLAS-400-00-105",
+ parameters -> (parameters.getEntityFilters() != null &&
containsAnyAttributeValue(parameters.getEntityFilters())) ||
+ (parameters.getTagFilters() != null &&
containsAnyAttributeValue(parameters.getTagFilters())));
+
runNegativeSearchTestForQuickSearch("search-parameters/attribute-value",
"ATLAS-400-00-105",
+ parameters -> parameters.getEntityFilters() != null &&
containsAnyAttributeValue(parameters.getEntityFilters()));
}
- public void runNegativeSearchTest(String jsonFile, String
expectedErrorCode, java.util.function.Predicate<SearchParameters> paramFilter) {
+ public void runNegativeSearchTestForBasicSearch(String jsonFile, String
expectedErrorCode, java.util.function.Predicate<SearchParameters> paramFilter) {
try {
BasicSearchParametersWithExpectation[] testExpectations =
TestResourceFileUtils.readObjectFromJson(jsonFile,
BasicSearchParametersWithExpectation[].class);
assertNotNull(testExpectations);
@@ -264,6 +276,66 @@ public class BasicSearchIT extends BaseResourceIT {
}
}
+ public void runNegativeSearchTestForQuickSearch(String jsonFile, String
expectedErrorCode, java.util.function.Predicate<QuickSearchParameters>
qspParamFilter) {
+ try {
+ BasicSearchParametersWithExpectation[] testExpectations =
TestResourceFileUtils.readObjectFromJson(jsonFile,
BasicSearchParametersWithExpectation[].class);
+ assertNotNull(testExpectations);
+ Arrays
+ .stream(testExpectations)
+ .map(testExpectation ->
testExpectation.getSearchParameters())
+ .map(sp -> {
+ QuickSearchParameters qsp = new
QuickSearchParameters();
+ qsp.setTypeName(sp.getTypeName());
+ qsp.setEntityFilters(sp.getEntityFilters());
+ return qsp; })
+ .filter(qspParamFilter)
+ .forEach(params -> {
+ try {
+ atlasClientV2.quickSearch(params);
+ }
+ catch (AtlasServiceException e) {
+
assertTrue(e.getMessage().contains(expectedErrorCode),
+ "Expected error code " + expectedErrorCode
+ " in exception message: " + e.getMessage());
+ }
+ });
+ } catch (IOException e) {
+ fail(e.getMessage());
+ }
+ }
+
+ private boolean
containsAnyMatchingCriteria(SearchParameters.FilterCriteria filterCriteria,
java.util.function.Predicate<SearchParameters.FilterCriteria> matcher) {
+ if (filterCriteria == null) {
+ return false;
+ }
+ if (matcher.test(filterCriteria)) {
+ return true;
+ }
+ if (filterCriteria.getCriterion() != null) {
+ return filterCriteria.getCriterion().stream()
+ .filter(fc -> fc != null)
+ .anyMatch(fc -> containsAnyMatchingCriteria(fc, matcher));
+ }
+
+ return false;
+ }
+
+ private boolean containsAnyOperator(SearchParameters.FilterCriteria
filter) {
+ return containsAnyMatchingCriteria(filter, fc -> {
+ if (fc.getOperator() == null) {
+ return true;
+ }
+ return
SearchParameters.Operator.fromString(fc.getOperator().toString()) == null;
+ });
+ }
+
+ private boolean containsAnyAttributeName(SearchParameters.FilterCriteria
filter) {
+ return containsAnyMatchingCriteria(filter, fc ->
StringUtils.isBlank(fc.getAttributeName()));
+ }
+
+ private boolean containsAnyAttributeValue(SearchParameters.FilterCriteria
filter) {
+ return containsAnyMatchingCriteria(filter, fc ->
StringUtils.isBlank(fc.getAttributeValue()));
+ }
+
@Test(dependsOnMethods = "testSavedSearch")
public void testExecuteSavedSearchByName() {
try {
diff --git
a/webapp/src/test/resources/json/search-parameters/attribute-filters.json
b/webapp/src/test/resources/json/search-parameters/attribute-filters.json
index e90f203e3..2b4584c27 100644
--- a/webapp/src/test/resources/json/search-parameters/attribute-filters.json
+++ b/webapp/src/test/resources/json/search-parameters/attribute-filters.json
@@ -9,6 +9,7 @@
"offset": 0,
"entityFilters": {
"attributeName": "name",
+ "operator": "contains",
"attributeValue": "testtable",
"condition" : "OR",
"criterion" : [
diff --git
a/webapp/src/test/resources/json/search-parameters/attribute-name.json
b/webapp/src/test/resources/json/search-parameters/attribute-name.json
index 084b674f2..6baa0304f 100644
--- a/webapp/src/test/resources/json/search-parameters/attribute-name.json
+++ b/webapp/src/test/resources/json/search-parameters/attribute-name.json
@@ -1,34 +1,157 @@
-[ {
- "testDescription": "hive_table contains testtable or retentionSize != 0",
- "searchParameters": {
- "typeName": "hive_table",
- "excludeDeletedEntities": true,
- "classification": "",
- "query": "",
- "limit": 25,
- "offset": 0,
- "entityFilters": {
- "attributeName": "",
- "attributeValue": "",
- "condition" : "AND",
- "criterion" : [
- {
- "attributeName": "",
- "operator": "eq",
- "attributeValue": "testtable"
- },
- {
- "attributeName": "retention",
- "operator": "neq",
- "attributeValue": "0"
- }
- ]
- },
- "tagFilters": null,
- "attributes": [
- ""
- ]
+[
+ {
+ "testDescription": "Invalid attribute name is empty",
+ "searchParameters": {
+ "typeName": "hive_table",
+ "excludeDeletedEntities": true,
+ "limit": 25,
+ "offset": 0,
+ "entityFilters": {
+ "condition": "AND",
+ "criterion": [
+ {
+ "attributeName": "",
+ "operator": "eq",
+ "attributeValue": "testtable"
+ },
+ {
+ "attributeName": "",
+ "operator": "neq",
+ "attributeValue": "0"
+ }
+ ]
+ },
+ "tagFilters": null,
+ "attributes": [""]
+ }
},
- "expectedCount": 0
-}
-]
+ {
+ "testDescription": "Nested invalid attribute names",
+ "searchParameters": {
+ "typeName": "hive_table",
+ "excludeDeletedEntities": true,
+ "limit": 25,
+ "offset": 0,
+ "entityFilters": {
+ "condition": "AND",
+ "criterion": [
+ {
+ "condition": "AND",
+ "criterion": [
+ {
+ "attributeName": "",
+ "operator": "eq",
+ "attributeValue": "hive"
+ },
+ {
+ "attributeName": "",
+ "operator": "neq",
+ "attributeValue": "hive"
+ }
+ ]
+ },
+ {
+ "attributeName": "",
+ "operator": "neq",
+ "attributeValue": ""
+ }
+ ]
+ },
+ "tagFilters": null,
+ "attributes": [""]
+ }
+ },
+ {
+ "testDescription": "Only nested tagFilters with invalid (empty) attribute
names",
+ "searchParameters": {
+ "typeName": "hive_column",
+ "excludeDeletedEntities": true,
+ "limit": 25,
+ "offset": 0,
+ "entityFilters": null,
+ "tagFilters": {
+ "condition": "AND",
+ "criterion": [
+ {
+ "condition": "OR",
+ "criterion": [
+ {
+ "attributeName": "",
+ "operator": "eq",
+ "attributeValue": "admin"
+ },
+ {
+ "attributeName": "",
+ "operator": "neq",
+ "attributeValue": "test_value"
+ }
+ ]
+ },
+ {
+ "attributeName": "",
+ "operator": "eq",
+ "attributeValue": "someValue"
+ }
+ ]
+ },
+ "attributes": [""],
+ "classification": "_ALL_CLASSIFICATION_TYPES"
+ }
+ },
+ {
+ "testDescription": "Nested entityFilters and tagFilters with invalid
(empty) attribute names",
+ "searchParameters": {
+ "typeName": "hive_table",
+ "excludeDeletedEntities": true,
+ "limit": 25,
+ "offset": 0,
+ "entityFilters": {
+ "condition": "AND",
+ "criterion": [
+ {
+ "condition": "AND",
+ "criterion": [
+ {
+ "attributeName": "",
+ "operator": "eq",
+ "attributeValue": "testtable"
+ },
+ {
+ "attributeName": "",
+ "operator": "eq",
+ "attributeValue": "testuser"
+ }
+ ]
+ },
+ {
+ "attributeName": "",
+ "operator": "neq",
+ "attributeValue": "0"
+ }
+ ]
+ },
+ "tagFilters": {
+ "condition": "AND",
+ "criterion": [
+ {
+ "condition": "OR",
+ "criterion": [
+ {
+ "attributeName": "",
+ "operator": "eq",
+ "attributeValue": "v1"
+ },
+ {
+ "attributeName": "",
+ "operator": "eq",
+ "attributeValue": "someValue"
+ }
+ ]
+ }
+ ]
+ },
+ "attributes": [""],
+ "classification": "_ALL_CLASSIFICATION_TYPES"
+ }
+ }
+]
\ No newline at end of file
diff --git
a/webapp/src/test/resources/json/search-parameters/attribute-value.json
b/webapp/src/test/resources/json/search-parameters/attribute-value.json
index 5bd367667..8b7ff7fb4 100644
--- a/webapp/src/test/resources/json/search-parameters/attribute-value.json
+++ b/webapp/src/test/resources/json/search-parameters/attribute-value.json
@@ -1,34 +1,172 @@
-[ {
- "testDescription": "hive_table contains testtable or retentionSize != 0",
- "searchParameters": {
- "typeName": "hive_table",
- "excludeDeletedEntities": true,
- "classification": "",
- "query": "",
- "limit": 25,
- "offset": 0,
- "entityFilters": {
- "attributeName": "name",
- "attributeValue": "",
- "condition" : "AND",
- "criterion" : [
- {
- "attributeName": "name",
- "operator": "eq",
- "attributeValue": ""
- },
- {
- "attributeName": "retention",
- "operator": "neq",
- "attributeValue": ""
- }
- ]
- },
- "tagFilters": null,
- "attributes": [
- ""
- ]
+[
+ {
+ "testDescription": "Invalid attribute values: empty name and retention",
+ "searchParameters": {
+ "typeName": "hive_table",
+ "excludeDeletedEntities": true,
+ "limit": 25,
+ "offset": 0,
+ "entityFilters": {
+ "condition": "AND",
+ "criterion": [
+ {
+ "attributeName": "name",
+ "operator": "eq",
+ "attributeValue": ""
+ },
+ {
+ "attributeName": "retention",
+ "operator": "neq",
+ "attributeValue": ""
+ }
+ ]
+ },
+ "tagFilters": null,
+ "attributes": []
+ }
},
- "expectedCount": 0
-}
+ {
+ "testDescription": "Nested filters with empty values",
+ "searchParameters": {
+ "typeName": "hive_table",
+ "excludeDeletedEntities": true,
+ "limit": 25,
+ "offset": 0,
+ "entityFilters": {
+ "condition": "AND",
+ "criterion": [
+ {
+ "condition": "AND",
+ "criterion": [
+ {
+ "attributeName": "name",
+ "operator": "eq",
+ "attributeValue": ""
+ },
+ {
+ "attributeName": "owner",
+ "operator": "neq",
+ "attributeValue": ""
+ }
+ ]
+ },
+ {
+ "attributeName": "retention",
+ "operator": "eq",
+ "attributeValue": ""
+ }
+ ]
+ },
+ "tagFilters": null,
+ "attributes": []
+ }
+ },
+ {
+ "testDescription": "Nested tag filters with mixed operators and empty
values",
+ "searchParameters": {
+ "typeName": "hive_column",
+ "excludeDeletedEntities": true,
+ "limit": 25,
+ "offset": 0,
+ "entityFilters": null,
+ "tagFilters": {
+ "condition": "AND",
+ "criterion": [
+ {
+ "condition": "OR",
+ "criterion": [
+ {
+ "attributeName": "__createdBy",
+ "operator": "eq",
+ "attributeValue": ""
+ },
+ {
+ "attributeName": "__state",
+ "operator": "eq",
+ "attributeValue": ""
+ }
+ ]
+ },
+ {
+ "condition": "AND",
+ "criterion": [
+ {
+ "attributeName": "__modificationTimestamp",
+ "operator": "eq",
+ "attributeValue": ""
+ },
+ {
+ "attributeName": "__modifiedBy",
+ "operator": "eq",
+ "attributeValue": ""
+ }
+ ]
+ }
+ ]
+ },
+ "attributes": [],
+ "classification": "_ALL_CLASSIFICATION_TYPES"
+ }
+ },
+ {
+ "testDescription": "Nested entity and tag filters with empty values for
negative testing",
+ "searchParameters": {
+ "typeName": "hive_table",
+ "excludeDeletedEntities": true,
+ "limit": 25,
+ "offset": 0,
+ "entityFilters": {
+ "condition": "AND",
+ "criterion": [
+ {
+ "attributeName": "name",
+ "operator": "eq",
+ "attributeValue": ""
+ },
+ {
+ "condition": "AND",
+ "criterion": [
+ {
+ "attributeName": "owner",
+ "operator": "eq",
+ "attributeValue": ""
+ },
+ {
+ "attributeName": "retention",
+ "operator": "neq",
+ "attributeValue": ""
+ }
+ ]
+ }
+ ]
+ },
+ "tagFilters": {
+ "condition": "OR",
+ "criterion": [
+ {
+ "condition": "AND",
+ "criterion": [
+ {
+ "attributeName": "__createdBy",
+ "operator": "eq",
+ "attributeValue": ""
+ },
+ {
+ "attributeName": "__modificationTimestamp",
+ "operator": "eq",
+ "attributeValue": ""
+ }
+ ]
+ },
+ {
+ "attributeName": "__state",
+ "operator": "eq",
+ "attributeValue": ""
+ }
+ ]
+ },
+ "attributes": [],
+ "classification": "_ALL_CLASSIFICATION_TYPES"
+ }
+ }
]
diff --git a/webapp/src/test/resources/json/search-parameters/operator.json
b/webapp/src/test/resources/json/search-parameters/operator.json
index 224657448..e2939753b 100644
--- a/webapp/src/test/resources/json/search-parameters/operator.json
+++ b/webapp/src/test/resources/json/search-parameters/operator.json
@@ -1,39 +1,6 @@
-[ {
- "testDescription": "hive_table contains testtable or retentionSize != 0",
- "searchParameters": {
- "typeName": "hive_table",
- "excludeDeletedEntities": true,
- "classification": "",
- "query": "",
- "limit": 25,
- "offset": 0,
- "entityFilters": {
- "attributeName": "name",
- "attributeValue": "testtable",
- "condition" : "AND",
- "criterion" : [
- {
- "attributeName": "name",
- "operator": "invalid_contains",
- "attributeValue": "testtable"
- },
- {
- "attributeName": "retention",
- "operator": "neq",
- "attributeValue": "0"
- }
- ]
- },
- "tagFilters": null,
- "attributes": [
- ""
- ]
- },
- "expectedCount": 0
-},
-
+[
{
- "testDescription": "hive_table contains testtable or retentionSize != 0",
+ "testDescription": "Invalid operator in nested filter (contains →
invalid_contains)",
"searchParameters": {
"typeName": "hive_table",
"excludeDeletedEntities": true,
@@ -42,32 +9,27 @@
"limit": 25,
"offset": 0,
"entityFilters": {
- "attributeName": "name",
- "attributeValue": "testtable",
- "condition" : "OR",
- "criterion" : [
+ "condition": "AND",
+ "criterion": [
{
"attributeName": "name",
- "operator": "invalid_eq",
+ "operator": "eqqq",
"attributeValue": "testtable"
},
{
"attributeName": "retention",
- "operator": "invalid_eq",
+ "operator": "nneq",
"attributeValue": "0"
}
]
},
"tagFilters": null,
- "attributes": [
- ""
- ]
+ "attributes": []
},
"expectedCount": 0
},
-
{
- "testDescription": "hive_table contains testtable or retentionSize != 0",
+ "testDescription": "Multiple invalid operators in complex nested filter",
"searchParameters": {
"typeName": "hive_table",
"excludeDeletedEntities": true,
@@ -76,27 +38,143 @@
"limit": 25,
"offset": 0,
"entityFilters": {
- "attributeName": "name",
- "attributeValue": "testtable",
- "condition" : "OR",
- "criterion" : [
+ "condition": "AND",
+ "criterion": [
{
- "attributeName": "name",
- "operator": "invalid_neq",
- "attributeValue": "testtable"
+ "condition": "OR",
+ "criterion": [
+ {
+ "attributeName": "owner",
+ "operator": "eqqq",
+ "attributeValue": "hive"
+ }
+ ]
},
{
- "attributeName": "retention",
- "operator": "invalid_contains",
- "attributeValue": "0"
+ "condition": "OR",
+ "criterion": [
+ {
+ "attributeName": "qualifiedName",
+ "operator": "qqeq",
+ "attributeValue": "test_db"
+ },
+ {
+ "attributeName": "qualifiedName",
+ "operator": "nneq",
+ "attributeValue": "default"
+ }
+ ]
+ },
+ {
+ "condition": "AND",
+ "criterion": [
+ {
+ "attributeName": "createTime",
+ "operator": "neqq",
+ "attributeValue": "1746057600000,1747785599000"
+ }
+ ]
}
]
},
"tagFilters": null,
- "attributes": [
- ""
- ]
+ "attributes": []
},
"expectedCount": 0
+ },
+
+ {
+ "testDescription": "Only nested tagFilters with invalid operators (eqqq,
nneq)",
+ "searchParameters": {
+ "typeName": "hive_column",
+ "excludeDeletedEntities": true,
+ "limit": 25,
+ "offset": 0,
+ "entityFilters": null,
+ "tagFilters": {
+ "condition": "AND",
+ "criterion": [
+ {
+ "condition": "OR",
+ "criterion": [
+ {
+ "attributeName": "name",
+ "operator": "eqqq",
+ "attributeValue": "value1"
+ },
+ {
+ "attributeName": "tagAttr2",
+ "operator": "nneq",
+ "attributeValue": "value2"
+ }
+ ]
+ },
+ {
+ "attributeName": "tagAttr3",
+ "operator": "neqeq",
+ "attributeValue": "value3"
+ }
+ ]
+ },
+ "attributes": [],
+ "classification": "_ALL_CLASSIFICATION_TYPES"
+ }
+ }
+,
+ {
+ "testDescription": "Nested entityFilters and tagFilters with invalid
operators",
+ "searchParameters": {
+ "typeName": "hive_table",
+ "excludeDeletedEntities": true,
+ "limit": 25,
+ "offset": 0,
+ "entityFilters": {
+ "condition": "AND",
+ "criterion": [
+ {
+ "condition": "AND",
+ "criterion": [
+ {
+ "attributeName": "name",
+ "operator": "eqqq",
+ "attributeValue": "testtable"
+ },
+ {
+ "attributeName": "owner",
+ "operator": "qeq",
+ "attributeValue": "admin"
+ }
+ ]
+ },
+ {
+ "attributeName": "createTime",
+ "operator": "ranger",
+ "attributeValue": "1000,2000"
+ }
+ ]
+ },
+ "tagFilters": {
+ "condition": "OR",
+ "criterion": [
+ {
+ "condition": "AND",
+ "criterion": [
+ {
+ "attributeName": "tagAttr1",
+ "operator": "eqqq",
+ "attributeValue": "value1"
+ },
+ {
+ "attributeName": "tagAttr2",
+ "operator": "isnotnull",
+ "attributeValue": ""
+ }
+ ]
+ }
+ ]
+ },
+ "attributes": [],
+ "classification": "_ALL_CLASSIFICATION_TYPES"
+ }
}
]
diff --git a/webapp/src/test/resources/json/search-parameters/tag-filters.json
b/webapp/src/test/resources/json/search-parameters/tag-filters.json
index 5e74328d6..01ea43553 100644
--- a/webapp/src/test/resources/json/search-parameters/tag-filters.json
+++ b/webapp/src/test/resources/json/search-parameters/tag-filters.json
@@ -12,5 +12,19 @@
"classification":"fooTag"
},
"expectedCount": 1
+ },
+ {
+ "testDescription": "Search for exact Tag name with entityFilter and
tagFilter with {}",
+ "searchParameters": {
+ "entityFilters": {},
+ "tagFilters": {},
+ "attributes": null,
+ "query":null,
+ "excludeDeletedEntities":true,
+ "limit":25,
+ "typeName":null,
+ "classification":"fooTag"
+ },
+ "expectedCount": 1
}
]
\ No newline at end of file