Skip to content

Commit e41c3f8

Browse files
committed
[ntuple] add RFieldBase::ConnectExtendedColumnsToPageSink
1 parent ede6d7f commit e41c3f8

2 files changed

Lines changed: 29 additions & 0 deletions

File tree

tree/ntuple/inc/ROOT/RFieldBase.hxx

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,8 @@ void CallFlushColumnsOnField(RFieldBase &);
5656
void CallCommitClusterOnField(RFieldBase &);
5757
void CallConnectPageSinkOnField(RFieldBase &, ROOT::Internal::RPageSink &, ROOT::NTupleSize_t firstEntry = 0);
5858
void CallConnectPageSourceOnField(RFieldBase &, ROOT::Internal::RPageSource &);
59+
void CallConnectExtendedColumnsToPageSinkOnField(RFieldBase &, ROOT::Internal::RPageSink &,
60+
ROOT::NTupleSize_t firstEntry);
5961
ROOT::RResult<std::unique_ptr<ROOT::RFieldBase>>
6062
CallFieldBaseCreate(const std::string &fieldName, const std::string &typeName, const ROOT::RCreateFieldOptions &options,
6163
const ROOT::RNTupleDescriptor *desc, ROOT::DescriptorId_t fieldId);
@@ -86,6 +88,8 @@ class RFieldBase {
8688
friend void Internal::CallCommitClusterOnField(RFieldBase &);
8789
friend void Internal::CallConnectPageSinkOnField(RFieldBase &, ROOT::Internal::RPageSink &, ROOT::NTupleSize_t);
8890
friend void Internal::CallConnectPageSourceOnField(RFieldBase &, ROOT::Internal::RPageSource &);
91+
friend void
92+
Internal::CallConnectExtendedColumnsToPageSinkOnField(RFieldBase &, ROOT::Internal::RPageSink &, ROOT::NTupleSize_t);
8993
friend ROOT::RResult<std::unique_ptr<ROOT::RFieldBase>>
9094
Internal::CallFieldBaseCreate(const std::string &fieldName, const std::string &typeName,
9195
const ROOT::RCreateFieldOptions &options, const ROOT::RNTupleDescriptor *desc,
@@ -261,6 +265,9 @@ private:
261265
/// calling this function. For subfields, a field ID may or may not be set. If the field ID is unset, it will be
262266
/// determined using the page source descriptor, based on the parent field ID and the subfield name.
263267
void ConnectPageSource(ROOT::Internal::RPageSource &pageSource);
268+
/// Similar to ConnectPageSink, but only used to connect new columns that were added via late model extension.
269+
/// The field must be already connected to the sink.
270+
void ConnectExtendedColumnsToPageSink(ROOT::Internal::RPageSink &pageSink, ROOT::NTupleSize_t firstEntry = 0);
264271

265272
void SetArtificial()
266273
{

tree/ntuple/src/RFieldBase.cxx

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,11 @@ void ROOT::Internal::CallConnectPageSourceOnField(RFieldBase &field, ROOT::Inter
8585
{
8686
field.ConnectPageSource(source);
8787
}
88+
void ROOT::Internal::CallConnectExtendedColumnsToPageSinkOnField(RFieldBase &field, ROOT::Internal::RPageSink &sink,
89+
ROOT::NTupleSize_t firstEntry)
90+
{
91+
field.ConnectExtendedColumnsToPageSink(sink, firstEntry);
92+
}
8893

8994
ROOT::RResult<std::unique_ptr<ROOT::RFieldBase>>
9095
ROOT::Internal::CallFieldBaseCreate(const std::string &fieldName, const std::string &typeName,
@@ -944,6 +949,23 @@ void ROOT::RFieldBase::ConnectPageSink(ROOT::Internal::RPageSink &pageSink, ROOT
944949
fState = EState::kConnectedToSink;
945950
}
946951

952+
void ROOT::RFieldBase::ConnectExtendedColumnsToPageSink(ROOT::Internal::RPageSink &pageSink,
953+
ROOT::NTupleSize_t firstEntry)
954+
{
955+
if (fState != EState::kConnectedToSink)
956+
throw RException(
957+
R__FAIL("invalid attempt to connect extended columns of a field that is not connected to a sink"));
958+
959+
const auto nPrev = fAvailableColumns.size();
960+
GenerateColumns();
961+
962+
for (auto i = nPrev, len = fAvailableColumns.size(); i < len; ++i) {
963+
auto &column = fAvailableColumns[i];
964+
auto firstElementIndex = (column->GetIndex() == 0) ? EntryToColumnElementIndex(firstEntry) : 0;
965+
column->ConnectPageSink(fOnDiskId, pageSink, firstElementIndex);
966+
}
967+
}
968+
947969
void ROOT::RFieldBase::ConnectPageSource(ROOT::Internal::RPageSource &pageSource)
948970
{
949971
if (dynamic_cast<ROOT::RFieldZero *>(this)) {

0 commit comments

Comments
 (0)