tshistory.pas 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462
  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; aDate: TDateTime);
  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; aDate : TDateTime);
  198. begin
  199. if Result_count[aStatus]=0 then
  200. begin
  201. first_date[aStatus]:=aDate;
  202. last_date[aStatus]:=aDate;
  203. first_date_id[aStatus]:=aRunID;
  204. last_date_id[aStatus]:=aRunID;
  205. end
  206. else
  207. begin
  208. if (aDate>last_date[aStatus]) then
  209. begin
  210. last_date[aStatus]:=aDate;
  211. last_date_id[aStatus]:=aRunID;
  212. end;
  213. if (aDate<first_date[aStatus]) then
  214. begin
  215. first_date[aStatus]:=aDate;
  216. first_date_id[aStatus]:=aRunID;
  217. end;
  218. end;
  219. end;
  220. procedure TTestHistoryInfo.HandleVersion(aRunID : Int64; aVersionID : Integer; aStatus : TTestStatus; aDate : TDateTime);
  221. var
  222. lVersion : Integer;
  223. begin
  224. if length(version_count)=0 then
  225. exit;
  226. lVersion:=MapVersion(aVersionId);
  227. if lVersion=-1 then
  228. exit;
  229. if version_count[lVersion,aStatus]=0 then
  230. begin
  231. version_first_date[lVersion,aStatus]:=aDate;
  232. version_last_date[lVersion,aStatus]:=aDate;
  233. version_first_date_id[lVersion,aStatus]:=aRunID;
  234. version_last_date_id[lVersion,aStatus]:=aRunID;
  235. end
  236. else
  237. begin
  238. if (aDate>version_last_date[lVersion,aStatus]) then
  239. begin
  240. version_last_date[lVersion,aStatus]:=aDate;
  241. version_last_date_id[lVersion,aStatus]:=aRunID;
  242. end;
  243. if aDate<version_first_date[lVersion,aStatus] then
  244. begin
  245. version_first_date[lVersion,aStatus]:=aDate;
  246. version_first_date_id[lVersion,aStatus]:=aRunID;
  247. end;
  248. end;
  249. inc(version_count[lVersion,aStatus]);
  250. end;
  251. procedure TTestHistoryInfo.UpdateFromDataset(Q: TDataset);
  252. var
  253. lMap : TDatasetMap;
  254. resi : Integer;
  255. TS : TTestStatus;
  256. lRunID: int64;
  257. lDate : TDateTime;
  258. begin
  259. lMap:=TDatasetMap.Create(Q);
  260. While not Q.EOF do
  261. begin
  262. inc(total_count);
  263. if lMap.OK.AsBoolean then
  264. inc(OK_count)
  265. else
  266. inc(not_OK_count);
  267. if lMap.Skip.AsBoolean then
  268. inc(skip_count)
  269. else
  270. inc(not_skip_count);
  271. lRunID:=lMap.Run.AsLongint;
  272. resi:=lMap.Result.AsInteger;
  273. if (Resi>=longint(FirstStatus)) and (Resi<=longint(LastStatus)) then
  274. begin
  275. TS:=TTestStatus(Resi);
  276. lDate:=lMap.Date.AsDateTime;
  277. HandleDates(lRunID,ts,lDate);
  278. // Do this only after the dates were handled, handleDates() has a 0=Result_count[TS] test.
  279. Inc(Result_count[TS]);
  280. HandleCPU(lRunID,lMap.CPU.asInteger,ts,lDate);
  281. HandleOS(lRunID,lMap.OS.AsInteger,ts,lDate);
  282. HandleVersion(lRunID,lMap.Version.AsInteger,ts,lDate);
  283. end;
  284. Q.Next;
  285. end;
  286. end;
  287. procedure TTestHistoryInfo.WriteCounts(aHTMLWriter: THTMLWriter; TS: TTestStatus);
  288. begin
  289. With aHTMLWriter do
  290. begin
  291. RowNext;
  292. CellStart;
  293. DumpLn(StatusText[TS]);
  294. CellNext;
  295. CellNext;
  296. DumpLn(Format('%d',[Result_count[TS]]));
  297. CellNext;
  298. DumpLn(Format('%3.1f',[Result_count[TS]*100/total_count]));
  299. CellNext;
  300. DumpLn(FormatDetailURL(first_date_id[TS], first_date[TS]));
  301. DumpLn(' : '+IntToStr(FSQL.GetFailCount(first_date_id[TS])));
  302. CellNext;
  303. DumpLn(FormatDetailURL(last_date_id[TS], last_date[TS]));
  304. DumpLn(' : '+IntToStr(FSQL.GetFailCount(last_date_id[TS])));
  305. CellEnd;
  306. end;
  307. end;
  308. function TTestHistoryInfo.FormatDetailURL(aRunID: Int64; aDate : TDateTime) : string;
  309. begin
  310. if assigned(OnGetDetailURL) then
  311. OnGetDetailURL(aRunID,aDate,Result)
  312. else
  313. Result:='';
  314. end;
  315. procedure TTestHistoryInfo.WriteCPUHistory(aHTMLWriter : THTMLWriter; TS : TTestStatus);
  316. var
  317. i : Integer;
  318. begin
  319. if not assigned(cpu_count) then
  320. exit;
  321. for i:=0 to Length(cpu_count)-1 do
  322. if cpu_count[i,TS]>0 then
  323. With aHTMLWriter do
  324. begin
  325. RowNext;
  326. CellStart;
  327. CellNext;
  328. DumpLn(FSQL.GetCPUName(FCPUMap[i]));
  329. CellNext;
  330. DumpLn(Format('%d',[cpu_count[i,TS]]));
  331. CellNext;
  332. DumpLn(Format('%3.1f',[cpu_count[i,TS]*100/result_count[TS]]));
  333. CellNext;
  334. DumpLn(FormatDetailURL(cpu_first_date_id[i,TS], cpu_first_date[i,TS]));
  335. DumpLn(' : '+IntToStr(FSQL.GetFailCount(cpu_first_date_id[i,TS])));
  336. CellNext;
  337. DumpLn(FormatDetailURL(cpu_last_date_id[i,TS], cpu_last_date[i,TS]));
  338. DumpLn(' : '+IntToStr(FSQL.GetFailCount(cpu_last_date_id[i,TS])));
  339. CellEnd;
  340. end;
  341. end;
  342. procedure TTestHistoryInfo.WriteOSHistory(aHTMLWriter: THTMLWriter; TS: TTestStatus);
  343. var
  344. i : Integer;
  345. begin
  346. if not assigned(os_count) then
  347. exit;
  348. for i:=0 to Length(os_count)-1 do
  349. if os_count[i,TS]>0 then
  350. With aHTMLWriter do
  351. begin
  352. RowNext;
  353. CellStart;
  354. CellNext;
  355. DumpLn(FSQL.GetOSName(FOSMap[i]));
  356. CellNext;
  357. DumpLn(Format('%d',[os_count[i,TS]]));
  358. CellNext;
  359. DumpLn(Format('%3.1f',[os_count[i,TS]*100/result_count[TS]]));
  360. CellNext;
  361. DumpLn(FormatDetailURL(os_first_date_id[i,TS],os_first_date[i,TS]));
  362. DumpLn(' : '+IntToStr(FSQL.GetFailCount(os_first_date_id[i,TS])));
  363. CellNext;
  364. DumpLn(FormatDetailURL(os_last_date_id[i,TS],os_last_date[i,TS]));
  365. DumpLn(' : '+IntToStr(FSQL.GetFailCount(os_last_date_id[i,TS])));
  366. CellEnd;
  367. end;
  368. end;
  369. procedure TTestHistoryInfo.WriteVersionHistory(aHTMLWriter: THTMLWriter; TS: TTestStatus);
  370. var
  371. I : integer;
  372. begin
  373. if not assigned(version_count) then
  374. exit;
  375. for i:=0 to length(Version_count)-1 do
  376. if version_count[i,TS]>0 then
  377. With aHTMLWriter do
  378. begin
  379. RowNext;
  380. CellStart;
  381. CellNext;
  382. DumpLn(FSQL.GetVersionName(FVersionMap[i]));
  383. CellNext;
  384. DumpLn(Format('%d',[version_count[i,TS]]));
  385. CellNext;
  386. DumpLn(Format('%3.1f',[version_count[i,TS]*100/result_count[TS]]));
  387. CellNext;
  388. DumpLn(FormatDetailURL(version_first_date_id[i,TS],version_first_date[i,TS]));
  389. DumpLn(' : '+IntToStr(FSQL.GetFailCount(version_first_date_id[i,TS])));
  390. CellNext;
  391. DumpLn(FormatDetailURL(version_last_date_id[i,TS], version_last_date[i,TS]));
  392. DumpLn(' : '+IntToStr(FSQL.GetFailCount(version_last_date_id[i,TS])));
  393. CellEnd;
  394. end;
  395. end;
  396. end.