Reworking DataRecords and DataFlow

This commit is contained in:
Michael Schimmel
2025-07-22 14:44:48 +02:00
parent bf4ef71cba
commit 5b8b475da7
7 changed files with 191 additions and 234 deletions
+23 -11
View File
@@ -124,6 +124,8 @@ type
class function FieldToRecord<T>(const Layout: TDataRecord.TLayout; const Name: String): TConverter<T, TDataRecord>; static;
class function FieldOfRecord<T>(const Layout: TDataRecord.TLayout; const Name: String): TConverter<TDataRecord, T>; static;
class function Join<T>(const DataProviders: TArray<TDataProvider<T>>): TDataProvider<TArray<T>>; static;
type
TRecordMapping = record
Layout: TDataRecord.TLayout;
@@ -137,7 +139,11 @@ type
const Output: TDataRecord.TLayout
): TConverter<TArray<TDataRecord>, TDataRecord>; static;
class function Join<T>(const DataProviders: TArray<TDataProvider<T>>): TDataProvider<TArray<T>>; static;
class function JoinRecords(
const TargetLayout: TDataRecord.TLayout;
const Mapping: TArray<TRecordMapping>;
const DataProviders: TArray<TDataProvider<TDataRecord>>
): TConverter<TArray<TDataRecord>, TDataRecord>; static;
end;
implementation
@@ -357,18 +363,11 @@ begin
Result :=
TConverter<TArray<TDataRecord>, TDataRecord>.CreateGeneric(
function(const Inputs: TArray<TDataRecord>): TDataRecord
var
tmp: array[0..63] of Byte;
begin
Result := TDataRecord.CreateFrom(Output);
Result := TDataRecord.Create(Output);
for var i := 0 to High(Idxs) do
begin
for var j := 0 to High(Idxs[i]) do
begin
Inputs[i].GetValue(Idxs[i][j].FromIdx, tmp);
Result.SetValue(Idxs[i][j].ToIdx, tmp);
end;
end;
Inputs[i].CopyField(Idxs[i][j].FromIdx, Result, Idxs[i][j].ToIdx);
end
);
end;
@@ -386,7 +385,7 @@ begin
TConverter<T, TDataRecord>.CreateGeneric(
function(const Value: T): TDataRecord
begin
Result := TDataRecord.CreateFrom(Layout);
Result := TDataRecord.Create(Layout);
Result.SetValue(idx, Value);
end
);
@@ -397,6 +396,19 @@ begin
Result := TMycDataJoin<T>.Create(DataProviders);
end;
class function TConverter.JoinRecords(
const TargetLayout: TDataRecord.TLayout;
const Mapping: TArray<TRecordMapping>;
const DataProviders: TArray<TDataProvider<TDataRecord>>
): TConverter<TArray<TDataRecord>, TDataRecord>;
begin
var RecProvider := Join<TDataRecord>(DataProviders);
Result := DataMapping(Mapping, TargetLayout);
RecProvider.Link(Result);
end;
class function TConverter.Parallel<T>(Parent: TDataProvider<T>): TConverter<T, T>;
begin
Result := TMycParallelConverter<T>.Create;