You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@atlas.apache.org by ma...@apache.org on 2017/09/23 00:22:28 UTC

atlas git commit: ATLAS-2160: added REST APIs to execute a saved-search

Repository: atlas
Updated Branches:
  refs/heads/master a9ca60e38 -> 7cce1c4af


ATLAS-2160: added REST APIs to execute a saved-search

Signed-off-by: Madhan Neethiraj <ma...@apache.org>


Project: http://git-wip-us.apache.org/repos/asf/atlas/repo
Commit: http://git-wip-us.apache.org/repos/asf/atlas/commit/7cce1c4a
Tree: http://git-wip-us.apache.org/repos/asf/atlas/tree/7cce1c4a
Diff: http://git-wip-us.apache.org/repos/asf/atlas/diff/7cce1c4a

Branch: refs/heads/master
Commit: 7cce1c4af84001c79b7e0d9ad2e566b8cbaf7ccb
Parents: a9ca60e
Author: ashutoshm <am...@hortonworks.com>
Authored: Fri Sep 22 14:52:58 2017 -0700
Committer: Madhan Neethiraj <ma...@apache.org>
Committed: Fri Sep 22 16:37:52 2017 -0700

----------------------------------------------------------------------
 .../model/profile/AtlasUserSavedSearch.java     |   4 -
 .../atlas/discovery/AtlasDiscoveryService.java  |  27 ++--
 .../atlas/discovery/EntityDiscoveryService.java |  96 ++++++++++++--
 .../repository/ogm/AtlasSavedSearchDTO.java     |   2 +-
 .../userprofile/UserProfileService.java         |  10 +-
 .../userprofile/UserProfileServiceTest.java     |  10 +-
 .../apache/atlas/web/rest/DiscoveryREST.java    | 126 ++++++++++++-------
 7 files changed, 193 insertions(+), 82 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/atlas/blob/7cce1c4a/intg/src/main/java/org/apache/atlas/model/profile/AtlasUserSavedSearch.java
----------------------------------------------------------------------
diff --git a/intg/src/main/java/org/apache/atlas/model/profile/AtlasUserSavedSearch.java b/intg/src/main/java/org/apache/atlas/model/profile/AtlasUserSavedSearch.java
index 8ecd52d..0625a13 100644
--- a/intg/src/main/java/org/apache/atlas/model/profile/AtlasUserSavedSearch.java
+++ b/intg/src/main/java/org/apache/atlas/model/profile/AtlasUserSavedSearch.java
@@ -61,10 +61,6 @@ public class AtlasUserSavedSearch extends AtlasBaseModelObject implements Serial
         this(ownerName, name, SavedSearchType.BASIC, null);
     }
 
-    public AtlasUserSavedSearch(String ownerName, String name, SavedSearchType searchType) {
-        this(ownerName, name, searchType, null);
-    }
-
     public AtlasUserSavedSearch(String ownerName, String name, SavedSearchType savedSearchType, SearchParameters searchParameters) {
         setOwnerName(ownerName);
         setName(name);

http://git-wip-us.apache.org/repos/asf/atlas/blob/7cce1c4a/repository/src/main/java/org/apache/atlas/discovery/AtlasDiscoveryService.java
----------------------------------------------------------------------
diff --git a/repository/src/main/java/org/apache/atlas/discovery/AtlasDiscoveryService.java b/repository/src/main/java/org/apache/atlas/discovery/AtlasDiscoveryService.java
index 630e776..4b3f6f7 100644
--- a/repository/src/main/java/org/apache/atlas/discovery/AtlasDiscoveryService.java
+++ b/repository/src/main/java/org/apache/atlas/discovery/AtlasDiscoveryService.java
@@ -24,7 +24,6 @@ import org.apache.atlas.exception.AtlasBaseException;
 import org.apache.atlas.model.discovery.AtlasSearchResult;
 import org.apache.atlas.model.discovery.SearchParameters;
 import org.apache.atlas.model.profile.AtlasUserSavedSearch;
-import org.apache.atlas.model.profile.AtlasUserSavedSearch.SavedSearchType;
 
 import java.util.List;
 
@@ -40,6 +39,15 @@ public interface AtlasDiscoveryService {
 
     /**
      *
+     * @param query query
+     * @param typeName type name
+     * @param classification classification
+     * @return Query in DSL form
+     */
+    String getDslQueryUsingTypeNameClassification(String query, String typeName, String classification);
+
+    /**
+     *
      * @param query search query.
      * @param excludeDeletedEntities exclude deleted entities in search result.
      * @param limit number of resultant rows (for pagination). [ limit > 0 ] and [ limit < maxlimit ]. -1 maps to atlas.search.defaultlimit property.
@@ -90,14 +98,14 @@ public interface AtlasDiscoveryService {
      * @param savedSearch Search to be saved
      * @throws AtlasBaseException
      */
-    AtlasUserSavedSearch addSavedSearch(AtlasUserSavedSearch savedSearch) throws AtlasBaseException;
+    AtlasUserSavedSearch addSavedSearch(String currentUser, AtlasUserSavedSearch savedSearch) throws AtlasBaseException;
 
     /**
      *
      * @param savedSearch Search to be saved
      * @throws AtlasBaseException
      */
-    AtlasUserSavedSearch updateSavedSearch(AtlasUserSavedSearch savedSearch) throws AtlasBaseException;
+    AtlasUserSavedSearch updateSavedSearch(String currentUser, AtlasUserSavedSearch savedSearch) throws AtlasBaseException;
 
     /**
      *
@@ -105,7 +113,7 @@ public interface AtlasDiscoveryService {
      * @return List of saved searches for the user
      * @throws AtlasBaseException
      */
-    List<AtlasUserSavedSearch> getSavedSearches(String userName) throws AtlasBaseException;
+    List<AtlasUserSavedSearch> getSavedSearches(String currentUser, String userName) throws AtlasBaseException;
 
     /**
      *
@@ -113,7 +121,7 @@ public interface AtlasDiscoveryService {
      * @return Search object identified by the guid
      * @throws AtlasBaseException
      */
-    AtlasUserSavedSearch getSavedSearch(String guid) throws AtlasBaseException;
+    AtlasUserSavedSearch getSavedSearchByGuid(String currentUser, String guid) throws AtlasBaseException;
 
     /**
      *
@@ -122,10 +130,13 @@ public interface AtlasDiscoveryService {
      * @return Search object identified by the name
      * @throws AtlasBaseException
      */
-    AtlasUserSavedSearch getSavedSearch(String userName, String searchName, SavedSearchType searchType) throws AtlasBaseException;
+    AtlasUserSavedSearch getSavedSearchByName(String currentUser, String userName, String searchName) throws AtlasBaseException;
 
     /**
-     * @param guid Guid for the saved search
+     *
+     * @param currentUser User requesting the operation
+     * @param guid Guid used to look up Saved Search
+     * @throws AtlasBaseException
      */
-    void deleteSavedSearch(String guid) throws AtlasBaseException;
+    void deleteSavedSearch(String currentUser, String guid) throws AtlasBaseException;
 }

http://git-wip-us.apache.org/repos/asf/atlas/blob/7cce1c4a/repository/src/main/java/org/apache/atlas/discovery/EntityDiscoveryService.java
----------------------------------------------------------------------
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 102c329..40c66dd 100644
--- a/repository/src/main/java/org/apache/atlas/discovery/EntityDiscoveryService.java
+++ b/repository/src/main/java/org/apache/atlas/discovery/EntityDiscoveryService.java
@@ -34,7 +34,6 @@ import org.apache.atlas.model.discovery.SearchParameters;
 import org.apache.atlas.model.instance.AtlasEntityHeader;
 import org.apache.atlas.model.instance.AtlasObjectId;
 import org.apache.atlas.model.profile.AtlasUserSavedSearch;
-import org.apache.atlas.model.profile.AtlasUserSavedSearch.SavedSearchType;
 import org.apache.atlas.query.Expressions.AliasExpression;
 import org.apache.atlas.query.Expressions.Expression;
 import org.apache.atlas.query.Expressions.SelectExpression;
@@ -807,8 +806,14 @@ public class EntityDiscoveryService implements AtlasDiscoveryService {
 
 
     @Override
-    public AtlasUserSavedSearch addSavedSearch(AtlasUserSavedSearch savedSearch) throws AtlasBaseException {
+    public AtlasUserSavedSearch addSavedSearch(String currentUser, AtlasUserSavedSearch savedSearch) throws AtlasBaseException {
         try {
+            if (StringUtils.isEmpty(savedSearch.getOwnerName())) {
+                savedSearch.setOwnerName(currentUser);
+            }
+
+            checkSavedSearchOwnership(currentUser, savedSearch);
+
             return userProfileService.addSavedSearch(savedSearch);
         } catch (AtlasBaseException e) {
             LOG.error("addSavedSearch({})", savedSearch, e);
@@ -818,8 +823,14 @@ public class EntityDiscoveryService implements AtlasDiscoveryService {
 
 
     @Override
-    public AtlasUserSavedSearch updateSavedSearch(AtlasUserSavedSearch savedSearch) throws AtlasBaseException {
+    public AtlasUserSavedSearch updateSavedSearch(String currentUser, AtlasUserSavedSearch savedSearch) throws AtlasBaseException {
         try {
+            if (StringUtils.isEmpty(savedSearch.getOwnerName())) {
+                savedSearch.setOwnerName(currentUser);
+            }
+
+            checkSavedSearchOwnership(currentUser, savedSearch);
+
             return userProfileService.updateSavedSearch(savedSearch);
         } catch (AtlasBaseException e) {
             LOG.error("updateSavedSearch({})", savedSearch, e);
@@ -828,8 +839,14 @@ public class EntityDiscoveryService implements AtlasDiscoveryService {
     }
 
     @Override
-    public List<AtlasUserSavedSearch> getSavedSearches(String userName) throws AtlasBaseException {
+    public List<AtlasUserSavedSearch> getSavedSearches(String currentUser, String userName) throws AtlasBaseException {
         try {
+            if (StringUtils.isEmpty(userName)) {
+                userName = currentUser;
+            } else if (!StringUtils.equals(currentUser, userName)) {
+                throw new AtlasBaseException(AtlasErrorCode.BAD_REQUEST, "invalid data");
+            }
+
             return userProfileService.getSavedSearches(userName);
         } catch (AtlasBaseException e) {
             LOG.error("getSavedSearches({})", userName, e);
@@ -838,27 +855,82 @@ public class EntityDiscoveryService implements AtlasDiscoveryService {
     }
 
     @Override
-    public AtlasUserSavedSearch getSavedSearch(String guid) throws AtlasBaseException {
+    public AtlasUserSavedSearch getSavedSearchByGuid(String currentUser, String guid) throws AtlasBaseException {
+        try {
+            AtlasUserSavedSearch savedSearch = userProfileService.getSavedSearch(guid);
+
+            checkSavedSearchOwnership(currentUser, savedSearch);
+
+            return savedSearch;
+        } catch (AtlasBaseException e) {
+            LOG.error("getSavedSearchByGuid({})", guid, e);
+            throw e;
+        }
+    }
+
+    @Override
+    public AtlasUserSavedSearch getSavedSearchByName(String currentUser, String userName, String searchName) throws AtlasBaseException {
         try {
-            return userProfileService.getSavedSearch(guid);
+            if (StringUtils.isEmpty(userName)) {
+                userName = currentUser;
+            } else if (!StringUtils.equals(currentUser, userName)) {
+                throw new AtlasBaseException(AtlasErrorCode.BAD_REQUEST, "invalid data");
+            }
+
+            return userProfileService.getSavedSearch(userName, searchName);
         } catch (AtlasBaseException e) {
-            LOG.error("getSavedSearch({})", guid, e);
+            LOG.error("getSavedSearchByName({}, {})", userName, searchName, e);
             throw e;
         }
     }
 
     @Override
-    public AtlasUserSavedSearch getSavedSearch(String userName, String searchName, SavedSearchType searchType) throws AtlasBaseException {
+    public void deleteSavedSearch(String currentUser, String guid) throws AtlasBaseException {
         try {
-            return userProfileService.getSavedSearch(userName, searchName, searchType);
+            AtlasUserSavedSearch savedSearch = userProfileService.getSavedSearch(guid);
+
+            checkSavedSearchOwnership(currentUser, savedSearch);
+
+            userProfileService.deleteSavedSearch(guid);
         } catch (AtlasBaseException e) {
-            LOG.error("getSavedSearch({}, {})", userName, searchName, e);
+            LOG.error("deleteSavedSearch({})", guid, e);
             throw e;
         }
     }
 
     @Override
-    public void deleteSavedSearch(String guid) throws AtlasBaseException {
-        userProfileService.deleteSavedSearch(guid);
+    public String getDslQueryUsingTypeNameClassification(String query, String typeName, String classification) {
+        String queryStr = query == null ? "" : query;
+
+        if (org.apache.commons.lang3.StringUtils.isNoneEmpty(typeName)) {
+            queryStr = escapeTypeName(typeName) + " " + queryStr;
+        }
+
+        if (org.apache.commons.lang3.StringUtils.isNoneEmpty(classification)) {
+            // isa works with a type name only - like hive_column isa PII; it doesn't work with more complex query
+            if (StringUtils.isEmpty(query)) {
+                queryStr += (" isa " + classification);
+            }
+        }
+        return queryStr;
+    }
+
+    private String escapeTypeName(String typeName) {
+        String ret;
+
+        if (StringUtils.startsWith(typeName, "`") && StringUtils.endsWith(typeName, "`")) {
+            ret = typeName;
+        } else {
+            ret = String.format("`%s`", typeName);
+        }
+
+        return ret;
+    }
+
+    private void checkSavedSearchOwnership(String claimedOwner, AtlasUserSavedSearch savedSearch) throws AtlasBaseException {
+        // block attempt to delete another user's saved-search
+        if (savedSearch != null && !StringUtils.equals(savedSearch.getOwnerName(), claimedOwner)) {
+            throw new AtlasBaseException(AtlasErrorCode.BAD_REQUEST, "invalid data");
+        }
     }
 }

http://git-wip-us.apache.org/repos/asf/atlas/blob/7cce1c4a/repository/src/main/java/org/apache/atlas/repository/ogm/AtlasSavedSearchDTO.java
----------------------------------------------------------------------
diff --git a/repository/src/main/java/org/apache/atlas/repository/ogm/AtlasSavedSearchDTO.java b/repository/src/main/java/org/apache/atlas/repository/ogm/AtlasSavedSearchDTO.java
index aa8fc39..27575ce 100644
--- a/repository/src/main/java/org/apache/atlas/repository/ogm/AtlasSavedSearchDTO.java
+++ b/repository/src/main/java/org/apache/atlas/repository/ogm/AtlasSavedSearchDTO.java
@@ -95,6 +95,6 @@ public class AtlasSavedSearchDTO extends AbstractDataTransferObject<AtlasUserSav
     }
 
     private String getUniqueValue(AtlasUserSavedSearch obj) {
-        return String.format("%s:%s:%s", obj.getOwnerName(), obj.getName(), obj.getSearchType()) ;
+        return String.format("%s:%s", obj.getOwnerName(), obj.getName()) ;
     }
 }

http://git-wip-us.apache.org/repos/asf/atlas/blob/7cce1c4a/repository/src/main/java/org/apache/atlas/repository/userprofile/UserProfileService.java
----------------------------------------------------------------------
diff --git a/repository/src/main/java/org/apache/atlas/repository/userprofile/UserProfileService.java b/repository/src/main/java/org/apache/atlas/repository/userprofile/UserProfileService.java
index 99d13af..a428b92 100644
--- a/repository/src/main/java/org/apache/atlas/repository/userprofile/UserProfileService.java
+++ b/repository/src/main/java/org/apache/atlas/repository/userprofile/UserProfileService.java
@@ -22,7 +22,6 @@ import org.apache.atlas.annotation.AtlasService;
 import org.apache.atlas.exception.AtlasBaseException;
 import org.apache.atlas.model.profile.AtlasUserProfile;
 import org.apache.atlas.model.profile.AtlasUserSavedSearch;
-import org.apache.atlas.model.profile.AtlasUserSavedSearch.SavedSearchType;
 import org.apache.atlas.repository.ogm.DataAccess;
 import org.apache.commons.lang.StringUtils;
 import org.slf4j.Logger;
@@ -70,7 +69,7 @@ public class UserProfileService {
         userProfile.getSavedSearches().add(savedSearch);
         userProfile = dataAccess.save(userProfile);
         for (AtlasUserSavedSearch s : userProfile.getSavedSearches()) {
-            if(s.getName().equals(savedSearch.getName()) && s.getSearchType().equals(savedSearch.getSearchType())) {
+            if(s.getName().equals(savedSearch.getName())) {
                 return s;
             }
         }
@@ -81,8 +80,7 @@ public class UserProfileService {
     private void checkIfQueryAlreadyExists(AtlasUserSavedSearch savedSearch, AtlasUserProfile userProfile) throws AtlasBaseException {
         for (AtlasUserSavedSearch exisingSearch : userProfile.getSavedSearches()) {
             if (StringUtils.equals(exisingSearch.getOwnerName(), savedSearch.getOwnerName()) &&
-                StringUtils.equals(exisingSearch.getName(), savedSearch.getName()) &&
-                exisingSearch.getSearchType().equals(savedSearch.getSearchType())) {
+                StringUtils.equals(exisingSearch.getName(), savedSearch.getName())) {
                 throw new AtlasBaseException(AtlasErrorCode.SAVED_SEARCH_ALREADY_EXISTS, savedSearch.getName(), savedSearch.getOwnerName());
             }
         }
@@ -129,8 +127,8 @@ public class UserProfileService {
         return (profile != null) ? profile.getSavedSearches() : null;
     }
 
-    public AtlasUserSavedSearch getSavedSearch(String userName, String searchName, SavedSearchType searchType) throws AtlasBaseException {
-        AtlasUserSavedSearch ss = new AtlasUserSavedSearch(userName, searchName, searchType);
+    public AtlasUserSavedSearch getSavedSearch(String userName, String searchName) throws AtlasBaseException {
+        AtlasUserSavedSearch ss = new AtlasUserSavedSearch(userName, searchName);
 
         return dataAccess.load(ss);
     }

http://git-wip-us.apache.org/repos/asf/atlas/blob/7cce1c4a/repository/src/test/java/org/apache/atlas/repository/userprofile/UserProfileServiceTest.java
----------------------------------------------------------------------
diff --git a/repository/src/test/java/org/apache/atlas/repository/userprofile/UserProfileServiceTest.java b/repository/src/test/java/org/apache/atlas/repository/userprofile/UserProfileServiceTest.java
index 713dade..0532f16 100644
--- a/repository/src/test/java/org/apache/atlas/repository/userprofile/UserProfileServiceTest.java
+++ b/repository/src/test/java/org/apache/atlas/repository/userprofile/UserProfileServiceTest.java
@@ -111,7 +111,7 @@ public class UserProfileServiceTest {
                 AtlasUserSavedSearch actual = userProfileService.addSavedSearch(getDefaultSavedSearch(userName, queryName, expectedSearchParameter));
                 assertNotNull(actual);
 
-                AtlasUserSavedSearch savedSearch = userProfileService.getSavedSearch(userName, queryName, BASIC);
+                AtlasUserSavedSearch savedSearch = userProfileService.getSavedSearch(userName, queryName);
                 assertNotNull(savedSearch);
                 assertEquals(savedSearch.getSearchParameters(), expectedSearchParameter);
             }
@@ -156,7 +156,7 @@ public class UserProfileServiceTest {
 
         saveQueries(userName, actualSearchParameter);
         for (int i = 0; i < max_searches; i++) {
-            AtlasUserSavedSearch savedSearch = userProfileService.getSavedSearch(userName, getIndexBasedQueryName(i), BASIC);
+            AtlasUserSavedSearch savedSearch = userProfileService.getSavedSearch(userName, getIndexBasedQueryName(i));
             assertEquals(savedSearch.getName(), getIndexBasedQueryName(i));
             assertEquals(savedSearch.getSearchParameters(), actualSearchParameter);
         }
@@ -194,7 +194,7 @@ public class UserProfileServiceTest {
     public void updateSearch() throws AtlasBaseException {
         final String queryName = getIndexBasedQueryName(0);
         String userName = getIndexBasedUserName(0);
-        AtlasUserSavedSearch expected = userProfileService.getSavedSearch(userName, queryName, BASIC);
+        AtlasUserSavedSearch expected = userProfileService.getSavedSearch(userName, queryName);
         assertNotNull(expected);
 
         SearchParameters sp = expected.getSearchParameters();
@@ -212,11 +212,11 @@ public class UserProfileServiceTest {
         final String queryName = getIndexBasedQueryName(1);
         String userName = getIndexBasedUserName(0);
 
-        AtlasUserSavedSearch expected = userProfileService.getSavedSearch(userName, queryName, BASIC);
+        AtlasUserSavedSearch expected = userProfileService.getSavedSearch(userName, queryName);
         assertNotNull(expected);
 
         userProfileService.deleteSavedSearch(expected.getGuid());
-        userProfileService.getSavedSearch(userName, queryName, BASIC);
+        userProfileService.getSavedSearch(userName, queryName);
     }
 
     @Test(dependsOnMethods = {"createsNewProfile", "savesMultipleQueriesForUser", "verifyQueryNameListForUser"})

http://git-wip-us.apache.org/repos/asf/atlas/blob/7cce1c4a/webapp/src/main/java/org/apache/atlas/web/rest/DiscoveryREST.java
----------------------------------------------------------------------
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 aed82ae..747fb4b 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
@@ -24,7 +24,6 @@ import org.apache.atlas.exception.AtlasBaseException;
 import org.apache.atlas.model.discovery.AtlasSearchResult;
 import org.apache.atlas.model.discovery.SearchParameters;
 import org.apache.atlas.model.profile.AtlasUserSavedSearch;
-import org.apache.atlas.model.profile.AtlasUserSavedSearch.SavedSearchType;
 import org.apache.atlas.utils.AtlasPerfTracer;
 import org.apache.atlas.web.util.Servlets;
 import org.apache.commons.collections.CollectionUtils;
@@ -98,18 +97,7 @@ public class DiscoveryREST {
                         + "," + classification + "," + limit + "," + offset + ")");
             }
 
-            String queryStr = query == null ? "" : query;
-
-            if (StringUtils.isNoneEmpty(typeName)) {
-                queryStr = escapeTypeName(typeName) + " " + queryStr;
-            }
-
-            if (StringUtils.isNoneEmpty(classification)) {
-                // isa works with a type name only - like hive_column isa PII; it doesn't work with more complex query
-                if (StringUtils.isEmpty(query)) {
-                    queryStr += (" isa " + classification);
-                }
-            }
+            String queryStr = atlasDiscoveryService.getDslQueryUsingTypeNameClassification(query, typeName, classification);
 
             return atlasDiscoveryService.searchUsingDslQuery(queryStr, limit, offset);
         } finally {
@@ -117,6 +105,8 @@ public class DiscoveryREST {
         }
     }
 
+
+
     /**
      * Retrieve data for the specified fulltext query
      *
@@ -332,17 +322,15 @@ public class DiscoveryREST {
     @Path("saved")
     @Consumes(Servlets.JSON_MEDIA_TYPE)
     @Produces(Servlets.JSON_MEDIA_TYPE)
-    public AtlasUserSavedSearch createSavedSearch(AtlasUserSavedSearch savedSearch) throws AtlasBaseException, IOException {
-        savedSearch.setOwnerName(Servlets.getUserName(httpServletRequest));
-
+    public AtlasUserSavedSearch addSavedSearch(AtlasUserSavedSearch savedSearch) throws AtlasBaseException, IOException {
         AtlasPerfTracer perf = null;
 
         try {
             if (AtlasPerfTracer.isPerfTraceEnabled(PERF_LOG)) {
-                perf = AtlasPerfTracer.getPerfTracer(PERF_LOG, "DiscoveryREST.createSavedSearch(ownerName=" + savedSearch.getOwnerName() + ", name=" + savedSearch.getName() + ", searchType=" + savedSearch.getSearchType() + ")");
+                perf = AtlasPerfTracer.getPerfTracer(PERF_LOG, "DiscoveryREST.addSavedSearch(userName=" + savedSearch.getOwnerName() + ", name=" + savedSearch.getName() + ", searchType=" + savedSearch.getSearchType() + ")");
             }
 
-            return atlasDiscoveryService.addSavedSearch(savedSearch);
+            return atlasDiscoveryService.addSavedSearch(Servlets.getUserName(httpServletRequest), savedSearch);
         } finally {
             AtlasPerfTracer.log(perf);
         }
@@ -359,16 +347,14 @@ public class DiscoveryREST {
     @Consumes(Servlets.JSON_MEDIA_TYPE)
     @Produces(Servlets.JSON_MEDIA_TYPE)
     public AtlasUserSavedSearch updateSavedSearch(AtlasUserSavedSearch savedSearch) throws AtlasBaseException {
-        savedSearch.setOwnerName(Servlets.getUserName(httpServletRequest));
-
         AtlasPerfTracer perf = null;
 
         try {
             if (AtlasPerfTracer.isPerfTraceEnabled(PERF_LOG)) {
-                perf = AtlasPerfTracer.getPerfTracer(PERF_LOG, "DiscoveryREST.updateSavedSearch(ownerName=" + savedSearch.getOwnerName() + ", name=" + savedSearch.getName() + ", searchType=" + savedSearch.getSearchType() + ")");
+                perf = AtlasPerfTracer.getPerfTracer(PERF_LOG, "DiscoveryREST.updateSavedSearch(userName=" + savedSearch.getOwnerName() + ", name=" + savedSearch.getName() + ", searchType=" + savedSearch.getSearchType() + ")");
             }
 
-            return atlasDiscoveryService.updateSavedSearch(savedSearch);
+            return atlasDiscoveryService.updateSavedSearch(Servlets.getUserName(httpServletRequest), savedSearch);
         } finally {
             AtlasPerfTracer.log(perf);
         }
@@ -376,34 +362,34 @@ public class DiscoveryREST {
 
     /**
      *
-     * @param userName User for whom the search is retrieved
      * @param searchName Name of the saved search
+     * @param userName User for whom the search is retrieved
      * @return
      * @throws AtlasBaseException
      */
     @GET
-    @Path("saved/{type}/{name}")
+    @Path("saved/{name}")
     @Consumes(Servlets.JSON_MEDIA_TYPE)
     @Produces(Servlets.JSON_MEDIA_TYPE)
-    public AtlasUserSavedSearch getSavedSearch(@PathParam("type") String searchType,
-                                               @PathParam("name") String searchName,
+    public AtlasUserSavedSearch getSavedSearch(@PathParam("name") String searchName,
                                                @QueryParam("user") String userName) throws AtlasBaseException {
-        userName = StringUtils.isBlank(userName) ? Servlets.getUserName(httpServletRequest) : userName;
-
         AtlasPerfTracer perf = null;
 
         try {
             if (AtlasPerfTracer.isPerfTraceEnabled(PERF_LOG)) {
-                perf = AtlasPerfTracer.getPerfTracer(PERF_LOG, "DiscoveryREST.getSavedSearch(user=" + userName + ", name=" + searchName + ", type=" + searchType + ")");
+                perf = AtlasPerfTracer.getPerfTracer(PERF_LOG, "DiscoveryREST.getSavedSearch(userName=" + userName + ", name=" + searchName + ")");
             }
 
-            return atlasDiscoveryService.getSavedSearch(userName, searchName, SavedSearchType.to(searchType));
+            return atlasDiscoveryService.getSavedSearchByName(Servlets.getUserName(httpServletRequest), userName, searchName);
         } finally {
             AtlasPerfTracer.log(perf);
         }
     }
 
     /**
+     *
+     * @param userName User for whom the search is retrieved
+     * @throws AtlasBaseException
      * @return list of all saved searches for given user
      */
     @GET
@@ -411,16 +397,14 @@ public class DiscoveryREST {
     @Consumes(Servlets.JSON_MEDIA_TYPE)
     @Produces(Servlets.JSON_MEDIA_TYPE)
     public List<AtlasUserSavedSearch> getSavedSearches(@QueryParam("user") String userName) throws AtlasBaseException {
-        userName = StringUtils.isBlank(userName) ? Servlets.getUserName(httpServletRequest) : userName;
-
         AtlasPerfTracer perf = null;
 
         try {
             if (AtlasPerfTracer.isPerfTraceEnabled(PERF_LOG)) {
-                perf = AtlasPerfTracer.getPerfTracer(PERF_LOG, "DiscoveryREST.getSavedSearches(user=" + userName + ")");
+                perf = AtlasPerfTracer.getPerfTracer(PERF_LOG, "DiscoveryREST.getSavedSearches(userName=" + userName + ")");
             }
 
-            return atlasDiscoveryService.getSavedSearches(userName);
+            return atlasDiscoveryService.getSavedSearches(Servlets.getUserName(httpServletRequest), userName);
         } finally {
             AtlasPerfTracer.log(perf);
         }
@@ -441,34 +425,84 @@ public class DiscoveryREST {
                 perf = AtlasPerfTracer.getPerfTracer(PERF_LOG, "DiscoveryREST.deleteSavedSearch(guid=" + guid + ")");
             }
 
-            AtlasUserSavedSearch savedSearch = atlasDiscoveryService.getSavedSearch(guid);
+            atlasDiscoveryService.deleteSavedSearch(Servlets.getUserName(httpServletRequest), guid);
+        } finally {
+            AtlasPerfTracer.log(perf);
+        }
+    }
+
+
+    /**
+     * Attribute based search for entities satisfying the search parameters
+     *
+     * @param searchName name of saved-search
+     * @param userName saved-search owner
+     * @return Atlas search result
+     * @throws AtlasBaseException
+     */
+    @Path("saved/execute/{name}")
+    @GET
+    @Consumes(Servlets.JSON_MEDIA_TYPE)
+    @Produces(Servlets.JSON_MEDIA_TYPE)
+    public AtlasSearchResult executeSavedSearchByName(@PathParam("name") String searchName,
+                                                      @QueryParam("user") String userName) throws AtlasBaseException {
+        AtlasPerfTracer perf = null;
 
-            // block attempt to delete another user's saved-search
-            if (!StringUtils.equals(savedSearch.getOwnerName(), Servlets.getUserName(httpServletRequest))) {
-                throw new AtlasBaseException(AtlasErrorCode.BAD_REQUEST, "invalid data");
+        try {
+            if (AtlasPerfTracer.isPerfTraceEnabled(PERF_LOG)) {
+                perf = AtlasPerfTracer.getPerfTracer(PERF_LOG,
+                        "DiscoveryREST.executeSavedSearchByName(userName=" + userName + ", " + "name=" + searchName + ")");
             }
 
-            atlasDiscoveryService.deleteSavedSearch(guid);
+            AtlasUserSavedSearch savedSearch = atlasDiscoveryService.getSavedSearchByName(Servlets.getUserName(httpServletRequest), userName, searchName);
+
+            return executeSavedSearch(savedSearch);
         } finally {
             AtlasPerfTracer.log(perf);
         }
     }
 
+    /**
+     * Attribute based search for entities satisfying the search parameters
+     *
+     * @param searchGuid Guid identifying saved search
+     * @return Atlas search result
+     * @throws AtlasBaseException
+     */
+    @Path("saved/execute/guid/{guid}")
+    @GET
+    @Consumes(Servlets.JSON_MEDIA_TYPE)
+    @Produces(Servlets.JSON_MEDIA_TYPE)
+    public AtlasSearchResult executeSavedSearchByGuid(@PathParam("guid") String searchGuid) throws AtlasBaseException {
+        AtlasPerfTracer perf = null;
+
+        try {
+            if (AtlasPerfTracer.isPerfTraceEnabled(PERF_LOG)) {
+                perf = AtlasPerfTracer.getPerfTracer(PERF_LOG, "DiscoveryREST.executeSavedSearchByGuid(" + searchGuid + ")");
+            }
+
+            AtlasUserSavedSearch savedSearch = atlasDiscoveryService.getSavedSearchByGuid(Servlets.getUserName(httpServletRequest), searchGuid);
+
+            return executeSavedSearch(savedSearch);
+        } finally {
+            AtlasPerfTracer.log(perf);
+        }
+    }
 
     private boolean isEmpty(SearchParameters.FilterCriteria filterCriteria) {
         return filterCriteria == null ||
                 (StringUtils.isEmpty(filterCriteria.getAttributeName()) && CollectionUtils.isEmpty(filterCriteria.getCriterion()));
     }
 
-    private String escapeTypeName(String typeName) {
-        String ret;
+    private AtlasSearchResult executeSavedSearch(AtlasUserSavedSearch savedSearch) throws AtlasBaseException {
+        SearchParameters sp = savedSearch.getSearchParameters();
+
+        if(savedSearch.getSearchType() == AtlasUserSavedSearch.SavedSearchType.ADVANCED) {
+            String dslQuery = atlasDiscoveryService.getDslQueryUsingTypeNameClassification(sp.getQuery(), sp.getTypeName(), sp.getClassification());
 
-        if (StringUtils.startsWith(typeName, "`") && StringUtils.endsWith(typeName, "`")) {
-            ret = typeName;
+            return atlasDiscoveryService.searchUsingDslQuery(dslQuery, sp.getLimit(), sp.getOffset());
         } else {
-            ret = String.format("`%s`", typeName);
+            return atlasDiscoveryService.searchWithParameters(sp);
         }
-
-        return ret;
     }
 }