bdb_query.hpp
上传用户:yhdzpy8989
上传日期:2007-06-13
资源大小:13604k
文件大小:9k
源码类别:

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: bdb_query.hpp,v $
  4.  * PRODUCTION Revision 1000.1  2004/06/01 18:37:03  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.10
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. #ifndef BDB_QUERY__HPP
  10. #define BDB_QUERY__HPP
  11. /*  $Id: bdb_query.hpp,v 1000.1 2004/06/01 18:37:03 gouriano Exp $
  12.  * ===========================================================================
  13.  *
  14.  *                            PUBLIC DOMAIN NOTICE
  15.  *               National Center for Biotechnology Information
  16.  *
  17.  *  This software/database is a "United States Government Work" under the
  18.  *  terms of the United States Copyright Act.  It was written as part of
  19.  *  the author's official duties as a United States Government employee and
  20.  *  thus cannot be copyrighted.  This software/database is freely available
  21.  *  to the public for use. The National Library of Medicine and the U.S.
  22.  *  Government have not placed any restriction on its use or reproduction.
  23.  *
  24.  *  Although all reasonable efforts have been taken to ensure the accuracy
  25.  *  and reliability of the software and data, the NLM and the U.S.
  26.  *  Government do not and cannot warrant the performance or results that
  27.  *  may be obtained by using this software or data. The NLM and the U.S.
  28.  *  Government disclaim all warranties, express or implied, including
  29.  *  warranties of performance, merchantability or fitness for any particular
  30.  *  purpose.
  31.  *
  32.  *  Please cite the author in any work or product based on this material.
  33.  *
  34.  * ===========================================================================
  35.  *
  36.  * Author: Anatoliy Kuznetsov
  37.  *
  38.  * File Description:
  39.  *  BDB Query
  40.  *
  41.  */
  42. /// @file bdb_query.hpp
  43. /// Queries for BDB library.
  44. #include <corelib/ncbi_tree.hpp>
  45. BEGIN_NCBI_SCOPE
  46. /** @addtogroup BDB_Query
  47.  *
  48.  * @{
  49.  */
  50. /// Query node class
  51. /// 
  52. /// Query node works as part of the query clause
  53. class NCBI_BDB_EXPORT CBDB_QueryNode
  54. {
  55. public:
  56.     enum ENodeType
  57.     {
  58.         eLogical,  // Logical AND, OR, NOT, etc
  59.         eOperator, // =, <, <=, like
  60.         eFunction,
  61.         eValue,    // Constant value
  62.         eDBField   // Database field
  63.     };
  64.     /// Subtype of ENodeType - eLogical
  65.     enum ELogicalType
  66.     {
  67.         eAnd,
  68.         eOr,
  69.         eNot
  70.     };
  71.     /// Subtype of ENodeType - eOperator
  72.     enum EOperatorType 
  73.     {
  74.         eEQ,
  75.         eGT,
  76.         eGE,
  77.         eLT,
  78.         eLE
  79.     };
  80. public:
  81.     /// Constuction of value type node
  82.     CBDB_QueryNode(string value = kEmptyStr);
  83.     /// Construction of logical (AND, OR, etc) node
  84.     CBDB_QueryNode(ELogicalType  ltype);
  85.     /// Construction of operator node
  86.     CBDB_QueryNode(EOperatorType otype, bool not_flag = false);
  87.     CBDB_QueryNode(const CBDB_QueryNode& qnode);
  88.     CBDB_QueryNode& operator=(const CBDB_QueryNode& qnode);
  89.     ~CBDB_QueryNode();
  90.     ENodeType     GetType() const { return m_NodeType; }
  91.     ELogicalType  GetLogicType() const;
  92.     EOperatorType GetOperatorType() const;
  93.     /// @return TRUE when node is an inverted operator (not EQ)
  94.     bool IsNot() const { return m_NotFlag; }
  95.     /// Set NOT flag (NOT EQ, etc)
  96.     void SetNot() { m_NotFlag = true; }
  97.     const string& GetValue() const { return m_Value; }
  98.     string& GetValue() { return m_Value; }
  99.     void SetValue(const string& value) { m_Value = value; }
  100.     bool HasValue() const { return !m_Value.empty(); }
  101.     /// Set node type to eDBField
  102.     /// @param 
  103.     ///   field_idx  database field index
  104.     void SetField(int field_idx);
  105.     int GetFiledIdx() const { return m_SubType.FieldIdx; }
  106.     /// Set alternative value
  107.     void SetAltValue(const string& v) { m_AltValue = v; }
  108.     /// Get alternative value
  109.     const string& GetAltValue() const { return m_AltValue; }
  110. protected:
  111.     ENodeType     m_NodeType;
  112.     union {
  113.         ELogicalType   LogicalType;
  114.         EOperatorType  OperatorType;
  115.         int            FieldIdx;
  116.     } m_SubType;
  117.     bool               m_NotFlag; ///< Inverted function
  118.     string m_Value;
  119.     string m_AltValue; ///< Alternative value
  120. };
  121. /// Query class incapsulates query tree (query clause) and 
  122. /// implements set of utility methods to construct query trees.
  123. ///
  124. class NCBI_BDB_EXPORT CBDB_Query
  125. {
  126. public:
  127.     typedef CTreeNode<CBDB_QueryNode> TQueryClause;
  128.     /// Contruct the query. If QueryClause is NOT NULL takes the ownership.
  129.     /// @param 
  130.     ///   qc  Query clause. (Should be created by new)
  131.     CBDB_Query(TQueryClause* qc = 0);
  132.     ~CBDB_Query();
  133.     TQueryClause& GetQueryClause() { return *m_QueryClause; }
  134.     const TQueryClause& GetQueryClause() const { return *m_QueryClause; }
  135.     /// Replace current query clause with the new one.
  136.     /// CBDB_Query object takes ownership on the passed argument.
  137.     void SetQueryClause(TQueryClause* query_clause);
  138.     void ResetQueryClause();
  139.     /// Creates new operator node of the query
  140.     /// Caller is responsible for destruction 
  141.     /// (in most cases the result is immediately added to the query tree).
  142.     static
  143.     TQueryClause* NewOperatorNode(CBDB_QueryNode::EOperatorType otype,  
  144.                                   const string&   arg1, 
  145.                                   const string&   arg2);
  146.     /// Creates new logical node of the query
  147.     /// @sa NewOperatorNode
  148.     static
  149.     TQueryClause* NewLogicalNode(CBDB_QueryNode::ELogicalType otype,  
  150.                                  TQueryClause*  arg1, 
  151.                                  TQueryClause*  arg2);
  152.     /// Creates new operator node of the query
  153.     /// Caller is responsible for destruction 
  154.     /// (in most cases the result is immediately added to the query tree).
  155.     ///
  156.     /// Function receives two argument nodes which are attached to the 
  157.     /// result clause. In terms of memory management caller does not need 
  158.     /// to deallocate them.
  159.     ///
  160.     /// @param
  161.     ///   otype - type of the operator to create
  162.     /// @param 
  163.     ///   arg1  - argument node.
  164.     /// @param 
  165.     ///   arg2  - argument node.
  166.     static
  167.     TQueryClause* NewOperatorNode(CBDB_QueryNode::EOperatorType ltype,  
  168.                                   TQueryClause*  arg1, 
  169.                                   TQueryClause*  arg2);
  170. private:
  171.     CBDB_Query(const CBDB_Query& query);
  172.     CBDB_Query& operator=(const CBDB_Query& query);
  173. public:
  174.     TQueryClause*     m_QueryClause;
  175. };
  176. class CBDB_File;
  177. class CBDB_FileCursor;
  178. /// Scans the BDB file, searches the matching records
  179. ///
  180. /// Search criteria is assigned by CBDB_Query
  181. ///
  182. class NCBI_BDB_EXPORT CBDB_FileScanner
  183. {
  184. public:
  185.     /// Scanner control codes
  186.     enum EScanAction
  187.     {
  188.         eContinue,   ///< Keep scanning
  189.         eStop        ///< Stop search process
  190.     };
  191. public:
  192.     CBDB_FileScanner(CBDB_File& db_file);
  193.     virtual ~CBDB_FileScanner();
  194.     /// Scan the BDB file, search the qualified records
  195.     /// When record found function calls OnRecordFound
  196.     /// @sa OnRecordFound
  197.     void Scan(CBDB_Query& query);
  198.     /// Scan the BDB file cursor, search the qualified records
  199.     /// When record found function calls OnRecordFound
  200.     /// @sa OnRecordFound
  201.     void Scan(CBDB_FileCursor& cur, CBDB_Query& query);
  202.     /// Static query evaluation without changing current position 
  203.     /// in the database file. Intended purpose: debugging
  204.     bool StaticEvaluate(CBDB_Query& query) 
  205.     { 
  206.         return Evaluate(query); 
  207.     }
  208.     /// Called when scanner finds a record matching the query terms
  209.     /// Function returns a control code (EScanAction) to confirm or
  210.     /// interrupt scanning process
  211.     virtual EScanAction OnRecordFound();
  212. protected:
  213.     /// Returns TRUE if file record matches the query
  214.     bool Evaluate(CBDB_Query& query);
  215.     void ResolveFields(CBDB_Query& query);
  216. private:
  217.     CBDB_FileScanner(const CBDB_FileScanner&);
  218.     CBDB_FileScanner& operator=(const CBDB_FileScanner&);
  219. protected:
  220.     CBDB_File&   m_File;   ///< Searched BDB file
  221. };
  222. /// Function prints the query tree on the specified ostream
  223. /// (Intended more for debugging purposes)
  224. NCBI_BDB_EXPORT
  225. void BDB_PrintQueryTree(CNcbiOstream& os, const CBDB_Query& query);
  226. /* @} */
  227. END_NCBI_SCOPE
  228. /*
  229.  * ===========================================================================
  230.  * $Log: bdb_query.hpp,v $
  231.  * Revision 1000.1  2004/06/01 18:37:03  gouriano
  232.  * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.10
  233.  *
  234.  * Revision 1.10  2004/05/17 19:34:53  gorelenk
  235.  * Added missed export prefix to BDB_PrintQueryTree
  236.  *
  237.  * Revision 1.9  2004/03/23 14:50:43  kuznets
  238.  * Implemented logical NOT
  239.  *
  240.  * Revision 1.8  2004/03/11 13:17:02  kuznets
  241.  * Added alternative value to the tree node
  242.  *
  243.  * Revision 1.7  2004/03/10 14:22:55  kuznets
  244.  * CBDB_FileScanner relaxed private to protected for m_File member
  245.  *
  246.  * Revision 1.6  2004/03/01 14:01:59  kuznets
  247.  * Add non const GetValue() accessor to query node
  248.  *
  249.  * Revision 1.5  2004/02/24 16:30:47  kuznets
  250.  * Improved doxygen documentation
  251.  *
  252.  * Revision 1.4  2004/02/24 14:11:44  kuznets
  253.  * Some improvement of CBDB_Query here and there. Additional constructor
  254.  * parameter, NewOperatorNode helper function.
  255.  *
  256.  * Revision 1.3  2004/02/19 17:35:15  kuznets
  257.  * + BDB_PrintQueryTree (tree printing utility function for debugging)
  258.  *
  259.  * Revision 1.2  2004/02/17 19:06:27  kuznets
  260.  * GCC warning fix
  261.  *
  262.  * Revision 1.1  2004/02/17 17:26:29  kuznets
  263.  * Initial revision
  264.  *
  265.  *
  266.  * ===========================================================================
  267.  */
  268. #endif