/// <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()) }; })); }
/// <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(), }; } })); }
///<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>()); }
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()); } }
/// <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(), }; })); }
/// <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(), }); }
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()), }); }
/// <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; } })); }