Package org.apache.druid.frame.processor
Class FrameChannelMerger
java.lang.Object
org.apache.druid.frame.processor.FrameChannelMerger
- All Implemented Interfaces:
FrameProcessor<Long>
Processor that merges already-sorted inputChannels and writes a fully-sorted stream to a single outputChannel.
Frames from input channels must be
FrameType.isRowBased(). Output frames will be row-based as well.
For unsorted output, use FrameChannelMixer instead.-
Constructor Summary
ConstructorsConstructorDescriptionFrameChannelMerger(List<ReadableFrameChannel> inputChannels, FrameReader frameReader, WritableFrameChannel outputChannel, FrameWriterFactory frameWriterFactory, List<KeyColumn> sortKey, ClusterByPartitions partitions, long rowLimit) -
Method Summary
Modifier and TypeMethodDescriptionvoidcleanup()Closes resources used by this worker.List of input channels.List of output channels.runIncrementally(it.unimi.dsi.fastutil.ints.IntSet readableInputs) Runs some of the algorithm, without blocking, and either returns a value or a set of input channels to wait for.
-
Constructor Details
-
FrameChannelMerger
public FrameChannelMerger(List<ReadableFrameChannel> inputChannels, FrameReader frameReader, WritableFrameChannel outputChannel, FrameWriterFactory frameWriterFactory, List<KeyColumn> sortKey, @Nullable ClusterByPartitions partitions, long rowLimit) - Parameters:
inputChannels- readable frame channels. Each channel must be sorted (i.e., if all frames in the channel are concatenated, the concatenated result must be fully sorted).frameReader- reader for framesoutputChannel- writable channel to receive the merge-sorted dataframeWriterFactory- writer for framessortKey- sort key for input and output framespartitions- partitions for output frames. If non-null, output frames are written withFrameWithPartition.partition()set according to this parameterrowLimit- maximum number of rows to write to the output channel
-
-
Method Details
-
inputChannels
Description copied from interface:FrameProcessorList of input channels. The positions of channels in this list are used to build thereadableInputsset provided toFrameProcessor.runIncrementally(it.unimi.dsi.fastutil.ints.IntSet).- Specified by:
inputChannelsin interfaceFrameProcessor<Long>
-
outputChannels
Description copied from interface:FrameProcessorList of output channels.- Specified by:
outputChannelsin interfaceFrameProcessor<Long>
-
runIncrementally
public ReturnOrAwait<Long> runIncrementally(it.unimi.dsi.fastutil.ints.IntSet readableInputs) throws IOException Description copied from interface:FrameProcessorRuns some of the algorithm, without blocking, and either returns a value or a set of input channels to wait for. This method is called byFrameProcessorExecutor.runFully(org.apache.druid.frame.processor.FrameProcessor<T>, java.lang.String)when all output channels are writable. Therefore, it is guaranteed that each output channel can accept at least one frame. This method must not read more than one frame from each readable input channel, and must not write more than one frame to each output channel.- Specified by:
runIncrementallyin interfaceFrameProcessor<Long>- Parameters:
readableInputs- channels fromFrameProcessor.inputChannels()that are either finished or ready to read. That is: eitherReadableFrameChannel.isFinished()orReadableFrameChannel.canRead()are true.- Returns:
- either a final return value or a set of input channels to wait for. Must be nonnull.
- Throws:
IOException
-
cleanup
Description copied from interface:FrameProcessorCloses resources used by this worker. Exact same concept asCloseable.close(). This interface does not extend Closeable, in order to make it easier to find all places where cleanup happens. (Static analysis tools can lose the thread when Closeables are closed in generic ways.) Implementations typically callReadableFrameChannel.close()andWritableFrameChannel.close()on all input and output channels, as well as releasing any additional resources that may be held, such asFrameWriter. In cases of cancellation, this method may be called even ifFrameProcessor.runIncrementally(it.unimi.dsi.fastutil.ints.IntSet)has not yet returned a result viaReturnOrAwait.returnObject(T).- Specified by:
cleanupin interfaceFrameProcessor<Long>- Throws:
IOException
-