Skip to content

Commit 45c5f51

Browse files
committed
[ntuple] use RResult in field reconciliation
Let EnsureMatchingOnDiskField() and EnsureMatchingTypePrefix() return an RResult<void> instead of directly throwing.
1 parent 3048154 commit 45c5f51

File tree

6 files changed

+36
-33
lines changed

6 files changed

+36
-33
lines changed

tree/ntuple/inc/ROOT/RField.hxx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -365,7 +365,7 @@ protected:
365365
{
366366
// Differences in the type name don't matter for simple fields; the valid column representations take
367367
// care of (allowed) schema differences.
368-
EnsureMatchingOnDiskField(desc.GetFieldDescriptor(GetOnDiskId()), kDiffTypeName);
368+
EnsureMatchingOnDiskField(desc.GetFieldDescriptor(GetOnDiskId()), kDiffTypeName).ThrowOnError();
369369
}
370370

371371
RSimpleField(std::string_view name, std::string_view type)

tree/ntuple/inc/ROOT/RFieldBase.hxx

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -525,10 +525,11 @@ protected:
525525
std::uint32_t CompareOnDiskField(const RFieldDescriptor &fieldDesc, std::uint32_t ignoreBits) const;
526526
/// Compares the field to the provieded on-disk field descriptor. Throws an exception if the fields don't match.
527527
/// Optionally, a set of bits can be provided that should be ignored in the comparison.
528-
void EnsureMatchingOnDiskField(const RFieldDescriptor &fieldDesc, std::uint32_t ignoreBits = 0) const;
528+
RResult<void> EnsureMatchingOnDiskField(const RFieldDescriptor &fieldDesc, std::uint32_t ignoreBits = 0) const;
529529
/// Many fields accept a range of type prefixes for schema evolution,
530530
/// e.g. std::unique_ptr< and std::optional< for nullable fields
531-
void EnsureMatchingTypePrefix(const RFieldDescriptor &fieldDesc, const std::vector<std::string> &prefixes) const;
531+
RResult<void>
532+
EnsureMatchingTypePrefix(const RFieldDescriptor &fieldDesc, const std::vector<std::string> &prefixes) const;
532533

533534
/// Factory method to resurrect a field from the stored on-disk type information. This overload takes an already
534535
/// normalized type name and type alias.

tree/ntuple/src/RField.cxx

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ void ROOT::RCardinalityField::GenerateColumns(const ROOT::RNTupleDescriptor &des
6464
void ROOT::RCardinalityField::ReconcileOnDiskField(const RNTupleDescriptor &desc)
6565
{
6666
const auto &fieldDesc = desc.GetFieldDescriptor(GetOnDiskId());
67-
EnsureMatchingOnDiskField(fieldDesc, kDiffTypeVersion | kDiffStructure | kDiffTypeName);
67+
EnsureMatchingOnDiskField(fieldDesc, kDiffTypeVersion | kDiffStructure | kDiffTypeName).ThrowOnError();
6868
if (fieldDesc.GetStructure() == ENTupleStructure::kPlain) {
6969
if (fieldDesc.GetTypeName().rfind("ROOT::RNTupleCardinality<", 0) != 0) {
7070
throw RException(R__FAIL("RCardinalityField " + GetQualifiedFieldName() +
@@ -615,7 +615,7 @@ void ROOT::RRecordField::ReconcileOnDiskField(const RNTupleDescriptor &desc)
615615
R__ASSERT(GetTypeName().empty());
616616

617617
const auto &fieldDesc = desc.GetFieldDescriptor(GetOnDiskId());
618-
EnsureMatchingOnDiskField(fieldDesc, kDiffTypeName | kDiffTypeVersion);
618+
EnsureMatchingOnDiskField(fieldDesc, kDiffTypeName | kDiffTypeVersion).ThrowOnError();
619619

620620
// The on-disk ID of subfields is matched by field name. So we inherently support reordering of fields
621621
// and we will ignore extra on-disk fields.
@@ -830,8 +830,8 @@ void ROOT::RNullableField::ReconcileOnDiskField(const RNTupleDescriptor &desc)
830830
static const std::vector<std::string> prefixes = {"std::optional<", "std::unique_ptr<"};
831831

832832
const auto &fieldDesc = desc.GetFieldDescriptor(GetOnDiskId());
833-
EnsureMatchingOnDiskField(fieldDesc, kDiffTypeName);
834-
EnsureMatchingTypePrefix(fieldDesc, prefixes);
833+
EnsureMatchingOnDiskField(fieldDesc, kDiffTypeName).ThrowOnError();
834+
EnsureMatchingTypePrefix(fieldDesc, prefixes).ThrowOnError();
835835
}
836836

837837
ROOT::RNTupleLocalIndex ROOT::RNullableField::GetItemIndex(ROOT::NTupleSize_t globalIndex)
@@ -1050,8 +1050,8 @@ void ROOT::RAtomicField::ReconcileOnDiskField(const RNTupleDescriptor &desc)
10501050
static const std::vector<std::string> prefixes = {"std::atomic<"};
10511051

10521052
const auto &fieldDesc = desc.GetFieldDescriptor(GetOnDiskId());
1053-
EnsureMatchingOnDiskField(fieldDesc, kDiffTypeName);
1054-
EnsureMatchingTypePrefix(fieldDesc, prefixes);
1053+
EnsureMatchingOnDiskField(fieldDesc, kDiffTypeName).ThrowOnError();
1054+
EnsureMatchingTypePrefix(fieldDesc, prefixes).ThrowOnError();
10551055
}
10561056

10571057
std::vector<ROOT::RFieldBase::RValue> ROOT::RAtomicField::SplitValue(const RValue &value) const

tree/ntuple/src/RFieldBase.cxx

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1002,14 +1002,15 @@ void ROOT::RFieldBase::ReconcileOnDiskField(const RNTupleDescriptor &desc)
10021002
// The default implementation throws an exception if the on-disk ID is set and there are any meaningful differences
10031003
// to the on-disk field. Derived classes may overwrite this and relax the checks to support automatic schema
10041004
// evolution.
1005-
EnsureMatchingOnDiskField(desc.GetFieldDescriptor(fOnDiskId));
1005+
EnsureMatchingOnDiskField(desc.GetFieldDescriptor(fOnDiskId)).ThrowOnError();
10061006
}
10071007

1008-
void ROOT::RFieldBase::EnsureMatchingOnDiskField(const RFieldDescriptor &fieldDesc, std::uint32_t ignoreBits) const
1008+
ROOT::RResult<void>
1009+
ROOT::RFieldBase::EnsureMatchingOnDiskField(const RFieldDescriptor &fieldDesc, std::uint32_t ignoreBits) const
10091010
{
10101011
const std::uint32_t diffBits = CompareOnDiskField(fieldDesc, ignoreBits);
10111012
if (diffBits == 0)
1012-
return;
1013+
return RResult<void>::Success();
10131014

10141015
std::ostringstream errMsg;
10151016
errMsg << "in-memory field " << GetQualifiedFieldName() << " of type " << GetTypeName() << " is incompatible "
@@ -1029,17 +1030,17 @@ void ROOT::RFieldBase::EnsureMatchingOnDiskField(const RFieldDescriptor &fieldDe
10291030
if (diffBits & kDiffNRepetitions) {
10301031
errMsg << " repetition count " << GetNRepetitions() << " vs. " << fieldDesc.GetNRepetitions() << ";";
10311032
}
1032-
throw RException(R__FAIL(errMsg.str()));
1033+
return R__FAIL(errMsg.str());
10331034
}
10341035

1035-
void ROOT::RFieldBase::EnsureMatchingTypePrefix(const RFieldDescriptor &fieldDesc,
1036-
const std::vector<std::string> &prefixes) const
1036+
ROOT::RResult<void> ROOT::RFieldBase::EnsureMatchingTypePrefix(const RFieldDescriptor &fieldDesc,
1037+
const std::vector<std::string> &prefixes) const
10371038
{
10381039
for (const auto &p : prefixes) {
10391040
if (fieldDesc.GetTypeName().rfind(p, 0) == 0)
1040-
return;
1041+
return RResult<void>::Success();
10411042
}
1042-
throw RException(R__FAIL("incompatible type " + fieldDesc.GetTypeName() + " for field " + GetQualifiedFieldName()));
1043+
return R__FAIL("incompatible type " + fieldDesc.GetTypeName() + " for field " + GetQualifiedFieldName());
10431044
}
10441045

10451046
std::uint32_t ROOT::RFieldBase::CompareOnDiskField(const RFieldDescriptor &fieldDesc, std::uint32_t ignoreBits) const

tree/ntuple/src/RFieldMeta.cxx

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -505,7 +505,7 @@ void ROOT::RClassField::BeforeConnectPageSource(ROOT::Internal::RPageSource &pag
505505

506506
void ROOT::RClassField::ReconcileOnDiskField(const RNTupleDescriptor &desc)
507507
{
508-
EnsureMatchingOnDiskField(desc.GetFieldDescriptor(GetOnDiskId()), kDiffTypeVersion | kDiffTypeName);
508+
EnsureMatchingOnDiskField(desc.GetFieldDescriptor(GetOnDiskId()), kDiffTypeVersion | kDiffTypeName).ThrowOnError();
509509
}
510510

511511
void ROOT::RClassField::ConstructValue(void *where) const
@@ -603,7 +603,7 @@ std::unique_ptr<ROOT::RFieldBase> ROOT::REnumField::CloneImpl(std::string_view n
603603
void ROOT::REnumField::ReconcileOnDiskField(const RNTupleDescriptor &desc)
604604
{
605605
// TODO(jblomer): allow enum to enum conversion only by rename rule
606-
EnsureMatchingOnDiskField(desc.GetFieldDescriptor(GetOnDiskId()), kDiffTypeName | kDiffTypeVersion);
606+
EnsureMatchingOnDiskField(desc.GetFieldDescriptor(GetOnDiskId()), kDiffTypeName | kDiffTypeVersion).ThrowOnError();
607607
}
608608

609609
std::vector<ROOT::RFieldBase::RValue> ROOT::REnumField::SplitValue(const RValue &value) const
@@ -669,8 +669,8 @@ void ROOT::RPairField::ReconcileOnDiskField(const RNTupleDescriptor &desc)
669669
static const std::vector<std::string> prefixes = {"std::pair<", "std::tuple<"};
670670

671671
const auto &fieldDesc = desc.GetFieldDescriptor(GetOnDiskId());
672-
EnsureMatchingOnDiskField(fieldDesc, kDiffTypeName);
673-
EnsureMatchingTypePrefix(fieldDesc, prefixes);
672+
EnsureMatchingOnDiskField(fieldDesc, kDiffTypeName).ThrowOnError();
673+
EnsureMatchingTypePrefix(fieldDesc, prefixes).ThrowOnError();
674674

675675
const auto nOnDiskSubfields = fieldDesc.GetLinkIds().size();
676676
if (nOnDiskSubfields != 2) {
@@ -814,7 +814,7 @@ void ROOT::RProxiedCollectionField::GenerateColumns(const ROOT::RNTupleDescripto
814814

815815
void ROOT::RProxiedCollectionField::ReconcileOnDiskField(const RNTupleDescriptor &desc)
816816
{
817-
EnsureMatchingOnDiskField(desc.GetFieldDescriptor(GetOnDiskId()), kDiffTypeName);
817+
EnsureMatchingOnDiskField(desc.GetFieldDescriptor(GetOnDiskId()), kDiffTypeName).ThrowOnError();
818818
}
819819

820820
void ROOT::RProxiedCollectionField::ConstructValue(void *where) const
@@ -980,7 +980,7 @@ void ROOT::RStreamerField::BeforeConnectPageSource(ROOT::Internal::RPageSource &
980980

981981
void ROOT::RStreamerField::ReconcileOnDiskField(const RNTupleDescriptor &desc)
982982
{
983-
EnsureMatchingOnDiskField(desc.GetFieldDescriptor(GetOnDiskId()), kDiffTypeName | kDiffTypeVersion);
983+
EnsureMatchingOnDiskField(desc.GetFieldDescriptor(GetOnDiskId()), kDiffTypeName | kDiffTypeVersion).ThrowOnError();
984984
}
985985

986986
void ROOT::RStreamerField::ConstructValue(void *where) const
@@ -1215,8 +1215,8 @@ void ROOT::RTupleField::ReconcileOnDiskField(const RNTupleDescriptor &desc)
12151215
static const std::vector<std::string> prefixes = {"std::pair<", "std::tuple<"};
12161216

12171217
const auto &fieldDesc = desc.GetFieldDescriptor(GetOnDiskId());
1218-
EnsureMatchingOnDiskField(fieldDesc, kDiffTypeName);
1219-
EnsureMatchingTypePrefix(fieldDesc, prefixes);
1218+
EnsureMatchingOnDiskField(fieldDesc, kDiffTypeName).ThrowOnError();
1219+
EnsureMatchingTypePrefix(fieldDesc, prefixes).ThrowOnError();
12201220

12211221
const auto nOnDiskSubfields = fieldDesc.GetLinkIds().size();
12221222
const auto nSubfields = fSubfields.size();
@@ -1377,8 +1377,8 @@ void ROOT::RVariantField::ReconcileOnDiskField(const RNTupleDescriptor &desc)
13771377
static const std::vector<std::string> prefixes = {"std::variant<"};
13781378

13791379
const auto &fieldDesc = desc.GetFieldDescriptor(GetOnDiskId());
1380-
EnsureMatchingOnDiskField(fieldDesc, kDiffTypeName);
1381-
EnsureMatchingTypePrefix(fieldDesc, prefixes);
1380+
EnsureMatchingOnDiskField(fieldDesc, kDiffTypeName).ThrowOnError();
1381+
EnsureMatchingTypePrefix(fieldDesc, prefixes).ThrowOnError();
13821382

13831383
if (fSubfields.size() != fieldDesc.GetLinkIds().size()) {
13841384
throw RException(R__FAIL("number of variants on-disk do not match for " + GetQualifiedFieldName()));

tree/ntuple/src/RFieldSequenceContainer.cxx

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -79,8 +79,8 @@ void ROOT::RArrayField::ReconcileOnDiskField(const RNTupleDescriptor &desc)
7979
static const std::vector<std::string> prefixes = {"std::array<"};
8080

8181
const auto &fieldDesc = desc.GetFieldDescriptor(GetOnDiskId());
82-
EnsureMatchingOnDiskField(fieldDesc, kDiffTypeName);
83-
EnsureMatchingTypePrefix(fieldDesc, prefixes);
82+
EnsureMatchingOnDiskField(fieldDesc, kDiffTypeName).ThrowOnError();
83+
EnsureMatchingTypePrefix(fieldDesc, prefixes).ThrowOnError();
8484
}
8585

8686
void ROOT::RArrayField::ConstructValue(void *where) const
@@ -414,7 +414,7 @@ void ROOT::RRVecField::GenerateColumns(const ROOT::RNTupleDescriptor &desc)
414414

415415
void ROOT::RRVecField::ReconcileOnDiskField(const RNTupleDescriptor &desc)
416416
{
417-
EnsureMatchingOnDiskField(desc.GetFieldDescriptor(GetOnDiskId()), kDiffTypeName);
417+
EnsureMatchingOnDiskField(desc.GetFieldDescriptor(GetOnDiskId()), kDiffTypeName).ThrowOnError();
418418
}
419419

420420
void ROOT::RRVecField::ConstructValue(void *where) const
@@ -597,7 +597,7 @@ void ROOT::RVectorField::GenerateColumns(const ROOT::RNTupleDescriptor &desc)
597597

598598
void ROOT::RVectorField::ReconcileOnDiskField(const RNTupleDescriptor &desc)
599599
{
600-
EnsureMatchingOnDiskField(desc.GetFieldDescriptor(GetOnDiskId()), kDiffTypeName);
600+
EnsureMatchingOnDiskField(desc.GetFieldDescriptor(GetOnDiskId()), kDiffTypeName).ThrowOnError();
601601
}
602602

603603
void ROOT::RVectorField::RVectorDeleter::operator()(void *objPtr, bool dtorOnly)
@@ -701,7 +701,7 @@ void ROOT::RField<std::vector<bool>>::GenerateColumns(const ROOT::RNTupleDescrip
701701

702702
void ROOT::RField<std::vector<bool>>::ReconcileOnDiskField(const RNTupleDescriptor &desc)
703703
{
704-
EnsureMatchingOnDiskField(desc.GetFieldDescriptor(GetOnDiskId()), kDiffTypeName);
704+
EnsureMatchingOnDiskField(desc.GetFieldDescriptor(GetOnDiskId()), kDiffTypeName).ThrowOnError();
705705
}
706706

707707
std::vector<ROOT::RFieldBase::RValue> ROOT::RField<std::vector<bool>>::SplitValue(const RValue &value) const
@@ -846,7 +846,8 @@ void ROOT::RArrayAsRVecField::ReadInClusterImpl(RNTupleLocalIndex localIndex, vo
846846
void ROOT::RArrayAsRVecField::ReconcileOnDiskField(const RNTupleDescriptor &desc)
847847
{
848848
const auto &fieldDesc = desc.GetFieldDescriptor(GetOnDiskId());
849-
EnsureMatchingOnDiskField(fieldDesc, kDiffTypeName | kDiffTypeVersion | kDiffStructure | kDiffNRepetitions);
849+
EnsureMatchingOnDiskField(fieldDesc, kDiffTypeName | kDiffTypeVersion | kDiffStructure | kDiffNRepetitions)
850+
.ThrowOnError();
850851
if (fieldDesc.GetTypeName().rfind("std::array<", 0) != 0) {
851852
throw RException(R__FAIL("RArrayAsRVecField " + GetQualifiedFieldName() + " expects an on-disk array field"));
852853
}

0 commit comments

Comments
 (0)