@@ -4275,10 +4275,17 @@ TEST(RNTupleMerger, MergeReal32Trunc)
42754275 RNTupleMergeOptions opts;
42764276 opts.fMergingMode = mmode;
42774277 auto res = merger.Merge (sourcePtrs, opts);
4278- // Currently we're not supporting merging columns with the same type but different metadata.
4279- // TODO: support this.
4280- EXPECT_FALSE (bool (res));
4281- EXPECT_THAT (res.GetError ()->GetReport (), testing::HasSubstr (" have different column metadata" ));
4278+ EXPECT_TRUE (bool (res));
4279+ }
4280+ {
4281+ auto reader = ROOT::RNTupleReader::Open (" ntuple" , fileGuardOut.GetPath ());
4282+ EXPECT_EQ (reader->GetNEntries (), 20 );
4283+ EXPECT_EQ (reader->GetDescriptor ().GetNPhysicalColumns (), 2 );
4284+ auto pFlt = reader->GetModel ().GetDefaultEntry ().GetPtr <float >(" flt" );
4285+ for (auto i : reader->GetEntryRange ()) {
4286+ reader->LoadEntry (i);
4287+ EXPECT_NEAR (*pFlt, i, 0 .01f );
4288+ }
42824289 }
42834290 }
42844291 }
@@ -4333,10 +4340,17 @@ TEST(RNTupleMerger, MergeReal32Quant)
43334340 RNTupleMergeOptions opts;
43344341 opts.fMergingMode = mmode;
43354342 auto res = merger.Merge (sourcePtrs, opts);
4336- // Currently we're not supporting merging columns with the same type but different metadata.
4337- // TODO: support this.
4338- ASSERT_FALSE (bool (res));
4339- EXPECT_THAT (res.GetError ()->GetReport (), testing::HasSubstr (" have different column metadata" ));
4343+ EXPECT_TRUE (bool (res));
4344+ }
4345+ {
4346+ auto reader = ROOT::RNTupleReader::Open (" ntuple" , fileGuardOut.GetPath ());
4347+ EXPECT_EQ (reader->GetNEntries (), 20 );
4348+ EXPECT_EQ (reader->GetDescriptor ().GetNPhysicalColumns (), 2 );
4349+ auto pFlt = reader->GetModel ().GetDefaultEntry ().GetPtr <float >(" flt" );
4350+ for (auto i : reader->GetEntryRange ()) {
4351+ reader->LoadEntry (i);
4352+ EXPECT_NEAR (*pFlt, i, 0 .01f );
4353+ }
43404354 }
43414355 }
43424356 }
@@ -4406,3 +4420,68 @@ TEST(RNTupleMerger, MergeReal32TruncQuantMixed)
44064420 }
44074421 }
44084422}
4423+
4424+ TEST (RNTupleMerger, MergeRealRegularQuantMixed)
4425+ {
4426+ // Merge two files, both containing the same field, but with the first being a SplitReal64 and the second Real32Quant
4427+ FileRaii fileGuard1 (" test_ntuple_merge_realregquant_in_1.root" );
4428+ {
4429+ auto model = RNTupleModel::Create ();
4430+ auto fieldDbl = model->MakeField <double >(" dbl" );
4431+ auto ntuple = RNTupleWriter::Recreate (std::move (model), " ntuple" , fileGuard1.GetPath ());
4432+ for (int i = 0 ; i < 10 ; ++i) {
4433+ *fieldDbl = i;
4434+ ntuple->Fill ();
4435+ }
4436+ }
4437+ FileRaii fileGuard2 (" test_ntuple_merge_realregquant_in_2.root" );
4438+ {
4439+ auto model = RNTupleModel::Create ();
4440+ auto field = std::make_unique<RField<double >>(" dbl" );
4441+ field->SetQuantized (29 , {0 ., 20 .});
4442+ model->AddField (std::move (field));
4443+ auto ntuple = RNTupleWriter::Recreate (std::move (model), " ntuple" , fileGuard2.GetPath ());
4444+ auto fieldDbl = ntuple->GetModel ().GetDefaultEntry ().GetPtr <double >(" dbl" );
4445+ for (int i = 0 ; i < 10 ; ++i) {
4446+ *fieldDbl = 10 + i;
4447+ ntuple->Fill ();
4448+ }
4449+ }
4450+ {
4451+ // Gather the input sources
4452+ std::vector<std::unique_ptr<RPageSource>> sources;
4453+ sources.push_back (RPageSource::Create (" ntuple" , fileGuard1.GetPath (), RNTupleReadOptions ()));
4454+ sources.push_back (RPageSource::Create (" ntuple" , fileGuard2.GetPath (), RNTupleReadOptions ()));
4455+ std::vector<RPageSource *> sourcePtrs;
4456+ for (const auto &s : sources) {
4457+ sourcePtrs.push_back (s.get ());
4458+ }
4459+
4460+ // Now merge the inputs
4461+ for (const auto mmode : {ENTupleMergingMode::kFilter , ENTupleMergingMode::kStrict , ENTupleMergingMode::kUnion }) {
4462+ SCOPED_TRACE (std::string (" with merging mode = " ) + ToString (mmode));
4463+ FileRaii fileGuardOut (" test_ntuple_merge_realregquant_out.root" );
4464+ {
4465+ auto destination = std::make_unique<RPageSinkFile>(" ntuple" , fileGuardOut.GetPath (), RNTupleWriteOptions ());
4466+ RNTupleMerger merger{std::move (destination)};
4467+ RNTupleMergeOptions opts;
4468+ opts.fMergingMode = mmode;
4469+ auto res = merger.Merge (sourcePtrs, opts);
4470+ EXPECT_TRUE (bool (res));
4471+ }
4472+ {
4473+ auto reader = ROOT::RNTupleReader::Open (" ntuple" , fileGuardOut.GetPath ());
4474+ EXPECT_EQ (reader->GetNEntries (), 20 );
4475+ EXPECT_EQ (reader->GetDescriptor ().GetNPhysicalColumns (), 2 );
4476+ auto pDbl = reader->GetModel ().GetDefaultEntry ().GetPtr <double >(" dbl" );
4477+ for (auto i : reader->GetEntryRange ()) {
4478+ reader->LoadEntry (i);
4479+ if (i < 10 )
4480+ EXPECT_DOUBLE_EQ (*pDbl, i);
4481+ else
4482+ EXPECT_NEAR (*pDbl, i, 0 .01f );
4483+ }
4484+ }
4485+ }
4486+ }
4487+ }
0 commit comments