Exemple #1
0
        public IChunkWriter <T> CreateChunkForMerge(
            IChunkReference <T> leftChunk,
            IChunkReference <T> rightChunk)
        {
            var totalSize  = leftChunk.TotalSize + rightChunk.TotalSize;
            var totalCount = leftChunk.Count + rightChunk.Count;

            return(CreateChunkForMerge(totalSize, totalCount));
        }
Exemple #2
0
 protected IChunkReference <T> Merge(
     IChunkReference <T> left,
     IChunkReference <T> right,
     ChunkStack <T> chunkStack)
 {
     using (var chunkWriter = chunkStack.CreateChunkForMerge(left, right))
     {
         foreach (var value in _sortJoin.Join(left.GetValue(), right.GetValue()))
         {
             chunkWriter.Write(value);
         }
         return(chunkWriter.Complete());
     }
 }
Exemple #3
0
            protected void PushToStackRecursively(IChunkReference <T> chunkReference)
            {
                var currentStack = _chunkStack;
                var otherStack   = GetOtherChunkStack(_chunkStack);

                while (currentStack.LastChunkLength == chunkReference.Count &&
                       (!_onlyMemoryMerge || (currentStack.LastChunkMemorySize > 0 && chunkReference.MemorySize > 0)))
                {
                    var previousChunkLength     = otherStack.LastChunkLength;
                    var previousChunkMemorySize = otherStack.LastChunkMemorySize;
                    chunkReference = Merge(chunkReference, currentStack.Pop(), otherStack);

                    if (previousChunkLength == chunkReference.Count &&
                        (!_onlyMemoryMerge || (previousChunkMemorySize > 0 && chunkReference.MemorySize > 0)))
                    {
                        currentStack   = otherStack;
                        otherStack     = GetOtherChunkStack(currentStack);
                        chunkReference = currentStack.Pop();
                    }
                }
            }