Skip to content

Commit 6917757

Browse files
committed
[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.
1 parent b040221 commit 6917757

File tree

1 file changed

+4
-4
lines changed

1 file changed

+4
-4
lines changed

tree/dataframe/inc/ROOT/RDF/RInterface.hxx

+4-4
Original file line numberDiff line numberDiff line change
@@ -342,13 +342,13 @@ public:
342342
RInterface<RDFDetail::RFilterWithMissingValues<Proxied>, DS_t> FilterAvailable(std::string_view column)
343343
{
344344
const auto columns = ColumnNames_t{column.data()};
345-
CheckAndFillDSColumns(columns, TTraits::TypeList<void>{});
346345
// For now disable this functionality in case of an empty data source and
347346
// the column name was not defined previously.
348347
if (ROOT::Internal::RDF::GetDataSourceLabel(*this) == "EmptyDS")
349348
GetValidatedColumnNames(1, columns);
350349
using F_t = RDFDetail::RFilterWithMissingValues<Proxied>;
351350
auto filterPtr = std::make_shared<F_t>(/*discardEntry*/ true, fProxiedPtr, fColRegister, columns);
351+
CheckAndFillDSColumns(columns, TTraits::TypeList<void>{});
352352
return RInterface<F_t, DS_t>(std::move(filterPtr), *fLoopManager, fColRegister);
353353
}
354354

@@ -393,13 +393,13 @@ public:
393393
RInterface<RDFDetail::RFilterWithMissingValues<Proxied>, DS_t> FilterMissing(std::string_view column)
394394
{
395395
const auto columns = ColumnNames_t{column.data()};
396-
CheckAndFillDSColumns(columns, TTraits::TypeList<void>{});
397396
// For now disable this functionality in case of an empty data source and
398397
// the column name was not defined previously.
399398
if (ROOT::Internal::RDF::GetDataSourceLabel(*this) == "EmptyDS")
400399
GetValidatedColumnNames(1, columns);
401400
using F_t = RDFDetail::RFilterWithMissingValues<Proxied>;
402401
auto filterPtr = std::make_shared<F_t>(/*discardEntry*/ false, fProxiedPtr, fColRegister, columns);
402+
CheckAndFillDSColumns(columns, TTraits::TypeList<void>{});
403403
return RInterface<F_t, DS_t>(std::move(filterPtr), *fLoopManager, fColRegister);
404404
}
405405

@@ -683,8 +683,6 @@ public:
683683
if (ROOT::Internal::RDF::GetDataSourceLabel(*this) == "EmptyDS")
684684
RDFInternal::CheckForDefinition(where, column, fColRegister, fLoopManager->GetBranchNames(),
685685
GetDataSource() ? GetDataSource()->GetColumnNames() : ColumnNames_t{});
686-
const auto validColumnNames = ColumnNames_t{column.data()};
687-
CheckAndFillDSColumns(validColumnNames, TTraits::TypeList<T>{});
688686

689687
// Declare return type to the interpreter, for future use by jitted actions
690688
auto retTypeName = RDFInternal::TypeID2TypeName(typeid(T));
@@ -695,8 +693,10 @@ public:
695693
retTypeName = "CLING_UNKNOWN_TYPE_" + demangledType;
696694
}
697695

696+
const auto validColumnNames = ColumnNames_t{column.data()};
698697
auto newColumn = std::make_shared<ROOT::Internal::RDF::RDefaultValueFor<T>>(
699698
column, retTypeName, defaultValue, validColumnNames, fColRegister, *fLoopManager);
699+
CheckAndFillDSColumns(validColumnNames, TTraits::TypeList<T>{});
700700

701701
RDFInternal::RColumnRegister newCols(fColRegister);
702702
newCols.AddDefine(std::move(newColumn));

0 commit comments

Comments
 (0)