This is an automated email from the ASF dual-hosted git repository. pinal pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/atlas.git
commit f6ec21dfb85401b775d82e2727b7d94ddb637f34 Author: Pinal <pinal-shah> AuthorDate: Wed Apr 7 21:37:43 2021 +0530 ATLAS-4238 : Quick Search: handle special characters to get correct results Signed-off-by: Pinal <pinal-shah> --- .../atlas/discovery/EntityDiscoveryService.java | 7 +++ .../atlas/discovery/AtlasDiscoveryServiceTest.java | 61 +++++++++++++++++++++- 2 files changed, 66 insertions(+), 2 deletions(-) diff --git a/repository/src/main/java/org/apache/atlas/discovery/EntityDiscoveryService.java b/repository/src/main/java/org/apache/atlas/discovery/EntityDiscoveryService.java index 4ae2d12..a3ab6e3 100644 --- a/repository/src/main/java/org/apache/atlas/discovery/EntityDiscoveryService.java +++ b/repository/src/main/java/org/apache/atlas/discovery/EntityDiscoveryService.java @@ -62,6 +62,7 @@ import org.apache.atlas.type.AtlasEntityType; import org.apache.atlas.type.AtlasStructType.AtlasAttribute; import org.apache.atlas.type.AtlasType; import org.apache.atlas.type.AtlasTypeRegistry; +import org.apache.atlas.type.AtlasStructType; import org.apache.atlas.util.AtlasGremlinQueryProvider; import org.apache.atlas.util.AtlasGremlinQueryProvider.AtlasGremlinQuery; import org.apache.atlas.util.SearchPredicateUtil; @@ -405,6 +406,12 @@ public class EntityDiscoveryService implements AtlasDiscoveryService { @Override @GraphTransaction public AtlasQuickSearchResult quickSearch(QuickSearchParameters quickSearchParameters) throws AtlasBaseException { + String query = quickSearchParameters.getQuery(); + if (StringUtils.isNotEmpty(query) && !AtlasStructType.AtlasAttribute.hastokenizeChar(query)) { + query = query + "*"; + } + quickSearchParameters.setQuery(query); + SearchContext searchContext = new SearchContext(createSearchParameters(quickSearchParameters), typeRegistry, graph, diff --git a/repository/src/test/java/org/apache/atlas/discovery/AtlasDiscoveryServiceTest.java b/repository/src/test/java/org/apache/atlas/discovery/AtlasDiscoveryServiceTest.java index c277806..f55577c 100644 --- a/repository/src/test/java/org/apache/atlas/discovery/AtlasDiscoveryServiceTest.java +++ b/repository/src/test/java/org/apache/atlas/discovery/AtlasDiscoveryServiceTest.java @@ -22,7 +22,9 @@ import org.apache.atlas.AtlasClient; import org.apache.atlas.BasicTestSetup; import org.apache.atlas.TestModules; import org.apache.atlas.exception.AtlasBaseException; +import org.apache.atlas.model.discovery.AtlasQuickSearchResult; import org.apache.atlas.model.discovery.AtlasSearchResult; +import org.apache.atlas.model.discovery.QuickSearchParameters; import org.apache.atlas.model.discovery.SearchParameters; import org.apache.atlas.model.instance.AtlasClassification; import org.apache.atlas.model.instance.AtlasEntity; @@ -351,6 +353,7 @@ public class AtlasDiscoveryServiceTest extends BasicTestSetup { String spChar18 = "/warehouse/tablespace/external/hive/name/hortonia_bank"; String spChar19 = "/warehouse/tablespace/external/hive/name/exis_bank"; + String spChar20 = "search_name_with nameblank@namecluster"; @DataProvider(name = "specialCharSearchContains") private Object[][] specialCharSearchContains() { @@ -575,10 +578,53 @@ public class AtlasDiscoveryServiceTest extends BasicTestSetup { }; } + @DataProvider(name = "specialCharQuickSearch") + private Object[][] specialCharQuickSearch() { + return new Object[][]{ + {"default.test_dot_name", 3}, + {"default.test_dot_name*", 3}, + {"test_dot_name", 0}, + {"*test_dot_name", 2}, + {"*test_dot_name*", 4}, + {"default.test_dot_name\\*", 0}, + + {"default.test_dot_qf", 3}, + {"default.test_dot_qf*", 3}, + {"test_dot_qf", 1}, + {"*test_dot_qf", 3}, + {"*test_dot_qf*", 4}, + {"default.test_dot_qf\\*", 2}, + + {"default.test_dot_name_12.col1", 1}, + {"default.test_dot_name_12.col1*", 1}, + {"default.test_dot_name_12.col", 0}, + {"default.test_dot_name_12.col*", 1}, + {"default.test_dot_qf_12.col1", 1}, + {"default.test_dot_qf_12.col1*", 0}, + + {"default.test_dot_name_12*", 1}, + {"default.test_dot_qf_12*", 1}, + + //space gets tokenized, hence whenever user searches for 'STRING' type attribute, space needs to be escaped + {"search_name_with nameblank@namecluster", 0}, + //{"search_name_with nameblank@name", 0}, commenting as there are some entities created from other class with same name + {"search_name_with nameblank*", 0}, + {"search_name_with\\ nameblank@namecluster", 1}, + {"search_name_with\\ nameblank*", 1}, + + //if we escape it will consider as single string, hence * will act as character not as wildcard + {"search_qf_with\\ qfblank*", 0}, + {"search_qf_with\\ qfblank@qfcluster", 1}, + {"search_qf_with qfblank@qfcluster", 1}, + {"search_qf_with qfblank@q", 1}, + {"search_qf_with qfblank*", 1}, + }; + } + public void createSpecialCharTestEntities() throws AtlasBaseException { - List<String> nameList = Arrays.asList(spChar1,spChar2,spChar3,spChar4,spChar5,spChar6,spChar7,spChar8,spChar9,spChar10,spChar11,spChar12,spChar13,spChar14,spChar15,spChar16,spChar17,spChar18,spChar19); + List<String> nameList = Arrays.asList(spChar1,spChar2,spChar3,spChar4,spChar5,spChar6,spChar7,spChar8,spChar9,spChar10,spChar11,spChar12,spChar13,spChar14,spChar15,spChar16,spChar17,spChar18,spChar19,spChar20); for (String nameStr : nameList) { AtlasEntity entityToDelete = new AtlasEntity(HIVE_TABLE_TYPE); entityToDelete.setAttribute("name", nameStr); @@ -647,7 +693,18 @@ public class AtlasDiscoveryServiceTest extends BasicTestSetup { params.setLimit(20); AtlasSearchResult searchResult = discoveryService.searchWithParameters(params); - assertSearchResult(searchResult,expected, attrValue); + assertSearchResult(searchResult, expected, attrValue); + } + + @Test(dataProvider = "specialCharQuickSearch") + public void specialCharQuickSearch(String searchValue, int expected) throws AtlasBaseException { + QuickSearchParameters params = new QuickSearchParameters(); + params.setQuery(searchValue); + params.setLimit(5); + params.setOffset(0); + + AtlasQuickSearchResult searchResult = discoveryService.quickSearch(params); + assertSearchResult(searchResult.getSearchResults(), expected, searchValue); } private void assertSearchResult(AtlasSearchResult searchResult, int expected, String query) {