SegmentDB.cs 19 KB

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