private static IEnumerable <ReduceTree> IterateTrees(Index self, List <FixedSizeTree> mapEntries, Tree reducePhaseTree, FixedSizeTree typePerHash, TransactionOperationContext indexContext, DisposableScope scope) { var reduceKeys = new HashSet <ulong>(); var idToDocIdHash = new Dictionary <long, string>(); foreach (var tree in mapEntries) { foreach (var mapEntry in MapReduceIndexBase <MapReduceIndexDefinition, IndexField> .GetMapEntries(tree)) { reduceKeys.Add(mapEntry.ReduceKeyHash); idToDocIdHash[mapEntry.Id] = tree.Name.ToString(); } } foreach (var reduceKeyHash in reduceKeys) { MapReduceResultsStore store; var mapReduceIndex = self as MapReduceIndex; if (mapReduceIndex != null) { store = mapReduceIndex.CreateResultsStore(typePerHash, reduceKeyHash, indexContext, false); } else { store = ((AutoMapReduceIndex)self).CreateResultsStore(typePerHash, reduceKeyHash, indexContext, false); } using (store) { ReduceTree tree; switch (store.Type) { case MapResultsStorageType.Tree: tree = RenderTree(store.Tree, reduceKeyHash, idToDocIdHash, self, indexContext); break; case MapResultsStorageType.Nested: tree = RenderNestedSection(store.GetNestedResultsSection(reducePhaseTree), reduceKeyHash, idToDocIdHash, self, indexContext); break; default: throw new ArgumentOutOfRangeException(store.Type.ToString()); } scope.EnsureDispose(tree); yield return(tree); } } }
private static IEnumerable <ReduceTree> IterateTrees(Index self, FixedSizeTree mapEntries, Tree reducePhaseTree, FixedSizeTree typePerHash, TransactionOperationContext indexContext) { var entriesPerReduceKeyHash = new Dictionary <ulong, List <MapEntry> >(); foreach (var mapEntry in MapReduceIndexBase <MapReduceIndexDefinition> .GetMapEntries(mapEntries)) { List <MapEntry> entries; if (entriesPerReduceKeyHash.TryGetValue(mapEntry.ReduceKeyHash, out entries) == false) { entriesPerReduceKeyHash[mapEntry.ReduceKeyHash] = entries = new List <MapEntry>(); } entries.Add(mapEntry); } foreach (var item in entriesPerReduceKeyHash) { MapReduceResultsStore store; var mapReduceIndex = self as MapReduceIndex; if (mapReduceIndex != null) { store = mapReduceIndex.CreateResultsStore(typePerHash, item.Key, indexContext, false); } else { store = ((AutoMapReduceIndex)self).CreateResultsStore(typePerHash, item.Key, indexContext, false); } using (store) { switch (store.Type) { case MapResultsStorageType.Tree: yield return(RenderTree(store.Tree, item.Value, mapEntries.Name.ToString(), self, indexContext)); break; case MapResultsStorageType.Nested: yield return (RenderNestedSection(store.GetNestedResultsSection(reducePhaseTree), item.Value, mapEntries.Name.ToString(), self, indexContext)); break; default: throw new ArgumentOutOfRangeException(store.Type.ToString()); } } } }