Exemple #1
0
        private IEnumerable <KeyValuePair <byte[], ulong> > MakeInternalNodes(ulong txnId, IEnumerable <KeyValuePair <byte[], ulong> > children, BrightstarProfiler profiler)
        {
            var enumerator = children.GetEnumerator();
            var childList  = enumerator.Next(_internalBranchFactor).ToList();

            if (childList.Count == 1)
            {
                yield return(childList[0]);

                yield break;
            }

            byte[]       prevNodeKey = childList[0].Key;
            InternalNode prevNode    = MakeInternalNode(childList);

            childList = enumerator.Next(_internalBranchFactor).ToList();
            while (childList.Count > 0)
            {
                InternalNode nextNode    = MakeInternalNode(childList);
                var          nextNodeKey = childList[0].Key;
                if (nextNode.NeedJoin)
                {
                    nextNodeKey = new byte[_config.KeySize];
                    nextNode.RedistributeFromLeft(prevNode, childList[0].Key, nextNodeKey);
                }
                yield return(WriteNode(txnId, prevNode, prevNodeKey, profiler));

                prevNode    = nextNode;
                prevNodeKey = nextNodeKey;
                childList   = enumerator.Next(_internalBranchFactor).ToList();
            }

            /*
             * if (enumerator.MoveNext())
             * {
             *  firstChild = enumerator.Current;
             *  InternalNode nextNode;
             *  var nextNodeKey = firstChild.Key;
             *  if (enumerator.MoveNext())
             *  {
             *      nextNode = MakeInternalNode(firstChild, enumerator, _internalBranchFactor);
             *  }
             *  else
             *  {
             *      nextNode = MakeInternalNode(firstChild);
             *  }
             *  if (nextNode.NeedJoin)
             *  {
             *      nextNodeKey = new byte[_config.KeySize];
             *      nextNode.RedistributeFromLeft(prevNode, firstChild.Key, nextNodeKey);
             *  }
             *  yield return WriteNode(txnId, prevNode, prevNodeKey, profiler);
             *  prevNode = nextNode;
             *  prevNodeKey = nextNodeKey;
             * }
             */
            yield return(WriteNode(txnId, prevNode, prevNodeKey, profiler));
        }