From 5e19ed1af031c8eae16f523379039144e854857c Mon Sep 17 00:00:00 2001 From: Vincenzo Eduardo Padulano Date: Tue, 18 Mar 2025 13:00:03 +0100 Subject: [PATCH] [df] Avoid creating readers for unavailable columns DefaultValueFor, FilterAvailable and FilterMissing register the column which might have missing values during the creation of a RDefaultValueFor or RFilterWithMissingValues object. Move the creation of the data source column readers after this is done, to avoid creating a reader for a column that might potentially be missing at that time. --- tree/dataframe/inc/ROOT/RDF/RInterface.hxx | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/tree/dataframe/inc/ROOT/RDF/RInterface.hxx b/tree/dataframe/inc/ROOT/RDF/RInterface.hxx index f411d35ab626f..7c95ff9e7fbde 100644 --- a/tree/dataframe/inc/ROOT/RDF/RInterface.hxx +++ b/tree/dataframe/inc/ROOT/RDF/RInterface.hxx @@ -342,13 +342,13 @@ public: RInterface, DS_t> FilterAvailable(std::string_view column) { const auto columns = ColumnNames_t{column.data()}; - CheckAndFillDSColumns(columns, TTraits::TypeList{}); // For now disable this functionality in case of an empty data source and // the column name was not defined previously. if (ROOT::Internal::RDF::GetDataSourceLabel(*this) == "EmptyDS") GetValidatedColumnNames(1, columns); using F_t = RDFDetail::RFilterWithMissingValues; auto filterPtr = std::make_shared(/*discardEntry*/ true, fProxiedPtr, fColRegister, columns); + CheckAndFillDSColumns(columns, TTraits::TypeList{}); return RInterface(std::move(filterPtr), *fLoopManager, fColRegister); } @@ -393,13 +393,13 @@ public: RInterface, DS_t> FilterMissing(std::string_view column) { const auto columns = ColumnNames_t{column.data()}; - CheckAndFillDSColumns(columns, TTraits::TypeList{}); // For now disable this functionality in case of an empty data source and // the column name was not defined previously. if (ROOT::Internal::RDF::GetDataSourceLabel(*this) == "EmptyDS") GetValidatedColumnNames(1, columns); using F_t = RDFDetail::RFilterWithMissingValues; auto filterPtr = std::make_shared(/*discardEntry*/ false, fProxiedPtr, fColRegister, columns); + CheckAndFillDSColumns(columns, TTraits::TypeList{}); return RInterface(std::move(filterPtr), *fLoopManager, fColRegister); } @@ -683,8 +683,6 @@ public: if (ROOT::Internal::RDF::GetDataSourceLabel(*this) == "EmptyDS") RDFInternal::CheckForDefinition(where, column, fColRegister, fLoopManager->GetBranchNames(), GetDataSource() ? GetDataSource()->GetColumnNames() : ColumnNames_t{}); - const auto validColumnNames = ColumnNames_t{column.data()}; - CheckAndFillDSColumns(validColumnNames, TTraits::TypeList{}); // Declare return type to the interpreter, for future use by jitted actions auto retTypeName = RDFInternal::TypeID2TypeName(typeid(T)); @@ -695,8 +693,10 @@ public: retTypeName = "CLING_UNKNOWN_TYPE_" + demangledType; } + const auto validColumnNames = ColumnNames_t{column.data()}; auto newColumn = std::make_shared>( column, retTypeName, defaultValue, validColumnNames, fColRegister, *fLoopManager); + CheckAndFillDSColumns(validColumnNames, TTraits::TypeList{}); RDFInternal::RColumnRegister newCols(fColRegister); newCols.AddDefine(std::move(newColumn));