16
16
#include < ROOT/RNTupleProcessor.hxx>
17
17
18
18
#include < ROOT/RFieldBase.hxx>
19
+ #include < ROOT/RNTuple.hxx>
20
+ #include < ROOT/RPageStorageFile.hxx>
21
+
22
+ #include < TDirectory.h>
19
23
20
24
namespace {
21
25
using ROOT::Experimental::RNTupleOpenSpec;
@@ -29,6 +33,16 @@ void EnsureUniqueNTupleNames(const RNTupleOpenSpec &primaryNTuple, const std::ve
29
33
}
30
34
}
31
35
}
36
+
37
+ std::unique_ptr<ROOT::Experimental::Internal::RPageSource> CreatePageSourceFromSpec (const RNTupleOpenSpec &spec)
38
+ {
39
+ if (const std::string *storagePath = std::get_if<std::string>(&spec.fStorage ))
40
+ return ROOT::Experimental::Internal::RPageSource::Create (spec.fNTupleName , *storagePath);
41
+
42
+ auto dir = std::get<TDirectory *>(spec.fStorage );
43
+ auto ntuple = std::unique_ptr<ROOT::RNTuple>(dir->Get <ROOT::RNTuple>(spec.fNTupleName .c_str ()));
44
+ return ROOT::Experimental::Internal::RPageSourceFile::CreateFromAnchor (*ntuple);
45
+ }
32
46
} // anonymous namespace
33
47
34
48
std::unique_ptr<ROOT::Experimental::RNTupleProcessor>
@@ -66,7 +80,7 @@ ROOT::Experimental::RNTupleProcessor::CreateChain(const std::vector<RNTupleOpenS
66
80
67
81
// If no model is provided, infer it from the first ntuple.
68
82
if (!model) {
69
- auto firstPageSource = Internal::RPageSource::Create (ntuples[0 ]. fNTupleName , ntuples[ 0 ]. fStorage );
83
+ auto firstPageSource = CreatePageSourceFromSpec (ntuples[0 ]);
70
84
firstPageSource->Attach ();
71
85
model = firstPageSource->GetSharedDescriptorGuard ()->CreateModel ();
72
86
}
@@ -180,7 +194,7 @@ ROOT::Experimental::RNTupleSingleProcessor::RNTupleSingleProcessor(const RNTuple
180
194
: RNTupleProcessor(processorName, std::move(model)), fNTupleSpec(ntuple)
181
195
{
182
196
if (!fModel ) {
183
- fPageSource = Internal::RPageSource::Create (fNTupleSpec . fNTupleName , fNTupleSpec . fStorage );
197
+ fPageSource = CreatePageSourceFromSpec (fNTupleSpec );
184
198
fPageSource ->Attach ();
185
199
fModel = fPageSource ->GetSharedDescriptorGuard ()->CreateModel ();
186
200
}
@@ -236,7 +250,7 @@ void ROOT::Experimental::RNTupleSingleProcessor::Connect()
236
250
return ;
237
251
238
252
if (!fPageSource )
239
- fPageSource = Internal::RPageSource::Create (fNTupleSpec . fNTupleName , fNTupleSpec . fStorage );
253
+ fPageSource = CreatePageSourceFromSpec (fNTupleSpec );
240
254
fPageSource ->Attach ();
241
255
fNEntries = fPageSource ->GetNEntries ();
242
256
@@ -343,7 +357,7 @@ ROOT::Experimental::RNTupleJoinProcessor::RNTupleJoinProcessor(const RNTupleOpen
343
357
: RNTupleProcessor(processorName, nullptr )
344
358
{
345
359
fNTuples .emplace_back (mainNTuple);
346
- fPageSource = Internal::RPageSource::Create (mainNTuple. fNTupleName , mainNTuple. fStorage );
360
+ fPageSource = CreatePageSourceFromSpec (mainNTuple);
347
361
fPageSource ->Attach ();
348
362
349
363
if (fPageSource ->GetNEntries () == 0 ) {
@@ -396,7 +410,7 @@ void ROOT::Experimental::RNTupleJoinProcessor::AddAuxiliary(const RNTupleOpenSpe
396
410
397
411
fNTuples .emplace_back (auxNTuple);
398
412
399
- auto pageSource = Internal::RPageSource::Create (auxNTuple. fNTupleName , auxNTuple. fStorage );
413
+ auto pageSource = CreatePageSourceFromSpec (auxNTuple);
400
414
pageSource->Attach ();
401
415
402
416
if (pageSource->GetNEntries () == 0 ) {
0 commit comments