package org.opencb.opencga.storage.hadoop.variant.exporters;
import org.apache.avro.mapred.AvroKey;
import org.apache.hadoop.hbase.client.Result;
import org.apache.hadoop.hbase.io.ImmutableBytesWritable;
import org.apache.hadoop.hbase.util.Bytes;
import org.apache.hadoop.io.NullWritable;
import org.opencb.biodata.models.variant.Variant;
import org.opencb.opencga.storage.hadoop.variant.AbstractHBaseMapReduce;
import org.opencb.opencga.storage.hadoop.variant.GenomeHelper;
import org.opencb.opencga.storage.hadoop.variant.index.AbstractVariantTableMapReduce;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import static org.opencb.opencga.storage.hadoop.variant.exporters.VariantTableExportDriver
.CONFIG_VARIANT_TABLE_EXPORT_TYPE;
/**
* Created by mh719 on 06/12/2016.
* @author Matthias Haimel
*/
public class AnalysisToFileMapper extends AbstractHBaseMapReduce<Object, Object> {
private byte[] studiesRow;
private VariantTableExportDriver.ExportType type;
@Override
protected void setup(Context context) throws IOException, InterruptedException {
super.setup(context);
studiesRow = getHelper().generateVariantRowKey(GenomeHelper.DEFAULT_METADATA_ROW_KEY, 0);
List<String> returnedSamples = Collections.emptyList(); // No GT data by default
boolean withGenotype = context.getConfiguration().getBoolean(VariantTableExportDriver
.CONFIG_VARIANT_TABLE_EXPORT_AVRO_GENOTYPE, false);
withGenotype = context.getConfiguration().getBoolean(VariantTableExportDriver
.CONFIG_VARIANT_TABLE_EXPORT_GENOTYPE, withGenotype);
if (withGenotype) {
returnedSamples = new ArrayList<>(this.getIndexedSamples().keySet());
}
getLog().info("Export Genotype [{}] of {} samples ... ", withGenotype, returnedSamples.size());
getHbaseToVariantConverter().setReturnedSamples(returnedSamples);
getHbaseToVariantConverter().setStudyNameAsStudyId(true);
String typeString = context.getConfiguration()
.get(CONFIG_VARIANT_TABLE_EXPORT_TYPE, VariantTableExportDriver.ExportType.AVRO.name());
this.type = VariantTableExportDriver.ExportType.valueOf(typeString);
}
@Override
protected void map(ImmutableBytesWritable key, Result value, Context context) throws IOException,
InterruptedException {
if (!Bytes.startsWith(value.getRow(), this.studiesRow)) { // ignore _METADATA row
Variant variant = this.getHbaseToVariantConverter().convert(value);
switch (this.type) {
case AVRO:
context.write(new AvroKey<>(variant.getImpl()), NullWritable.get());
break;
case VCF:
context.write(variant, NullWritable.get());
break;
default:
throw new IllegalStateException("Type not supported: " + this.type);
}
context.getCounter(AbstractVariantTableMapReduce.COUNTER_GROUP_NAME, this.type.name()).increment(1);
}
}
}