Refactoring streams and fixin various bugs
This commit is contained in:
@@ -897,43 +897,56 @@ begin
|
||||
// Case 2: Record Series, e.g. (new-series [[:Price :Float] [:Vol :Ordinal]])
|
||||
tuple := defNode.AsTuple;
|
||||
elements := tuple.Elements;
|
||||
SetLength(fields, Length(elements));
|
||||
|
||||
for i := 0 to High(elements) do
|
||||
if Length(elements) > 0 then
|
||||
begin
|
||||
if elements[i].Kind <> akTuple then
|
||||
// check format first
|
||||
var failed := false;
|
||||
for i := 0 to High(elements) do
|
||||
begin
|
||||
if Assigned(FLog) then
|
||||
FLog.AddError('Record definition elements must be vectors [Key Type]', elements[i]);
|
||||
continue;
|
||||
if elements[i].Kind <> akTuple then
|
||||
begin
|
||||
failed := true;
|
||||
if Assigned(FLog) then
|
||||
FLog.AddError('Record definition elements must be vectors [Key Type]', elements[i]);
|
||||
break;
|
||||
end;
|
||||
|
||||
fieldTuple := elements[i].AsTuple;
|
||||
if Length(fieldTuple.Elements) <> 2 then
|
||||
begin
|
||||
failed := true;
|
||||
if Assigned(FLog) then
|
||||
FLog.AddError('Record definition entry must have exactly 2 elements [Key Type]', fieldTuple);
|
||||
break;
|
||||
end;
|
||||
|
||||
if (fieldTuple.Elements[0].Kind <> akKeyword) or (fieldTuple.Elements[1].Kind <> akKeyword) then
|
||||
begin
|
||||
failed := true;
|
||||
if Assigned(FLog) then
|
||||
FLog.AddError('Record definition keys and types must be keywords', fieldTuple);
|
||||
break;
|
||||
end;
|
||||
end;
|
||||
|
||||
fieldTuple := elements[i].AsTuple;
|
||||
if Length(fieldTuple.Elements) <> 2 then
|
||||
if not failed then
|
||||
begin
|
||||
if Assigned(FLog) then
|
||||
FLog.AddError('Record definition entry must have exactly 2 elements [Key Type]', fieldTuple);
|
||||
continue;
|
||||
SetLength(fields, Length(elements));
|
||||
|
||||
for i := 0 to High(elements) do
|
||||
begin
|
||||
fieldTuple := elements[i].AsTuple;
|
||||
keyNode := fieldTuple.Elements[0].AsKeyword;
|
||||
typeNode := fieldTuple.Elements[1].AsKeyword;
|
||||
|
||||
elemKind := TScalar.StringToKind(typeNode.Value.Name);
|
||||
fields[i] := TPair<IKeyword, TScalar.TKind>.Create(keyNode.Value, elemKind);
|
||||
end;
|
||||
|
||||
recDef := TKeywordMappingRegistry<TScalar.TKind>.Intern(fields);
|
||||
resType := TTypes.CreateRecordSeries(recDef);
|
||||
end;
|
||||
|
||||
if (fieldTuple.Elements[0].Kind <> akKeyword) or (fieldTuple.Elements[1].Kind <> akKeyword) then
|
||||
begin
|
||||
if Assigned(FLog) then
|
||||
FLog.AddError('Record definition keys and types must be keywords', fieldTuple);
|
||||
continue;
|
||||
end;
|
||||
|
||||
keyNode := fieldTuple.Elements[0].AsKeyword;
|
||||
typeNode := fieldTuple.Elements[1].AsKeyword;
|
||||
|
||||
elemKind := TScalar.StringToKind(typeNode.Value.Name);
|
||||
fields[i] := TPair<IKeyword, TScalar.TKind>.Create(keyNode.Value, elemKind);
|
||||
end;
|
||||
|
||||
if Length(fields) > 0 then
|
||||
begin
|
||||
recDef := TKeywordMappingRegistry<TScalar.TKind>.Intern(fields);
|
||||
resType := TTypes.CreateRecordSeries(recDef);
|
||||
end;
|
||||
end
|
||||
else
|
||||
|
||||
Reference in New Issue
Block a user