/* * 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.compara; import java.sql.Connection; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import java.util.HashMap; import java.util.Iterator; import java.util.List; import org.apache.commons.lang.StringUtils; import org.ensembl.healthcheck.DatabaseRegistryEntry; import org.ensembl.healthcheck.ReportManager; import org.ensembl.healthcheck.Team; import org.ensembl.healthcheck.testcase.SingleDatabaseTestCase; import org.ensembl.healthcheck.util.DBUtils; /** * An EnsEMBL Healthcheck test case for the "high_coverage_mlss_id" MethodLinkSpeciesSetTag entries */ public class MLSSTagHighCoverageMSA extends SingleDatabaseTestCase { public MLSSTagHighCoverageMSA() { setDescription("Tests that proper entries are in method_link_species_set_tag."); setTeamResponsible(Team.COMPARA); } public boolean run(DatabaseRegistryEntry dbre) { boolean result = true; Connection con = dbre.getConnection(); if (!DBUtils.checkTableExists(con, "method_link_species_set_tag")) { result = false; ReportManager.problem(this, con, "method_link_species_set_tag table not present"); return result; } result &= checkLowCoverageMLSSAreLinkedToHighCoverageMLSS(dbre); return result; } public boolean checkLowCoverageMLSSAreLinkedToHighCoverageMLSS(final DatabaseRegistryEntry dbre) { Connection con = dbre.getConnection(); String sql = "SELECT mlss1.method_link_species_set_id, tag, value, mlss2.method_link_species_set_id, ml2.type" + " FROM method_link_species_set mlss1 JOIN method_link ml1 USING (method_link_id)" + " LEFT JOIN method_link_species_set_tag mlsst ON mlsst.method_link_species_set_id = mlss1.method_link_species_set_id AND tag = 'high_coverage_mlss_id'" + " LEFT JOIN (method_link_species_set mlss2 JOIN method_link ml2 USING (method_link_id)) ON value = mlss2.method_link_species_set_id" + " WHERE ml1.type = 'EPO_LOW_COVERAGE'"; List<String[]> all_rows = DBUtils.getRowValuesList(con, sql); boolean result = true; for (String[] row : all_rows) { // Check all the potential errors if (row[1] == null) { ReportManager.problem(this, con, String.format("The MLSS ID %s is missing its 'high_coverage_mlss_id' tag", row[0])); } else if (row[2] == null) { ReportManager.problem(this, con, String.format("The 'high_coverage_mlss_id' tag for MLSS ID %s has a NULL value", row[0])); } else if (row[3] == null) { ReportManager.problem(this, con, String.format("The value of the 'high_coverage_mlss_id' tag for MLSS ID %s does not link to a valid MLSS ID: '%s'", row[0], row[2])); } else if (!row[4].equals("EPO")) { ReportManager.problem(this, con, String.format("The value of the 'high_coverage_mlss_id' tag for MLSS ID %s does not link to a 'EPO' MLSS but '%s' (ID %s)", row[0], row[4], row[3])); } else { // This row is correct: everything is non-NULL, and the EPO_LOW_COVERAGE mlss is linked to a EPO continue; } result = false; } return result; } }