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)); }
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()); } }
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(); } } }