Guest User

Untitled

a guest
Aug 11th, 2018
92
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Delphi 5.70 KB | None | 0 0
  1. unit uReplayAnalyzer;
  2.  
  3. interface
  4.  
  5. uses
  6.   Winapi.Windows, System.Classes, Data.DB, DBAccess, Uni, UniProvider,
  7.   SQLServerUniProvider, MemDS;
  8.  
  9. const
  10.   DENSITY_MATRIX_SIZE = 10000;
  11.  
  12. type
  13.   TAnalyzerData = record
  14.                     TotalMatches     : DWORD;
  15.                     GoodGuysWin      : DWORD;
  16.                     BadGuysWin       : DWORD;
  17.                     DurationDensity  : Array[0..DENSITY_MATRIX_SIZE] of DWORD;
  18.                     FirstBloodDensity: Array[0..DENSITY_MATRIX_SIZE] of DWORD;
  19.                     TimeDensity      : Array[0..DENSITY_MATRIX_SIZE] of DWORD;
  20.                     LastTime         : DWORD;
  21.                   end;
  22.  
  23. type
  24.   TReplayAnalyzerProgress = procedure(Sender: TObject; const AProgress: Integer) of object;
  25.   TReplayAnalyzer = class(TThread)
  26.                     private
  27.                       var
  28.                         FRowFrom       : DWORD;
  29.                         FRowTo         : DWORD;
  30.                         FReplayProgress: Integer;
  31.                         FData          : TAnalyzerData;
  32.                         FConnection    : TUniConnection;
  33.                         FQuery         : TUniQuery;
  34.                         FCurrMatchId   : String;
  35.                         FStartDate     : TDateTime;
  36.  
  37.                         FOnReplayProgress: TReplayAnalyzerProgress;
  38.                         FOnAnalyzeDone   : TNotifyEvent;
  39.  
  40.                       function Analyze: Boolean;
  41.                       procedure syncReplayProgress;
  42.                       procedure syncAnalyzeDone;
  43.                       procedure QueryAfterExecute(Sender: TObject; Result: Boolean);
  44.                     protected
  45.                       procedure Execute; override;
  46.                     public
  47.                       constructor Create(const AConnection: TUniConnection; const ARowFrom, ARowTo: DWORD);
  48.                       destructor Destroy; override;
  49.  
  50.                       property OnReplayProgress: TReplayAnalyzerProgress read FOnReplayProgress write FOnReplayProgress;
  51.                       property OnAnalyzeDone   : TNotifyEvent read FOnAnalyzeDone write FOnAnalyzeDone;
  52.                       property Progress        : Integer read FReplayProgress;
  53.                       property Data            : TAnalyzerData read FData;
  54.                     end;
  55.  
  56. implementation
  57.  
  58. uses
  59.   System.SysUtils, System.StrUtils, System.DateUtils,
  60.   uCommon;
  61.  
  62.  
  63. constructor TReplayAnalyzer.Create(const AConnection: TUniConnection; const ARowFrom, ARowTo: DWORD);
  64. begin
  65.   inherited Create(TRUE);
  66.  
  67.   FreeOnTerminate := TRUE;
  68.  
  69.   FConnection := AConnection;
  70.   FRowFrom := ARowFrom;
  71.   FRowTo := ARowTo;
  72.  
  73. //  FStartDate := EncodeDate(2010, 12, 09);
  74.   FStartDate := EncodeDate(2011, 08, 01);
  75. end;
  76.  
  77. destructor TReplayAnalyzer.Destroy;
  78. begin
  79.   inherited;
  80. end;
  81.  
  82. function TReplayAnalyzer.Analyze: Boolean;
  83. var
  84.   f_match_id  : String;
  85.   f_fb_time   : Int64;
  86.   f_duration  : Int64;
  87.   f_datetime  : TDateTime;
  88.   days_between: Integer;
  89. begin
  90.   result := FALSE;
  91.   f_match_id := FQuery.FieldByName('match_id').AsString;
  92.   if FCurrMatchId <> f_match_id then
  93.   begin
  94.     FCurrMatchId := f_match_id;
  95.  
  96.     if FQuery.FieldByName('good_guys_win').AsBoolean then
  97.       Inc(FData.GoodGuysWin)
  98.     else
  99.       Inc(FData.BadGuysWin);
  100.  
  101.     f_fb_time := FQuery.FieldByName('first_blood_time').AsLargeInt;
  102.     if f_fb_time > 0 then
  103.     begin
  104.       if f_fb_time > DENSITY_MATRIX_SIZE - 1 then
  105.         Inc(FData.FirstBloodDensity[DENSITY_MATRIX_SIZE])
  106.       else
  107.         Inc(FData.FirstBloodDensity[f_fb_time]);
  108.     end;
  109.  
  110.     f_duration := FQuery.FieldByName('duration').AsLargeInt;
  111.     if f_duration > 0 then
  112.     begin
  113.       if f_duration > DENSITY_MATRIX_SIZE - 1 then
  114.         Inc(FData.DurationDensity[DENSITY_MATRIX_SIZE])
  115.       else
  116.         Inc(FData.DurationDensity[f_duration]);
  117.     end;
  118.  
  119.     f_datetime := FQuery.FieldByName('start_time').AsDateTime;
  120.     if f_datetime > FStartDate then
  121.     begin
  122.       days_between := DaysBetween(FStartDate, f_datetime);
  123.  
  124.       if days_between < DENSITY_MATRIX_SIZE then
  125.         Inc(FData.TimeDensity[days_between]);
  126.     end;
  127.  
  128.     result := TRUE;
  129.   end;
  130. end;
  131.  
  132. procedure TReplayAnalyzer.Execute;
  133. begin
  134.   FQuery := TUniQuery.Create(nil);
  135.   FQuery.Connection := FConnection;
  136.   FQuery.UniDirectional := TRUE;
  137.   FQuery.FetchRows := 1000;
  138.   FQuery.SQL.Text := 'SELECT m.match_id, m.duration, m.first_blood_time, m.good_guys_win, m.human_players, m.start_time FROM Matches AS m LEFT JOIN Players AS p ON m.match_id = p.match_id';
  139.   FQuery.SpecificOptions.Clear;
  140.   FQuery.SpecificOptions.Add('SQL Server.FetchAll=False');
  141.   FQuery.AfterExecute := QueryAfterExecute;
  142.   FQuery.ExecSQL;
  143.  
  144.   while not Terminated do
  145.     Sleep(1);
  146.  
  147.   FQuery.Free;
  148.  
  149.   Synchronize(syncAnalyzeDone);
  150. end;
  151.  
  152. procedure TReplayAnalyzer.QueryAfterExecute(Sender: TObject; Result: Boolean);
  153. var
  154.   currpos: DWORD;
  155. begin
  156.   if Result then
  157.   begin
  158.     FData.TotalMatches := FRowTo - FRowFrom + 1;
  159.     currpos := 0;
  160.     FQuery.Open;
  161.     FQuery.First;
  162.     while not FQuery.Eof do
  163.     begin
  164.       if Terminated then
  165.         Break;
  166.  
  167.       if Analyze then
  168.         Inc(currpos);
  169.  
  170.       if Round(((currpos + 1) / FData.TotalMatches) * 100) <> FReplayProgress then
  171.       begin
  172.         FReplayProgress := Round(((currpos + 1) / FData.TotalMatches) * 100);
  173.         Synchronize(syncReplayProgress);
  174.       end;
  175.  
  176.       FQuery.Next;
  177.     end;
  178.     FQuery.Close;
  179.   end;
  180.  
  181.   if not Terminated then
  182.     Terminate;
  183. end;
  184.  
  185. procedure TReplayAnalyzer.syncReplayProgress;
  186. begin
  187.   if Assigned(FOnReplayProgress) then
  188.     FOnReplayProgress(self, FReplayProgress);
  189. end;
  190.  
  191. procedure TReplayAnalyzer.syncAnalyzeDone;
  192. begin
  193.   if Assigned(FOnAnalyzeDone) then
  194.     FOnAnalyzeDone(self);
  195. end;
  196.  
  197. end.
Add Comment
Please, Sign In to add comment