/**
   * Test various things about marker features.
   *
   * @param dbre The database to use.
   * @return Result.
   */
  public boolean run(DatabaseRegistryEntry dbre) {

    boolean result = true;

    Connection con = dbre.getConnection();

    // only check for human, mouse, rat and zebrafish
    Species s = dbre.getSpecies();
    if ((dbre.getType() != DatabaseType.SANGER_VEGA
            && (s.equals(Species.HOMO_SAPIENS)
                || s.equals(Species.MUS_MUSCULUS)
                || s.equals(Species.RATTUS_NORVEGICUS)))
        || s.equals(Species.DANIO_RERIO)) { // for
      // sangervega
      // only
      // run
      // the
      // test
      // for
      // zebrafish

      result &= checkFeaturesAndMapWeights(con);

      result &= checkMarkerPriorities(con);

      result &= checkAllChromosomesHaveMarkers(con);
    }

    return result;
  } // run
  /**
   * Re-implementation of the compare tables in schema method used to detect if two schemas are
   * equal to each other. This is due to variation specific logic which means that schemas can
   * differ but this is still valid.
   *
   * <p>The logic is the same as variation's original version
   *
   * @param master The master connection
   * @param targetDbre The registry entry for the given target schema
   * @param ignoreBackupTables Ignored option
   * @param directionFlag Ignored option
   */
  @Override
  public boolean compareTableEquality(
      Connection master,
      DatabaseRegistryEntry targetDbre,
      boolean ignoreBackupTables,
      int directionFlag) {
    boolean result = true;

    Connection target = targetDbre.getConnection();
    String targetName = getDbNameForMsg(target);
    String masterName = getDbNameForMsg(master);

    Set<String> targetTables = createLinkedHashSet(getTableNames(target));
    Set<String> masterTables = createLinkedHashSet(getTableNames(master));

    Species species = targetDbre.getSpecies();

    Set<String> notRequired = getSets(notRequiredTables(), species);
    Set<String> required = getSets(requiredTables(), species);

    // Check that tables that are in the master are in the target & skip those
    // in the notRequired list
    for (String masterTable : masterTables) {
      if (notRequired.contains(masterTable)) {
        String msg =
            String.format(
                "Table `%s` is in the list of 'notRequiredTables()' exceptions for %s. Skipping",
                masterTable, species.getAlias());
        ReportManager.info(this, target, msg);
        continue;
      }
      if (!targetTables.contains(masterTable)) {
        String msg =
            String.format(
                "Table `%s` exists in `%s` but not in `%s`", masterTable, masterName, targetName);
        ReportManager.problem(this, target, msg);
        result = false;
      }
    }

    // Check that tables in the target are in the master & it was a required table
    for (String targetTable : targetTables) {
      if (!masterTables.contains(targetTable) && !required.contains(targetTable)) {
        String msg =
            String.format(
                "Table `%s` exists in `%s` but not in `%s`", targetTable, targetName, masterName);
        ReportManager.problem(this, target, msg);
        result = false;
      }
    }

    // Finally check for the required tables
    for (String table : required) {
      if (!targetTables.contains(table)) {
        String msg = String.format("Table `%s` does not exist in `%s`", table, targetName);
        ReportManager.problem(this, target, msg);
        result = false;
      }
    }

    return result;
  }