protected virtual string GenerateRelativeUrl(SearchIndexRequest request)
 {
     return string.Format("/_design/{0}/_search/{1}{2}",
         request.IndexIdentity.DesignDocument,
         request.IndexIdentity.Name,
         GenerateRequestUrlQueryString(request));
 }
        public virtual HttpRequest Create(SearchIndexRequest request)
        {
            Ensure.That(request, "request").IsNotNull();

            return new HttpRequest(HttpMethod.Get, GenerateRelativeUrl(request))
                .SetRequestTypeHeader(request.GetType());
        }
        protected virtual IDictionary<string, string> GenerateJsonCompatibleKeyValues(SearchIndexRequest request)
        {
            var kvs = new Dictionary<string, string>();

            if (!string.IsNullOrWhiteSpace(request.Expression))
                kvs.Add(KeyNames.Expression, request.Expression);

            if (request.HasSortings())
                kvs.Add(KeyNames.Sort, DocumentSerializer.ToJsonArray(request.Sort.ToArray()));

            if (!string.IsNullOrWhiteSpace(request.Bookmark))
                kvs.Add(KeyNames.Bookmark, request.Bookmark);

            if (request.Stale.HasValue)
                kvs.Add(KeyNames.Stale, request.Stale.Value.AsString());

            if (request.Limit.HasValue)
                kvs.Add(KeyNames.Limit, DocumentSerializer.ToJson(request.Limit.Value));

            if (request.IncludeDocs.HasValue)
                kvs.Add(KeyNames.IncludeDocs, DocumentSerializer.ToJson(request.IncludeDocs.Value));
            
            if (request.Ranges != null)
                kvs.Add(KeyNames.Ranges, Serializer.Serialize(request.Ranges));

            if (request.HasCounts())
                kvs.Add(KeyNames.Counts, DocumentSerializer.ToJsonArray(request.Counts.ToArray()));

            if (!string.IsNullOrWhiteSpace(request.GroupField))
                kvs.Add(KeyNames.GroupField, request.GroupField);

            if (request.GroupLimit.HasValue)
                kvs.Add(KeyNames.GroupLimit, DocumentSerializer.ToJson(request.GroupLimit.Value));

            if (request.HasGroupSortings())
                kvs.Add(KeyNames.GroupSort, DocumentSerializer.ToJsonArray(request.GroupSort.ToArray()));

            if (request.DrillDown.HasValue)
                kvs.Add(KeyNames.DrillDown, DocumentSerializer.ToJsonArray(new []{ request.DrillDown.Value.Key, request.DrillDown.Value.Value }));

            return kvs;
        }
 protected virtual string GenerateQueryStringParams(SearchIndexRequest request)
 {
     return string.Join("&", GenerateJsonCompatibleKeyValues(request)
         .Select(kv => string.Format("{0}={1}", kv.Key, Uri.EscapeDataString(kv.Value))));
 }
        protected virtual string GenerateRequestUrlQueryString(SearchIndexRequest request)
        {
            var p = GenerateQueryStringParams(request);

            return string.IsNullOrEmpty(p) ? string.Empty : string.Concat("?", p);
        }