TDataPoint<T> review

This commit is contained in:
Michael Schimmel
2025-06-11 08:53:30 +02:00
parent 3cfca1f167
commit d282d2c40d
3 changed files with 46 additions and 42 deletions
+6 -4
View File
@@ -13,19 +13,21 @@ type
end; end;
TDataPoint<T> = record TDataPoint<T> = record
Idx: Int64;
Time: TDateTime; Time: TDateTime;
Data: T; Data: T;
constructor Create(AIdx: Int64; ATime: TDateTime; const AData: T); constructor Create(ATime: TDateTime; const AData: T);
end;
IMycStream<T: record> = interface
procedure Add(const Data: TDataPoint<T>);
end; end;
implementation implementation
{ TDataPoint } { TDataPoint }
constructor TDataPoint<T>.Create(AIdx: Int64; ATime: TDateTime; const AData: T); constructor TDataPoint<T>.Create(ATime: TDateTime; const AData: T);
begin begin
Idx := AIdx;
Time := ATime; Time := ATime;
Data := AData; Data := AData;
end; end;
+40 -38
View File
@@ -72,8 +72,8 @@ type
IAuraDataServer<T: record> = interface(IDataServer<T>) IAuraDataServer<T: record> = interface(IDataServer<T>)
['{481E27DE-DC58-49AF-B8A8-B6316980C423}'] ['{481E27DE-DC58-49AF-B8A8-B6316980C423}']
function LoadDataFile(const FileName: string): TFuture<TArray<TAuraFileDataRecord<T>>>; function LoadDataFile(const FileName: string): TFuture<TArray<TDataPoint<T>>>;
function LoadDataSeries(const FileName: string): TFuture<TArray<TAuraFileDataRecord<T>>>; function LoadDataSeries(const FileName: string): TFuture<TArray<TDataPoint<T>>>;
function EnumerateAssetFiles: TArray<String>; function EnumerateAssetFiles: TArray<String>;
end; end;
@@ -88,7 +88,7 @@ type
Name: String; Name: String;
Age: TDateTime; Age: TDateTime;
LastUsed: TDateTime; LastUsed: TDateTime;
Data: TFuture<TArray<TAuraFileDataRecord<T>>>; Data: TFuture<TArray<TDataPoint<T>>>;
end; end;
private private
// The cache is per-instance. // The cache is per-instance.
@@ -102,8 +102,8 @@ type
FLoadGate: TLatch; FLoadGate: TLatch;
protected protected
class function ReadCompressedData(const InputStream: TStream): TArray<TAuraFileDataRecord<T>>; static; class function ReadCompressedData(const InputStream: TStream): TArray<TDataPoint<T>>; static;
class function ReadUncompressedData(const InputStream: TStream): TArray<TAuraFileDataRecord<T>>; static; class function ReadUncompressedData(const InputStream: TStream): TArray<TDataPoint<T>>; static;
public public
constructor Create(const APath: String); constructor Create(const APath: String);
@@ -124,8 +124,8 @@ type
procedure ClearCache; procedure ClearCache;
function EnumerateAssetFiles: TArray<String>; function EnumerateAssetFiles: TArray<String>;
function LoadDataFile(const FileName: string): TFuture<TArray<TAuraFileDataRecord<T>>>; function LoadDataFile(const FileName: string): TFuture<TArray<TDataPoint<T>>>;
function LoadDataSeries(const FileName: string): TFuture<TArray<TAuraFileDataRecord<T>>>; function LoadDataSeries(const FileName: string): TFuture<TArray<TDataPoint<T>>>;
property Path: String read GetPath; property Path: String read GetPath;
end; end;
@@ -136,11 +136,10 @@ type
FDataServer: TAuraDataServer<T>; FDataServer: TAuraDataServer<T>;
FIsLiveData: TMutable<Boolean>.IWriteable; FIsLiveData: TMutable<Boolean>.IWriteable;
FCurrentFileName: string; FCurrentFileName: string;
FCurrentData: TFuture<TArray<TAuraFileDataRecord<T>>>; FCurrentData: TFuture<TArray<TDataPoint<T>>>;
FNextFileName: string; FNextFileName: string;
FNextData: TFuture<TArray<TAuraFileDataRecord<T>>>; FNextData: TFuture<TArray<TDataPoint<T>>>;
FCurrPosInFile: Int64; FCurrPosInFile: Int64;
FCurrentIdx: Int64;
FLastTimeStamp: TDateTime; FLastTimeStamp: TDateTime;
protected protected
function GetChunk(var Data: array of TDataPoint<T>): Integer; override; function GetChunk(var Data: array of TDataPoint<T>): Integer; override;
@@ -315,12 +314,12 @@ begin
Result := FPath; Result := FPath;
end; end;
function TAuraDataServer<T>.LoadDataFile(const FileName: string): TFuture<TArray<TAuraFileDataRecord<T>>>; function TAuraDataServer<T>.LoadDataFile(const FileName: string): TFuture<TArray<TDataPoint<T>>>;
var var
parsedPath, parsedSymbol: string; parsedPath, parsedSymbol: string;
parsedYear, parsedMonth: Integer; parsedYear, parsedMonth: Integer;
begin begin
Result := TFuture<TArray<TAuraFileDataRecord<T>>>.Null; Result := TFuture<TArray<TDataPoint<T>>>.Null;
if not TryParseFileName(FileName, parsedPath, parsedSymbol, parsedYear, parsedMonth) then if not TryParseFileName(FileName, parsedPath, parsedSymbol, parsedYear, parsedMonth) then
exit; exit;
@@ -369,8 +368,8 @@ begin
.Construct( .Construct(
TLatch.Enqueue(FLoadGate), // Use shared class var FLoadGate TLatch.Enqueue(FLoadGate), // Use shared class var FLoadGate
function: TBytes begin Result := TFile.ReadAllBytes(capFileName); end) function: TBytes begin Result := TFile.ReadAllBytes(capFileName); end)
.Chain<TArray<TAuraFileDataRecord<T>>>( .Chain<TArray<TDataPoint<T>>>(
function(bytes: TBytes): TArray<TAuraFileDataRecord<T>> function(bytes: TBytes): TArray<TDataPoint<T>>
begin begin
var zipMemoryStream := TBytesStream.Create(bytes); var zipMemoryStream := TBytesStream.Create(bytes);
try try
@@ -384,9 +383,9 @@ begin
else if TFile.Exists(FileName) then else if TFile.Exists(FileName) then
begin begin
Result := Result :=
TFuture<TArray<TAuraFileDataRecord<T>>>.Construct( TFuture<TArray<TDataPoint<T>>>.Construct(
TLatch.Enqueue(FLoadGate), // Use shared class var FLoadGate TLatch.Enqueue(FLoadGate), // Use shared class var FLoadGate
function: TArray<TAuraFileDataRecord<T>> function: TArray<TDataPoint<T>>
begin begin
if TFile.Exists(capFileName) then if TFile.Exists(capFileName) then
begin begin
@@ -419,11 +418,11 @@ begin
end; end;
end; end;
function TAuraDataServer<T>.LoadDataSeries(const FileName: string): TFuture<TArray<TAuraFileDataRecord<T>>>; function TAuraDataServer<T>.LoadDataSeries(const FileName: string): TFuture<TArray<TDataPoint<T>>>;
var var
loadedState: TState; loadedState: TState;
loadedFiles: TArray<TFuture<TArray<TAuraFileDataRecord<T>>>>; loadedFiles: TArray<TFuture<TArray<TDataPoint<T>>>>;
liveData: TFuture<TArray<TAuraFileDataRecord<T>>>; liveData: TFuture<TArray<TDataPoint<T>>>;
tabFiles: TList<string>; tabFiles: TList<string>;
currentFile: string; currentFile: string;
liveFilePath: string; liveFilePath: string;
@@ -453,7 +452,7 @@ begin
end; end;
end; end;
var loadedFileList := TList<TFuture<TArray<TAuraFileDataRecord<T>>>>.Create; var loadedFileList := TList<TFuture<TArray<TDataPoint<T>>>>.Create;
var loadStates := TList<TState>.Create; var loadStates := TList<TState>.Create;
try try
for currentFile in tabFiles do for currentFile in tabFiles do
@@ -463,7 +462,7 @@ begin
loadStates.Add(data.Done); loadStates.Add(data.Done);
end; end;
liveData := TFuture<TArray<TAuraFileDataRecord<T>>>.Null; liveData := TFuture<TArray<TDataPoint<T>>>.Null;
if liveFilePath <> '' then if liveFilePath <> '' then
begin begin
liveData := LoadDataFile(liveFilePath); liveData := LoadDataFile(liveFilePath);
@@ -482,11 +481,11 @@ begin
end; end;
Result := Result :=
TFuture<TArray<TAuraFileDataRecord<T>>>.Construct( TFuture<TArray<TDataPoint<T>>>.Construct(
loadedState, loadedState,
function: TArray<TAuraFileDataRecord<T>> function: TArray<TDataPoint<T>>
begin begin
var tickList := TList<TAuraFileDataRecord<T>>.Create; var tickList := TList<TDataPoint<T>>.Create;
try try
var overallLastTabTickTime: TDateTime := 0; var overallLastTabTickTime: TDateTime := 0;
var cnt := 0; var cnt := 0;
@@ -496,10 +495,10 @@ begin
for var P in loadedFiles do for var P in loadedFiles do
for var iterTickData in P.Value do for var iterTickData in P.Value do
if overallLastTabTickTime < iterTickData.TimeStamp then if overallLastTabTickTime < iterTickData.Time then
begin begin
tickList.Add(iterTickData); tickList.Add(iterTickData);
overallLastTabTickTime := iterTickData.TimeStamp; overallLastTabTickTime := iterTickData.Time;
end; end;
Result := tickList.ToArray; Result := tickList.ToArray;
finally finally
@@ -509,7 +508,7 @@ begin
); );
end; end;
class function TAuraDataServer<T>.ReadCompressedData(const InputStream: TStream): TArray<TAuraFileDataRecord<T>>; class function TAuraDataServer<T>.ReadCompressedData(const InputStream: TStream): TArray<TDataPoint<T>>;
var var
decompressionStream: TStream; decompressionStream: TStream;
localHeader: TZipHeader; localHeader: TZipHeader;
@@ -548,10 +547,11 @@ begin
end; end;
end; end;
class function TAuraDataServer<T>.ReadUncompressedData(const InputStream: TStream): TArray<TAuraFileDataRecord<T>>; class function TAuraDataServer<T>.ReadUncompressedData(const InputStream: TStream): TArray<TDataPoint<T>>;
var var
fileSize: Int64; fileSize: Int64;
recordCount, bytesRead: Integer; recordCount, bytesRead: Integer;
rec: TAuraFileDataRecord<T>;
begin begin
SetLength(Result, 0); SetLength(Result, 0);
InputStream.Position := 0; InputStream.Position := 0;
@@ -563,9 +563,13 @@ begin
if recordCount > 0 then if recordCount > 0 then
begin begin
SetLength(Result, recordCount); SetLength(Result, recordCount);
bytesRead := InputStream.Read(Result[0], fileSize); for var i:=0 to High(Result) do
if bytesRead <> fileSize then begin
raise EReadError.CreateFmt('Read error. Expected %d bytes, read %d.', [fileSize, bytesRead]); bytesRead := InputStream.Read(rec, SizeOf(TAuraFileDataRecord<T>));
if bytesRead <> SizeOf(TAuraFileDataRecord<T>) then
raise EReadError.CreateFmt('Read error. Expected %d bytes, read %d.', [fileSize, bytesRead]);
Result[i].Create( rec.TimeStamp, rec.Data );
end;
end; end;
end; end;
@@ -585,7 +589,6 @@ begin
inherited; inherited;
FCurrentData := FDataServer.LoadDataFile(FCurrentFileName); FCurrentData := FDataServer.LoadDataFile(FCurrentFileName);
FCurrPosInFile := 0; FCurrPosInFile := 0;
FCurrentIdx := 0;
FIsLiveData.SetValue(false); FIsLiveData.SetValue(false);
FLastTimeStamp := 0; FLastTimeStamp := 0;
FNextFileName := FDataServer.FindNextDataFile(FCurrentFileName); FNextFileName := FDataServer.FindNextDataFile(FCurrentFileName);
@@ -597,8 +600,8 @@ end;
function TAuraFileStream<T>.GetChunk(var Data: array of TDataPoint<T>): Integer; function TAuraFileStream<T>.GetChunk(var Data: array of TDataPoint<T>): Integer;
var var
item: TAuraFileDataRecord<T>; item: TDataPoint<T>;
currData: TArray<TAuraFileDataRecord<T>>; currData: TArray<TDataPoint<T>>;
begin begin
Result := 0; Result := 0;
if not FCurrentData.Done.IsSet then if not FCurrentData.Done.IsSet then
@@ -635,12 +638,11 @@ begin
end; end;
item := currData[FCurrPosInFile]; item := currData[FCurrPosInFile];
if FLastTimeStamp < item.TimeStamp then if FLastTimeStamp < item.Time then
begin begin
FLastTimeStamp := item.TimeStamp; FLastTimeStamp := item.Time;
Data[Result].Create(FCurrentIdx, FLastTimeStamp, item.Data); Data[Result].Create(FLastTimeStamp, item.Data);
Inc(Result); Inc(Result);
Inc(FCurrentIdx);
end; end;
Inc(FCurrPosInFile); Inc(FCurrPosInFile);
end; end;
BIN
View File
Binary file not shown.