/**
* See the NOTICE file distributed with this work for additional
* information regarding copyright ownership.
*
* This is free software; you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License as
* published by the Free Software Foundation; either version 2.1 of
* the License, or (at your option) any later version.
*
* This software is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this software; if not, write to the Free
* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
*/
package org.ut.biolab.medsavant.server.serverapi;
import org.ut.biolab.medsavant.shared.model.Reference;
import org.ut.biolab.medsavant.shared.model.Chromosome;
import java.rmi.RemoteException;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;
import com.healthmarketscience.sqlbuilder.DeleteQuery;
import com.healthmarketscience.sqlbuilder.InsertQuery;
import com.healthmarketscience.sqlbuilder.OrderObject.Dir;
import com.healthmarketscience.sqlbuilder.SelectQuery;
import org.ut.biolab.medsavant.server.db.MedSavantDatabase;
import org.ut.biolab.medsavant.server.db.MedSavantDatabase.AnnotationColumns;
import org.ut.biolab.medsavant.server.db.MedSavantDatabase.ChromosomeTableSchema;
import org.ut.biolab.medsavant.server.db.MedSavantDatabase.GeneSetColumns;
import org.ut.biolab.medsavant.server.db.MedSavantDatabase.ReferenceTableSchema;
import org.ut.biolab.medsavant.server.db.MedSavantDatabase.VariantTablemapTableSchema;
import org.ut.biolab.medsavant.shared.db.TableSchema;
import org.ut.biolab.medsavant.server.db.ConnectionController;
import org.ut.biolab.medsavant.server.db.PooledConnection;
import org.ut.biolab.medsavant.shared.util.BinaryConditionMS;
import org.ut.biolab.medsavant.server.MedSavantServerUnicastRemoteObject;
import org.ut.biolab.medsavant.shared.model.SessionExpiredException;
import org.ut.biolab.medsavant.shared.serverapi.ReferenceManagerAdapter;
/**
*
* @author mfiume
*/
public class ReferenceManager extends MedSavantServerUnicastRemoteObject implements ReferenceManagerAdapter, GeneSetColumns {
private static ReferenceManager instance;
public static synchronized ReferenceManager getInstance() throws RemoteException, SessionExpiredException {
if (instance == null) {
instance = new ReferenceManager();
}
return instance;
}
public ReferenceManager() throws RemoteException, SessionExpiredException {super();}
@Override
public Reference[] getReferences(String sessID) throws SQLException, SessionExpiredException {
TableSchema table = MedSavantDatabase.ReferenceTableSchema;
SelectQuery query = new SelectQuery();
query.addFromTable(table.getTable());
query.addColumns(
table.getDBColumn(ReferenceTableSchema.COLUMNNAME_OF_REFERENCE_ID),
table.getDBColumn(ReferenceTableSchema.COLUMNNAME_OF_NAME));
ResultSet rs = ConnectionController.executeQuery(sessID, query.toString());
List<Reference> results = new ArrayList<Reference>();
while (rs.next()) {
results.add(new Reference(
rs.getInt(ReferenceTableSchema.COLUMNNAME_OF_REFERENCE_ID),
rs.getString(ReferenceTableSchema.COLUMNNAME_OF_NAME)));
}
return results.toArray(new Reference[0]);
}
@Override
public String[] getReferenceNames(String sessID) throws SQLException, SessionExpiredException {
TableSchema table = MedSavantDatabase.ReferenceTableSchema;
SelectQuery query = new SelectQuery();
query.addFromTable(table.getTable());
query.addColumns(table.getDBColumn(ReferenceTableSchema.COLUMNNAME_OF_NAME));
ResultSet rs = ConnectionController.executeQuery(sessID, query.toString());
List<String> results = new ArrayList<String>();
while (rs.next()) {
results.add(rs.getString(1));
}
return results.toArray(new String[0]);
}
@Override
public int getReferenceID(String sessID, String refName) throws SQLException, SessionExpiredException {
TableSchema table = MedSavantDatabase.ReferenceTableSchema;
SelectQuery query = new SelectQuery();
query.addFromTable(table.getTable());
query.addColumns(table.getDBColumn(ReferenceTableSchema.COLUMNNAME_OF_REFERENCE_ID));
query.addCondition(BinaryConditionMS.equalTo(table.getDBColumn(ReferenceTableSchema.COLUMNNAME_OF_NAME), refName));
ResultSet rs = ConnectionController.executeQuery(sessID, query.toString());
if (rs.next()) {
return rs.getInt(1);
} else {
return -1;
}
}
@Override
public boolean containsReference(String sessID, String refName) throws SQLException, SessionExpiredException {
TableSchema table = MedSavantDatabase.ReferenceTableSchema;
SelectQuery query = new SelectQuery();
query.addFromTable(table.getTable());
query.addAllColumns();
query.addCondition(BinaryConditionMS.equalTo(table.getDBColumn(ReferenceTableSchema.COLUMNNAME_OF_NAME), refName));
ResultSet rs = ConnectionController.executeQuery(sessID, query.toString());
return rs.next();
}
@Override
public int addReference(String sessID, String refName, Chromosome[] chroms, String url) throws SQLException, SessionExpiredException {
TableSchema referenceTable = MedSavantDatabase.ReferenceTableSchema;
TableSchema chromTable = MedSavantDatabase.ChromosomeTableSchema;
Connection c = ConnectionController.connectPooled(sessID);
//add reference
InsertQuery query1 = new InsertQuery(referenceTable.getTable());
query1.addColumn(referenceTable.getDBColumn(ReferenceTableSchema.COLUMNNAME_OF_NAME), refName);
query1.addColumn(referenceTable.getDBColumn(ReferenceTableSchema.COLUMNNAME_OF_URL), url);
PreparedStatement stmt = c.prepareStatement(query1.toString(), Statement.RETURN_GENERATED_KEYS);
stmt.execute();
ResultSet rs = stmt.getGeneratedKeys();
rs.next();
int refID = rs.getInt(1);
//add contigs
c.setAutoCommit(false);
for (int i = 0; i < chroms.length; i++) {
Chromosome chrom = chroms[i];
InsertQuery query = new InsertQuery(chromTable.getTable());
query.addColumn(chromTable.getDBColumn(ChromosomeTableSchema.COLUMNNAME_OF_REFERENCE_ID), refID);
query.addColumn(chromTable.getDBColumn(ChromosomeTableSchema.COLUMNNAME_OF_CONTIG_ID), i);
query.addColumn(chromTable.getDBColumn(ChromosomeTableSchema.COLUMNNAME_OF_CONTIG_NAME), chrom.getName());
query.addColumn(chromTable.getDBColumn(ChromosomeTableSchema.COLUMNNAME_OF_CONTIG_LENGTH), chrom.getLength());
query.addColumn(chromTable.getDBColumn(ChromosomeTableSchema.COLUMNNAME_OF_CENTROMERE_POS), chrom.getCentromerePos());
c.createStatement().executeUpdate(query.toString());
}
c.commit();
c.setAutoCommit(true);
c.close();
return refID;
}
@Override
public boolean removeReference(String sessID, int refID) throws SQLException, SessionExpiredException {
TableSchema annotationTable = MedSavantDatabase.AnnotationTableSchema;
TableSchema variantMapTable = MedSavantDatabase.VarianttablemapTableSchema;
TableSchema refTable = MedSavantDatabase.ReferenceTableSchema;
TableSchema chromTable = MedSavantDatabase.ChromosomeTableSchema;
PooledConnection conn = ConnectionController.connectPooled(sessID);
try {
SelectQuery q1 = new SelectQuery();
q1.addFromTable(annotationTable.getTable());
q1.addAllColumns();
q1.addCondition(BinaryConditionMS.equalTo(annotationTable.getDBColumn(AnnotationColumns.REFERENCE_ID), refID));
ResultSet rs = conn.executeQuery(q1.toString());
if (rs.next()) {
return false;
}
SelectQuery q2 = new SelectQuery();
q2.addFromTable(variantMapTable.getTable());
q2.addAllColumns();
q2.addCondition(BinaryConditionMS.equalTo(variantMapTable.getDBColumn(VariantTablemapTableSchema.COLUMNNAME_OF_REFERENCE_ID), refID));
rs = conn.executeQuery(q2.toString());
if (rs.next()) {
return false;
}
DeleteQuery q3 = new DeleteQuery(refTable.getTable());
q3.addCondition(BinaryConditionMS.equalTo(refTable.getDBColumn(ReferenceTableSchema.COLUMNNAME_OF_REFERENCE_ID), refID));
conn.executeUpdate(q3.toString());
DeleteQuery q4 = new DeleteQuery(chromTable.getTable());
q4.addCondition(BinaryConditionMS.equalTo(chromTable.getDBColumn(ChromosomeTableSchema.COLUMNNAME_OF_REFERENCE_ID), refID));
conn.executeUpdate(q4.toString());
} finally {
conn.close();
}
return true;
}
/* @Override
public Map<Integer, String> getReferencesWithoutTablesInProject(String sid,int projectid) throws SQLException, SessionExpiredException {
ResultSet rs = ConnectionController.executeQuery(sid,
"SELECT *"
+ " FROM " + ReferenceTableSchema.TABLE_NAME
+ " WHERE " + ReferenceTableSchema.COLUMNNAME_OF_REFERENCE_ID + " NOT IN"
+ " (SELECT " + VariantTablemapTableSchema.COLUMNNAME_OF_REFERENCE_ID + " FROM " + VariantTablemapTableSchema.TABLE_NAME
+ " WHERE " + VariantTablemapTableSchema.COLUMNNAME_OF_PROJECT_ID + "=" + projectid + ")");
HashMap<Integer,String> result = new HashMap<Integer,String>();
while (rs.next()) {
result.put(rs.getInt(1), rs.getString(2));
}
return result;
}*/
@Override
public String getReferenceUrl(String sid,int referenceid) throws SQLException, SessionExpiredException {
TableSchema refTable = MedSavantDatabase.ReferenceTableSchema;
SelectQuery query = new SelectQuery();
query.addFromTable(refTable.getTable());
query.addColumns(refTable.getDBColumn(ReferenceTableSchema.COLUMNNAME_OF_URL));
query.addCondition(BinaryConditionMS.equalTo(refTable.getDBColumn(ReferenceTableSchema.COLUMNNAME_OF_REFERENCE_ID), referenceid));
ResultSet rs = ConnectionController.executeQuery(sid, query.toString());
rs.next();
return rs.getString(1);
}
@Override
public Chromosome[] getChromosomes(String sid, int referenceid) throws SQLException, SessionExpiredException {
TableSchema table = MedSavantDatabase.ChromosomeTableSchema;
SelectQuery query = new SelectQuery();
query.addFromTable(table.getTable());
query.addAllColumns();
query.addCondition(BinaryConditionMS.equalTo(table.getDBColumn(ChromosomeTableSchema.COLUMNNAME_OF_REFERENCE_ID), referenceid));
query.addOrdering(table.getDBColumn(ChromosomeTableSchema.COLUMNNAME_OF_CONTIG_ID), Dir.ASCENDING);
ResultSet rs = ConnectionController.executeQuery(sid, query.toString());
List<Chromosome> result = new ArrayList<Chromosome>();
while(rs.next()) {
result.add(new Chromosome(
rs.getString(ChromosomeTableSchema.COLUMNNAME_OF_CONTIG_NAME),
rs.getInt(ChromosomeTableSchema.COLUMNNAME_OF_CENTROMERE_POS),
rs.getInt(ChromosomeTableSchema.COLUMNNAME_OF_CONTIG_LENGTH)));
}
return result.toArray(new Chromosome[0]);
}
public String getReferenceName(String sid, int refID) throws SQLException, SessionExpiredException {
TableSchema refTable = MedSavantDatabase.ReferenceTableSchema;
SelectQuery query = new SelectQuery();
query.addFromTable(refTable.getTable());
query.addColumns(refTable.getDBColumn(ReferenceTableSchema.COLUMNNAME_OF_NAME));
query.addCondition(BinaryConditionMS.equalTo(refTable.getDBColumn(ReferenceTableSchema.COLUMNNAME_OF_REFERENCE_ID), refID));
ResultSet rs = ConnectionController.executeQuery(sid, query.toString());
rs.next();
return rs.getString(1);
}
}