示例#1
0
        /// <summary>
        /// Begins the async query.
        /// </summary>
        /// <param name="index">The index.</param>
        /// <param name="query">The query.</param>
        /// <param name="includes">The include paths</param>
        public Task <QueryResult> QueryAsync(string index, IndexQuery query, string[] includes)
        {
            EnsureIsNotNullOrEmpty(index, "index");
            var path = query.GetIndexQueryUrl(url, index, "indexes");

            if (includes != null && includes.Length > 0)
            {
                path += "&" + string.Join("&", includes.Select(x => "include=" + x).ToArray());
            }
            var request = jsonRequestFactory.CreateHttpJsonRequest(this, path, "GET", credentials, convention);

            return(Task.Factory.FromAsync <string>(request.BeginReadResponseString, request.EndReadResponseString, null)
                   .ContinueWith(task =>
            {
                RavenJObject json;
                using (var reader = new JsonTextReader(new StringReader(task.Result)))
                    json = (RavenJObject)RavenJToken.Load(reader);

                return new QueryResult
                {
                    IsStale = Convert.ToBoolean(json["IsStale"].ToString()),
                    IndexTimestamp = json.Value <DateTime>("IndexTimestamp"),
                    IndexEtag = new Guid(request.ResponseHeaders["ETag"]),
                    Results = ((RavenJArray)json["Results"]).Cast <RavenJObject>().ToList(),
                    TotalResults = Convert.ToInt32(json["TotalResults"].ToString()),
                    IndexName = json.Value <string>("IndexName"),
                    SkippedResults = Convert.ToInt32(json["SkippedResults"].ToString())
                };
            }));
        }
示例#2
0
        /// <summary>
        /// Returns a list of suggestions based on the specified suggestion query.
        /// </summary>
        /// <param name="index">The index to query for suggestions</param>
        /// <param name="suggestionQuery">The suggestion query.</param>
        public Task <SuggestionQueryResult> SuggestAsync(string index, SuggestionQuery suggestionQuery)
        {
            if (suggestionQuery == null)
            {
                throw new ArgumentNullException("suggestionQuery");
            }

            var requestUri = url + string.Format("/suggest/{0}?term={1}&field={2}&max={3}&distance={4}&accuracy={5}",
                                                 Uri.EscapeUriString(index),
                                                 Uri.EscapeDataString(suggestionQuery.Term),
                                                 Uri.EscapeDataString(suggestionQuery.Field),
                                                 Uri.EscapeDataString(suggestionQuery.MaxSuggestions.ToString()),
                                                 Uri.EscapeDataString(suggestionQuery.Distance.ToString()),
                                                 Uri.EscapeDataString(suggestionQuery.Accuracy.ToString()));

            var request = jsonRequestFactory.CreateHttpJsonRequest(this, requestUri.NoCache(), "GET", credentials, convention);

            request.AddOperationHeaders(OperationsHeaders);

            return(request.ReadResponseStringAsync()
                   .ContinueWith(task =>
            {
                using (var reader = new JsonTextReader(new StringReader(task.Result)))
                {
                    var json = (RavenJObject)RavenJToken.Load(reader);
                    return new SuggestionQueryResult
                    {
                        Suggestions = ((RavenJArray)json["Suggestions"]).Select(x => x.Value <string>()).ToArray(),
                    };
                }
            }));
        }
示例#3
0
        ///<summary>
        /// Get the possible terms for the specified field in the index
        /// You can page through the results by use fromValue parameter as the
        /// starting point for the next query
        ///</summary>
        ///<returns></returns>
        public IEnumerable <string> GetTerms(string index, string field, string fromValue, int pageSize)
        {
            var requestUri = url + string.Format("/terms/{0}?field={1}&pageSize={2}&fromValue={3}",
                                                 Uri.EscapeUriString(index),
                                                 Uri.EscapeDataString(field),
                                                 pageSize,
                                                 Uri.EscapeDataString(fromValue ?? ""));

            var request = jsonRequestFactory.CreateHttpJsonRequest(this, requestUri, "GET", credentials, convention);

            request.AddOperationHeaders(OperationsHeaders);

            RavenJToken json;

            try
            {
                using (var reader = new JsonTextReader(new StringReader(request.ReadResponseString())))
                    json = RavenJToken.Load(reader);
            }
            catch (WebException e)
            {
                var httpWebResponse = e.Response as HttpWebResponse;
                if (httpWebResponse != null && httpWebResponse.StatusCode == HttpStatusCode.InternalServerError)
                {
                    throw new InvalidOperationException("could not execute suggestions at this time");
                }
                throw;
            }
            return(json.Values <string>());
        }
示例#4
0
        public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
        {
            // NOTE: THIS DOESN'T SUPPORT READING OF DynamicJsonObject !!!

            var o = RavenJToken.Load(reader);

            return((o.Type == JTokenType.Null || o.Type == JTokenType.Undefined) ? null : o);
        }
        private void WriteStreamContentMaybeJson(StringBuilder requestStringBuilder, Stream stream, NameValueCollection headers)
        {
            stream.Position = 0;

            if (headers["Content-Type"] == "application/json; charset=utf-8" && stream.Length > 0)
            {
                var t = RavenJToken.Load(new RavenJsonTextReader(new StreamReader(stream)));
                requestStringBuilder.Append(t.ToString(Formatting.Indented));
            }
            else
            {
                var streamReader = new StreamReader(stream);
                requestStringBuilder.Append(streamReader.ReadToEnd());
            }
        }
示例#6
0
        /// <summary>
        /// Begins the async query.
        /// </summary>
        /// <param name="query">A string representation of a Linq query</param>
        public Task <QueryResult> LinearQueryAsync(string linq, int start, int pageSize)
        {
            var query = @"{
					Query: '"                     + linq + @"',
                    Start: " + start + @",
                    PageSize: " + pageSize + @"
					}"                    ;

            var metadata = new RavenJObject();
            var request  = jsonRequestFactory.CreateHttpJsonRequest(this, url + "/linearQuery", "POST", metadata, credentials, convention);

            request.AddOperationHeaders(OperationsHeaders);

            return(request
                   .WriteAsync(Encoding.UTF8.GetBytes(query))
                   .ContinueWith(write =>
            {
                if (write.Exception != null)
                {
                    throw new InvalidOperationException("Unable to write to server");
                }

                return request.ReadResponseStringAsync();
            })
                   .ContinueWith(task =>
            {
                RavenJObject json;
                using (var reader = new JsonTextReader(new StringReader(task.Result.Result)))
                    json = (RavenJObject)RavenJToken.Load(reader);

                //TODO: the json includes LastScanResults and Errors, but it doesn't include the commented out properties below.
                // Should this change?
                return new QueryResult
                {
                    //IsStale = Convert.ToBoolean(json["IsStale"].ToString()),
                    //IndexTimestamp = json.Value<DateTime>("IndexTimestamp"),
                    //IndexEtag = new Guid(request.ResponseHeaders["ETag"].First()),
                    Results = ((RavenJArray)json["Results"]).Cast <RavenJObject>().ToList(),
                    TotalResults = Convert.ToInt32(json["TotalResults"].ToString()),
                    //SkippedResults = Convert.ToInt32(json["SkippedResults"].ToString()),
                    //Includes = json["Includes"].Children().Cast<RavenJObject>().ToList(),
                };
            }));
        }
示例#7
0
        /// <summary>
        /// Returns a list of suggestions based on the specified suggestion query.
        /// </summary>
        /// <param name="index">The index to query for suggestions</param>
        /// <param name="suggestionQuery">The suggestion query.</param>
        /// <returns></returns>
        public SuggestionQueryResult Suggest(string index, SuggestionQuery suggestionQuery)
        {
            if (suggestionQuery == null)
            {
                throw new ArgumentNullException("suggestionQuery");
            }

            var requestUri = url + string.Format("/suggest/{0}?term={1}&field={2}&max={3}&distance={4}&accuracy={5}",
                                                 Uri.EscapeUriString(index),
                                                 Uri.EscapeDataString(suggestionQuery.Term),
                                                 Uri.EscapeDataString(suggestionQuery.Field),
                                                 Uri.EscapeDataString(suggestionQuery.MaxSuggestions.ToString()),
                                                 Uri.EscapeDataString(suggestionQuery.Distance.ToString()),
                                                 Uri.EscapeDataString(suggestionQuery.Accuracy.ToString()));

            var request = jsonRequestFactory.CreateHttpJsonRequest(this, requestUri, "GET", credentials, convention);

            request.AddOperationHeaders(OperationsHeaders);

            RavenJObject json;

            try
            {
                using (var reader = new JsonTextReader(new StringReader(request.ReadResponseString())))
                    json = (RavenJObject)RavenJToken.Load(reader);
            }
            catch (WebException e)
            {
                var httpWebResponse = e.Response as HttpWebResponse;
                if (httpWebResponse != null && httpWebResponse.StatusCode == HttpStatusCode.InternalServerError)
                {
                    throw new InvalidOperationException("could not execute suggestions at this time");
                }
                throw;
            }

            return(new SuggestionQueryResult
            {
                Suggestions = ((RavenJArray)json["Suggestions"]).Select(x => x.Value <string>()).ToArray(),
            });
        }
示例#8
0
        private QueryResult DirectQuery(string index, IndexQuery query, string operationUrl, string[] includes)
        {
            string path = query.GetIndexQueryUrl(operationUrl, index, "indexes");

            if (includes != null && includes.Length > 0)
            {
                path += "&" + string.Join("&", includes.Select(x => "include=" + x).ToArray());
            }
            var request = jsonRequestFactory.CreateHttpJsonRequest(this, path, "GET", credentials, convention);

            request.AddOperationHeaders(OperationsHeaders);

            RavenJObject json;

            try
            {
                using (var reader = new JsonTextReader(new StringReader(request.ReadResponseString())))
                    json = (RavenJObject)RavenJToken.Load(reader);
            }
            catch (WebException e)
            {
                var httpWebResponse = e.Response as HttpWebResponse;
                if (httpWebResponse != null && httpWebResponse.StatusCode == HttpStatusCode.NotFound)
                {
                    throw new InvalidOperationException("There is no index named: " + index);
                }
                throw;
            }
            return(new QueryResult
            {
                IsStale = Convert.ToBoolean(json["IsStale"].ToString()),
                IndexTimestamp = json.Value <DateTime>("IndexTimestamp"),
                IndexEtag = new Guid(request.ResponseHeaders["ETag"]),
                Results = ((RavenJArray)json["Results"]).Cast <RavenJObject>().ToList(),
                Includes = ((RavenJArray)json["Includes"]).Cast <RavenJObject>().ToList(),
                TotalResults = Convert.ToInt32(json["TotalResults"].ToString()),
                IndexName = json.Value <string>("IndexName"),
                SkippedResults = Convert.ToInt32(json["SkippedResults"].ToString()),
            });
        }
示例#9
0
        /// <summary>
        /// Using the given Index, calculate the facets as per the specified doc
        /// </summary>
        public Task <IDictionary <string, IEnumerable <FacetValue> > > GetFacetsAsync(string index, IndexQuery query, string facetSetupDoc)
        {
            var requestUri = url + string.Format("/facets/{0}?facetDoc={1}&query={2}",
                                                 Uri.EscapeUriString(index),
                                                 Uri.EscapeDataString(facetSetupDoc),
                                                 Uri.EscapeDataString(query.Query));

            var request = jsonRequestFactory.CreateHttpJsonRequest(this, requestUri.NoCache(), "GET", credentials, convention);

            request.AddOperationHeaders(OperationsHeaders);

            return(request.ReadResponseStringAsync()
                   .ContinueWith(task =>
            {
                using (var reader = new JsonTextReader(new StringReader(task.Result)))
                {
                    var json = (RavenJObject)RavenJToken.Load(reader);
                    var jsonAsType = json.JsonDeserialization <IDictionary <string, IEnumerable <FacetValue> > >();
                    return jsonAsType;
                }
            }));
        }