public virtual async Task <IHttpActionResult> GetFacets(string facets, string userFilter = null, string query = null)
        {
            var systemFilter = GetSystemFilter(HasOrganizationFilter(query), _supportsSoftDeletes);

            var fo  = AggregationOptions.Parse(facets);
            var res = await _repository.GetAggregationsAsync(systemFilter, fo, userFilter);

            return(Ok(res));
        }
        public async Task <IHttpActionResult> GetInternal(SystemFilterQuery systemFilter = null, string userFilter = null, string query = null, string sort = null, string offset = null, string mode = null, int page = 1, int limit = 10, string facet = null)
        {
            page  = GetPage(page);
            limit = GetLimit(limit);
            var skip = GetSkip(page + 1, limit);

            if (skip > MAXIMUM_SKIP)
            {
                return(BadRequest("Cannot get requested page"));
            }

            if (systemFilter == null)
            {
                systemFilter = GetSystemFilter(HasOrganizationFilter(query), _supportsSoftDeletes);
            }

            var fo = AggregationOptions.Parse(facet);

            FindResults <TModel> results;

            try {
                results = await _repository.SearchAsync(systemFilter, userFilter, query, sort, new PagingOptions { Limit = limit, Page = page }, fo);
            } catch (ApplicationException ex) {
                ex.ToExceptionless().SetProperty("Search Filter", new { SystemFilter = systemFilter, UserFilter = query, Sort = sort, Offset = offset, Page = page, Limit = limit }).AddTags("Search").Submit();
                return(BadRequest("An error has occurred. Please check your search filter."));
            }

            if (!String.IsNullOrEmpty(mode) && String.Equals(mode, "summary", StringComparison.InvariantCultureIgnoreCase))
            {
                return(OkWithResourceLinks(await MapCollection <TViewModel>(results.Documents, true), results.HasMore, page, results.Total));
            }

            var mappedModels = await MapCollection <TViewModel>(results.Documents, true);

            var hasMore = results.HasMore && !NextPageExceedsSkipLimit(page, limit);

            if (facet != null)
            {
                var wrappedResult = new ResultWithFacets <TViewModel> {
                    Results = mappedModels, Facets = results.Aggregations
                };
                return(OkWithResourceLinks(wrappedResult, hasMore, page, results.Total));
            }

            return(OkWithResourceLinks(mappedModels, hasMore, page, results.Total));
        }