package edu.washington.escience.myria.operator.network;
import java.util.List;
import edu.washington.escience.myria.DbException;
import edu.washington.escience.myria.MyriaConstants.ProfilingMode;
import edu.washington.escience.myria.operator.Operator;
import edu.washington.escience.myria.operator.network.distribute.DistributeFunction;
import edu.washington.escience.myria.parallel.ExchangePairID;
import edu.washington.escience.myria.storage.TupleBatch;
/**
* GenericShuffleProducer, which support json encoding of 1. Broadcast Shuffle 2. One to one Shuffle (Shuffle) 3. Hyper
* Cube Join Shuffle (HyperJoinShuffle)
*/
public class GenericShuffleProducer extends Producer {
/** Required for Java serialization. */
private static final long serialVersionUID = 1L;
/** the distribute function. */
protected final DistributeFunction distributeFunction;
/**
* Shuffle to multiple operator IDs on multiple workers. The most generic constructor.
*
* @param child the child who provides data for this producer to distribute.
* @param operatorIDs destination operators the data goes
* @param workerIDs set of destination workers
* @param df the distribute function
*/
public GenericShuffleProducer(
final Operator child,
final ExchangePairID[] operatorIDs,
final int[] workerIDs,
final DistributeFunction df) {
super(child, operatorIDs, workerIDs);
distributeFunction = df;
}
@Override
protected final void consumeTuples(final TupleBatch tup) throws DbException {
final List<List<TupleBatch>> partitions = distributeFunction.distribute(tup);
if (getProfilingMode().contains(ProfilingMode.QUERY)) {
for (int channelIdx = 0; channelIdx < partitions.size(); channelIdx++) {
int numTuples = 0;
for (TupleBatch tb : partitions.get(channelIdx)) {
if (tb != null) {
numTuples += tb.numTuples();
}
}
final int destWorkerId = getOutputIDs()[channelIdx].getRemoteID();
getProfilingLogger().recordSent(this, numTuples, destWorkerId);
}
}
writePartitionsIntoChannels(partitions);
}
@Override
protected void childEOS() throws DbException {
writePartitionsIntoChannels(null);
for (int p = 0; p < numChannels(); p++) {
super.channelEnds(p);
}
}
@Override
protected final void childEOI() throws DbException {
writePartitionsIntoChannels(
distributeFunction.distribute(TupleBatch.eoiTupleBatch(getSchema())));
}
/**
* @return the distribute function
*/
public final DistributeFunction getDistributeFunction() {
return distributeFunction;
}
}