add ability for sysadmin to return ES query instead of results
diff --git a/stack/core/src/main/java/org/apache/usergrid/corepersistence/CpRelationManager.java b/stack/core/src/main/java/org/apache/usergrid/corepersistence/CpRelationManager.java
index e329c29..218c695 100644
--- a/stack/core/src/main/java/org/apache/usergrid/corepersistence/CpRelationManager.java
+++ b/stack/core/src/main/java/org/apache/usergrid/corepersistence/CpRelationManager.java
@@ -634,6 +634,7 @@
         final Optional<String> queryString = query.isGraphSearch()? Optional.<String>absent(): query.getQl();
         final Id ownerId = headEntity.asId();
         final boolean analyzeOnly = query.getAnalyzeOnly();
+        final boolean returnQuery = query.getReturnQuery();
 
 
         if(query.getLevel() == Level.IDS ){
@@ -648,6 +649,7 @@
                             queryString, cursor );
 
                     search.setAnalyzeOnly(analyzeOnly);
+                    search.setReturnQuery(returnQuery);
 
                     return collectionService.searchCollectionIds( search );
                 }
@@ -666,6 +668,7 @@
                         queryString, cursor );
 
                 search.setAnalyzeOnly(analyzeOnly);
+                search.setReturnQuery(returnQuery);
                 IndexConsistency indexConsistency = getIndexConsistencyForType(collectionName);
                 search.setKeepStaleEntries(indexConsistency == IndexConsistency.LATEST);
 
@@ -931,6 +934,7 @@
         headEntity = em.validate( headEntity );
 
         final boolean analyzeOnly = query.getAnalyzeOnly();
+        final boolean returnQuery = query.getReturnQuery();
 
 
         final Query toExecute = adjustQuery( query );
@@ -965,6 +969,7 @@
                         new ConnectionSearch( applicationScope, sourceId, entityType, connection, toExecute.getLimit(),
                             queryString, cursor, isConnecting );
                     search.setAnalyzeOnly(analyzeOnly);
+                    search.setReturnQuery(returnQuery);
                     return connectionService.searchConnectionAsRefs( search );
                 }
             }.next();
@@ -981,6 +986,7 @@
                     new ConnectionSearch( applicationScope, sourceId, entityType, connection, toExecute.getLimit(),
                         queryString, cursor, isConnecting );
                 search.setAnalyzeOnly(analyzeOnly);
+                search.setReturnQuery(returnQuery);
                 return connectionService.searchConnection( search );
             }
         }.next();
diff --git a/stack/core/src/main/java/org/apache/usergrid/corepersistence/pipeline/builder/IdBuilder.java b/stack/core/src/main/java/org/apache/usergrid/corepersistence/pipeline/builder/IdBuilder.java
index 4f44ac4..14237d6 100644
--- a/stack/core/src/main/java/org/apache/usergrid/corepersistence/pipeline/builder/IdBuilder.java
+++ b/stack/core/src/main/java/org/apache/usergrid/corepersistence/pipeline/builder/IdBuilder.java
@@ -118,13 +118,15 @@
      * @param collectionName  The name of the collection
      * @param ql The user's query to execute
      * @param entityType The type of the entity
-     * @param analyzeOnly
+     * @param analyzeOnly Whether only query analysis should be performed
+     * @param returnQuery Whether query should be returned instead of results
      * @return  Candidate results
      */
-    public CandidateBuilder searchCollection(final String collectionName, final String ql, final String entityType, boolean analyzeOnly) {
+    public CandidateBuilder searchCollection(final String collectionName, final String ql, final String entityType,
+                                             final boolean analyzeOnly, final boolean returnQuery) {
 
         final Pipeline<FilterResult<Candidate>> newFilter = pipeline.withFilter( filterFactory.searchCollectionFilter(
-            ql, collectionName, entityType, analyzeOnly ) );
+            ql, collectionName, entityType, analyzeOnly, returnQuery ) );
 
         return new CandidateBuilder( newFilter, filterFactory , null);
     }
@@ -132,7 +134,7 @@
     public CandidateBuilder searchCollection(final String collectionName, final String ql, final CollectionSearch search ) {
 
         final Pipeline<FilterResult<Candidate>> newFilter = pipeline.withFilter( filterFactory.searchCollectionFilter(
-            ql, collectionName, search.getEntityType(), search.getAnalyzeOnly() ) );
+            ql, collectionName, search.getEntityType(), search.getAnalyzeOnly(), search.getReturnQuery() ) );
 
         return new CandidateBuilder( newFilter, filterFactory, search );
     }
@@ -142,14 +144,16 @@
      * @param connectionName The connection name to search
      * @param ql The query to execute
      * @param entityType The optional type of entity.  If this is absent, all entity types in the connection will be searched
-     * @param analyzeOnly
+     * @param analyzeOnly Whether only query analysis should be performed
+     * @param returnQuery Whether index query should be returned instead of results
      * @return  Candidate results
      */
-    public CandidateBuilder searchConnection(final String connectionName, final String ql, final Optional<String> entityType, boolean analyzeOnly) {
+    public CandidateBuilder searchConnection(final String connectionName, final String ql, final Optional<String> entityType,
+                                             final boolean analyzeOnly, final boolean returnQuery) {
 
 
         final Pipeline<FilterResult<Candidate>> newFilter = pipeline.withFilter( filterFactory.searchConnectionFilter(
-            ql, connectionName, entityType,analyzeOnly ) );
+            ql, connectionName, entityType, analyzeOnly, returnQuery ) );
 
         return new CandidateBuilder( newFilter, filterFactory );
     }
diff --git a/stack/core/src/main/java/org/apache/usergrid/corepersistence/pipeline/read/FilterFactory.java b/stack/core/src/main/java/org/apache/usergrid/corepersistence/pipeline/read/FilterFactory.java
index 7b61b3d..6cce6ec 100644
--- a/stack/core/src/main/java/org/apache/usergrid/corepersistence/pipeline/read/FilterFactory.java
+++ b/stack/core/src/main/java/org/apache/usergrid/corepersistence/pipeline/read/FilterFactory.java
@@ -97,7 +97,8 @@
     SearchCollectionFilter searchCollectionFilter( @Assisted( "query" ) final String query,
                                                    @Assisted( "collectionName" ) final String collectionName,
                                                    @Assisted( "entityType" ) final String entityType,
-                                                   @Assisted( "analyzeOnly") final boolean analyzeOnly);
+                                                   @Assisted( "analyzeOnly") final boolean analyzeOnly,
+                                                   @Assisted( "returnQuery" ) final boolean returnQuery);
 
 
     /**
@@ -110,7 +111,8 @@
     SearchConnectionFilter searchConnectionFilter( @Assisted( "query" ) final String query,
                                                    @Assisted( "connectionName" ) final String connectionName,
                                                    @Assisted( "connectedEntityType" ) final Optional<String> connectedEntityType,
-                                                   @Assisted( "analyzeOnly") final boolean analyzeOnly);
+                                                   @Assisted( "analyzeOnly") final boolean analyzeOnly,
+                                                   @Assisted( "returnQuery") final boolean returnQuery);
 
 
     /**
diff --git a/stack/core/src/main/java/org/apache/usergrid/corepersistence/pipeline/read/search/AbstractElasticSearchFilter.java b/stack/core/src/main/java/org/apache/usergrid/corepersistence/pipeline/read/search/AbstractElasticSearchFilter.java
index 9f6be2a..7a46507 100644
--- a/stack/core/src/main/java/org/apache/usergrid/corepersistence/pipeline/read/search/AbstractElasticSearchFilter.java
+++ b/stack/core/src/main/java/org/apache/usergrid/corepersistence/pipeline/read/search/AbstractElasticSearchFilter.java
@@ -57,6 +57,7 @@
     private final String query;
     private final Timer searchTimer;
     private final boolean analyzeOnly;
+    private final boolean returnQuery;
 
 
     /**
@@ -65,12 +66,13 @@
     public AbstractElasticSearchFilter(final EntityIndexFactory entityIndexFactory,
                                        final MetricsFactory metricsFactory,
                                        final IndexLocationStrategyFactory indexLocationStrategyFactory,
-                                       final String query, boolean analyzeOnly) {
+                                       final String query, boolean analyzeOnly, boolean returnQuery) {
         this.entityIndexFactory = entityIndexFactory;
         this.indexLocationStrategyFactory = indexLocationStrategyFactory;
         this.query = query;
         this.searchTimer = metricsFactory.getTimer( AbstractElasticSearchFilter.class, "query.search" );
         this.analyzeOnly = analyzeOnly;
+        this.returnQuery = returnQuery;
     }
 
 
@@ -127,7 +129,8 @@
 
                     try {
                         final CandidateResults candidateResults =
-                            applicationEntityIndex.search( searchEdge, searchTypes, query, limit, currentOffSet, propertiesWithType, analyzeOnly );
+                            applicationEntityIndex.search( searchEdge, searchTypes, query, limit, currentOffSet,
+                                propertiesWithType, analyzeOnly, returnQuery);
 
 
                         Collection<SelectFieldMapping> fieldMappingCollection = candidateResults.getGetFieldMappings();
diff --git a/stack/core/src/main/java/org/apache/usergrid/corepersistence/pipeline/read/search/SearchCollectionFilter.java b/stack/core/src/main/java/org/apache/usergrid/corepersistence/pipeline/read/search/SearchCollectionFilter.java
index 214bcbb..176d986 100644
--- a/stack/core/src/main/java/org/apache/usergrid/corepersistence/pipeline/read/search/SearchCollectionFilter.java
+++ b/stack/core/src/main/java/org/apache/usergrid/corepersistence/pipeline/read/search/SearchCollectionFilter.java
@@ -53,8 +53,9 @@
                                    @Assisted( "query" ) final String query,
                                    @Assisted( "collectionName" ) final String collectionName,
                                    @Assisted( "entityType" ) final String entityType,
-                                   @Assisted( "analyzeOnly") final boolean analyzeOnly) {
-        super( entityIndexFactory, metricsFactory, indexLocationStrategyFactory, query, analyzeOnly );
+                                   @Assisted( "analyzeOnly") final boolean analyzeOnly,
+                                   @Assisted( "returnQuery" ) final boolean returnQuery) {
+        super( entityIndexFactory, metricsFactory, indexLocationStrategyFactory, query, analyzeOnly, returnQuery);
         this.collectionName = collectionName;
         this.entityType = entityType;
     }
diff --git a/stack/core/src/main/java/org/apache/usergrid/corepersistence/pipeline/read/search/SearchConnectionFilter.java b/stack/core/src/main/java/org/apache/usergrid/corepersistence/pipeline/read/search/SearchConnectionFilter.java
index 4a61120..4e8aed7 100644
--- a/stack/core/src/main/java/org/apache/usergrid/corepersistence/pipeline/read/search/SearchConnectionFilter.java
+++ b/stack/core/src/main/java/org/apache/usergrid/corepersistence/pipeline/read/search/SearchConnectionFilter.java
@@ -51,8 +51,9 @@
                                    @Assisted( "query" ) final String query,
                                    @Assisted( "connectionName" ) final String connectionName,
                                    @Assisted( "connectedEntityType" ) final Optional<String> connectedEntityType,
-                                   @Assisted( "analyzeOnly") final boolean analyzeOnly) {
-        super( entityIndexFactory, metricsFactory, indexLocationStrategyFactory, query, analyzeOnly);
+                                   @Assisted( "analyzeOnly") final boolean analyzeOnly,
+                                   @Assisted( "returnQuery" ) final boolean returnQuery) {
+        super( entityIndexFactory, metricsFactory, indexLocationStrategyFactory, query, analyzeOnly, returnQuery);
 
         this.connectionName = connectionName;
         this.connectedEntityType = connectedEntityType;
diff --git a/stack/core/src/main/java/org/apache/usergrid/corepersistence/service/CollectionSearch.java b/stack/core/src/main/java/org/apache/usergrid/corepersistence/service/CollectionSearch.java
index 6b6edfc..3cbbf14 100644
--- a/stack/core/src/main/java/org/apache/usergrid/corepersistence/service/CollectionSearch.java
+++ b/stack/core/src/main/java/org/apache/usergrid/corepersistence/service/CollectionSearch.java
@@ -42,6 +42,7 @@
     private final Optional<String> cursor;
     private Level level = Level.ALL;
     private boolean analyzeOnly;
+    private boolean returnQuery;
     private boolean keepStaleEntries;
 
 
@@ -56,6 +57,7 @@
         this.query = query;
         this.cursor = cursor;
         this.analyzeOnly = false;
+        this.returnQuery = false;
     }
 
 
@@ -105,6 +107,14 @@
         this.analyzeOnly = analyzeOnly;
     }
 
+    public boolean getReturnQuery() {
+        return returnQuery;
+    }
+
+    public void setReturnQuery(final boolean returnQuery) {
+        this.returnQuery = returnQuery;
+    }
+
     public boolean getKeepStaleEntries() {
         return keepStaleEntries;
     }
diff --git a/stack/core/src/main/java/org/apache/usergrid/corepersistence/service/ConnectionSearch.java b/stack/core/src/main/java/org/apache/usergrid/corepersistence/service/ConnectionSearch.java
index 98f36be..c7a563a 100644
--- a/stack/core/src/main/java/org/apache/usergrid/corepersistence/service/ConnectionSearch.java
+++ b/stack/core/src/main/java/org/apache/usergrid/corepersistence/service/ConnectionSearch.java
@@ -38,6 +38,7 @@
     private final Optional<String> cursor;
     private final boolean isConnecting;
     private boolean analyzeOnly;
+    private boolean returnQuery;
 
 
 
@@ -53,6 +54,7 @@
         this.cursor = cursor;
         this.isConnecting = isConnecting;
         this.analyzeOnly = false;
+        this.returnQuery = false;
 
     }
 
@@ -102,4 +104,12 @@
     public void setAnalyzeOnly(final boolean analyzeOnly){
         this.analyzeOnly = analyzeOnly;
     }
+
+    public boolean getReturnQuery() {
+        return returnQuery;
+    }
+
+    public void setReturnQuery(final boolean returnQuery) {
+        this.returnQuery = returnQuery;
+    }
 }
diff --git a/stack/core/src/main/java/org/apache/usergrid/corepersistence/service/ConnectionServiceImpl.java b/stack/core/src/main/java/org/apache/usergrid/corepersistence/service/ConnectionServiceImpl.java
index 7c70a3d..259e4b9 100644
--- a/stack/core/src/main/java/org/apache/usergrid/corepersistence/service/ConnectionServiceImpl.java
+++ b/stack/core/src/main/java/org/apache/usergrid/corepersistence/service/ConnectionServiceImpl.java
@@ -106,7 +106,8 @@
         else {
 
             results =
-                pipelineBuilder.searchConnection( search.getConnectionName(), query.get(), search.getEntityType(), search.getAnalyzeOnly() )
+                pipelineBuilder.searchConnection( search.getConnectionName(), query.get(), search.getEntityType(),
+                    search.getAnalyzeOnly(), search.getReturnQuery() )
                                .loadEntities();
         }
 
@@ -135,7 +136,8 @@
         }
         else {
             traversedIds =
-                pipelineBuilder.searchConnection( connectionName, query.get(), search.getEntityType(), search.getAnalyzeOnly() ).loadIds();
+                pipelineBuilder.searchConnection( connectionName, query.get(), search.getEntityType(),
+                    search.getAnalyzeOnly(), search.getReturnQuery() ).loadIds();
         }
 
         //create connection refs
diff --git a/stack/core/src/main/java/org/apache/usergrid/persistence/Query.java b/stack/core/src/main/java/org/apache/usergrid/persistence/Query.java
index 4c9d16c..034bc10 100644
--- a/stack/core/src/main/java/org/apache/usergrid/persistence/Query.java
+++ b/stack/core/src/main/java/org/apache/usergrid/persistence/Query.java
@@ -82,6 +82,7 @@
     private String ql;
     private Collection<SelectFieldMapping> selectFields;
     private boolean analyzeOnly = false;
+    private boolean returnQuery = false;
 
 
     private static ObjectMapper mapper = new ObjectMapper();
@@ -125,7 +126,7 @@
         collection = q.collection;
         level = q.level;
         analyzeOnly = q.analyzeOnly;
-
+        returnQuery = q.returnQuery;
     }
 
 
@@ -506,6 +507,14 @@
         return analyzeOnly;
     }
 
+    public void setReturnQuery(final boolean returnQuery) {
+        this.returnQuery = returnQuery;
+    }
+
+    public boolean getReturnQuery() {
+        return returnQuery;
+    }
+
     public boolean isMergeSelectResults() {
         return mergeSelectResults;
     }
diff --git a/stack/corepersistence/queryindex/src/main/java/org/apache/usergrid/persistence/index/EntityIndex.java b/stack/corepersistence/queryindex/src/main/java/org/apache/usergrid/persistence/index/EntityIndex.java
index 437f9bf..afcfdd7 100644
--- a/stack/corepersistence/queryindex/src/main/java/org/apache/usergrid/persistence/index/EntityIndex.java
+++ b/stack/corepersistence/queryindex/src/main/java/org/apache/usergrid/persistence/index/EntityIndex.java
@@ -121,6 +121,25 @@
                             final int limit, final int offset, final Map<String, Class> fieldsWithType,
                             final boolean analyzeOnly);
 
+    /**
+     * Search on every document in the specified search edge.  Also search by the types if specified
+     *
+     * @param searchEdge        The edge to search on
+     * @param searchTypes       The search types to search
+     * @param query             The query to execute
+     * @param limit             The limit of values to return
+     * @param offset            The offset to query on
+     * @param fieldsWithType    An optional param that allows the caller to provide schema related info which might
+     *                          relate to data in the query, such as sort predicate types
+     * @param analyzeOnly       This optional param will instruct the query processing to only analyze the query and
+     *                          provide info but not actually execute the query.
+     * @param returnQuery       This optional param will cause the index query to be returned instead of run.
+     * @return
+     */
+    CandidateResults search(final SearchEdge searchEdge, final SearchTypes searchTypes, final String query,
+                            final int limit, final int offset, final Map<String, Class> fieldsWithType,
+                            final boolean analyzeOnly, final boolean returnQuery);
+
 
     /**
      * Same as search, just iterates all documents that match the index edge exactly.
diff --git a/stack/corepersistence/queryindex/src/main/java/org/apache/usergrid/persistence/index/exceptions/QueryReturnException.java b/stack/corepersistence/queryindex/src/main/java/org/apache/usergrid/persistence/index/exceptions/QueryReturnException.java
new file mode 100644
index 0000000..54d9455
--- /dev/null
+++ b/stack/corepersistence/queryindex/src/main/java/org/apache/usergrid/persistence/index/exceptions/QueryReturnException.java
@@ -0,0 +1,47 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ *  contributor license agreements.  The ASF licenses this file to You
+ * under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.  For additional information regarding
+ * copyright in this work, please see the NOTICE file in the top level
+ * directory of this distribution.
+ */
+package org.apache.usergrid.persistence.index.exceptions;
+
+
+import java.util.UUID;
+
+public class QueryReturnException extends RuntimeException {
+
+    private String originalQuery;
+    private String indexQuery;
+    private UUID applicationUUID;
+
+    public QueryReturnException(final String originalQuery, final String indexQuery,
+                                final UUID applicationUUID) {
+        super("Return Query");
+        this.originalQuery = originalQuery;
+        this.indexQuery = indexQuery;
+        this.applicationUUID = applicationUUID;
+    }
+
+    public String getOriginalQuery(){
+        return originalQuery;
+    }
+    public String getIndexQuery(){
+        return indexQuery;
+    }
+
+    public UUID getApplicationUUID(){
+        return applicationUUID;
+    }
+}
diff --git a/stack/corepersistence/queryindex/src/main/java/org/apache/usergrid/persistence/index/impl/EsEntityIndexImpl.java b/stack/corepersistence/queryindex/src/main/java/org/apache/usergrid/persistence/index/impl/EsEntityIndexImpl.java
index 211cf70..e3121e1 100644
--- a/stack/corepersistence/queryindex/src/main/java/org/apache/usergrid/persistence/index/impl/EsEntityIndexImpl.java
+++ b/stack/corepersistence/queryindex/src/main/java/org/apache/usergrid/persistence/index/impl/EsEntityIndexImpl.java
@@ -39,6 +39,7 @@
 import org.apache.usergrid.persistence.index.exceptions.IndexException;
 import org.apache.usergrid.persistence.index.exceptions.QueryAnalyzerException;
 import org.apache.usergrid.persistence.index.exceptions.QueryAnalyzerEnforcementException;
+import org.apache.usergrid.persistence.index.exceptions.QueryReturnException;
 import org.apache.usergrid.persistence.index.migration.IndexDataVersions;
 import org.apache.usergrid.persistence.index.query.ParsedQuery;
 import org.apache.usergrid.persistence.index.query.ParsedQueryBuilder;
@@ -430,6 +431,12 @@
     public CandidateResults search( final SearchEdge searchEdge, final SearchTypes searchTypes, final String query,
                                     final int limit, final int offset, final Map<String, Class> fieldsWithType,
                                     final boolean analyzeOnly ) {
+        return search(searchEdge, searchTypes, query, limit, offset, fieldsWithType, analyzeOnly, false);
+    }
+
+    public CandidateResults search( final SearchEdge searchEdge, final SearchTypes searchTypes, final String query,
+                                    final int limit, final int offset, final Map<String, Class> fieldsWithType,
+                                    final boolean analyzeOnly, final boolean returnQuery ) {
 
         IndexValidationUtils.validateSearchEdge(searchEdge);
         Preconditions.checkNotNull(searchTypes, "searchTypes cannot be null");
@@ -453,7 +460,6 @@
             hasGeoSortPredicates = visitor.getGeoSorts().contains(sortPredicate.getPropertyName());
         }
 
-
         final String cacheKey = applicationScope.getApplication().getUuid().toString()+"_"+searchEdge.getEdgeName();
         final Object totalEdgeSizeFromCache = sizeCache.getIfPresent(cacheKey);
         long totalEdgeSizeInBytes;
@@ -494,6 +500,10 @@
                 searchTypes.getTypeNames( applicationScope ), srb );
         }
 
+        if (returnQuery) {
+            throw new QueryReturnException(parsedQuery.getOriginalQuery(), srb.toString(), applicationScope.getApplication().getUuid());
+        }
+
         //Added For Graphite Metrics
         final Timer.Context timerContext = searchTimer.time();
 
diff --git a/stack/rest/src/main/java/org/apache/usergrid/rest/applications/ServiceResource.java b/stack/rest/src/main/java/org/apache/usergrid/rest/applications/ServiceResource.java
index 9373f5e..9fc5457 100644
--- a/stack/rest/src/main/java/org/apache/usergrid/rest/applications/ServiceResource.java
+++ b/stack/rest/src/main/java/org/apache/usergrid/rest/applications/ServiceResource.java
@@ -34,6 +34,7 @@
 import org.apache.usergrid.rest.applications.assets.AssetsResource;
 import org.apache.usergrid.rest.security.annotations.CheckPermissionsForPath;
 import org.apache.usergrid.security.oauth.AccessInfo;
+import org.apache.usergrid.security.shiro.utils.SubjectUtils;
 import org.apache.usergrid.services.*;
 import org.apache.usergrid.services.assets.BinaryStoreFactory;
 import org.apache.usergrid.services.assets.data.*;
@@ -50,6 +51,7 @@
 import org.springframework.context.annotation.Scope;
 import org.springframework.stereotype.Component;
 
+import javax.security.auth.Subject;
 import javax.ws.rs.*;
 import javax.ws.rs.core.*;
 import java.io.InputStream;
@@ -245,7 +247,7 @@
         addQueryParams( getServiceParameters(), ui );
 
         ServiceRequest r = services.newRequest( action, tree, getServiceParameters(), payload,
-            returnInboundConnections, returnOutboundConnections, false);
+            returnInboundConnections, returnOutboundConnections, false, false);
 
         response.setServiceRequest( r );
 
@@ -299,7 +301,7 @@
         addQueryParams( getServiceParameters(), ui );
 
         ServiceRequest r = services.newRequest( action, tree, getServiceParameters(), payload,
-            returnInboundConnections, returnOutboundConnections, false);
+            returnInboundConnections, returnOutboundConnections, false, false);
 
         response.setServiceRequest( r );
 
@@ -384,6 +386,11 @@
         }
 
         boolean analyzeQueryOnly = Boolean.valueOf(ui.getQueryParameters().getFirst("analyzeOnly"));
+        boolean returnQuery = false;
+        // currently only allow query return if service admin
+        if (SubjectUtils.isServiceAdmin()) {
+            returnQuery = Boolean.valueOf(ui.getQueryParameters().getFirst("returnQuery"));
+        }
 
         boolean collectionGet = false;
         if ( action == ServiceAction.GET ) {
@@ -391,7 +398,7 @@
         }
         addQueryParams( getServiceParameters(), ui );
         ServiceRequest r = services.newRequest( action, tree, getServiceParameters(), payload,
-            returnInboundConnections, returnOutboundConnections, analyzeQueryOnly);
+            returnInboundConnections, returnOutboundConnections, analyzeQueryOnly, returnQuery);
         response.setServiceRequest( r );
         ServiceResults results = r.execute();
         if ( results != null ) {
diff --git a/stack/rest/src/main/java/org/apache/usergrid/rest/exceptions/QueryReturnExceptionMapper.java b/stack/rest/src/main/java/org/apache/usergrid/rest/exceptions/QueryReturnExceptionMapper.java
new file mode 100644
index 0000000..875e17e
--- /dev/null
+++ b/stack/rest/src/main/java/org/apache/usergrid/rest/exceptions/QueryReturnExceptionMapper.java
@@ -0,0 +1,35 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.usergrid.rest.exceptions;
+
+
+import org.apache.usergrid.persistence.index.exceptions.QueryReturnException;
+
+import javax.ws.rs.core.Response;
+import javax.ws.rs.ext.Provider;
+
+
+@Provider
+public class QueryReturnExceptionMapper extends AbstractExceptionMapper<QueryReturnException> {
+
+    // returns query as JSON with 200 response
+
+    @Override
+    public Response toResponse( QueryReturnException e ) {
+        return toResponse(200, e.getIndexQuery());
+    }
+}
diff --git a/stack/services/src/main/java/org/apache/usergrid/services/AbstractService.java b/stack/services/src/main/java/org/apache/usergrid/services/AbstractService.java
index f60bfdd..60a79e5 100644
--- a/stack/services/src/main/java/org/apache/usergrid/services/AbstractService.java
+++ b/stack/services/src/main/java/org/apache/usergrid/services/AbstractService.java
@@ -29,7 +29,6 @@
 import org.apache.usergrid.persistence.core.metrics.MetricsFactory;
 import org.apache.usergrid.persistence.core.metrics.ObservableTimer;
 import org.apache.usergrid.persistence.core.rx.RxTaskScheduler;
-import org.apache.usergrid.persistence.index.exceptions.QueryAnalyzerException;
 import org.apache.usergrid.security.shiro.utils.LocalShiroCache;
 import org.apache.usergrid.security.shiro.utils.SubjectUtils;
 import org.apache.usergrid.services.ServiceParameter.IdParameter;
@@ -688,6 +687,7 @@
         }
         else if ( query != null ) {
             query.setAnalyzeOnly(request.isAnalyzeQueryOnly());
+            query.setReturnQuery(request.shouldReturnQuery());
             return new ServiceContext( this, action, request, previousResults, owner, collectionName, query, parameters,
                     payload );
         }
diff --git a/stack/services/src/main/java/org/apache/usergrid/services/ServiceManager.java b/stack/services/src/main/java/org/apache/usergrid/services/ServiceManager.java
index 075278f..7e0cf07 100644
--- a/stack/services/src/main/java/org/apache/usergrid/services/ServiceManager.java
+++ b/stack/services/src/main/java/org/apache/usergrid/services/ServiceManager.java
@@ -357,13 +357,13 @@
 
 
     public ServiceRequest newRequest( ServiceAction action, List<ServiceParameter> parameters ) throws Exception {
-        return newRequest( action, false, parameters, null, true, true, false);
+        return newRequest( action, false, parameters, null, true, true, false, false);
     }
 
 
     public ServiceRequest newRequest( ServiceAction action, List<ServiceParameter> parameters, ServicePayload payload )
             throws Exception {
-        return newRequest( action, false, parameters, payload, true, true, false);
+        return newRequest( action, false, parameters, payload, true, true, false, false);
     }
 
 
@@ -382,7 +382,8 @@
 
     public ServiceRequest newRequest(ServiceAction action, boolean returnsTree, List<ServiceParameter> parameters,
                                      ServicePayload payload, boolean returnsInboundConnections,
-                                     boolean returnsOutboundConnections, boolean analyzeQueryOnly) throws Exception {
+                                     boolean returnsOutboundConnections, boolean analyzeQueryOnly,
+                                     boolean returnQuery) throws Exception {
 
         if ( em != null ) {
             if ( action != null ) {
@@ -413,12 +414,12 @@
 
         String serviceName = pluralize( ServiceParameter.dequeueParameter( parameters ).getName() );
         return new ServiceRequest( this, action, serviceName, parameters, payload, returnsTree,
-            returnsInboundConnections, returnsOutboundConnections, analyzeQueryOnly);
+            returnsInboundConnections, returnsOutboundConnections, analyzeQueryOnly, returnQuery);
     }
 
     public ServiceRequest newRequest( ServiceAction action, boolean returnsTree, List<ServiceParameter> parameters,
                                       ServicePayload payload ) throws Exception {
-        return newRequest( action, returnsTree, parameters, payload, true, true, false);
+        return newRequest( action, returnsTree, parameters, payload, true, true, false, false);
     }
 
     public void notifyExecutionEventListeners( ServiceAction action, ServiceRequest request, ServiceResults results,
diff --git a/stack/services/src/main/java/org/apache/usergrid/services/ServiceRequest.java b/stack/services/src/main/java/org/apache/usergrid/services/ServiceRequest.java
index 89f4976..f0f3227 100644
--- a/stack/services/src/main/java/org/apache/usergrid/services/ServiceRequest.java
+++ b/stack/services/src/main/java/org/apache/usergrid/services/ServiceRequest.java
@@ -60,13 +60,15 @@
     private final ServicePayload payload;
     private final List<ServiceParameter> originalParameters;
     private final boolean analyzeQueryOnly;
+    private final boolean returnQuery;
 
     // return results_set, result_entity, new_service, param_list, properties
 
 
     public ServiceRequest(ServiceManager services, ServiceAction action, String serviceName,
                           List<ServiceParameter> parameters, ServicePayload payload, boolean returnsTree,
-                          boolean returnsInboundConnections, boolean returnsOutboundConnections, boolean analyzeQueryOnly) {
+                          boolean returnsInboundConnections, boolean returnsOutboundConnections,
+                          boolean analyzeQueryOnly, boolean returnQuery) {
         this.services = services;
         this.action = action;
         parent = null;
@@ -80,6 +82,7 @@
         this.returnsInboundConnections = returnsInboundConnections;
         this.returnsOutboundConnections = returnsOutboundConnections;
         this.analyzeQueryOnly = analyzeQueryOnly;
+        this.returnQuery = returnQuery;
         if ( payload == null ) {
             payload = new ServicePayload();
         }
@@ -89,13 +92,13 @@
 
     public ServiceRequest( ServiceManager services, ServiceAction action, String serviceName,
                            List<ServiceParameter> parameters, ServicePayload payload, boolean returnsTree) {
-        this( services, action, serviceName, parameters, payload, returnsTree, true, true, false);
+        this( services, action, serviceName, parameters, payload, returnsTree, true, true, false, false);
     }
 
 
     public ServiceRequest( ServiceManager services, ServiceAction action, String serviceName,
                            List<ServiceParameter> parameters, ServicePayload payload ) {
-        this( services, action, serviceName, parameters, payload, false, true, true, false);
+        this( services, action, serviceName, parameters, payload, false, true, true, false, false);
     }
 
 
@@ -106,6 +109,7 @@
         this.returnsInboundConnections = parent.returnsInboundConnections;
         this.returnsOutboundConnections = parent.returnsOutboundConnections;
         this.analyzeQueryOnly = parent.analyzeQueryOnly;
+        this.returnQuery = parent.returnQuery;
         this.action = parent.action;
         this.payload = parent.payload;
         this.parent = parent;
@@ -124,7 +128,8 @@
     public ServiceRequest( ServiceManager services, ServiceAction action, ServiceRequest parent, EntityRef owner,
                            String path, String childPath, String serviceName, List<ServiceParameter> parameters,
                            ServicePayload payload, boolean returnsTree, boolean returnsInboundConnections,
-                           boolean returnsOutboundConnections, boolean analyzeQueryOnly ) {
+                           boolean returnsOutboundConnections, boolean analyzeQueryOnly,
+                           boolean returnQuery) {
         this.services = services;
         this.action = action;
         this.parent = parent;
@@ -138,25 +143,29 @@
         this.returnsInboundConnections = returnsInboundConnections;
         this.returnsOutboundConnections = returnsOutboundConnections;
         this.analyzeQueryOnly = analyzeQueryOnly;
+        this.returnQuery = returnQuery;
         this.payload = payload;
     }
 
     public ServiceRequest( ServiceManager services, ServiceAction action, ServiceRequest parent, EntityRef owner,
                            String path, String childPath, String serviceName, List<ServiceParameter> parameters,
                            ServicePayload payload, boolean returnsTree ) {
-        this(services, action, parent, owner, path, childPath, serviceName, parameters, payload, returnsTree, true, true, false);
+        this(services, action, parent, owner, path, childPath, serviceName, parameters, payload, returnsTree,
+            true, true, false, false);
     }
 
 
     public static ServiceRequest withPath( ServiceRequest r, String path ) {
         return new ServiceRequest( r.services, r.action, r.parent, r.owner, path, r.childPath, r.serviceName,
-                r.parameters, r.payload, r.returnsTree, r.returnsInboundConnections, r.returnsOutboundConnections, r.analyzeQueryOnly );
+            r.parameters, r.payload, r.returnsTree, r.returnsInboundConnections, r.returnsOutboundConnections,
+            r.analyzeQueryOnly, r.returnQuery);
     }
 
 
     public static ServiceRequest withChildPath( ServiceRequest r, String childPath ) {
         return new ServiceRequest( r.services, r.action, r.parent, r.owner, r.path, childPath, r.serviceName,
-                r.parameters, r.payload, r.returnsTree, r.returnsInboundConnections, r.returnsOutboundConnections, r.analyzeQueryOnly );
+            r.parameters, r.payload, r.returnsTree, r.returnsInboundConnections, r.returnsOutboundConnections,
+            r.analyzeQueryOnly, r.returnQuery);
     }
 
 
@@ -398,4 +407,8 @@
     public boolean isAnalyzeQueryOnly(){
         return analyzeQueryOnly;
     }
+
+    public boolean shouldReturnQuery(){
+        return returnQuery;
+    }
 }