/// <inheritdoc />
        public IAnalyticsDeferredResultHandle <T> ImportDeferredQueryHandle <T>(string encodedHandle)
        {
            var json = JObject.Parse(encodedHandle);

            if (json["v"].Value <string>() != "1")
            {
                throw new ArgumentException("Invalid encoded handle.");
            }

            var uri = json["uri"].Value <string>();

            if (string.IsNullOrWhiteSpace(uri))
            {
                throw new ArgumentException("Invalid encoded handle.");
            }

            var result = new AnalyticsResult <T> {
                MetaData = new MetaData {
                    Status = QueryStatus.Running
                }
            };                                                                                            // default to running

            return(new AnalyticsDeferredResultHandle <T>(result, HttpClient, DataMapper, uri));
        }
Пример #2
0
        internal AnalyticsResult <T> ToQueryResult(HttpClient client, IDataMapper dataMapper)
        {
            var result = new AnalyticsResult <T>
            {
                Rows     = results.ToList(),
                MetaData = new MetaData
                {
                    Status          = status,
                    RequestId       = requestID,
                    ClientContextId = clientContextID,
                    Signature       = signature,
                    Errors          = errors?.Select(e => e.ToError()).ToList(),
                    Warnings        = warnings?.Select(w => w.ToWarning()).ToList(),
                    Metrics         = metrics?.ToMetrics()
                }
            };

            if (!string.IsNullOrWhiteSpace(handle))
            {
                result.Handle = new AnalyticsDeferredResultHandle <T>(result, client, dataMapper, handle);
            }

            return(result);
        }
        /// <summary>
        /// Queries the asynchronous.
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="queryRequest">The query request.</param>
        /// <param name="token">The token.</param>
        /// <returns></returns>
        public async Task <IAnalyticsResult <T> > QueryAsync <T>(IAnalyticsRequest queryRequest, CancellationToken token)
        {
            // try get Analytics node
            if (!ClusterOptions.GlobalNodes.TryGetRandom(x => x.HasAnalytics(), out var node))
            {
                //const string noNodeAvailableMessage = "Unable to locate analytics node to submit query to.";
                //Logger.LogError(noNodeAvailableMessage);
                throw new ServiceNotAvailableException(ServiceType.Analytics);
            }

            var result = new AnalyticsResult <T>();

            string body;

            //using (ClientConfiguration.Tracer.BuildSpan(queryRequest, CouchbaseOperationNames.RequestEncoding).StartActive())
            //{
            body = queryRequest.GetFormValuesAsJson();
            //}

            using (var content = new StringContent(body, System.Text.Encoding.UTF8, MediaType.Json))
            {
                try
                {
                    //Log.Trace("Sending analytics query cid{0}: {1}", queryRequest.CurrentContextId, baseUri);

                    HttpResponseMessage response;
                    //using (ClientConfiguration.Tracer.BuildSpan(queryRequest, CouchbaseOperationNames.DispatchToServer).StartActive())
                    //{
                    var request = new HttpRequestMessage(HttpMethod.Post, node.AnalyticsUri)
                    {
                        Content = content
                    };

                    if (queryRequest is AnalyticsRequest req && req.PriorityValue != 0)
                    {
                        request.Headers.Add(AnalyticsPriorityHeaderName, new[] { req.PriorityValue.ToString() });
                    }

                    response = await HttpClient.SendAsync(request, token).ConfigureAwait(false);

                    //}

                    //using (var scope = ClientConfiguration.Tracer.BuildSpan(queryRequest, CouchbaseOperationNames.ResponseDecoding).StartActive())
                    using (var stream = await response.Content.ReadAsStreamAsync().ConfigureAwait(false))
                    {
                        result = DataMapper.Map <AnalyticsResultData <T> >(stream).ToQueryResult(HttpClient, DataMapper);
                        //result.MetaData.Success = result.MetaData.Status == QueryStatus.Success || result.MetaData.Status == QueryStatus.Running;
                        result.MetaData.HttpStatusCode = response.StatusCode;
                        //Log.Trace("Received analytics query cid{0}: {1}", result.ClientContextId, result.ToString());

                        //scope.Span.SetPeerLatencyTag(result.Metrics.ElaspedTime);
                    }
                    //uri.ClearFailed();analytu
                }
                catch (OperationCanceledException e)
                {
                    //var operationContext = OperationContext.CreateAnalyticsContext(queryRequest.CurrentContextId, Context.BucketName, uri?.Authority);
                    //if (queryRequest is AnalyticsRequest request)
                    //{
                    //    operationContext.TimeoutMicroseconds = request.TimeoutValue;
                    //}

                    //Log.Info(operationContext.ToString());
                    ProcessError(e, result);
                }
                catch (HttpRequestException e)
                {
                    //Log.Info("Failed analytics query cid{0}: {1}", queryRequest.CurrentContextId, baseUri);
                    //uri.IncrementFailed();
                    ProcessError(e, result);
                    //Log.Error(e);
                }
                catch (AggregateException ae)
                {
                    ae.Flatten().Handle(e =>
                    {
                        //Log.Info("Failed analytics query cid{0}: {1}", queryRequest.CurrentContextId, baseUri);
                        //Log.Error(e);
                        ProcessError(e, result);
                        return(true);
                    });
                }
                catch (Exception e)
                {
                    //Log.Info("Failed analytics query cid{0}: {1}", queryRequest.CurrentContextId, baseUri);
                    //Log.Info(e);
                    ProcessError(e, result);
                }
            }

            UpdateLastActivity();

            return(result);
        }
 private static void ProcessError <T>(Exception exception, AnalyticsResult <T> queryResult)
 {
     queryResult.MetaData.Status         = QueryStatus.Fatal;
     queryResult.MetaData.HttpStatusCode = HttpStatusCode.BadRequest;
 }