package org.opencb.opencga.storage.hadoop.variant.index.annotation;
import org.apache.phoenix.util.SchemaUtil;
import org.opencb.biodata.models.variant.avro.VariantAnnotation;
import org.opencb.commons.datastore.core.QueryOptions;
import org.opencb.opencga.core.common.ProgressLogger;
import org.opencb.opencga.storage.core.variant.io.db.VariantAnnotationDBWriter;
import org.opencb.opencga.storage.hadoop.variant.GenomeHelper;
import org.opencb.opencga.storage.hadoop.variant.adaptors.VariantHadoopDBAdaptor;
import org.opencb.opencga.storage.hadoop.variant.converters.annotation.VariantAnnotationToHBaseConverter;
import org.opencb.opencga.storage.hadoop.variant.index.phoenix.PhoenixHelper;
import org.opencb.opencga.storage.hadoop.variant.index.phoenix.VariantPhoenixHelper;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.IOException;
import java.io.UncheckedIOException;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.*;
/**
* Created by jacobo on 26/10/16.
*/
public class VariantAnnotationPhoenixDBWriter extends VariantAnnotationDBWriter {
private final Connection connection;
private final VariantAnnotationUpsertExecutor upsertExecutor;
private final VariantAnnotationToHBaseConverter converter;
private final boolean closeConnection;
private String variantTable;
private GenomeHelper genomeHelper;
protected static Logger logger = LoggerFactory.getLogger(VariantAnnotationPhoenixDBWriter.class);
public VariantAnnotationPhoenixDBWriter(VariantHadoopDBAdaptor dbAdaptor, QueryOptions options, String variantTable,
Connection jdbcConnection, boolean closeConnection) {
this(dbAdaptor, options, variantTable, null, jdbcConnection, closeConnection);
}
public VariantAnnotationPhoenixDBWriter(VariantHadoopDBAdaptor dbAdaptor, QueryOptions options, String variantTable,
ProgressLogger progressLogger, Connection jdbcConnection, boolean closeConnection) {
super(dbAdaptor, options, progressLogger);
this.connection = jdbcConnection;
this.genomeHelper = dbAdaptor.getGenomeHelper();
this.closeConnection = closeConnection;
this.converter = new VariantAnnotationToHBaseConverter(genomeHelper);
this.variantTable = variantTable;
List<PhoenixHelper.Column> columns = new ArrayList<>();
Collections.addAll(columns, VariantPhoenixHelper.VariantColumn.values());
columns.addAll(VariantPhoenixHelper.getHumanPopulationFrequenciesColumns());
this.upsertExecutor = new VariantAnnotationUpsertExecutor(connection, SchemaUtil.getEscapedFullTableName(variantTable), columns);
}
@Override
public synchronized void pre() {
VariantPhoenixHelper variantPhoenixHelper = new VariantPhoenixHelper(genomeHelper);
try {
//TODO: Read population frequencies columns from StudyConfiguration ?
variantPhoenixHelper.getPhoenixHelper().addMissingColumns(connection, variantTable,
VariantPhoenixHelper.getHumanPopulationFrequenciesColumns(), true);
variantPhoenixHelper.updateAnnotationColumns(connection, variantTable);
} catch (SQLException e) {
throw new RuntimeException(e);
}
}
@Override
public List<Object> apply(List<VariantAnnotation> variantAnnotationList) throws IOException {
Iterable<Map<PhoenixHelper.Column, ?>> records = converter.apply(variantAnnotationList);
upsertExecutor.execute(records);
// List<Put> puts = new ArrayList<>(variantAnnotationList.size());
// for (Map<PhoenixHelper.Column, ?> record : records) {
// Put put = converter.buildPut(record, column -> column.column().startsWith(VariantPhoenixHelper.POPULATION_FREQUENCY_PREFIX));
// if (put != null) {
// puts.add(put);
// }
// }
//
// hBaseManager.act(variantTable, table -> {
// table.put(puts);
// });
logUpdate(variantAnnotationList);
return Collections.emptyList();
}
@Override
public void post() {
try {
upsertExecutor.close();
if (closeConnection) {
logger.info("Close Phoenix connection " + connection);
connection.close();
}
} catch (IOException e) {
throw new UncheckedIOException(e);
} catch (SQLException e) {
throw new RuntimeException(e);
}
}
}