Ejemplo n.º 1
0
        /// <summary>
        /// Executes a <see cref="IFtsQuery" /> request including any <see cref="ISearchParams" /> parameters asynchronously.
        /// </summary>
        /// <returns>A <see cref="ISearchQueryResult"/> wrapped in a <see cref="Task"/> for awaiting on.</returns>
        public async Task<ISearchQueryResult> QueryAsync(SearchQuery searchQuery)
        {
            var searchResult = new SearchQueryResult();
            var baseUri = ConfigContextBase.GetSearchUri();
            var requestUri = new Uri(baseUri, searchQuery.RelativeUri());
            var searchBody = searchQuery.Export().ToString();

            try
            {
                using (var httpClient = CreateHttpClient())
                using (var content = new StringContent(searchBody, Encoding.UTF8, "application/json"))
                using (var response = await httpClient.PostAsync(requestUri, content).ContinueOnAnyContext())
                using (var stream = await response.Content.ReadAsStreamAsync())
                {
                    if (response.IsSuccessStatusCode)
                    {
                        searchResult = DataMapper.Map<SearchQueryResult>(stream);
                    }
                    else
                    {
                        // ReSharper disable once UseStringInterpolation
                        var message = string.Format("{0}: {1}", (int)response.StatusCode, response.ReasonPhrase);
                        ProcessError(new HttpRequestException(message), searchResult);

                        using (var reader = new StreamReader(stream))
                        {
                            searchResult.Errors.Add(reader.ReadToEnd());
                        }
                        if (response.StatusCode == HttpStatusCode.NotFound)
                        {
                            baseUri.IncrementFailed();
                        }
                    }
                }
                baseUri.ClearFailed();
            }
            catch (HttpRequestException e)
            {
                Log.LogInformation("Search failed {0}: {1}{2}",  baseUri, Environment.NewLine, searchBody);
                baseUri.IncrementFailed();
                ProcessError(e, searchResult);
                Log.LogError(e.Message, e);
            }
            catch (AggregateException ae)
            {
                ae.Flatten().Handle(e =>
                {
                    Log.LogInformation("Search failed {0}: {1}{2}", baseUri, Environment.NewLine, searchBody);
                    ProcessError(e, searchResult);
                    return true;
                });
            }
            catch (Exception e)
            {
                Log.LogInformation("Search failed {0}: {1}{2}", baseUri, Environment.NewLine, searchBody);
                Log.LogInformation(e.Message);
                ProcessError(e, searchResult);
            }
            return searchResult;
        }
        /// <summary>
        /// Executes a <see cref="IFtsQuery" /> request including any <see cref="ISearchParams" /> parameters asynchronously.
        /// </summary>
        /// <returns>A <see cref="ISearchQueryResult"/> wrapped in a <see cref="Task"/> for awaiting on.</returns>
        public async Task <ISearchQueryResult> QueryAsync(SearchQuery searchQuery)
        {
            var searchResult = new SearchQueryResult();
            var baseUri      = ConfigContextBase.GetSearchUri();
            var requestUri   = new Uri(baseUri, searchQuery.RelativeUri());
            var searchBody   = searchQuery.Export().ToString();

            try
            {
                using (var httpClient = CreateHttpClient())
                    using (var content = new StringContent(searchBody, Encoding.UTF8, "application/json"))
                        using (var response = await httpClient.PostAsync(requestUri, content).ContinueOnAnyContext())
                            using (var stream = await response.Content.ReadAsStreamAsync())
                            {
                                if (response.IsSuccessStatusCode)
                                {
                                    searchResult = DataMapper.Map <SearchQueryResult>(stream);
                                }
                                else
                                {
                                    // ReSharper disable once UseStringInterpolation
                                    var message = string.Format("{0}: {1}", (int)response.StatusCode, response.ReasonPhrase);
                                    ProcessError(new HttpRequestException(message), searchResult);

                                    using (var reader = new StreamReader(stream))
                                    {
                                        searchResult.Errors.Add(reader.ReadToEnd());
                                    }
                                    if (response.StatusCode == HttpStatusCode.NotFound)
                                    {
                                        baseUri.IncrementFailed();
                                    }
                                }
                            }
                baseUri.ClearFailed();
            }
            catch (HttpRequestException e)
            {
                Log.InfoFormat("Search failed {0}: {1}{2}", baseUri, Environment.NewLine, searchBody);
                baseUri.IncrementFailed();
                ProcessError(e, searchResult);
                Log.Error(e);
            }
            catch (AggregateException ae)
            {
                ae.Flatten().Handle(e =>
                {
                    Log.InfoFormat("Search failed {0}: {1}{2}", baseUri, Environment.NewLine, searchBody);
                    ProcessError(e, searchResult);
                    return(true);
                });
            }
            catch (Exception e)
            {
                Log.InfoFormat("Search failed {0}: {1}{2}", baseUri, Environment.NewLine, searchBody);
                Log.Info(e);
                ProcessError(e, searchResult);
            }
            return(searchResult);
        }
Ejemplo n.º 3
0
 /// <summary>
 /// Processes the error.
 /// </summary>
 /// <param name="e">The <see cref="Exception"/> that was raised.</param>
 /// <param name="result">The <see cref="ISearchQueryResult"/> that will returned back to the caller with the failure state.</param>
 private static void ProcessError(Exception e, SearchQueryResult result)
 {
     result.Metrics.SuccessCount = 0;
     result.Metrics.ErrorCount   = 1;
     result.Status    = SearchStatus.Failed;
     result.Success   = false;
     result.Exception = e;
 }
 void ReadFacets(JsonTextReader reader, SearchQueryResult response)
 {
     if (reader.TokenType == JsonToken.StartObject && reader.Path.Contains("facets["))
     {
         var facet = JObject.Load(reader);
         //todo
     }
 }
        T IDataMapper.Map <T>(Stream stream)
        {
            var response = new SearchQueryResult();

            using (var reader = new JsonTextReader(new StreamReader(stream)))
            {
                while (reader.Read())
                {
                    ReadStatus(reader, response);
                    ReadHits(reader, response);
                }
            }
            return(response as T);
        }
        public T Map <T>(Stream stream) where T : class
        {
            var response = new SearchQueryResult();

            using (var reader = new JsonTextReader(new StreamReader(stream)))
            {
                while (reader.Read())
                {
                    ReadStatus(reader, response);
                    ReadHits(reader, response);
                }
            }
            return(response as T);
        }
 void ReadHits(JsonTextReader reader, SearchQueryResult response)
 {
     if (reader.TokenType == JsonToken.StartObject && reader.Path.Contains("hits["))
     {
         var hit = JObject.Load(reader);
         response.Add(new SearchQueryRow
         {
             Index       = hit["index"].Value <string>(),
             Id          = hit["id"].Value <string>(),
             Score       = hit["score"].Value <double>(),
             Explanation = ReadValue <dynamic>(hit, "explanation"),
             Locations   = ReadValue <dynamic>(hit, "locations"),
             Fragments   = ReadValue <Dictionary <string, List <string> > >(hit, "fragments"),
             Fields      = ReadValue <Dictionary <string, string> >(hit, "fields")
         });
     }
 }
Ejemplo n.º 8
0
        /// <summary>
        /// Executes a <see cref="IFtsQuery" /> request including any <see cref="ISearchParams" /> parameters asynchronously.
        /// </summary>
        /// <returns>A <see cref="ISearchQueryResult"/> wrapped in a <see cref="Task"/> for awaiting on.</returns>
        public async Task <ISearchQueryResult> QueryAsync(SearchQuery searchQuery, CancellationToken cancellationToken)
        {
            var searchResult = new SearchQueryResult();
            var baseUri      = ConfigContextBase.GetSearchUri();
            var requestUri   = new Uri(baseUri, searchQuery.RelativeUri());

            string searchBody;

            using (ClientConfiguration.Tracer.BuildSpan(searchQuery, CouchbaseOperationNames.RequestEncoding).Start())
            {
                searchBody = searchQuery.ToJson();
            }

            try
            {
                using (var content = new StringContent(searchBody, Encoding.UTF8, MediaType.Json))
                {
                    HttpResponseMessage response;
                    using (ClientConfiguration.Tracer.BuildSpan(searchQuery, CouchbaseOperationNames.DispatchToServer).Start())
                    {
                        response = await HttpClient.PostAsync(requestUri, content, cancellationToken).ContinueOnAnyContext();
                    }

                    using (ClientConfiguration.Tracer.BuildSpan(searchQuery, CouchbaseOperationNames.ResponseDecoding).Start())
                        using (var stream = await response.Content.ReadAsStreamAsync().ContinueOnAnyContext())
                        {
                            if (response.IsSuccessStatusCode)
                            {
                                searchResult = DataMapper.Map <SearchQueryResult>(stream);
                            }
                            else
                            {
                                string responseContent;
                                using (var reader = new StreamReader(stream))
                                {
                                    responseContent = await reader.ReadToEndAsync().ContinueOnAnyContext();
                                }

                                if (response.Content.Headers.TryGetValues("Content-Type", out var values) &&
                                    values.Any(value => value.Contains(MediaType.Json)))
                                {
                                    // server 5.5+ responds with JSON content
                                    var result = JsonConvert.DeserializeObject <FailedSearchQueryResult>(responseContent);
                                    ProcessError(new HttpRequestException(result.Message), searchResult);
                                    searchResult.Errors.Add(result.Message);
                                }
                                else
                                {
                                    // use response content as raw string
                                    // ReSharper disable once UseStringInterpolation
                                    var message = string.Format("{0}: {1}", (int)response.StatusCode, response.ReasonPhrase);
                                    ProcessError(new HttpRequestException(message), searchResult);
                                    searchResult.Errors.Add(responseContent);
                                }

                                if (response.StatusCode == HttpStatusCode.NotFound)
                                {
                                    baseUri.IncrementFailed();
                                }
                            }
                        }
                }
                baseUri.ClearFailed();
            }
            catch (TaskCanceledException)
            {
                var operationContext = new OperationContext("fts", string.Empty)
                {
                    RemoteEndpoint = baseUri.Authority
                };

                Log.Info(operationContext.ToString());
            }
            catch (HttpRequestException e)
            {
                Log.Info("Search failed {0}: {1}{2}", baseUri, Environment.NewLine, User(searchBody));
                baseUri.IncrementFailed();
                ProcessError(e, searchResult);
                Log.Error(e);
            }
            catch (AggregateException ae)
            {
                ae.Flatten().Handle(e =>
                {
                    Log.Info("Search failed {0}: {1}{2}", baseUri, Environment.NewLine, User(searchBody));
                    ProcessError(e, searchResult);
                    return(true);
                });
            }
            catch (Exception e)
            {
                Log.Info("Search failed {0}: {1}{2}", baseUri, Environment.NewLine, User(searchBody));
                Log.Info(e);
                ProcessError(e, searchResult);
            }

            UpdateLastActivity();

            return(searchResult);
        }
 void ReadStatus(JsonTextReader reader, SearchQueryResult response)
 {
     if (reader.Path == "total_hits")
     {
         var totalHits = reader.ReadAsInt32();
         if (totalHits != null)
         {
             response.TotalHits = (long)totalHits;
             return;
         }
     }
     if (reader.Path == "max_score")
     {
         var maxScore = reader.ReadAsDecimal();
         if (maxScore != null)
         {
             response.MaxScore = (double)maxScore;
             return;
         }
     }
     if (reader.Path == "took")
     {
         var took = reader.ReadAsString();
         if (took != null)
         {
             response.Took = new TimeSpan(long.Parse(took));
             return;
         }
     }
     if (reader.Path == "status.failed")
     {
         var failed = reader.ReadAsInt32();
         if (failed != null)
         {
             response.ErrorCount = (long)failed;
             response.Success    = failed.Value >= 0;
             return;
         }
     }
     if (reader.Path == "status.successful")
     {
         var success = reader.ReadAsInt32();
         if (success != null)
         {
             response.SuccessCount = success.Value;
             return;
         }
     }
     if (reader.Path == "status.total")
     {
         var total = reader.ReadAsInt32();
         if (total != null)
         {
             response.TotalCount = total.Value;
         }
     }
     if (reader.Path == "status.errors")
     {
         var errors = reader.ReadAsString();
         if (errors != null)
         {
             response.Errors = JsonConvert.DeserializeObject <List <string> >(errors);
         }
     }
 }
        /// <summary>
        /// Executes a <see cref="IFtsQuery" /> request including any <see cref="ISearchParams" /> parameters asynchronously.
        /// </summary>
        /// <returns>A <see cref="ISearchQueryResult"/> wrapped in a <see cref="Task"/> for awaiting on.</returns>
        public async Task <ISearchQueryResult> QueryAsync(SearchQuery searchQuery)
        {
            var searchResult = new SearchQueryResult();
            var baseUri      = ConfigContextBase.GetSearchUri();
            var requestUri   = new Uri(baseUri, searchQuery.RelativeUri());

            string searchBody;

            using (ClientConfiguration.Tracer.BuildSpan(searchQuery, CouchbaseOperationNames.RequestEncoding).Start())
            {
                searchBody = searchQuery.ToJson();
            }

            try
            {
                using (var content = new StringContent(searchBody, Encoding.UTF8, MediaType.Json))
                {
                    HttpResponseMessage response;
                    using (ClientConfiguration.Tracer.BuildSpan(searchQuery, CouchbaseOperationNames.DispatchToServer).Start())
                    {
                        response = await HttpClient.PostAsync(requestUri, content).ContinueOnAnyContext();
                    }

                    using (ClientConfiguration.Tracer.BuildSpan(searchQuery, CouchbaseOperationNames.ResponseDecoding).Start())
                        using (var stream = await response.Content.ReadAsStreamAsync().ContinueOnAnyContext())
                        {
                            if (response.IsSuccessStatusCode)
                            {
                                searchResult = DataMapper.Map <SearchQueryResult>(stream);
                            }
                            else
                            {
                                // ReSharper disable once UseStringInterpolation
                                var message = string.Format("{0}: {1}", (int)response.StatusCode, response.ReasonPhrase);
                                ProcessError(new HttpRequestException(message), searchResult);

                                using (var reader = new StreamReader(stream))
                                {
                                    searchResult.Errors.Add(await reader.ReadToEndAsync().ContinueOnAnyContext());
                                }
                                if (response.StatusCode == HttpStatusCode.NotFound)
                                {
                                    baseUri.IncrementFailed();
                                }
                            }
                        }
                }
                baseUri.ClearFailed();
            }
            catch (HttpRequestException e)
            {
                Log.Info("Search failed {0}: {1}{2}", baseUri, Environment.NewLine, User(searchBody));
                baseUri.IncrementFailed();
                ProcessError(e, searchResult);
                Log.Error(e);
            }
            catch (AggregateException ae)
            {
                ae.Flatten().Handle(e =>
                {
                    Log.Info("Search failed {0}: {1}{2}", baseUri, Environment.NewLine, User(searchBody));
                    ProcessError(e, searchResult);
                    return(true);
                });
            }
            catch (Exception e)
            {
                Log.Info("Search failed {0}: {1}{2}", baseUri, Environment.NewLine, User(searchBody));
                Log.Info(e);
                ProcessError(e, searchResult);
            }

            UpdateLastActivity();

            return(searchResult);
        }
Ejemplo n.º 11
0
 /// <summary>
 /// Processes the error.
 /// </summary>
 /// <param name="e">The <see cref="Exception"/> that was raised.</param>
 /// <param name="result">The <see cref="ISearchQueryResult"/> that will returned back to the caller with the failure state.</param>
 static void ProcessError(Exception e, SearchQueryResult result)
 {
     result.SuccessCount = 0;
     result.ErrorCount = 1;
     result.Status = SearchStatus.Failed;
     result.Success = false;
     result.Exception = e;
 }
 private static void ReadStatus(JsonTextReader reader, SearchQueryResult response)
 {
     if (reader.Path == "total_hits")
     {
         var totalHits = reader.ReadAsInt32();
         if (totalHits != null)
         {
             response.Metrics.TotalHits = (long)totalHits;
             return;
         }
     }
     if (reader.Path == "max_score")
     {
         var maxScore = reader.ReadAsDecimal();
         if (maxScore != null)
         {
             response.Metrics.MaxScore = (double)maxScore;
             return;
         }
     }
     if (reader.Path == "took")
     {
         var took = reader.ReadAsString();
         if (took != null)
         {
             response.Metrics.Took = new TimeSpan(long.Parse(took));
             return;
         }
     }
     if (reader.Path == "status.failed")
     {
         var failed = reader.ReadAsInt32();
         if (failed != null)
         {
             response.Metrics.ErrorCount = (long)failed;
             response.Success            = failed.Value >= 0;
             return;
         }
     }
     if (reader.Path == "status.successful")
     {
         var success = reader.ReadAsInt32();
         if (success != null)
         {
             response.Metrics.SuccessCount = success.Value;
             return;
         }
     }
     if (reader.Path == "status.total")
     {
         var total = reader.ReadAsInt32();
         if (total != null)
         {
             response.Metrics.TotalCount = total.Value;
         }
     }
     if (reader.Path == "status.errors")
     {
         var errors = reader.ReadAsString();
         if (errors != null)
         {
             response.Errors = JsonConvert.DeserializeObject <List <string> >(errors);
         }
     }
     if (reader.Path == "facets" && reader.TokenType == JsonToken.StartObject)
     {
         var obj = JObject.Load(reader);
         if (obj != null)
         {
             foreach (var item in obj)
             {
                 if (item.Value["terms"] != null)
                 {
                     var result = item.Value.ToObject <TermFacetResult>();
                     result.Name  = item.Key;
                     result.Terms = item.Value["terms"].ToObject <List <Term> >();
                     response.Facets.Add(item.Key, result);
                 }
                 else if (item.Value["numeric_ranges"] != null)
                 {
                     var result = item.Value.ToObject <NumericRangeFacetResult>();
                     result.Name          = item.Key;
                     result.NumericRanges = item.Value["numeric_ranges"].ToObject <List <NumericRange> >();
                     response.Facets.Add(item.Key, result);
                 }
                 else if (item.Value["date_ranges"] != null)
                 {
                     var result = item.Value.ToObject <DateRangeFacetResult>();
                     result.Name       = item.Key;
                     result.DateRanges = item.Value["date_ranges"].ToObject <List <DateRange> >();
                     response.Facets.Add(item.Key, result);
                 }
                 else
                 {
                     var result = item.Value.ToObject <DefaultFacetResult>();
                     result.Name = item.Key;
                     response.Facets.Add(item.Key, result);
                 }
             }
         }
     }
 }