hce-node application  1.4.3
HCE Hierarchical Cluster Engine node application
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros
SphinxDataSource.cpp
Go to the documentation of this file.
1 #include <Poco/DOM/DOMParser.h>
2 #include <Poco/DOM/DOMWriter.h>
3 #include <Poco/DOM/Document.h>
4 #include <Poco/DOM/NodeIterator.h>
5 #include <Poco/DOM/NodeFilter.h>
6 #include <Poco/DOM/AutoPtr.h>
7 #include <Poco/DOM/NamedNodeMap.h>
8 #include <Poco/XML/XMLWriter.h>
9 #include <Poco/DOM/Attr.h>
10 
11 #include <Poco/SharedPtr.h>
12 #include <Poco/AutoPtr.h>
13 
14 #include <fstream>
15 #include <sstream>
16 
17 #include "SphinxDataSource.hpp"
18 
19 namespace HCE
20 {
21 namespace sphinx
22 {
23 //-----------------------------------------------------------------------------
24 SphinxDataSource::SphinxDataSource(std::istream& istrSchema, std::istream& istrDocument)
25 :sourceSchema(istrSchema), sourceDocument(istrDocument), errorMsg(""), _IsError(false), maxDocId(0)
26 {
27 }
28 //-----------------------------------------------------------------------------
30 {
31 }
32 //-----------------------------------------------------------------------------
33 void SphinxDataSource::save(Poco::XML::Node* pNode, std::ostream& os)
34 {
35  Poco::XML::DOMWriter writer;
36  writer.setNewLine("\n");
37  writer.setOptions(Poco::XML::XMLWriter::PRETTY_PRINT | Poco::XML::XMLWriter::WRITE_XML_DECLARATION);
38  writer.writeNode(os, pNode);
39 }
40 //-----------------------------------------------------------------------------
41 bool SphinxDataSource::Process(std::ostream& os)
42 {
43  errorMsg.clear();
44  maxDocId = 0; // maximum found document ID
45 
46  try
47  {
48  Poco::AutoPtr<Poco::XML::Document> pOutDoc = new Poco::XML::Document;
49  Poco::AutoPtr<Poco::XML::Element> pRoot = pOutDoc->createElementNS(sphinx_data_source_const::namespaceURITag, sphinx_data_source_const::docsetTag);
50  pOutDoc->appendChild(pRoot);
51 
52  Poco::XML::DOMParser parser;
53  Poco::AutoPtr<Poco::XML::Document> pDoc = parser.parse(&sourceSchema);
54  Poco::XML::NodeIterator it_schema(pDoc, Poco::XML::NodeFilter::SHOW_ALL);
55  Poco::XML::Node* pNode = it_schema.nextNode();
56  Poco::XML::Node* schemaNode = pNode;
57 
58  while (pNode)
59  {
60  if (pNode->nodeName() == sphinx_data_source_const::schemaTag)
61  {
62  schemaNode = pNode;
63  break;
64  }
65  else
66  pNode = it_schema.nextNode();
67  }
68 
69  Poco::AutoPtr<Poco::XML::Element> pSchema = static_cast<Poco::XML::Element*>(pOutDoc->importNode(schemaNode, true));
70  pRoot->appendChild(pSchema);
71 
72  pDoc = parser.parse(&sourceDocument);
73  Poco::XML::NodeIterator it(pDoc, Poco::XML::NodeFilter::SHOW_ALL);
74  pNode = it.nextNode();
75 
76  unsigned long long documents = 0; // count of documents
77  unsigned long long foundMaxDocId = 0;
78  while (pNode)
79  {
80  if (pNode->nodeName() == sphinx_data_source_const::documentTag)
81  {
82  Poco::AutoPtr<Poco::XML::Element> pDocument = static_cast<Poco::XML::Element*>(pOutDoc->importNode(pNode, true));
83  pRoot->appendChild(pDocument);
84 
85  ++documents;
86 
87  Poco::AutoPtr<Poco::XML::NamedNodeMap> pMap = pNode->attributes();
88  if (!pMap.isNull())
89  {
90  for (size_t i=0;i<pMap->length();++i)
91  {
92  if (pMap->item(i)->nodeName()==sphinx_data_source_const::documentIdAttrTag)
93  {
94  try
95  {
96  foundMaxDocId = std::stoull(pMap->item(i)->nodeValue()); // pMap->item(i)->setNodeValue();
97  }
98  catch(...)
99  {
100  foundMaxDocId = 0;
101  }
102  }
103  }
104  }
105  if (maxDocId < foundMaxDocId)
106  maxDocId = foundMaxDocId;
107  }
108  pNode = it.nextNode();
109  }
110 
111  Poco::AutoPtr<Poco::XML::Element> pHceParameters = pOutDoc->createElementNS(sphinx_data_source_const::namespaceURITag, sphinx_data_source_const::hceParametersTag);
112  pRoot->appendChild(pHceParameters);
113 
114  Poco::AutoPtr<Poco::XML::Element> pHceDocs = pOutDoc->createElement(sphinx_data_source_const::hceDocsTag);
115  pHceParameters->appendChild(pHceDocs);
116 
117 
118  Poco::AutoPtr<Poco::XML::Attr> pAttrMaxDocId = pOutDoc->createAttribute(sphinx_data_source_const::maxDocIdAttrTag);
119  Poco::XML::Attr* pAttrOld = pHceDocs->addAttributeNodeNP(0, pAttrMaxDocId.get());
120  Poco::AutoPtr<Poco::XML::Attr> pAttrDocuments = pOutDoc->createAttribute(sphinx_data_source_const::documentsAttrTag);
121  pHceDocs->addAttributeNodeNP(pAttrOld, pAttrDocuments.get());
122 
123  Poco::AutoPtr<Poco::XML::NamedNodeMap> pMap = pHceDocs->attributes();
124  if (!pMap.isNull())
125  {
126  for (size_t i=0;i<pMap->length();++i)
127  {
128  if (pMap->item(i)->nodeName()==sphinx_data_source_const::maxDocIdAttrTag)
129  pMap->item(i)->setNodeValue(std::to_string(maxDocId));
130  if (pMap->item(i)->nodeName()==sphinx_data_source_const::documentsAttrTag)
131  pMap->item(i)->setNodeValue(std::to_string(documents));
132  }
133  }
134  save(pOutDoc, os);
135 
136  _IsError = false;
137  }
138  catch(Poco::Exception& e)
139  {
140  errorMsg = e.displayText();
141  _IsError = true;
142  }
143  catch(std::exception& e)
144  {
145  errorMsg = e.what();
146  _IsError = true;
147  }
148  return !_IsError;
149 }
150 //-----------------------------------------------------------------------------
151 std::ostream& operator << (std::ostream& os, const SphinxDataSource& dataSource) throw (Poco::Exception)
152 {
153  std::stringstream out;
154  const_cast<SphinxDataSource&>(dataSource).Process(out);
155  if (dataSource.isError())
156  throw Poco::Exception(dataSource.getErrorMsg());
157 
158  return os << out.str();
159 }
160 //-----------------------------------------------------------------------------
161 //-----------------------------------------------------------------------------
162 } // end namespace sphinx
163 } // end namespace HCE
164