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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: lds_dataloader.cpp,v $
  4.  * PRODUCTION Revision 1000.3  2004/06/01 19:42:43  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.15
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /*  $Id: lds_dataloader.cpp,v 1000.3 2004/06/01 19:42:43 gouriano Exp $
  10.  * ===========================================================================
  11.  *
  12.  *                            PUBLIC DOMAIN NOTICE
  13.  *               National Center for Biotechnology Information
  14.  *
  15.  *  This software/database is a "United States Government Work" under the
  16.  *  terms of the United States Copyright Act.  It was written as part of
  17.  *  the author's official duties as a United States Government employee and
  18.  *  thus cannot be copyrighted.  This software/database is freely available
  19.  *  to the public for use. The National Library of Medicine and the U.S.
  20.  *  Government have not placed any restriction on its use or reproduction.
  21.  *
  22.  *  Although all reasonable efforts have been taken to ensure the accuracy
  23.  *  and reliability of the software and data, the NLM and the U.S.
  24.  *  Government do not and cannot warrant the performance or results that
  25.  *  may be obtained by using this software or data. The NLM and the U.S.
  26.  *  Government disclaim all warranties, express or implied, including
  27.  *  warranties of performance, merchantability or fitness for any particular
  28.  *  purpose.
  29.  *
  30.  *  Please cite the author in any work or product based on this material.
  31.  *
  32.  * ===========================================================================
  33.  *
  34.  * Author: Anatoliy Kuznetsov
  35.  *
  36.  * File Description:  LDS dataloader. Implementations.
  37.  *
  38.  */
  39. #include <ncbi_pch.hpp>
  40. #include <objtools/data_loaders/lds/lds_dataloader.hpp>
  41. #include <objtools/lds/lds_reader.hpp>
  42. #include <objtools/lds/lds_util.hpp>
  43. #include <objects/general/Object_id.hpp>
  44. #include <bdb/bdb_util.hpp>
  45. #include <objtools/lds/lds.hpp>
  46. #include <objmgr/impl/handle_range_map.hpp>
  47. #include <objmgr/impl/tse_info.hpp>
  48. #include <objmgr/impl/data_source.hpp>
  49. #include <corelib/plugin_manager.hpp>
  50. #include <corelib/plugin_manager_impl.hpp>
  51. BEGIN_NCBI_SCOPE
  52. NCBI_DECLARE_INTERFACE_VERSION(objects::CDataLoader,  "omdataloader", 1, 1, 0);
  53. BEGIN_SCOPE(objects)
  54. class CLDS_BlobId : public CObject
  55. {
  56. public:
  57.     CLDS_BlobId(int rec_id)
  58.     : m_RecId(rec_id)
  59.     {}
  60.     int GetRecId() const { return m_RecId; }
  61. private:
  62.     int    m_RecId;
  63. };
  64. class CLDS_FindSeqIdFunc
  65. {
  66. public:
  67.     CLDS_FindSeqIdFunc(SLDS_TablesCollection& db,
  68.                        const CHandleRangeMap&  hrmap)
  69.     : m_HrMap(hrmap),
  70.       m_db(db)
  71.     {}
  72.     void operator()(SLDS_ObjectDB& dbf)
  73.     {
  74.         if (dbf.primary_seqid.IsNull())
  75.             return;
  76.         int object_id = dbf.object_id;
  77.         int tse_id = dbf.TSE_object_id;
  78.         string seq_id_str = (const char*)dbf.primary_seqid;
  79.         if (seq_id_str.empty())
  80.             return;
  81.         {{
  82.             CSeq_id seq_id_db(seq_id_str);
  83.             if (seq_id_db.Which() == CSeq_id::e_not_set) {
  84.                 seq_id_db.SetLocal().SetStr(seq_id_str);
  85.                 if (seq_id_db.Which() == CSeq_id::e_not_set) {
  86.                     return;
  87.                 }
  88.             }
  89.             ITERATE (CHandleRangeMap, it, m_HrMap) {
  90.                 CSeq_id_Handle seq_id_hnd = it->first;
  91.                 CConstRef<CSeq_id> seq_id = seq_id_hnd.GetSeqId();
  92.                 if (seq_id->Match(seq_id_db)) {
  93.                     m_ids.insert(tse_id ? tse_id : object_id);
  94.                     return;
  95.                 }
  96.             } // ITERATE
  97.         }}
  98.         // Primaty seq_id scan gave no results
  99.         // Trying supplemental aliases
  100. /*
  101.         m_db.object_attr_db.object_attr_id = object_id;
  102.         if (m_db.object_attr_db.Fetch() != eBDB_Ok) {
  103.             return;
  104.         }
  105.         if (m_db.object_attr_db.seq_ids.IsNull() || 
  106.             m_db.object_attr_db.seq_ids.IsEmpty()) {
  107.             return;
  108.         }
  109. */
  110.         if (dbf.seq_ids.IsNull() || 
  111.             dbf.seq_ids.IsEmpty()) {
  112.             return;
  113.         }
  114.         string attr_seq_ids((const char*)dbf.seq_ids);
  115.         vector<string> seq_id_arr;
  116.         
  117.         NStr::Tokenize(attr_seq_ids, " ", seq_id_arr, NStr::eMergeDelims);
  118.         ITERATE (vector<string>, it, seq_id_arr) {
  119.             CSeq_id seq_id_db(*it);
  120.             if (seq_id_db.Which() == CSeq_id::e_not_set) {
  121.                 seq_id_db.SetLocal().SetStr(*it);
  122.                 if (seq_id_db.Which() == CSeq_id::e_not_set) {
  123.                     continue;
  124.                 }
  125.             }
  126.             {{
  127.             
  128.             ITERATE (CHandleRangeMap, it2, m_HrMap) {
  129.                 CSeq_id_Handle seq_id_hnd = it2->first;
  130.                 CConstRef<CSeq_id> seq_id = seq_id_hnd.GetSeqId();
  131.                 if (seq_id->Match(seq_id_db)) {
  132.                     m_ids.insert(tse_id ? tse_id : object_id);
  133.                     return;
  134.                 }
  135.             } // ITERATE
  136.             
  137.             }}
  138.         } // ITERATE
  139.     }
  140.     CLDS_Set& GetIds() { return m_ids; }
  141. private:
  142.     const CHandleRangeMap&  m_HrMap;  // Range map of seq ids to search
  143.     SLDS_TablesCollection&  m_db;     // The LDS database
  144.     CLDS_Set                m_ids;    // TSE results, found
  145. };
  146. CLDS_DataLoader::CLDS_DataLoader()
  147. : m_LDS_db(0)
  148. {}
  149. CLDS_DataLoader::CLDS_DataLoader(CLDS_Database& lds_db,
  150.                                  const string& dl_name)
  151.  : CDataLoader(dl_name),
  152.    m_LDS_db(&lds_db),
  153.    m_OwnDatabase(false)
  154. {
  155. }
  156. CLDS_DataLoader::CLDS_DataLoader(const string& db_path,
  157.                                  const string& dl_name)
  158.  : CDataLoader(dl_name),
  159.    m_LDS_db(new CLDS_Database(db_path, kEmptyStr)),
  160.    m_OwnDatabase(true)
  161. {
  162.     try {
  163.         m_LDS_db->Open();
  164.     } 
  165.     catch(...)
  166.     {
  167.         delete m_LDS_db;
  168.         throw;
  169.     }
  170. }
  171. CLDS_DataLoader::~CLDS_DataLoader()
  172. {
  173.     if (m_OwnDatabase)
  174.         delete m_LDS_db;
  175. }
  176. void CLDS_DataLoader::SetDatabase(CLDS_Database& lds_db,
  177.                                   const string&  dl_name)
  178. {
  179.     if (m_LDS_db && m_OwnDatabase)
  180.         delete m_LDS_db;
  181.     m_LDS_db = &lds_db;
  182.     SetName(dl_name);
  183. }
  184. void CLDS_DataLoader::GetRecords(const CSeq_id_Handle& idh,
  185.                                  EChoice choice)
  186. {
  187.     CHandleRangeMap hrmap;
  188.     hrmap.AddRange(idh, CRange<TSeqPos>::GetWhole(), eNa_strand_unknown);
  189.     CLDS_FindSeqIdFunc search_func(m_LDS_db->GetTables(), hrmap);
  190.     
  191.     SLDS_TablesCollection& db = m_LDS_db->GetTables();
  192.     BDB_iterate_file(db.object_db, search_func);
  193.     const CLDS_Set& ids = search_func.GetIds();
  194.     CDataSource* data_source = GetDataSource();
  195.     _ASSERT(data_source);
  196.     CLDS_Set::const_iterator it;
  197.     for (it = ids.begin(); it != ids.end(); ++it) {
  198.         int object_id = *it;
  199.         if (LDS_SetTest(m_LoadedObjects, object_id)) {
  200.             // Object has already been loaded. Ignore.
  201.             continue;
  202.         }
  203.         CRef<CSeq_entry> seq_entry = 
  204.             LDS_LoadTSE(db, m_LDS_db->GetObjTypeMap(), object_id);
  205.         if (seq_entry) {
  206.             CRef<CTSE_Info> tse_info = 
  207.                 data_source->AddTSE(*seq_entry,
  208.                                     false,
  209.                                     new CLDS_BlobId(object_id));
  210.             m_LoadedObjects.insert(object_id);
  211.         }
  212.     }
  213. }
  214. void CLDS_DataLoader::DropTSE(const CTSE_Info& tse_info)
  215. {
  216.     const CConstRef<CObject>& cobj_ref = tse_info.GetBlobId();
  217.     const CObject* obj_ptr = cobj_ref.GetPointerOrNull();
  218.     _ASSERT(obj_ptr);
  219.     const CLDS_BlobId* blob_id = 
  220.         dynamic_cast<const CLDS_BlobId*>(obj_ptr);
  221.     _ASSERT(blob_id);
  222.     
  223.     int object_id = blob_id->GetRecId();
  224.     m_LoadedObjects.erase(object_id);
  225. }
  226. END_SCOPE(objects)
  227. // ===========================================================================
  228. USING_SCOPE(objects);
  229. class CLDS_DataLoaderCF : 
  230.   public CSimpleClassFactoryImpl<objects::CDataLoader, objects::CLDS_DataLoader>
  231. {
  232. public:
  233.     typedef CSimpleClassFactoryImpl<objects::CDataLoader, 
  234.                                     objects::CLDS_DataLoader>    TParent;
  235.     CLDS_DataLoaderCF() : TParent("CLDS_DataLoader")
  236.     {}
  237. };
  238. extern "C"
  239. {
  240. void NCBI_XLOADER_LDS_EXPORT 
  241. NCBI_EntryPoint_DataLoader_LDS(CPluginManager<CDataLoader>::TDriverInfoList&   info_list,
  242.                                CPluginManager<CDataLoader>::EEntryPointRequest method)
  243. {
  244.     CHostEntryPointImpl<CLDS_DataLoaderCF>::NCBI_EntryPointImpl(info_list, method);
  245. }
  246. }
  247. END_NCBI_SCOPE
  248. /*
  249.  * ===========================================================================
  250.  * $Log: lds_dataloader.cpp,v $
  251.  * Revision 1000.3  2004/06/01 19:42:43  gouriano
  252.  * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.15
  253.  *
  254.  * Revision 1.15  2004/05/21 21:42:52  gorelenk
  255.  * Added PCH ncbi_pch.hpp
  256.  *
  257.  * Revision 1.14  2004/03/09 17:17:20  kuznets
  258.  * Merge object attributes with objects
  259.  *
  260.  * Revision 1.13  2003/12/16 20:49:18  vasilche
  261.  * Fixed compile errors - added missing includes and declarations.
  262.  *
  263.  * Revision 1.12  2003/12/16 17:55:22  kuznets
  264.  * Added plugin entry point
  265.  *
  266.  * Revision 1.11  2003/11/28 13:41:10  dicuccio
  267.  * Fixed to match new API in CDataLoader
  268.  *
  269.  * Revision 1.10  2003/10/28 14:01:20  kuznets
  270.  * Added constructor parameter name of the dataloader
  271.  *
  272.  * Revision 1.9  2003/10/08 19:40:55  kuznets
  273.  * kEmptyStr instead database path as default alias
  274.  *
  275.  * Revision 1.8  2003/10/08 19:29:08  ucko
  276.  * Adapt to new (multi-DB-capable) LDS API.
  277.  *
  278.  * Revision 1.7  2003/09/30 16:36:37  vasilche
  279.  * Updated CDataLoader interface.
  280.  *
  281.  * Revision 1.6  2003/08/19 14:21:24  kuznets
  282.  * +name("LDS_dataloader") for the dataloader class
  283.  *
  284.  * Revision 1.5  2003/07/30 19:52:15  kuznets
  285.  * Cleaned compilation warnings
  286.  *
  287.  * Revision 1.4  2003/07/30 19:46:54  kuznets
  288.  * Implemented alias search mode
  289.  *
  290.  * Revision 1.3  2003/07/30 18:36:38  kuznets
  291.  * Minor syntactic fix
  292.  *
  293.  * Revision 1.2  2003/06/18 18:49:01  kuznets
  294.  * Implemented new constructor.
  295.  *
  296.  * Revision 1.1  2003/06/16 15:48:28  kuznets
  297.  * Initial revision.
  298.  *
  299.  *
  300.  * ===========================================================================
  301.  */