public static CosmosQueryResponse ConvertToCosmosQueryResponse(
            FeedResponse <CosmosElement> dynamicFeed,
            CosmosSerializationOptions cosmosSerializationOptions)
        {
            IJsonWriter jsonWriter;

            if (cosmosSerializationOptions != null)
            {
                jsonWriter = cosmosSerializationOptions.CreateCustomWriterCallback();
            }
            else
            {
                jsonWriter = JsonWriter.Create(JsonSerializationFormat.Text);
            }

            jsonWriter.WriteArrayStart();

            foreach (CosmosElement cosmosElement in dynamicFeed)
            {
                cosmosElement.WriteTo(jsonWriter);
            }

            jsonWriter.WriteArrayEnd();

            MemoryStream memoryStream = new MemoryStream(jsonWriter.GetResult());

            return(new CosmosQueryResponse(
                       dynamicFeed.Headers,
                       memoryStream,
                       dynamicFeed.Count,
                       dynamicFeed.ResponseContinuation,
                       dynamicFeed.QueryMetrics));
        }
Exemple #2
0
        /// <summary>
        /// DEVNOTE: Need to refactor to use CosmosJsonSerializer
        /// Todo: This method can be optimized by not writing the result out to text.
        /// </summary>
        public static DocumentFeedResponse <T> ConvertCosmosElementFeed <T>(
            DocumentFeedResponse <CosmosElement> dynamicFeed,
            ResourceType resourceType,
            JsonSerializerSettings settings)
        {
            if (dynamicFeed.Count == 0)
            {
                return(new DocumentFeedResponse <T>(
                           new List <T>(),
                           dynamicFeed.Count,
                           dynamicFeed.Headers,
                           dynamicFeed.UseETagAsContinuation,
                           dynamicFeed.QueryMetrics,
                           dynamicFeed.RequestStatistics,
                           dynamicFeed.DisallowContinuationTokenMessage,
                           dynamicFeed.ResponseLengthBytes));
            }

            IJsonWriter jsonWriter = JsonWriter.Create(JsonSerializationFormat.Text);

            jsonWriter.WriteArrayStart();

            foreach (CosmosElement cosmosElement in dynamicFeed)
            {
                cosmosElement.WriteTo(jsonWriter);
            }

            jsonWriter.WriteArrayEnd();

            ReadOnlyMemory <byte> buffer = jsonWriter.GetResult();
            string jsonText = Utf8StringHelpers.ToString(buffer);

            IEnumerable <T> typedResults;

            // If the resource type is an offer and the requested type is either a Offer or OfferV2 or dynamic
            // create a OfferV2 object and cast it to T. This is a temporary fix until offers is moved to v3 API.
            if (resourceType == ResourceType.Offer &&
                (typeof(T).IsSubclassOf(typeof(Documents.Resource)) || typeof(T) == typeof(object)))
            {
                typedResults = JsonConvert.DeserializeObject <List <OfferV2> >(jsonText, settings).Cast <T>();
            }
            else
            {
                typedResults = JsonConvert.DeserializeObject <List <T> >(jsonText, settings);
            }

            return(new DocumentFeedResponse <T>(
                       typedResults,
                       dynamicFeed.Count,
                       dynamicFeed.Headers,
                       dynamicFeed.UseETagAsContinuation,
                       dynamicFeed.QueryMetrics,
                       dynamicFeed.RequestStatistics,
                       dynamicFeed.DisallowContinuationTokenMessage,
                       dynamicFeed.ResponseLengthBytes));
        }
        /// <summary>
        /// DEVNOTE: Need to refactor to use CosmosJsonSerializer
        /// </summary>
        public static FeedResponse <T> ConvertCosmosElementFeed <T>(
            FeedResponse <CosmosElement> dynamicFeed,
            ResourceType resourceType,
            CosmosJsonSerializer jsonSerializer)
        {
            if (dynamicFeed.Count == 0)
            {
                return(new FeedResponse <T>(
                           new List <T>(),
                           dynamicFeed.Count,
                           dynamicFeed.Headers,
                           dynamicFeed.UseETagAsContinuation,
                           dynamicFeed.QueryMetrics,
                           dynamicFeed.RequestStatistics,
                           dynamicFeed.DisallowContinuationTokenMessage,
                           dynamicFeed.ResponseLengthBytes));
            }

            IJsonWriter jsonWriter = JsonWriter.Create(JsonSerializationFormat.Text);

            jsonWriter.WriteArrayStart();

            foreach (CosmosElement cosmosElement in dynamicFeed)
            {
                cosmosElement.WriteTo(jsonWriter);
            }

            jsonWriter.WriteArrayEnd();
            MemoryStream    stream = new MemoryStream(jsonWriter.GetResult());
            IEnumerable <T> typedResults;

            // If the resource type is an offer and the requested type is either a Offer or OfferV2 or dynamic
            // create a OfferV2 object and cast it to T. This is a temporary fix until offers is moved to v3 API.
            if (resourceType == ResourceType.Offer &&
                (typeof(T).IsSubclassOf(typeof(Resource)) || typeof(T) == typeof(object)))
            {
                typedResults = jsonSerializer.FromStream <List <OfferV2> >(stream).Cast <T>();
            }
            else
            {
                typedResults = jsonSerializer.FromStream <List <T> >(stream);
            }

            return(new FeedResponse <T>(
                       typedResults,
                       dynamicFeed.Count,
                       dynamicFeed.Headers,
                       dynamicFeed.UseETagAsContinuation,
                       dynamicFeed.QueryMetrics,
                       dynamicFeed.RequestStatistics,
                       dynamicFeed.DisallowContinuationTokenMessage,
                       dynamicFeed.ResponseLengthBytes));
        }