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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: entrez2client.cpp,v $
  4.  * PRODUCTION Revision 1000.2  2004/06/01 19:32:10  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.4
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /* $Id: entrez2client.cpp,v 1000.2 2004/06/01 19:32:10 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:  Mike DiCuccio
  35.  *
  36.  * File Description:
  37.  *
  38.  */
  39. #include <ncbi_pch.hpp>
  40. #include <connect/ncbi_core_cxx.hpp>
  41. #include <corelib/ncbiapp.hpp>
  42. #include <corelib/ncbiargs.hpp>
  43. #include <corelib/ncbienv.hpp>
  44. #include <corelib/ncbistd.hpp>
  45. #include <objects/entrez2/Entrez2_boolean_element.hpp>
  46. #include <objects/entrez2/Entrez2_boolean_exp.hpp>
  47. #include <objects/entrez2/Entrez2_boolean_reply.hpp>
  48. #include <objects/entrez2/Entrez2_db_id.hpp>
  49. #include <objects/entrez2/Entrez2_docsum_list.hpp>
  50. #include <objects/entrez2/Entrez2_eval_boolean.hpp>
  51. #include <objects/entrez2/Entrez2_id_list.hpp>
  52. #include <objects/entrez2/Entrez2_info.hpp>
  53. #include <objects/entrez2/Entrez2_limits.hpp>
  54. #include <objects/entrez2/entrez2_client.hpp>
  55. #include <serial/objostrasn.hpp>
  56. #include <serial/serial.hpp>
  57. using namespace ncbi;
  58. using namespace objects;
  59. class CEntrez2ClientApp : public CNcbiApplication
  60. {
  61. public:
  62.     virtual void Init(void);
  63.     virtual int  Run (void);
  64. private:
  65.     CRef<CEntrez2Client>     m_Client;
  66.     CNcbiOstream*            m_Ostream;
  67.     auto_ptr<CObjectOStream> m_ObjOstream;
  68.     //
  69.     // handlers for specific requests
  70.     //
  71.     void x_GetInfo         (CEntrez2Client& client);
  72.     void x_GetCount        (CEntrez2Client& client,
  73.                             const string& query, const string& db);
  74.     void x_GetParsedQuery  (CEntrez2Client& client,
  75.                             const string& query, const string& db);
  76.     void x_GetUids         (CEntrez2Client& client,
  77.                             const string& query, const string& db);
  78.     void x_GetDocsums      (CEntrez2Client& client,
  79.                             const string& query, const string& db,
  80.                             int start, int max_num);
  81.     void x_GetTermPositions(CEntrez2Client& client,
  82.                             const string& query, const string& db);
  83.     void x_GetTermList(CEntrez2Client& client,
  84.                        const string& query, const string& db);
  85.     void x_GetTermHierarchy(CEntrez2Client& client,
  86.                             const string& query, const string& db);
  87.     void x_GetLinks(CEntrez2Client& client,
  88.                     const string& query, const string& db);
  89.     void x_GetLinked(CEntrez2Client& client,
  90.                      const string& query, const string& db);
  91.     void x_GetLinkCounts(CEntrez2Client& client,
  92.                          const string& query, const string& db);
  93.     // format a reply (basic formatting only)
  94.     void x_FormatReply(CEntrez2_boolean_reply& reply);
  95.     // main internal query function
  96.     CEntrez2_boolean_reply* x_EvalBoolean(CEntrez2Client& client,
  97.                                           const string& query,
  98.                                           const string& db,
  99.                                           bool parse, bool uids,
  100.                                           int start = -1, int max_num = -1);
  101. };
  102. void CEntrez2ClientApp::Init(void)
  103. {
  104.     // Prepare command line descriptions
  105.     auto_ptr<CArgDescriptions> arg_desc(new CArgDescriptions);
  106.     arg_desc->AddKey("query", "QueryString", "Query to submit",
  107.                      CArgDescriptions::eString);
  108.     arg_desc->AddKey("db", "Database", "Name of database to query",
  109.                      CArgDescriptions::eString);
  110.     arg_desc->AddDefaultKey("lt", "Lookup", "Type of lookup to perform",
  111.                             CArgDescriptions::eString, "info");
  112.     arg_desc->SetConstraint("lt",
  113.                             &(*new CArgAllow_Strings,
  114.                               "info",     // get-info request
  115.                               "count",    // eval-boolean: count only
  116.                               "parse",    // eval-boolean: parsed query
  117.                               "uids",     // eval-boolean: uid list
  118.                               "docsum",   // get docsums for our query
  119.                               "termpos",  // get term positions
  120.                               "termhier", // get term hierarchy
  121.                               "termlist", // get term list
  122.                               "links",    // get links
  123.                               "linked",   // get linked status
  124.                               "linkct"    // get link count
  125.                              ));
  126.     arg_desc->AddDefaultKey("start", "StartPos",
  127.                             "Starting point in the UID list for retrieval",
  128.                             CArgDescriptions::eInteger, "-1");
  129.     arg_desc->AddDefaultKey("max", "MaxNum",
  130.                             "Maximum number of records to retrieve",
  131.                             CArgDescriptions::eInteger, "-1");
  132.     arg_desc->AddDefaultKey("out", "OutputFile", "File to dump output to",
  133.                             CArgDescriptions::eOutputFile, "-");
  134.     // Pass argument descriptions to the application
  135.     //
  136.     SetupArgDescriptions(arg_desc.release());
  137. }
  138. int CEntrez2ClientApp::Run(void)
  139. {
  140.     // Setup application registry, error log, and MT-lock for CONNECT library
  141.     CONNECT_Init(&GetConfig());
  142.     CArgs args = GetArgs();
  143.     string db          = args["db"].AsString();
  144.     string query       = args["query"].AsString();
  145.     string lt          = args["lt"].AsString();
  146.     CNcbiOstream& ostr = args["out"].AsOutputFile();
  147.     int start          = args["start"].AsInteger();
  148.     int max_num        = args["max"].AsInteger();
  149.     m_Client.Reset(new CEntrez2Client());
  150.     m_Client->SetDefaultRequest().SetTool("Entrez2 Command-line Test");
  151.     m_ObjOstream.reset(CObjectOStream::Open(eSerial_AsnText, ostr));
  152.     m_Ostream = &ostr;
  153.     //
  154.     // process each lookup type
  155.     //
  156.     if (lt == "info") {
  157.         LOG_POST(Info << "performing look-up type: get-info");
  158.         x_GetInfo(*m_Client);
  159.     } else if (lt == "count") {
  160.         LOG_POST(Info << "performing look-up type: eval-boolean (count only)");
  161.         x_GetCount(*m_Client, query, db);
  162.     } else if (lt == "parse") {
  163.         LOG_POST(Info << "performing look-up type: eval-boolean (show parsed expression)");
  164.         x_GetParsedQuery(*m_Client, query, db);
  165.     } else if (lt == "uids") {
  166.         LOG_POST(Info << "performing look-up type: eval-boolean (UID list)");
  167.         x_GetUids(*m_Client, query, db);
  168.     } else if (lt == "docsum") {
  169.         LOG_POST(Info << "performing look-up type: get-docsum");
  170.         x_GetDocsums(*m_Client, query, db, start, max_num);
  171.     } else if (lt == "termpos") {
  172.         LOG_POST(Info << "performing look-up type: get-termpos");
  173.         x_GetTermPositions(*m_Client, query, db);
  174.     } else {
  175.         LOG_POST(Error << "unrecognized lookup type: " << lt);
  176.         return 1;
  177.     }
  178.     return 0;
  179. }
  180. //
  181. // get-info
  182. // returns information about active databases
  183. //
  184. void CEntrez2ClientApp::x_GetInfo(CEntrez2Client& client)
  185. {
  186.     CRef<CEntrez2_info> info = client.AskGet_info();
  187.     *m_ObjOstream << *info;
  188. }
  189. //
  190. // display only the number fo records that match a query
  191. //
  192. void CEntrez2ClientApp::x_GetCount(CEntrez2Client& client,
  193.                                    const string& query, const string& db)
  194. {
  195.     *m_Ostream << "query: " << query << endl;
  196.     CRef<CEntrez2_boolean_reply> reply(x_EvalBoolean(client, query, db,
  197.                                                      false, false));
  198.     x_FormatReply(*reply);
  199. }
  200. //
  201. // display only the number fo records that match a query
  202. //
  203. void CEntrez2ClientApp::x_GetUids(CEntrez2Client& client,
  204.                                   const string& query, const string& db)
  205. {
  206.     CRef<CEntrez2_boolean_reply> reply(x_EvalBoolean(client, query, db,
  207.                                                      true, true));
  208.     *m_Ostream << "query: " << query << endl;
  209.     x_FormatReply(*reply);
  210. }
  211. //
  212. // display only the number fo records that match a query
  213. //
  214. void CEntrez2ClientApp::x_GetParsedQuery(CEntrez2Client& client,
  215.                                          const string& query,
  216.                                          const string& db)
  217. {
  218.     CRef<CEntrez2_boolean_reply> reply(x_EvalBoolean(client, query, db,
  219.                                                      true, false));
  220.     x_FormatReply(*reply);
  221. }
  222. //
  223. // display docsums for a given query
  224. //
  225. void CEntrez2ClientApp::x_GetDocsums(CEntrez2Client& client,
  226.                                      const string& query,
  227.                                      const string& db,
  228.                                      int start, int max_num)
  229. {
  230.     // retrieve our list of UIDs
  231.     CRef<CEntrez2_boolean_reply> reply(x_EvalBoolean(client, query, db,
  232.                                                      false, true,
  233.                                                      start, max_num));
  234.     // retrieve the docsums
  235.     CRef<CEntrez2_docsum_list> docsums =
  236.         client.AskGet_docsum(reply->GetUids());
  237.     *m_Ostream << reply->GetCount() << " records match" << endl;
  238.     *m_Ostream << "docsums:" << endl;
  239.     *m_Ostream << string(72, '-') << endl;
  240.     *m_ObjOstream << *docsums;
  241.     *m_Ostream << endl << string(72, '-') << endl;
  242. }
  243. //
  244. // display term positions for a given query
  245. //
  246. void CEntrez2ClientApp::x_GetTermPositions(CEntrez2Client& client,
  247.                                            const string& query,
  248.                                            const string& db)
  249. {
  250.     LOG_POST(Error << "get-term-pos query unimplemented");
  251. }
  252. //
  253. // display term list for a given query
  254. //
  255. void CEntrez2ClientApp::x_GetTermList(CEntrez2Client& client,
  256.                                       const string& query,
  257.                                       const string& db)
  258. {
  259.     LOG_POST(Error << "get-term-list query unimplemented");
  260. }
  261. //
  262. // display term hierarchy for a given query
  263. //
  264. void CEntrez2ClientApp::x_GetTermHierarchy(CEntrez2Client& client,
  265.                                            const string& query,
  266.                                            const string& db)
  267. {
  268.     LOG_POST(Error << "get-term-hierarchy query unimplemented");
  269. }
  270. //
  271. // display links for a given query
  272. //
  273. void CEntrez2ClientApp::x_GetLinks(CEntrez2Client& client,
  274.                                    const string& query,
  275.                                    const string& db)
  276. {
  277.     LOG_POST(Error << "get-links query unimplemented");
  278. }
  279. //
  280. // display linked status for a given query
  281. //
  282. void CEntrez2ClientApp::x_GetLinked(CEntrez2Client& client,
  283.                                     const string& query,
  284.                                     const string& db)
  285. {
  286.     LOG_POST(Error << "get-linked query unimplemented");
  287. }
  288. //
  289. // display link counts for a given query
  290. //
  291. void CEntrez2ClientApp::x_GetLinkCounts(CEntrez2Client& client,
  292.                                         const string& query,
  293.                                         const string& db)
  294. {
  295.     LOG_POST(Error << "get-link-counts query unimplemented");
  296. }
  297. //
  298. // eval-boolean
  299. // returns a count of the number of items that match
  300. //
  301. CEntrez2_boolean_reply*
  302. CEntrez2ClientApp::x_EvalBoolean(CEntrez2Client& client,
  303.                                  const string& query, const string& db,
  304.                                  bool parse, bool uids,
  305.                                  int start, int max_num)
  306. {
  307.     CEntrez2_eval_boolean req;
  308.     if (parse) {
  309.         req.SetReturn_parse(true);
  310.     }
  311.     if (uids) {
  312.         req.SetReturn_UIDs(true);
  313.     }
  314.     CEntrez2_boolean_exp& exp = req.SetQuery();
  315.     if (start != -1) {
  316.         exp.SetLimits().SetOffset_UIDs(start);
  317.     }
  318.     if (max_num != -1) {
  319.         exp.SetLimits().SetMax_UIDs(max_num);
  320.     }
  321.     // set the database we're querying
  322.     exp.SetDb().Set(db);
  323.     // set the query
  324.     CRef<CEntrez2_boolean_element> elem(new CEntrez2_boolean_element());
  325.     elem->SetStr(query);
  326.     exp.SetExp().push_back(elem);
  327.     CRef<CEntrez2_boolean_reply> reply = client.AskEval_boolean(req);
  328.     return reply.Release();
  329. }
  330. //
  331. // x_FormatReply()
  332. // dump results from the reply block
  333. //
  334. void CEntrez2ClientApp::x_FormatReply(CEntrez2_boolean_reply& reply)
  335. {
  336.     if (reply.CanGetCount()) {
  337.         *m_Ostream << reply.GetCount() << " uids match" << endl;
  338.     }
  339.     if (reply.IsSetQuery()) {
  340.         *m_Ostream << "parsed query:" << endl;
  341.         *m_Ostream << string(75, '-') << endl;
  342.         *m_ObjOstream << reply.GetQuery();
  343.         *m_Ostream << endl << string(75, '-') << endl;
  344.     }
  345.     if (reply.IsSetUids()) {
  346.         *m_Ostream << "decoded UIDs:" << endl;
  347.         CEntrez2_id_list::TConstUidIterator iter =
  348.             reply.GetUids().GetConstUidIterator();
  349.         for ( ; !iter.AtEnd();  ++iter) {
  350.             *m_Ostream << "    " << *iter << endl;
  351.         }
  352.     }
  353. }
  354. /////////////////////////////////////////////////////////////////////////////
  355. //  MAIN
  356. int main(int argc, const char* argv[])
  357. {
  358.     return CEntrez2ClientApp().AppMain(argc, argv, 0, eDS_Default, 0);
  359. }
  360. /*
  361.  * ===========================================================================
  362.  * $Log: entrez2client.cpp,v $
  363.  * Revision 1000.2  2004/06/01 19:32:10  gouriano
  364.  * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.4
  365.  *
  366.  * Revision 1.4  2004/05/19 17:21:09  gorelenk
  367.  * Added include of PCH - ncbi_pch.hpp
  368.  *
  369.  * Revision 1.3  2003/11/20 15:41:17  ucko
  370.  * Update for new (saner) treatment of ASN.1 NULLs.
  371.  *
  372.  * Revision 1.2  2003/07/31 18:12:26  dicuccio
  373.  * Code clean-up.  Added limits for docsum retrieval (start pos / max number of
  374.  * records)
  375.  *
  376.  * Revision 1.1  2003/07/31 17:38:51  dicuccio
  377.  * Added subproject demo with a single applicaiton, a command-line demo app
  378.  *
  379.  * ===========================================================================
  380.  */