package org.ensembl.healthcheck.testcase.funcgen;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import org.ensembl.healthcheck.DatabaseRegistryEntry;
import org.ensembl.healthcheck.ReportManager;
import org.ensembl.healthcheck.Team;
import org.ensembl.healthcheck.testcase.SingleDatabaseTestCase;
/**
* @author mnuhn
*
* See the description in the constructor.
*
*/
public class InconsistentExperimentIds extends SingleDatabaseTestCase {
protected final int max_errors_reported = 10;
public InconsistentExperimentIds() {
setTeamResponsible(Team.FUNCGEN);
setDescription(
"Tests for inconsistencies between the experiment id in the result "
+ "set table and the corresponding one in the inpus subset table. "
+ "This tends to happen when the epigenome and feature type of the "
+ "two referenced experiments are identical and only differ in the "
+ "experimental_group."
);
}
@Override
public boolean run(DatabaseRegistryEntry dbre) {
String sql =
" select" + "\n"
+ " result_set.name,"+ "\n"
+ " result_set.experiment_id,"+ "\n"
+ " result_set_experiment.name,"+ "\n"
+ " input_subset.name,"+ "\n"
+ " input_subset.experiment_id,"+ "\n"
+ " input_subset_experiment.name"+ "\n"
+ " from "+ "\n"
+ " result_set"+ "\n"
+ " join experiment result_set_experiment using (experiment_id)"+ "\n"
+ " join result_set_input using (result_set_id)"+ "\n"
+ " join input_subset on (input_subset_id=table_id)"+ "\n"
+ " join experiment input_subset_experiment on (input_subset.experiment_id=input_subset_experiment.experiment_id)"+ "\n"
+ " where"+ "\n"
+ " input_subset_experiment.is_control=0"+ "\n"
+ " and result_set.experiment_id != input_subset.experiment_id"+ "\n"
+ ";"
;
Connection con = dbre.getConnection();
int number_of_errors_reported = 0;
try {
Statement stmt = con.createStatement();
ResultSet rs = stmt.executeQuery(sql);
while(rs.next() && number_of_errors_reported<max_errors_reported) {
String resultSetName = rs.getString("result_set.name");
String resultSetExperimentId = rs.getString("result_set.experiment_id");
String resultSetExperimentName = rs.getString("result_set_experiment.name");
String inputSubsetName = rs.getString("input_subset.name");
String inputSubsetExperimentId = rs.getString("input_subset.experiment_id");
String inputSubsetExperimentName = rs.getString("input_subset_experiment.name");
ReportManager.problem(this, con,
"\nThe result set " + resultSetName + "\n"
+ "and the linked input subset " + inputSubsetName + "\n"
+ "should have the same experiment id." + "\n"
+ "But they have different ones: ("+resultSetExperimentId+" vs "+inputSubsetExperimentId+")" + "\n"
+ "The result set is pointing to the experiment " + resultSetExperimentName + "\n"
+ "The input subset is pointing to the experiment " + inputSubsetExperimentName + "\n"
+ "\n"
+ "Useful SQL: "
+ generateUsefulSql(resultSetExperimentId, inputSubsetExperimentId) + "\n"
);
number_of_errors_reported++;
}
} catch (SQLException e) {
e.printStackTrace();
return false;
}
boolean passes = number_of_errors_reported == 0;
if (!passes) {
ReportManager.problem(this, con,
"Find all instances with this problem like this:\n"
+ sql
);
}
return passes;
}
protected String generateUsefulSql(
String resultSetExperimentId,
String inputSubsetExperimentId
) {
return
"select * from experiment where experiment_id in ("
+ resultSetExperimentId +", "
+ inputSubsetExperimentId +");";
}
}