Data pipeline refactoring

This commit is contained in:
Michael Schimmel
2025-12-14 17:47:07 +01:00
parent f0567a32a1
commit 3c7723f3d2
7 changed files with 20 additions and 32 deletions
File diff suppressed because one or more lines are too long
+1 -1
View File
@@ -1083,7 +1083,7 @@ procedure TForm1.SeriesTestButtonClick(Sender: TObject);
var
ast: IAstNode;
resultValue: TDataValue;
series: TScalarRecordSeries;
series: IWriteableScalarRecordSeries;
recordDef: IScalarRecordDefinition;
i: Integer;
values: TArray<TScalar.TValue>;
+1 -1
View File
@@ -405,7 +405,7 @@ var
baseValue, indexValue: TDataValue;
index: Int64;
series: ISeries;
recSeries: IRecordSeries;
recSeries: IScalarRecordSeries;
i, fieldCount: Integer;
values: TArray<TScalar.TValue>;
key: IKeyword;
+2 -4
View File
@@ -2,8 +2,6 @@ unit Myc.Data.Pipeline;
interface
{$M+}
uses
Myc.Signals,
Myc.Mutable,
@@ -13,12 +11,12 @@ type
TTag = Pointer;
// A generic interface for components that consume data of type T.
IConsumer<T> = interface
IConsumer<T> = interface(IInvokable)
function Consume(const Value: T): TState;
end;
// A producer generates data and distributes it to linked consumers.
IProducer<T> = interface
IProducer<T> = interface(IInvokable)
function Link(const Consumer: IConsumer<T>): TTag;
procedure Unlink(Tag: TTag);
end;
+10 -20
View File
@@ -179,23 +179,27 @@ type
procedure Add(const Item: TScalar.TValue; Lookback: Int64 = -1);
end;
IRecordSeries = interface
IScalarRecordSeries = interface
{$region 'private'}
function GetCount: Int64;
function GetDef: IScalarRecordDefinition;
function GetTotalCount: Int64;
function GetFields(const Key: IKeyword): ISeries;
function GetTotalCount: Int64;
{$endregion}
procedure Add(const Item: IScalarRecord; Lookback: Int64 = -1);
procedure AddRaw(const Data; Lookback: Int64 = -1);
property Count: Int64 read GetCount;
property Def: IScalarRecordDefinition read GetDef;
property Fields[const Key: IKeyword]: ISeries read GetFields; default;
property TotalCount: Int64 read GetTotalCount;
end;
IWriteableScalarRecordSeries = interface(IScalarRecordSeries)
{$region 'private'}
{$endregion}
procedure Add(const Item: IScalarRecord; Lookback: Int64 = -1);
end;
// A series of scalar records, optimized for memory and access speed.
TScalarRecordSeries = class(TInterfacedObject, IRecordSeries)
TScalarRecordSeries = class(TInterfacedObject, IWriteableScalarRecordSeries)
type
TMemberSeries = class(TGenericContainedObject<TScalarRecordSeries>, ISeries)
private
@@ -222,10 +226,8 @@ type
public
constructor Create(const ADef: IScalarRecordDefinition);
destructor Destroy; override;
procedure Add(const Item: IScalarRecord; Lookback: Int64 = -1);
// Copies data directly from the Data reference (zero-copy wrapper)
procedure AddRaw(const Data; Lookback: Int64 = -1);
procedure Add(const Item: IScalarRecord; Lookback: Int64 = -1);
property Count: Int64 read GetCount;
property Fields[const Key: IKeyword]: ISeries read GetFields; default;
@@ -809,18 +811,6 @@ begin
inc(FTotalCount);
end;
procedure TScalarRecordSeries.AddRaw(const Data; Lookback: Int64 = -1);
begin
var lb := FDef.Count * Integer(Lookback);
var P: TScalar.PValue := @Data;
for var i := 0 to FDef.Count - 1 do
begin
FArray.Add(P^, lb);
inc(P);
end;
inc(FTotalCount);
end;
function TScalarRecordSeries.GetFields(const Key: IKeyword): ISeries;
begin
var elem := FDef.IndexOf(Key);
+5 -5
View File
@@ -78,7 +78,7 @@ type
class function Map(const SourceSeries: ISeries; const MapperFunc: TFunc): ISeries; static;
class function FromRecordSeries(const AValue: IRecordSeries): TDataValue; static; inline;
class function FromRecordSeries(const AValue: IWriteableScalarRecordSeries): TDataValue; static; inline;
class function FromScalarRecord(const AValue: IScalarRecord): TDataValue; static; inline;
class function FromGenericRecord(const AValue: IKeywordMapping<TDataValue>): TDataValue; static; inline;
class function FromSeries(const AValue: ISeries): TDataValue; static; inline;
@@ -86,7 +86,7 @@ type
function AsScalar: TScalar; inline;
function AsMethod: TFunc; inline;
function AsText: String; inline;
function AsRecordSeries: IRecordSeries; inline;
function AsRecordSeries: IWriteableScalarRecordSeries; inline;
function AsScalarRecord: IScalarRecord; inline;
function AsGenericRecord: IKeywordMapping<TDataValue>; inline;
function AsSeries: ISeries; inline;
@@ -205,11 +205,11 @@ begin
Result := IKeywordMapping<TDataValue>(FInterface);
end;
function TDataValue.AsRecordSeries: IRecordSeries;
function TDataValue.AsRecordSeries: IWriteableScalarRecordSeries;
begin
if (FKind <> vkRecordSeries) then
raise EInvalidCast.Create('Cannot read value as RecordSeries.');
Result := IRecordSeries(FInterface);
Result := IWriteableScalarRecordSeries(FInterface);
end;
function TDataValue.AsScalar: TScalar;
@@ -266,7 +266,7 @@ begin
Result.FInterface := AValue;
end;
class function TDataValue.FromRecordSeries(const AValue: IRecordSeries): TDataValue;
class function TDataValue.FromRecordSeries(const AValue: IWriteableScalarRecordSeries): TDataValue;
begin
Result.FKind := vkRecordSeries;
Result.FInterface := AValue;