tshistory.pas 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465
  1. unit tshistory;
  2. {$mode ObjFPC}
  3. {$h+}
  4. interface
  5. uses
  6. Classes, SysUtils, types, tstypes, db, tsdb, whtml;
  7. Type
  8. { TDatasetMap }
  9. TDatasetMap = class(TObject)
  10. OK,
  11. Skip,
  12. Result,
  13. CPU,
  14. OS,
  15. Version,
  16. Date,
  17. Run : TField;
  18. constructor Create(aDataset : TDataset);
  19. end;
  20. TGetDetailURLEvent = procedure (aRunID : Int64; aDate : TDateTime; out aURl : String) of object;
  21. { TTestHistoryInfo }
  22. TTestHistoryInfo = Class (TObject)
  23. Const
  24. { We already have 53 versions }
  25. MaxCombo = 100;
  26. Type
  27. StatusLongintArray = Array [TTestStatus] of Int64;
  28. StatusDateTimeArray = Array [TTestStatus] of TDateTime;
  29. TStatusLAArray = Array of StatusLongintArray;
  30. TStatusDTAArray = Array of StatusDateTimeArray;
  31. private
  32. function FormatDetailURL(aRunID: Int64; aDate: TDateTime): string;
  33. procedure HandleCPU(aRunID: Int64; aCPUID: Integer; aStatus: TTestStatus; aDate: TDateTime);
  34. procedure HandleDates(aRunID: Int64; aStatus: TTestStatus; aMap: TDatasetMap);
  35. procedure HandleOS(aRunID: Int64; aOSID: Integer; aStatus: TTestStatus; aDate: TDateTime);
  36. procedure HandleVersion(aRunID: Int64; aVersionID: Integer; aStatus: TTestStatus; aDate: TDateTime);
  37. function MapCpu(aID: Integer): integer;
  38. function MapOS(aID: Integer): integer;
  39. function MapVersion(aID: Integer): integer;
  40. Public
  41. total_count:Integer;
  42. OK_count:Integer;
  43. not_OK_count:Integer;
  44. skip_count:Integer;
  45. not_skip_count:Integer;
  46. os_count,cpu_count,version_count: TStatusLAArray;
  47. os_first_date, os_last_date,
  48. cpu_first_date, cpu_last_date,
  49. version_first_date, version_last_date : TStatusDTAArray;
  50. os_first_date_id, os_last_date_id,
  51. cpu_first_date_id, cpu_last_date_id,
  52. version_first_date_id, version_last_date_id : TStatusLAArray;
  53. first_date, last_date : array[TTestStatus] of TDateTime;
  54. first_date_id, last_date_id : array[TTestStatus] of Int64;
  55. result_count : StatusLongintArray;
  56. FCPUMap,FOSMap,FVersionMap :TIntegerDynArray;
  57. FSQL : TTestSQL;
  58. OnGetDetailURL : TGetDetailURLEvent;
  59. constructor create(aSQL : TTestSQL; aOSMap,aCPUMap,aVersionMap : TIntegerDynArray);
  60. procedure InitCPU(aCPUCount : Integer);
  61. procedure InitVersion(aVersionCount : Integer);
  62. procedure InitOS(aOSCount : Integer);
  63. procedure UpdateFromDataset(Q: TDataset);
  64. procedure WriteCounts(aHTMLWriter: THTMLWriter; TS: TTestStatus);
  65. procedure WriteCPUHistory(aHTMLWriter: THTMLWriter; TS: TTestStatus);
  66. procedure WriteOSHistory(aHTMLWriter: THTMLWriter; TS: TTestStatus);
  67. procedure WriteVersionHistory(aHTMLWriter: THTMLWriter; TS: TTestStatus);
  68. end;
  69. implementation
  70. { TDatasetMap }
  71. constructor TDatasetMap.Create(aDataset: TDataset);
  72. begin
  73. OK:=aDataset.FieldByName('OK');
  74. Skip:=aDataset.FieldByName('SKIP');
  75. Result:=aDataset.FieldByName('Result');
  76. CPU:=aDataset.FieldByName('TC_ID');
  77. OS:=aDataset.FieldByName('TO_ID');
  78. Version:=aDataset.FieldByName('TV_ID');
  79. Date:=aDataset.FieldByName('Date');
  80. Run:=aDataset.FieldByName('TU_ID');
  81. end;
  82. { TTestHistoryInfo }
  83. constructor TTestHistoryInfo.create(aSQL: TTestSQL; aOSMap, aCPUMap, aVersionMap: TIntegerDynArray);
  84. begin
  85. FSQL:=aSQL;
  86. FCPUMap:=aCPUMap;
  87. FOSMap:=aOSMap;
  88. FVersionMap:=aVersionMap;
  89. InitCPU(Length(aCPUMap));
  90. InitVersion(Length(aVersionMap));
  91. InitOS(Length(aOSMap));
  92. end;
  93. procedure TTestHistoryInfo.InitCPU(aCPUCount: Integer);
  94. begin
  95. SetLength(cpu_count,aCPUCount+1);
  96. SetLength(cpu_first_date_id,aCPUCount+1);
  97. SetLength(cpu_last_date_id,aCPUCount+1);
  98. SetLength(cpu_first_date,aCPUCount+1);
  99. SetLength(cpu_last_date,aCPUCount+1);
  100. end;
  101. procedure TTestHistoryInfo.InitVersion(aVersionCount: Integer);
  102. begin
  103. SetLength(version_count,aVersionCount+1);
  104. SetLength(version_first_date_id,aVersionCount+1);
  105. SetLength(version_last_date_id,aVersionCount+1);
  106. SetLength(version_first_date,aVersionCount+1);
  107. SetLength(version_last_date,aVersionCount+1);
  108. end;
  109. procedure TTestHistoryInfo.InitOS(aOSCount: Integer);
  110. begin
  111. SetLength(os_count,aOSCount+1);
  112. SetLength(os_first_date_id,aOSCount+1);
  113. SetLength(os_last_date_id,aOSCount+1);
  114. SetLength(os_first_date,aOSCount+1);
  115. SetLength(os_last_date,aOSCount+1);
  116. end;
  117. function TTestHistoryInfo.MapCpu(aID : Integer) : integer;
  118. begin
  119. Result:=Length(FCPUMap)-1;
  120. While (Result>=0) and (FCPUMap[Result]<>aID) do
  121. dec(Result);
  122. end;
  123. function TTestHistoryInfo.MapOS(aID : Integer) : integer;
  124. begin
  125. Result:=Length(FOSMap)-1;
  126. While (Result>=0) and (FOSMap[Result]<>aID) do
  127. dec(Result);
  128. end;
  129. function TTestHistoryInfo.MapVersion(aID: Integer): integer;
  130. begin
  131. Result:=Length(FVersionMap)-1;
  132. While (Result>=0) and (FVersionMap[Result]<>aID) do
  133. dec(Result);
  134. end;
  135. procedure TTestHistoryInfo.HandleCPU(aRunID : Int64; aCPUID : Integer; aStatus : TTestStatus; aDate : TDateTime);
  136. var
  137. lCPU : Integer;
  138. begin
  139. if length(cpu_count)=0 then
  140. exit;
  141. lCPU:=MapCPU(aCPUID);
  142. if lCPU=-1 then
  143. exit;
  144. if cpu_count[lCPU,aStatus]=0 then
  145. begin
  146. cpu_first_date[lCPU,aStatus]:=aDate;
  147. cpu_last_date[lCPU,aStatus]:=aDate;
  148. cpu_first_date_id[lCPU,aStatus]:=aRunID;
  149. cpu_last_date_id[lCPU,aStatus]:=aRunID;
  150. end
  151. else
  152. begin
  153. if (aDate>cpu_last_date[lCPU,aStatus]) then
  154. begin
  155. cpu_last_date[lCPU,aStatus]:=aDate;
  156. cpu_last_date_id[lCPU,aStatus]:=aRunID;
  157. end;
  158. if aDate<cpu_first_date[lCPU,aStatus] then
  159. begin
  160. cpu_first_date[lCPU,aStatus]:=aDate;
  161. cpu_first_date_id[lCPU,aStatus]:=aRunID;
  162. end;
  163. end;
  164. inc(cpu_count[lCPU,aStatus]);
  165. end;
  166. procedure TTestHistoryInfo.HandleOS(aRunID : Int64; aOSID : Integer; aStatus : TTestStatus; aDate : TDateTime);
  167. var
  168. lOS : Integer;
  169. begin
  170. if length(os_count)=0 then
  171. exit;
  172. lOS:=MapOS(aOSId);
  173. if lOS=-1 then
  174. exit;
  175. if os_count[lOS,aStatus]=0 then
  176. begin
  177. os_first_date[lOS,aStatus]:=aDate;
  178. os_last_date[lOS,aStatus]:=aDate;
  179. os_first_date_id[lOS,aStatus]:=aRunID;
  180. os_last_date_id[lOS,aStatus]:=aRunID;
  181. end
  182. else
  183. begin
  184. if (aDate>os_last_date[lOS,aStatus]) then
  185. begin
  186. os_last_date[lOS,aStatus]:=aDate;
  187. os_last_date_id[lOS,aStatus]:=aRunID;
  188. end;
  189. if aDate<os_first_date[lOS,aStatus] then
  190. begin
  191. os_first_date[lOS,aStatus]:=aDate;
  192. os_first_date_id[lOS,aStatus]:=aRunID;
  193. end;
  194. end;
  195. inc(os_count[lOS,aStatus]);
  196. end;
  197. procedure TTestHistoryInfo.HandleDates(aRunID : Int64; aStatus : TTestStatus; aMap : TDatasetMap);
  198. var
  199. lDate : TDateTime;
  200. begin
  201. lDate:=aMap.Date.AsDateTime;
  202. if Result_count[aStatus]=0 then
  203. begin
  204. first_date[aStatus]:=lDate;
  205. last_date[aStatus]:=lDate;
  206. first_date_id[aStatus]:=aRunID;
  207. last_date_id[aStatus]:=aRunID;
  208. end
  209. else
  210. begin
  211. if (date>last_date[aStatus]) then
  212. begin
  213. last_date[aStatus]:=lDate;
  214. last_date_id[aStatus]:=aRunID;
  215. end;
  216. if date<first_date[aStatus] then
  217. begin
  218. first_date[aStatus]:=lDate;
  219. first_date_id[aStatus]:=aRunID;
  220. end;
  221. end;
  222. end;
  223. procedure TTestHistoryInfo.HandleVersion(aRunID : Int64; aVersionID : Integer; aStatus : TTestStatus; aDate : TDateTime);
  224. var
  225. lVersion : Integer;
  226. begin
  227. if length(version_count)=0 then
  228. exit;
  229. lVersion:=MapVersion(aVersionId);
  230. if lVersion=-1 then
  231. exit;
  232. if version_count[lVersion,aStatus]=0 then
  233. begin
  234. version_first_date[lVersion,aStatus]:=aDate;
  235. version_last_date[lVersion,aStatus]:=aDate;
  236. version_first_date_id[lVersion,aStatus]:=aRunID;
  237. version_last_date_id[lVersion,aStatus]:=aRunID;
  238. end
  239. else
  240. begin
  241. if (aDate>version_last_date[lVersion,aStatus]) then
  242. begin
  243. version_last_date[lVersion,aStatus]:=aDate;
  244. version_last_date_id[lVersion,aStatus]:=aRunID;
  245. end;
  246. if aDate<version_first_date[lVersion,aStatus] then
  247. begin
  248. version_first_date[lVersion,aStatus]:=aDate;
  249. version_first_date_id[lVersion,aStatus]:=aRunID;
  250. end;
  251. end;
  252. inc(version_count[lVersion,aStatus]);
  253. end;
  254. procedure TTestHistoryInfo.UpdateFromDataset(Q: TDataset);
  255. var
  256. lMap : TDatasetMap;
  257. resi : Integer;
  258. TS : TTestStatus;
  259. lRunID: int64;
  260. lDate : TDateTime;
  261. begin
  262. lMap:=TDatasetMap.Create(Q);
  263. While not Q.EOF do
  264. begin
  265. inc(total_count);
  266. if lMap.OK.AsBoolean then
  267. inc(OK_count)
  268. else
  269. inc(not_OK_count);
  270. if lMap.Skip.AsBoolean then
  271. inc(skip_count)
  272. else
  273. inc(not_skip_count);
  274. lRunID:=lMap.Run.AsLongint;
  275. resi:=lMap.Result.AsInteger;
  276. if (Resi>=longint(FirstStatus)) and (Resi<=longint(LastStatus)) then
  277. begin
  278. TS:=TTestStatus(Resi);
  279. inc(Result_count[TS]);
  280. HandleDates(lRunID,ts,lMap);
  281. lDate:=lMap.Date.AsDateTime;
  282. HandleCPU(lRunID,lMap.CPU.asInteger,ts,lDate);
  283. HandleOS(lRunID,lMap.OS.AsInteger,ts,lDate);
  284. HandleVersion(lRunID,lMap.Version.AsInteger,ts,lDate);
  285. end;
  286. Q.Next;
  287. end;
  288. end;
  289. procedure TTestHistoryInfo.WriteCounts(aHTMLWriter: THTMLWriter; TS: TTestStatus);
  290. begin
  291. With aHTMLWriter do
  292. begin
  293. RowNext;
  294. CellStart;
  295. DumpLn(StatusText[TS]);
  296. CellNext;
  297. CellNext;
  298. DumpLn(Format('%d',[Result_count[TS]]));
  299. CellNext;
  300. DumpLn(Format('%3.1f',[Result_count[TS]*100/total_count]));
  301. CellNext;
  302. DumpLn(FormatDetailURL(first_date_id[TS], first_date[TS]));
  303. DumpLn(' : '+IntToStr(FSQL.GetFailCount(first_date_id[TS])));
  304. CellNext;
  305. DumpLn(FormatDetailURL(last_date_id[TS], last_date[TS]));
  306. DumpLn(' : '+IntToStr(FSQL.GetFailCount(last_date_id[TS])));
  307. CellEnd;
  308. end;
  309. end;
  310. function TTestHistoryInfo.FormatDetailURL(aRunID: Int64; aDate : TDateTime) : string;
  311. begin
  312. if assigned(OnGetDetailURL) then
  313. OnGetDetailURL(aRunID,aDate,Result)
  314. else
  315. Result:='';
  316. end;
  317. procedure TTestHistoryInfo.WriteCPUHistory(aHTMLWriter : THTMLWriter; TS : TTestStatus);
  318. var
  319. i : Integer;
  320. begin
  321. if not assigned(cpu_count) then
  322. exit;
  323. for i:=0 to Length(cpu_count)-1 do
  324. if cpu_count[i,TS]>0 then
  325. With aHTMLWriter do
  326. begin
  327. RowNext;
  328. CellStart;
  329. CellNext;
  330. DumpLn(FSQL.GetCPUName(FCPUMap[i]));
  331. CellNext;
  332. DumpLn(Format('%d',[cpu_count[i,TS]]));
  333. CellNext;
  334. DumpLn(Format('%3.1f',[cpu_count[i,TS]*100/result_count[TS]]));
  335. CellNext;
  336. DumpLn(FormatDetailURL(cpu_first_date_id[i,TS], cpu_first_date[i,TS]));
  337. DumpLn(' '+IntToStr(FSQL.GetFailCount(cpu_first_date_id[i,TS])));
  338. CellNext;
  339. DumpLn(FormatDetailURL(cpu_last_date_id[i,TS], cpu_last_date[i,TS]));
  340. DumpLn(' '+IntToStr(FSQL.GetFailCount(cpu_last_date_id[i,TS])));
  341. CellEnd;
  342. end;
  343. end;
  344. procedure TTestHistoryInfo.WriteOSHistory(aHTMLWriter: THTMLWriter; TS: TTestStatus);
  345. var
  346. i : Integer;
  347. begin
  348. if not assigned(os_count) then
  349. exit;
  350. for i:=0 to Length(os_count)-1 do
  351. if os_count[i,TS]>0 then
  352. With aHTMLWriter do
  353. begin
  354. RowNext;
  355. CellStart;
  356. CellNext;
  357. DumpLn(FSQL.GetOSName(i));
  358. CellNext;
  359. DumpLn(Format('%d',[os_count[i,TS]]));
  360. CellNext;
  361. DumpLn(Format('%3.1f',[os_count[i,TS]*100/result_count[TS]]));
  362. CellNext;
  363. DumpLn(FormatDetailURL(os_first_date_id[i,TS],os_first_date[i,TS]));
  364. DumpLn(' '+IntToStr(FSQL.GetFailCount(os_first_date_id[i,TS])));
  365. CellNext;
  366. DumpLn(FormatDetailURL(os_last_date_id[i,TS],os_last_date[i,TS]));
  367. DumpLn(' '+IntToStr(FSQL.GetFailCount(os_last_date_id[i,TS])));
  368. CellEnd;
  369. end;
  370. end;
  371. procedure TTestHistoryInfo.WriteVersionHistory(aHTMLWriter: THTMLWriter; TS: TTestStatus);
  372. var
  373. I : integer;
  374. begin
  375. if not assigned(version_count) then
  376. exit;
  377. for i:=0 to length(Version_count)-1 do
  378. if version_count[i,TS]>0 then
  379. With aHTMLWriter do
  380. begin
  381. RowNext;
  382. CellStart;
  383. CellNext;
  384. DumpLn(FSQL.GetVersionName(i));
  385. CellNext;
  386. DumpLn(Format('%d',[version_count[i,TS]]));
  387. CellNext;
  388. DumpLn(Format('%3.1f',[version_count[i,TS]*100/result_count[TS]]));
  389. CellNext;
  390. DumpLn(FormatDetailURL(version_first_date_id[i,TS],version_first_date[i,TS]));
  391. DumpLn(' '+IntToStr(FSQL.GetFailCount(version_first_date_id[i,TS])));
  392. CellNext;
  393. DumpLn(FormatDetailURL(version_last_date_id[i,TS], version_last_date[i,TS]));
  394. DumpLn(' '+IntToStr(FSQL.GetFailCount(version_last_date_id[i,TS])));
  395. CellEnd;
  396. end;
  397. end;
  398. end.