private async Task GetDocumentsByIdAsync(DocumentsOperationContext context, Microsoft.Extensions.Primitives.StringValues ids, bool metadataOnly) { var sw = Stopwatch.StartNew(); var includePaths = GetStringValuesQueryString("include", required: false); var documents = new List <Document>(ids.Count); var includes = new List <Document>(includePaths.Count * ids.Count); var includeDocs = new IncludeDocumentsCommand(Database.DocumentsStorage, context, includePaths, isProjection: false); GetCountersQueryString(Database, context, out var includeCounters); GetTimeSeriesQueryString(Database, context, out var includeTimeSeries); GetCompareExchangeValueQueryString(Database, out var includeCompareExchangeValues); using (includeCompareExchangeValues) { foreach (var id in ids) { Document document = null; if (string.IsNullOrEmpty(id) == false) { document = Database.DocumentsStorage.Get(context, id); } if (document == null && ids.Count == 1) { HttpContext.Response.StatusCode = (int)HttpStatusCode.NotFound; return; } documents.Add(document); includeDocs.Gather(document); includeCounters?.Fill(document); includeTimeSeries?.Fill(document); includeCompareExchangeValues?.Gather(document); } includeDocs.Fill(includes); includeCompareExchangeValues?.Materialize(); var actualEtag = ComputeHttpEtags.ComputeEtagForDocuments(documents, includes, includeCounters, includeTimeSeries, includeCompareExchangeValues); var etag = GetStringFromHeaders("If-None-Match"); if (etag == actualEtag) { HttpContext.Response.StatusCode = (int)HttpStatusCode.NotModified; return; } HttpContext.Response.Headers[Constants.Headers.Etag] = "\"" + actualEtag + "\""; int numberOfResults = 0; numberOfResults = await WriteDocumentsJsonAsync(context, metadataOnly, documents, includes, includeCounters?.Results, includeTimeSeries?.Results, includeCompareExchangeValues?.Results, numberOfResults); AddPagingPerformanceHint(PagingOperationType.Documents, nameof(GetDocumentsByIdAsync), HttpContext.Request.QueryString.Value, numberOfResults, documents.Count, sw.ElapsedMilliseconds); } }
private void GetDocumentsById(DocumentsOperationContext context, StringValues ids, bool metadataOnly) { var sw = Stopwatch.StartNew(); var includePaths = GetStringValuesQueryString("include", required: false); var documents = new List <Document>(ids.Count); var includes = new List <Document>(includePaths.Count * ids.Count); var includeDocs = new IncludeDocumentsCommand(Database.DocumentsStorage, context, includePaths); foreach (var id in ids) { var document = Database.DocumentsStorage.Get(context, id); if (document == null && ids.Count == 1) { HttpContext.Response.StatusCode = (int)HttpStatusCode.NotFound; return; } documents.Add(document); includeDocs.Gather(document); } includeDocs.Fill(includes); var actualEtag = ComputeHttpEtags.ComputeEtagForDocuments(documents, includes); var etag = GetStringFromHeaders("If-None-Match"); if (etag == actualEtag) { HttpContext.Response.StatusCode = (int)HttpStatusCode.NotModified; return; } HttpContext.Response.Headers[Constants.Headers.Etag] = "\"" + actualEtag + "\""; int numberOfResults; var blittable = GetBoolValueQueryString("blittable", required: false) ?? false; if (blittable) { WriteDocumentsBlittable(context, documents, includes, out numberOfResults); } else { WriteDocumentsJson(context, metadataOnly, documents, includes, out numberOfResults); } AddPagingPerformanceHint(PagingOperationType.Documents, nameof(GetDocumentsById), HttpContext, numberOfResults, documents.Count, sw.Elapsed); }