SegmentDB.cs 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486
  1. using OTSCOMMONCLR;
  2. using OTSDataType;
  3. using OTSModelSharp.DTLBase;
  4. using System;
  5. using System.Collections.Generic;
  6. using System.Data;
  7. using System.Linq;
  8. using System.Text;
  9. using System.Threading.Tasks;
  10. namespace OTSModelSharp
  11. {
  12. public class CSegmentDB: CSQLiteDB
  13. {
  14. // particle list
  15. List< COTSParticleClr> m_listParticle;
  16. public CSegmentDB(IDBStoreBase _conStr, CSQLiteTable _table):base(_conStr,_table)
  17. {
  18. }
  19. public COTSFeatureClr GetFeatureById( long a_nXrayId, long a_nFieldId, long a_nSegmentSize)
  20. {
  21. COTSFeatureClr pFeatureNew = null;
  22. if (m_listParticle.Count!=0)
  23. {
  24. foreach (var pParticle in m_listParticle)
  25. {
  26. COTSFeatureClr pFeature = pParticle.GetFeature();
  27. if (pParticle.GetAnalysisId() == a_nXrayId && pParticle.GetFieldId() == a_nFieldId && (int) pFeature.GetSegmentsList().Count == a_nSegmentSize)
  28. {
  29. pFeatureNew = new COTSFeatureClr(pFeature);
  30. }
  31. }
  32. }
  33. else
  34. {
  35. // read element list
  36. for (int i = 0; i<a_nSegmentSize; i++)
  37. {
  38. var tableQuery = GetQueryById(a_nXrayId, a_nFieldId, i, a_nSegmentSize); //CElementChemistryDB
  39. COTSParticleClr pParticle = ReadParticleInfo(tableQuery);
  40. COTSFeatureClr pFeature = pParticle.GetFeature();
  41. pFeatureNew = new COTSFeatureClr(pFeature);
  42. }
  43. }
  44. return pFeatureNew;
  45. }
  46. public List< COTSParticleClr> GetParticleInfoList( bool a_bForce/* = FALSE*/)
  47. {
  48. if (a_bForce)
  49. {
  50. m_listParticle.Clear();
  51. }
  52. if (m_listParticle.Count == 0)
  53. {
  54. ReadParticleInfoList();
  55. }
  56. return m_listParticle;
  57. }
  58. public COTSParticleClr ReadParticleInfo(DataTable a_query)
  59. {
  60. int nCol;
  61. COTSParticleClr pParticle=new COTSParticleClr();
  62. int nXrayIdNow;
  63. int nFieldIdNow;
  64. // CSegmentTable类改完再改此处
  65. nCol = (int)CSegmentTable.ColumnID.N_XRAY_INDEX - (int)CSegmentTable.ColumnID.MIN;
  66. nXrayIdNow = (int)a_query.Rows[(int)CSegmentTable.ColumnID.N_XRAY_INDEX][0];
  67. pParticle.SetAnalysisId(nXrayIdNow);
  68. nCol = (int)CSegmentTable.ColumnID.N_FIELD_ID - (int)CSegmentTable.ColumnID.MIN;
  69. nFieldIdNow = (int)a_query.Rows[(int)CSegmentTable.ColumnID.N_FIELD_ID][0];
  70. pParticle.SetFieldId(nFieldIdNow);
  71. nCol = (int)CSegmentTable.ColumnID.N_SEGMENT_ID - (int)CSegmentTable.ColumnID.MIN;
  72. int nSegmentIndex = (int)a_query.Rows[(int)CSegmentTable.ColumnID.N_SEGMENT_ID][0];
  73. nCol = (int)CSegmentTable.ColumnID.N_SEGMENT_TOTAL - (int)CSegmentTable.ColumnID.MIN;
  74. int nSegmentTotal = (int)a_query.Rows[(int)CSegmentTable.ColumnID.N_SEGMENT_TOTAL][0];
  75. //pParticle->SetElementNum(nElementTotal);
  76. if (nSegmentIndex > nSegmentTotal - 1)
  77. {
  78. return null;
  79. }
  80. COTSSegmentClr pSegment = new COTSSegmentClr();
  81. nCol = (int)CSegmentTable.ColumnID.N_START - (int)CSegmentTable.ColumnID.MIN;
  82. int nStart = (int)a_query.Rows[(int)CSegmentTable.ColumnID.N_START][0];
  83. pSegment.SetStart(nStart);
  84. nCol = (int)CSegmentTable.ColumnID.N_HEIGHT - (int)CSegmentTable.ColumnID.MIN;
  85. int nHeight = (int)a_query.Rows[(int)CSegmentTable.ColumnID.N_HEIGHT][0];
  86. pSegment.SetHeight(nHeight);
  87. nCol = (int)CSegmentTable.ColumnID.N_LENGTH - (int)CSegmentTable.ColumnID.MIN;
  88. int nLength = (int)a_query.Rows[(int)CSegmentTable.ColumnID.N_LENGTH][0];
  89. pSegment.SetLength(nLength);
  90. List<COTSSegmentClr> listSegment = new List<COTSSegmentClr>();
  91. listSegment.Add(pSegment);
  92. a_query.NewRow();
  93. int nXrayNew, nFieldIdNew;
  94. int nRowId = 0;
  95. for (int i = 0; i < a_query.Rows.Count; i++)
  96. {
  97. nCol = (int)CSegmentTable.ColumnID.N_XRAY_INDEX - (int)CSegmentTable.ColumnID.MIN;
  98. nXrayNew = (int)a_query.Rows[(int)CSegmentTable.ColumnID.N_XRAY_INDEX][0];
  99. nCol = (int)CSegmentTable.ColumnID.N_FIELD_ID - (int)CSegmentTable.ColumnID.MIN;
  100. nFieldIdNew = (int)a_query.Rows[(int)CSegmentTable.ColumnID.N_FIELD_ID][0];
  101. if (nXrayNew == nXrayIdNow && nFieldIdNew == nFieldIdNow)
  102. {
  103. nCol = (int)CSegmentTable.ColumnID.N_SEGMENT_ID - (int)CSegmentTable.ColumnID.MIN;
  104. int nSegmentIndexs = (int)a_query.Rows[(int)CSegmentTable.ColumnID.N_SEGMENT_ID][0];
  105. nCol = (int)CSegmentTable.ColumnID.N_SEGMENT_TOTAL - (int)CSegmentTable.ColumnID.MIN;
  106. int nSegmentTotals = (int)a_query.Rows[(int)CSegmentTable.ColumnID.N_SEGMENT_TOTAL][0];
  107. if (nSegmentIndex > nSegmentTotal - 1)
  108. {
  109. return null;
  110. }
  111. nCol = (int)CSegmentTable.ColumnID.N_START - (int)CSegmentTable.ColumnID.MIN;
  112. int Start = (int)a_query.Rows[(int)CSegmentTable.ColumnID.N_START][0];
  113. pSegment.SetStart(nStart);
  114. nCol = (int)CSegmentTable.ColumnID.N_HEIGHT - (int)CSegmentTable.ColumnID.MIN;
  115. int Height = (int)a_query.Rows[(int)CSegmentTable.ColumnID.N_HEIGHT][0];
  116. pSegment.SetHeight(nHeight);
  117. nCol = (int)CSegmentTable.ColumnID.N_LENGTH - (int)CSegmentTable.ColumnID.MIN;
  118. int Length = (int)a_query.Rows[(int)CSegmentTable.ColumnID.N_LENGTH][0];
  119. pSegment.SetLength(nLength);
  120. listSegment.Add(pSegment);
  121. if (nSegmentIndex == nSegmentTotal - 1)
  122. {
  123. break;
  124. }
  125. }
  126. else
  127. {
  128. continue;
  129. }
  130. a_query.NewRow();
  131. nRowId++;
  132. }
  133. COTSFeatureClr pFeature = new COTSFeatureClr();
  134. pFeature.SetSegmentsList(listSegment,true);
  135. pParticle.SetFeature(pFeature);
  136. return pParticle;
  137. }
  138. public bool SaveFeature( List<COTSParticleClr> a_ParticleList)
  139. {
  140. //System.Data.DataTable query;
  141. var tableInfoPtr = GetTableInfo();
  142. var datastorePtr = GetDatastore();
  143. String sInsertFormat =tableInfoPtr. GetInsertCommandFormatString(true);//SQLiteTable
  144. String sSQLCommand = "";
  145. foreach (var pParticle in a_ParticleList)
  146. {
  147. COTSFeatureClr pFeature = pParticle.GetFeature();
  148. List< COTSSegmentClr> listSegments = pFeature.GetSegmentsList();
  149. int nSize = (int)listSegments.Count;
  150. int nSegmentIndex = 0;
  151. foreach (var pSegment in listSegments)
  152. {
  153. sSQLCommand= String.Format(sInsertFormat,
  154. pParticle.GetAnalysisId(),
  155. pParticle.GetFieldId(),
  156. nSegmentIndex,
  157. nSize,
  158. pSegment.GetStart(),
  159. pSegment.GetHeight(),
  160. pSegment.GetLength(),
  161. pParticle.GetTagId());
  162. datastorePtr.RunCommand(sSQLCommand);
  163. nSegmentIndex++;
  164. }
  165. }
  166. return true;
  167. }
  168. public bool SaveFeature(COTSParticleClr a_pParticle)
  169. {
  170. //System.Data.DataTable query;
  171. var tableInfoPtr = GetTableInfo();
  172. var datastorePtr = GetDatastore();
  173. String sInsertFormat = tableInfoPtr.GetInsertCommandFormatString(true);//CSQLiteTable修改完再修改此处
  174. String sSQLCommand = "";
  175. COTSFeatureClr pFeature = a_pParticle.GetFeature();
  176. List< COTSSegmentClr> listSegments = pFeature.GetSegmentsList();
  177. int nSize = (int)listSegments.Count;
  178. int nSegmentIndex = 0;
  179. foreach (var pSegment in listSegments)
  180. {
  181. sSQLCommand=String.Format(sInsertFormat,
  182. a_pParticle.GetAnalysisId(),
  183. a_pParticle.GetFieldId(),
  184. nSegmentIndex,
  185. nSize,
  186. pSegment.GetStart(),
  187. pSegment.GetHeight(),
  188. pSegment.GetLength(),
  189. a_pParticle.GetTagId());
  190. datastorePtr.RunCommand(sSQLCommand);
  191. nSegmentIndex++;
  192. }
  193. return true;
  194. }
  195. public bool DeleteFeatureById( long a_nFieldId, long a_nXrayId)
  196. {
  197. System.Data.DataTable query;
  198. if (m_listParticle.Count!=0)
  199. {
  200. for (int itr = 0; itr < m_listParticle.Count; itr++)
  201. {
  202. if (m_listParticle[itr].GetTypeName() ==a_nFieldId.ToString())
  203. {
  204. COTSParticleClr particle = new COTSParticleClr();
  205. particle = m_listParticle[itr];
  206. break;
  207. }
  208. }
  209. }
  210. var tableInfoPtr = GetTableInfo();
  211. var datastorePtr = GetDatastore();
  212. String sTableName = tableInfoPtr.GetTableName();
  213. if (!IsTableExists(""))
  214. {
  215. return true;
  216. }
  217. //CSQLiteTable 修改完再修改此处
  218. var sXrayIdColumnName = tableInfoPtr.GetColumnName((int)CSegmentTable.ColumnID.N_XRAY_INDEX - (int)CSegmentTable.ColumnID.MIN);
  219. var sFieldIdColumnName = tableInfoPtr.GetColumnName((int)CSegmentTable.ColumnID.N_FIELD_ID - (int)CSegmentTable.ColumnID.MIN);
  220. String sSQLCommand = "";
  221. String.Format("DELETE FROM \'%s\' WHERE %s = %d AND %s = %d AND %s = %d AND %s = %d;", (String)tableInfoPtr.GetTableName(), sXrayIdColumnName,
  222. a_nXrayId, sFieldIdColumnName, a_nFieldId);
  223. //var helper = new SQLiteHelper(datastorePtr);
  224. datastorePtr.RunCommand(sSQLCommand);
  225. return true;
  226. }
  227. public bool IsTableExists(String a_sTableName)
  228. {
  229. return tableExists(a_sTableName);//OTSSQLiteDll,SQLiteStore中的GetDBPtr()方法修改完再修改此处
  230. }
  231. public bool tableExists(string szTable)
  232. {
  233. String sSQL = "";
  234. string.Format("select count(*) from sqlite_master where type='table' and name='%s'", szTable);
  235. int nRet = Convert.ToInt32(sSQL);
  236. return (nRet > 0);
  237. }
  238. public bool GetAllSegmentsRecord(Dictionary<List<int>, List<COTSSegmentClr>> mapSegments)
  239. {
  240. var allRecords = this.GetQueryOfAllRecord();
  241. for (int i = 0; i < allRecords.Rows.Count; i++)
  242. {
  243. int curFldId = Convert.ToInt32(allRecords.Rows[i][(int)CSegmentTable.ColumnID.N_FIELD_ID]);
  244. int curParticleId = Convert.ToInt32(allRecords.Rows[i][(int)CSegmentTable.ColumnID.N_PARTICLE_ID]);
  245. List<int> fldvec = new List<int>();
  246. fldvec.Add(curFldId);
  247. fldvec.Add(curParticleId);
  248. //var itr = mapSegments.ContainsKey(fldvec);
  249. if (mapSegments.ContainsKey(fldvec))
  250. {
  251. List<COTSSegmentClr> segments = mapSegments[fldvec];
  252. COTSSegmentClr segment = new COTSSegmentClr();
  253. segment.SetStart(Convert.ToInt32(allRecords.Rows[i][(int)CSegmentTable.ColumnID.N_START]));
  254. segment.SetHeight(Convert.ToInt32(allRecords.Rows[i][(int)CSegmentTable.ColumnID.N_HEIGHT]));
  255. segment.SetLength(Convert.ToInt32(allRecords.Rows[i][(int)CSegmentTable.ColumnID.N_LENGTH]));
  256. //segment.UpDownConection(segment);
  257. segments.Add(segment);
  258. }
  259. else
  260. {
  261. //auto pairseg = *itr;
  262. List<COTSSegmentClr> segments = new List<COTSSegmentClr>();
  263. COTSSegmentClr segment = new COTSSegmentClr();
  264. segment.SetStart(Convert.ToInt32(allRecords.Rows[i][(int)CSegmentTable.ColumnID.N_START]));
  265. segment.SetHeight(Convert.ToInt32(allRecords.Rows[i][(int)CSegmentTable.ColumnID.N_HEIGHT]));
  266. segment.SetLength(Convert.ToInt32(allRecords.Rows[i][(int)CSegmentTable.ColumnID.N_LENGTH]));
  267. segments.Add(segment);
  268. mapSegments.Add(fldvec, segments);
  269. }
  270. }
  271. //allRecords.Dispose();
  272. return true;
  273. }
  274. public bool ReadParticleInfoList()
  275. {
  276. var tableInfoPtr = GetTableInfo();
  277. var query =GetTableQueryForDataTable (tableInfoPtr.GetTableName());//CElementChemistryDB
  278. m_listParticle = ReadParticleInfoList(query);
  279. return true;
  280. }
  281. public List< COTSParticleClr> ReadParticleInfoList(DataTable a_query)
  282. {
  283. List<COTSParticleClr> listParticle = new List<COTSParticleClr>();
  284. int nRowId = 0;
  285. int nWrongItems = 0;
  286. DataTable dataTable = new DataTable();
  287. foreach(var r in a_query.Rows)
  288. {
  289. var ParticleInfo = ReadParticleInfo(dataTable); //current x-ray point
  290. if (ParticleInfo != null)
  291. {
  292. nWrongItems++;
  293. }
  294. else
  295. {
  296. if (listParticle.Count!=0)
  297. {
  298. int nXrayId = ParticleInfo.GetAnalysisId();
  299. int nFieldId = ParticleInfo.GetFieldId();
  300. COTSFeatureClr pFeature = ParticleInfo.GetFeature();
  301. List< COTSSegmentClr> listSegmentNew = pFeature.GetSegmentsList();
  302. int nIndex = 0;
  303. foreach (var pParticle in listParticle)
  304. {
  305. listParticle.Remove(pParticle);
  306. if ((pParticle.GetAnalysisId() == nXrayId)
  307. && (pParticle.GetFieldId() == nFieldId))
  308. {
  309. COTSFeatureClr apFeature = pParticle.GetFeature();
  310. List < COTSSegmentClr> listSegmentOld = pFeature.GetSegmentsList();
  311. foreach (var pSegment in listSegmentNew)
  312. {
  313. listSegmentOld.Add(new COTSSegmentClr(pSegment));
  314. }
  315. pFeature.SetSegmentsList(listSegmentOld,true);
  316. ParticleInfo.SetFeature(pFeature);
  317. break;
  318. }
  319. nIndex++;
  320. }
  321. }
  322. listParticle.Add(ParticleInfo);
  323. }
  324. }
  325. return listParticle;
  326. }
  327. public DataTable GetQueryById( long a_nXrayId, long a_nFieldId, long a_nSegmentId, long a_nSegmentNum)
  328. {
  329. DataTable query;
  330. var datastorePtr = GetDatastore();
  331. //var helper = new SQLiteHelper(datastorePtr);
  332. var tableInfoPtr = GetTableInfo();
  333. //没有SegmentTable类,有了再修改此处
  334. // String sXrayIdColumnName = tableInfoPtr.columns((int)CSegmentTable.ColumnID.N_XRAY_INDEX - (int)CSegmentTable.ColumnID.MIN);
  335. var sXrayIdColumnName = tableInfoPtr.GetColumnName((int)CSegmentTable.ColumnID.N_XRAY_INDEX - (int)CSegmentTable.ColumnID.MIN);
  336. // String sXrayIdColumnName = tableInfoPtr.GetColumnName((int)CSegmentTable.ColumnID.N_XRAY_INDEX - (int)CSegmentTable.ColumnID.MIN);
  337. var sFieldIdColumnName = tableInfoPtr.GetColumnName((int)CSegmentTable.ColumnID.N_FIELD_ID - (int)CSegmentTable.ColumnID.MIN);
  338. String sElementIdColumnName = tableInfoPtr.GetColumnName((int)CSegmentTable.ColumnID.N_SEGMENT_ID - (int)CSegmentTable.ColumnID.MIN);
  339. String sElementNumColumnName = tableInfoPtr.GetColumnName((int)CSegmentTable.ColumnID.N_SEGMENT_TOTAL - (int)CSegmentTable.ColumnID.MIN);
  340. // String sSQLCommand;
  341. String sSQLCommand=String.Format("SELECT * FROM \'{0}\' WHERE {1} = {2} AND {3} ={4} AND {5} ={6} AND {7} = {8};",(String)tableInfoPtr.GetTableName(),
  342. (String)sFieldIdColumnName,a_nFieldId,(String)sXrayIdColumnName,a_nXrayId,a_nSegmentId, (String)sElementNumColumnName,
  343. a_nSegmentNum);
  344. query = datastorePtr.QueryByCmdForDataTable(sSQLCommand);//SQLiteStote在OTSSQLiteDll中修改完再修改此处
  345. return query;
  346. }
  347. public DataTable GetQueryOfAllRecord()//CDBQueryBase在OTSClassifyEngine中修改完再更改此处
  348. {
  349. DataTable query;
  350. var datastorestr = GetDatastore();
  351. var tableInfoPtr = GetTableInfo();
  352. String sSQLCommand=String.Format("SELECT * FROM \'{0}\';", tableInfoPtr.GetTableName());
  353. //sSQLCommand= tableInfoPtr.GetTableName();
  354. //var helper = new SQLiteHelper(datastorestr);
  355. query = datastorestr.QueryByCmdForDataTable(sSQLCommand);//SQLiteStote在OTSSQLiteDll中修改完再修改此处
  356. // do the table related valid checking
  357. return query;
  358. }
  359. }
  360. }