ElementRangeDB.cpp 8.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362
  1. #include "stdafx.h"
  2. #include "ElementRangeDB.h"
  3. #include "ElementRangeTable.h"
  4. namespace OTSClassifyEngine
  5. {
  6. CElementRangeDB::CElementRangeDB(CDBStoreBasePtr a_datastore)
  7. {
  8. m_tableInfo.reset(new CElementRangeTable());
  9. myDB = CreateNewSQLiteDB(a_datastore,m_tableInfo);
  10. }
  11. CElementRangeDB::~CElementRangeDB()
  12. {
  13. }
  14. CElementRangeList CElementRangeDB::GetElementRangeListById(const long a_nSTDId, const long a_nElementSize)
  15. {
  16. CElementRangeList listElementRange;
  17. if (!m_listSTDItem.empty())
  18. {
  19. for (auto& pSTDItem : m_listSTDItem)
  20. {
  21. if (pSTDItem->GetSTDId() == (DWORD)a_nSTDId && pSTDItem->GetElementRange() == a_nElementSize)
  22. {
  23. listElementRange = pSTDItem->GetElementRangeList();
  24. }
  25. }
  26. }
  27. else
  28. {
  29. // read element list
  30. for (int i = 0; i < a_nElementSize; i++)
  31. {
  32. auto tableQuery = GetQueryById(a_nSTDId, i, a_nElementSize);
  33. ASSERT(tableQuery);
  34. if (!tableQuery)
  35. {
  36. return listElementRange;
  37. }
  38. CSTDItemPtr pItem = ReadSTDItem(tableQuery);
  39. ASSERT(pItem);
  40. if (!pItem)
  41. {
  42. return listElementRange;
  43. }
  44. CElementRangeList listElement = pItem->GetElementRangeList();
  45. CElementRangePtr pElement = CElementRangePtr(new CElementRange(*listElement[0].get()));
  46. listElementRange.push_back(pElement);
  47. }
  48. }
  49. return listElementRange;
  50. }
  51. CSTDItemsList& CElementRangeDB::GetSTDItemList(const BOOL a_bForce/* = FALSE*/)
  52. {
  53. if (a_bForce)
  54. {
  55. m_listSTDItem.clear();
  56. }
  57. if (m_listSTDItem.size() == 0)
  58. {
  59. ReadSTDItemList();
  60. }
  61. return m_listSTDItem;
  62. }
  63. CDBTableBasePtr CElementRangeDB::GetTableInfo()
  64. {
  65. /*if (!m_tableInfo)
  66. {
  67. m_tableInfo.reset(new CElementRangeTable);
  68. }*/
  69. return m_tableInfo;
  70. }
  71. BOOL CElementRangeDB::Init(const BOOL a_bClean /*= FALSE*/)
  72. {
  73. return myDB->Init(a_bClean);
  74. }
  75. BOOL CElementRangeDB::CreateTable(const BOOL a_bForce /*= FALSE*/)
  76. {
  77. return myDB->CreateTable(a_bForce);
  78. }
  79. BOOL CElementRangeDB::DeleteTable()
  80. {
  81. return myDB->DeleteTable();
  82. }
  83. BOOL CElementRangeDB::RemoveAllRows()
  84. {
  85. return myDB->RemoveAllRows();
  86. }
  87. BOOL CElementRangeDB::IsDBExist()
  88. {
  89. return myDB->IsDBExist();
  90. }
  91. OTSSQLITE::CDBStoreBasePtr CElementRangeDB::GetDatastore()
  92. {
  93. return myDB->GetDatastore();
  94. }
  95. OTSSQLITE::CDBQueryBasePtr CElementRangeDB::GetTableQuery(LPCTSTR a_sOrderColumnName /*= nullptr*/)
  96. {
  97. return myDB->GetTableQuery(a_sOrderColumnName);
  98. }
  99. BOOL CElementRangeDB::ReadSTDItemList()
  100. {
  101. auto tableInfoPtr = GetTableInfo();
  102. ASSERT(tableInfoPtr);
  103. if (!tableInfoPtr)
  104. {
  105. return FALSE;
  106. }
  107. auto query = GetTableQuery();
  108. ASSERT(query);
  109. if (!query)
  110. {
  111. return FALSE;
  112. }
  113. m_listSTDItem = ReadSTDItemList(query);
  114. return TRUE;
  115. }
  116. CSTDItemsList CElementRangeDB::ReadSTDItemList(CDBQueryBasePtr a_query)
  117. {
  118. CSTDItemsList listSTDItem;
  119. int nRowId = 0;
  120. int nWrongItems = 0;
  121. while (!a_query->IsEOF())
  122. {
  123. auto STDItem = ReadSTDItem(a_query); //current x-ray point
  124. if (!STDItem)
  125. {
  126. LogErrorTrace(__FILE__, __LINE__, _T("Read xray point info item failed: row id: %d"), nRowId);
  127. nWrongItems++;
  128. }
  129. else
  130. {
  131. if (!listSTDItem.empty())
  132. {
  133. int nSTDId = STDItem->GetSTDId();
  134. CElementRangeList listElementNew = STDItem->GetElementRangeList();
  135. int nIndex = 0;
  136. for (auto Item : listSTDItem)
  137. {
  138. listSTDItem.erase(listSTDItem.begin() + nIndex);
  139. if (Item->GetSTDId() == nSTDId)
  140. {
  141. CElementRangeList listElementOld = Item->GetElementRangeList();
  142. for (auto pElement : listElementNew)
  143. {
  144. listElementOld.push_back(CElementRangePtr(new CElementRange(*pElement.get())));
  145. }
  146. STDItem->SetElementRangeList(listElementOld);
  147. break;
  148. }
  149. nIndex++;
  150. }
  151. }
  152. listSTDItem.push_back(STDItem);
  153. }
  154. a_query->NextRow();
  155. nRowId++;
  156. }
  157. return listSTDItem;
  158. }
  159. CSTDItemPtr CElementRangeDB::ReadSTDItem(CDBQueryBasePtr a_query)
  160. {
  161. int nCol;
  162. CSTDItemPtr pSTDItem(new CSTDItem());
  163. int nRangeNum;
  164. nCol = (int)CElementRangeTable::ColumnID::N_RANGE_NUM - (int)CElementRangeTable::ColumnID::MIN;
  165. nRangeNum = a_query->GetColIntValue(nCol, -1);
  166. pSTDItem->SetElementRange(nRangeNum);
  167. int nSTDIdNow;
  168. nCol = (int)CElementRangeTable::ColumnID::N_STD_ID - (int)CElementRangeTable::ColumnID::MIN;
  169. nSTDIdNow = a_query->GetColIntValue(nCol, -1);
  170. pSTDItem->SetSTDId(nSTDIdNow);
  171. CElementRangePtr pElementRange = CElementRangePtr(new CElementRange());
  172. int nRangeStart;
  173. nCol = (int)CElementRangeTable::ColumnID::N_RANGE_START - (int)CElementRangeTable::ColumnID::MIN;
  174. nRangeStart = a_query->GetColIntValue(nCol, -1);
  175. int nRangeEnd;
  176. nCol = (int)CElementRangeTable::ColumnID::N_RANGE_END - (int)CElementRangeTable::ColumnID::MIN;
  177. nRangeEnd = a_query->GetColIntValue(nCol, -1);
  178. CIntRangePtr pIntRange = CIntRangePtr(new CIntRange());
  179. pIntRange->SetStart(nRangeStart);
  180. pIntRange->SetEnd(nRangeEnd);
  181. pElementRange->SetRange(pIntRange);
  182. CElementPtr pElement = CElementPtr(new CElement());
  183. int nAtomNum;
  184. nCol = (int)CElementRangeTable::ColumnID::N_ATOM_NUM - (int)CElementRangeTable::ColumnID::MIN;
  185. nAtomNum = a_query->GetColIntValue(nCol, -1);
  186. pElement->SetAtomNum(nAtomNum);
  187. double dPercent;
  188. nCol = (int)CElementRangeTable::ColumnID::F_PERCENTAGE - (int)CElementRangeTable::ColumnID::MIN;
  189. dPercent = a_query->GetColFloatValue(nCol, -1);
  190. pElement->SetPercentage(dPercent);
  191. pElementRange->SetElement(pElement);
  192. CElementRangeList listElementRange;
  193. listElementRange.push_back(pElementRange);
  194. a_query->NextRow();
  195. int nSTDIdNew;
  196. int nRowId = 0;
  197. while (!a_query->IsEOF())
  198. {
  199. nCol = (int)CElementRangeTable::ColumnID::N_STD_ID - (int)CElementRangeTable::ColumnID::MIN;
  200. nSTDIdNew = a_query->GetColIntValue(nCol, -1);
  201. if (nSTDIdNew == nSTDIdNow)
  202. {
  203. CElementRangePtr pElementRange = CElementRangePtr(new CElementRange());
  204. int nElementIndex;
  205. nCol = (int)CElementRangeTable::ColumnID::N_RANGE_ID - (int)CElementRangeTable::ColumnID::MIN;
  206. nElementIndex = a_query->GetColIntValue(nCol, -1);
  207. int nRangeStart;
  208. nCol = (int)CElementRangeTable::ColumnID::N_RANGE_START - (int)CElementRangeTable::ColumnID::MIN;
  209. nRangeStart = a_query->GetColIntValue(nCol, -1);
  210. int nRangeEnd;
  211. nCol = (int)CElementRangeTable::ColumnID::N_RANGE_END - (int)CElementRangeTable::ColumnID::MIN;
  212. nRangeEnd = a_query->GetColIntValue(nCol, -1);
  213. CIntRangePtr pIntRange = CIntRangePtr(new CIntRange());
  214. pIntRange->SetStart(nRangeStart);
  215. pIntRange->SetEnd(nRangeEnd);
  216. pElementRange->SetRange(pIntRange);
  217. CElementPtr pElement = CElementPtr(new CElement());
  218. int nAtomNum;
  219. nCol = (int)CElementRangeTable::ColumnID::N_ATOM_NUM - (int)CElementRangeTable::ColumnID::MIN;
  220. nAtomNum = a_query->GetColIntValue(nCol, -1);
  221. pElement->SetAtomNum(nAtomNum);
  222. double dPercent;
  223. nCol = (int)CElementRangeTable::ColumnID::F_PERCENTAGE - (int)CElementRangeTable::ColumnID::MIN;
  224. dPercent = a_query->GetColFloatValue(nCol, -1);
  225. pElement->SetPercentage(dPercent);
  226. pElementRange->SetElement(pElement);
  227. listElementRange.push_back(pElementRange);
  228. if (nElementIndex == nRangeNum - 1)
  229. {
  230. break;
  231. }
  232. }
  233. else
  234. {
  235. continue;
  236. }
  237. a_query->NextRow();
  238. nRowId++;
  239. }
  240. pSTDItem->SetElementRangeList(listElementRange);
  241. return pSTDItem;
  242. }
  243. CDBQueryBasePtr CElementRangeDB::GetQueryById(const long a_nSTDId, const long a_nElementId, const long a_nElementNum)
  244. {
  245. CDBQueryBasePtr query;
  246. auto datastorePtr = GetDatastore();
  247. ASSERT(datastorePtr);
  248. if (!datastorePtr)
  249. {
  250. return query;
  251. }
  252. auto tableInfoPtr = GetTableInfo();
  253. ASSERT(tableInfoPtr);
  254. if (!tableInfoPtr)
  255. {
  256. return query;
  257. }
  258. CString sSTDIdColumnName = tableInfoPtr->GetColumnName((int)CElementRangeTable::ColumnID::N_STD_ID - (int)CElementRangeTable::ColumnID::MIN);
  259. CString sElementIdColumnName = tableInfoPtr->GetColumnName((int)CElementRangeTable::ColumnID::N_RANGE_ID - (int)CElementRangeTable::ColumnID::MIN);
  260. CString sElementNumColumnName = tableInfoPtr->GetColumnName((int)CElementRangeTable::ColumnID::N_RANGE_NUM - (int)CElementRangeTable::ColumnID::MIN);
  261. CString sSQLCommand;
  262. sSQLCommand.Format(_T("SELECT * FROM \'%s\' WHERE %s = %d AND %s = %d AND %s = %d;"),
  263. (LPCTSTR)tableInfoPtr->GetTableName(),
  264. (LPCTSTR)sSTDIdColumnName,
  265. a_nSTDId,
  266. (LPCTSTR)sElementIdColumnName,
  267. a_nElementId,
  268. (LPCTSTR)sElementNumColumnName,
  269. a_nElementNum);
  270. query = datastorePtr->QueryByCommand(sSQLCommand);
  271. ASSERT(query);
  272. if (!query || !query->IsValid())
  273. {
  274. LogErrorTrace(__FILE__, __LINE__, _T("Invalid quary command (%s)."), (LPCTSTR)sSQLCommand);
  275. ASSERT(FALSE);
  276. return (CDBQueryBasePtr());
  277. }
  278. // do the table related valid checking
  279. if (query->GetColCount() != GetTableInfo()->GetColumnCount())
  280. {
  281. LogErrorTrace(__FILE__, __LINE__, _T("query col num value is %d, but not %d"), query->GetColCount(), GetTableInfo()->GetColumnCount());
  282. ASSERT(FALSE);
  283. return (CDBQueryBasePtr());
  284. }
  285. return query;
  286. }
  287. }