content: /*************************************************************************
  *                                                                        *
  *  This file is part of the 20n/act project.                             *
  *  20n/act enables DNA prediction for synthetic biology/bioengineering.  *
  *  Copyright (C) 2017 20n Labs, Inc.                                     *
  *                                                                        *
  *  Please direct all queries to act@20n.com.                             *
  *                                                                        *
  *  This program is free software: you can redistribute it and/or modify  *
  *  it under the terms of the GNU General Public License as published by  *
  *  the Free Software Foundation, either version 3 of the License, or     *
  *  (at your option) any later version.                                   *
  *                                                                        *
  *  This program 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 General Public License for more details.                          *
  *                                                                        *
  *  You should have received a copy of the GNU General Public License     *
  *  along with this program.  If not, see <http://www.gnu.org/licenses/>. *
  *                                                                        *
  *************************************************************************/
  
  package act.installer.brenda;
  
  import java.io.Serializable;
  import java.sql.ResultSet;
  import java.sql.SQLException;
  
  /**
   * A class representing rows in some table in the BRENDA MySQL DB.  Adds a constraint that T must implement Serializable
   * so that implementing classes can be written into an on-disk index.
   * @param <T> The class extending this interface.  Used to "tie a knot" in the type signatures of methods exposed
   *           by this interface so that instances of implementing classes can be returned in a polymorphism-friendly way.
   */
  public interface FromBrendaDB<T extends FromBrendaDB> extends Serializable {
    /**
     * Access the query used to fetch specific rows from this BRENDA DB table.  Parameters must be (in order) EC number,
     * literature reference, and organism name.
     * TODO: this might be better in an abstract class w/ parameter binding done by this method.
     * @return The SQL query used to fetch specific rows of this type from the BRENDA MySQL DB.
     */
    String getQuery();
  
    /**
     * Produce an instance of this object from the current row available via the resultSet parameter, assuming that
     * result set was constructed from the QUERY or ALL_QUERY fields (i.e. the sting returned by getQuery() or
     * getAllQuery()).
     * @param resultSet The result set from which to extract an instance of type T.
     * @return An instance of type T produced from the result set.
     * @throws SQLException
     */
    T fromResultSet(ResultSet resultSet) throws SQLException;
  
    /**
     * Returns the (one-indexed) index of the Literature field in the class's QUERY.  This should only be used for
     * filtering nested literature reference lists.
     * @return The one-indexed offset of the Literature field for a result set produced using this class's QUERY.
     */
    int getLiteratureField();
    // ResultSet fields for query that fetches all rows.
  
    /**
     * Returns the ALL_QUERY field for this class, which is a parameter-free query that will iterate over all rows in this
     * class's DB table.  ResultSet fields returned must include at leastany fields exposed by this object via getters
     * plus EC number, literature reference, and organism name.
     * @return A query string that will fetch all rows representing instances of this type.
     */
    String getAllQuery();
  
    /**
     * Used for key generation during on-disk index construction.
     * @return the one-indexed offset of the literature field in the result set produced by this class's ALL_QUERY.
     */
    int getLiteratureFieldForAllQuery();
  
    /**
     * Used for key generation during on-disk index construction.
     * @return the one-indexed offset of the ec number field in the result set produced by this class's ALL_QUERY.
     */
    int getECNumberFieldForAllQuery();
  
    /**
     * Used for key generation during on-disk index construction.
     * @return the one-indexed offset of the organism name field in the result set produced by this class's ALL_QUERY.
     */
    int getOrganismFieldForAllQuery();
  
    /**
     * Returns a string that should be used as the `column family` (name space) name for this class during on-disk index
     * generation.  This is a concession to the RocksDB API.
     * @return a string representing the `column family` (name space) for this class in an on-disk index.
     */
    String getColumnFamilyName();
  }
  