/*
* Copyright [1999-2015] Wellcome Trust Sanger Institute and the
* EMBL-European Bioinformatics Institute
* Copyright [2016-2017] EMBL-European Bioinformatics Institute
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.ensembl.healthcheck.testcase.funcgen;
import org.ensembl.healthcheck.DatabaseRegistryEntry;
import org.ensembl.healthcheck.ReportManager;
import org.ensembl.healthcheck.Team;
import org.ensembl.healthcheck.testcase.SingleDatabaseTestCase;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
/**
* Check that every regulatory_feature of the current Regulatory Build has
* a valid activity value in at least one epigenome.
* Valid activity: 'INACTIVE', 'REPRESSED', 'POISED', 'ACTIVE'
* Invalid activity: 'NA'
*
* @author ilavidas
*/
public class RegulatoryFeatureIsActive extends SingleDatabaseTestCase {
private static final int MAX_ERRORS_REPORTED = 20;
public RegulatoryFeatureIsActive() {
setTeamResponsible(Team.FUNCGEN);
setDescription("Check that every regulatory_feature of the current "
+ "Regulatory Build has a valid activity value in at least "
+ "one epigenome.");
}
@Override
public boolean run(DatabaseRegistryEntry dbre) {
boolean result = true;
Connection con = dbre.getConnection();
int errorCount = 0;
try {
//fetch all regulatory_feature_ids of the current Regulatory Build
Statement stmt = con.createStatement();
ResultSet rs = stmt.executeQuery("SELECT regulatory_feature_id " +
"FROM regulatory_feature JOIN regulatory_build USING" +
"(regulatory_build_id) WHERE regulatory_build" +
".is_current=1");
while (rs != null && rs.next()) {
int regulatoryFeatureID = rs.getInt(1);
//fetch activity for every regulatory_feature
Statement newStmt = con.createStatement();
ResultSet activity = newStmt.executeQuery("SELECT * FROM " +
"regulatory_activity WHERE activity!='NA' AND " +
"regulatory_feature_id=" + regulatoryFeatureID);
if (!activity.next()) {
ReportManager.problem(this, con, "The regulatory_feature " +
"with id " + regulatoryFeatureID + " is not " +
"active in any epigenome.");
errorCount++;
result = false;
}
//if the number of errors is too high do not report all of
// them, as this is usually slow. Print a helpful sql query
// instead for manual inspection by the user
if (errorCount > MAX_ERRORS_REPORTED) {
String helpfulQuery = "SELECT regulatory_feature" +
".regulatory_feature_id FROM regulatory_build " +
"JOIN regulatory_feature USING " +
"(regulatory_build_id) LEFT JOIN " +
"regulatory_activity ON (regulatory_feature" +
".regulatory_feature_id=regulatory_activity" +
".regulatory_feature_id AND activity!='NA') " +
"WHERE regulatory_activity.regulatory_activity_id" +
" IS NULL AND regulatory_build.is_current=1";
ReportManager.info(this, con, "Too many errors found. The" +
" above list is NOT exhaustive! Execute this " +
"query to retrieve all regulatory_feature_ids " +
"that are not active in any epigenome:\n" +
helpfulQuery);
break;
}
}
} catch (SQLException e) {
e.printStackTrace();
}
return result;
}
}