Пример #1
0
        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);
                }
            }
        }
Пример #2
0
        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());
                    }
                }
            }
        }