private JsonDocument RetrieveDocumentInternal( IndexQueryResult queryResult, HashSet<string> loadedIds, FieldsToFetch fieldsToFetch, IndexDefinition indexDefinition) { if (queryResult.Projection == null) { // duplicate document, filter it out if (loadedIds.Add(queryResult.Key) == false) return null; return GetDocumentWithCaching(queryResult.Key); } if (fieldsToFetch.IsProjection) { if (indexDefinition.IsMapReduce == false) { bool hasStoredFields = false; foreach (var fieldToFetch in fieldsToFetch) { FieldStorage value; if (indexDefinition.Stores.TryGetValue(fieldToFetch, out value) == false && value != FieldStorage.No) continue; hasStoredFields = true; } if (hasStoredFields == false) { // duplicate document, filter it out if (loadedIds.Add(queryResult.Key) == false) return null; } } var fieldsToFetchFromDocument = fieldsToFetch.Where(fieldToFetch => queryResult.Projection.Property(fieldToFetch) == null); var doc = GetDocumentWithCaching(queryResult.Key); if (doc != null) { var result = doc.DataAsJson.SelectTokenWithRavenSyntax(fieldsToFetchFromDocument.ToArray()); foreach (var property in result.Properties()) { if(property.Value == null || property.Value.Type == JTokenType.Null) continue; queryResult.Projection[property.Name] = property.Value; } } } return new JsonDocument { Key = queryResult.Key, Projection = queryResult.Projection, }; }
private JsonDocument RetrieveDocumentInternal( IndexQueryResult queryResult, HashSet <string> loadedIds, FieldsToFetch fieldsToFetch, IndexDefinition indexDefinition) { var queryScore = queryResult.Score; if (float.IsNaN(queryScore)) { queryScore = 0f; } if (queryResult.Projection == null) { // duplicate document, filter it out if (loadedIds.Add(queryResult.Key) == false) { return(null); } var document = GetDocumentWithCaching(queryResult.Key); if (document != null) { document.Metadata[Constants.TemporaryScoreValue] = queryScore; } return(document); } if (fieldsToFetch.IsProjection) { if (indexDefinition.IsMapReduce == false) { bool hasStoredFields = false; foreach (var fieldToFetch in fieldsToFetch) { FieldStorage value; if (indexDefinition.Stores.TryGetValue(fieldToFetch, out value) == false && value != FieldStorage.No) { continue; } hasStoredFields = true; } if (hasStoredFields == false) { // duplicate document, filter it out if (loadedIds.Add(queryResult.Key) == false) { return(null); } } } var fieldsToFetchFromDocument = fieldsToFetch.Where(fieldToFetch => queryResult.Projection[fieldToFetch] == null); var doc = GetDocumentWithCaching(queryResult.Key); if (doc != null) { var result = doc.DataAsJson.SelectTokenWithRavenSyntax(fieldsToFetchFromDocument.ToArray()); foreach (var property in result) { if (property.Value == null || property.Value.Type == JTokenType.Null) { continue; } queryResult.Projection[property.Key] = property.Value; } } } return(new JsonDocument { Key = queryResult.Key, DataAsJson = queryResult.Projection, Metadata = new RavenJObject { { Constants.TemporaryScoreValue, queryScore } } }); }