62std::unique_ptr<ROOT::Experimental::RFieldBase>
69 std::vector<std::unique_ptr<RFieldBase>> memberFields;
72 memberFields.emplace_back(memberDesc.CreateField(ntplDesc));
75 auto recordField = std::make_unique<RRecordField>(
GetFieldName(), memberFields);
79 auto recordField = std::make_unique<RRecordField>(
"_0", memberFields);
80 auto collectionField = std::make_unique<RVectorField>(
GetFieldName(), std::move(recordField));
81 collectionField->SetOnDiskId(
fFieldId);
82 return collectionField;
90 for (
auto &
f : *field)
91 f.SetOnDiskId(ntplDesc.
FindFieldId(
f.GetFieldName(),
f.GetParent()->GetOnDiskId()));
127 decltype(idxInCluster) firstInPage = 0;
130 if (firstInPage + pi.fNElements > idxInCluster) {
134 firstInPage += pi.fNElements;
145 std::size_t pageSize)
150 [](std::size_t
n,
const auto &
PI) { return n + PI.fNElements; });
151 const auto nElementsRequired =
static_cast<std::uint64_t
>(columnRange.
fNElements);
153 if (nElementsRequired == nElements)
155 R__ASSERT((nElementsRequired > nElements) &&
"invalid attempt to shrink RPageRange");
157 std::vector<RPageInfo> pageInfos;
159 const std::uint64_t nElementsPerPage = pageSize / element.
GetSize();
161 for (
auto nRemainingElements = nElementsRequired - nElements; nRemainingElements > 0;) {
163 PI.fNElements = std::min(nElementsPerPage, nRemainingElements);
166 pageInfos.emplace_back(
PI);
167 nRemainingElements -=
PI.fNElements;
170 pageInfos.insert(pageInfos.end(), std::make_move_iterator(
fPageInfos.begin()),
173 return nElementsRequired - nElements;
185 std::unordered_set<DescriptorId_t>
result;
193 std::uint64_t nbytes = 0;
195 for (
const auto &pi : pr.second.fPageInfos) {
196 nbytes += pi.fLocator.fBytesOnStorage;
210 clone.fPageRanges.emplace(
d.first,
d.second.Clone());
236 if (!cd.second.ContainsColumn(physicalColumnId))
238 auto columnRange = cd.second.GetColumnRange(physicalColumnId);
239 result = std::max(
result, columnRange.fFirstElementIndex + columnRange.fNElements);
248 std::string leafName(fieldName);
249 auto posDot = leafName.find_last_of(
'.');
250 if (posDot != std::string::npos) {
251 auto parentName = leafName.substr(0, posDot);
252 leafName = leafName.substr(posDot + 1);
256 if (fd.second.GetParentId() == parentId && fd.second.GetFieldName() == leafName)
257 return fd.second.GetId();
271 return fieldDescriptor.GetFieldName();
272 return prefix +
"." + fieldDescriptor.GetFieldName();
293 if (cd.second.GetFieldId() == fieldId && cd.second.GetIndex() == columnIndex)
294 return cd.second.GetLogicalId();
313 if (!cd.second.ContainsColumn(physicalColumnId))
315 auto columnRange = cd.second.GetColumnRange(physicalColumnId);
316 if (columnRange.Contains(
index))
317 return cd.second.GetId();
328 auto firstEntryInNextCluster = clusterDesc.GetFirstEntryIndex() + clusterDesc.GetNEntries();
331 if (cd.second.GetFirstEntryIndex() == firstEntryInNextCluster)
332 return cd.second.GetId();
345 if (cd.second.GetFirstEntryIndex() + cd.second.GetNEntries() == clusterDesc.GetFirstEntryIndex())
346 return cd.second.GetId();
351std::vector<ROOT::Experimental::DescriptorId_t>
356 std::vector<DescriptorId_t> fields;
359 fields.emplace_back(fieldId);
365 for (
unsigned int i = 0;
true; ++
i) {
366 auto logicalId =
fNTuple.FindLogicalColumnId(fieldId,
i);
386 while (!fieldIdQueue.empty()) {
387 auto currFieldId = fieldIdQueue.front();
388 fieldIdQueue.pop_front();
390 CollectColumnIds(currFieldId);
392 for (const auto &field : ntuple.GetFieldIterable(currFieldId)) {
393 auto fieldId = field.GetId();
394 fieldIdQueue.push_back(fieldId);
401 std::vector<std::uint64_t>
result;
402 unsigned int base = 0;
403 std::uint64_t flags = 0;
405 if ((
f > 0) && ((
f % 64) == 0))
407 while (
f > base + 64) {
408 result.emplace_back(flags);
415 result.emplace_back(flags);
421 std::vector<RClusterDescriptor> &clusterDescs)
425 return R__FAIL(
"invalid attempt to add details of unknown cluster group");
426 if (iter->second.HasClusterDetails())
427 return R__FAIL(
"invalid attempt to re-populate cluster group details");
428 if (iter->second.GetNClusters() != clusterDescs.size())
429 return R__FAIL(
"mismatch of number of clusters");
431 std::vector<DescriptorId_t> clusterIds;
432 for (
unsigned i = 0;
i < clusterDescs.size(); ++
i) {
433 clusterIds.emplace_back(clusterDescs[
i].GetId());
436 return R__FAIL(
"invalid attempt to re-populate existing cluster");
440 cgBuilder.AddClusters(clusterIds);
441 iter->second = cgBuilder.MoveDescriptor().Unwrap();
450 return R__FAIL(
"invalid attempt to drop cluster details of unknown cluster group");
451 if (!iter->second.HasClusterDetails())
452 return R__FAIL(
"invalid attempt to drop details of cluster group summary");
454 for (
auto clusterId : iter->second.GetClusterIds())
456 iter->second = iter->second.CloneSummary();
462 auto fieldZero = std::make_unique<RFieldZero>();
466 model->AddField(topDesc.CreateField(*
this));
473 auto clone = std::make_unique<RNTupleDescriptor>();
484 clone->fFieldDescriptors.emplace(
d.first,
d.second.Clone());
486 clone->fColumnDescriptors.emplace(
d.first,
d.second.Clone());
488 clone->fClusterGroupDescriptors.emplace(
d.first,
d.second.Clone());
490 clone->fClusterDescriptors.emplace(
d.first,
d.second.Clone());
533 DescriptorId_t physicalId, std::uint64_t firstElementIndex, std::uint32_t compressionSettings,
537 return R__FAIL(
"column ID mismatch");
538 if (
fCluster.fPageRanges.count(physicalId) > 0)
539 return R__FAIL(
"column ID conflict");
543 columnRange.fNElements += pi.fNElements;
546 fCluster.fColumnRanges[physicalId] = columnRange;
556 auto fnTraverseSubtree = [&](
DescriptorId_t rootFieldId, std::uint64_t nRepetitionsAtThisLevel,
557 const auto &visitField,
const auto &enterSubtree) ->
void {
558 visitField(rootFieldId, nRepetitionsAtThisLevel);
560 const std::uint64_t nRepetitions = std::max(
f.GetNRepetitions(), std::uint64_t{1U}) * nRepetitionsAtThisLevel;
561 enterSubtree(
f.GetId(), nRepetitions, visitField, enterSubtree);
571 for (
const auto &topLevelFieldId : xHeader->GetTopLevelFields(desc)) {
575 for (const auto &c : desc.GetColumnIterable(fieldId)) {
576 const DescriptorId_t physicalId = c.GetPhysicalId();
577 auto &columnRange = fCluster.fColumnRanges[physicalId];
578 auto &pageRange = fCluster.fPageRanges[physicalId];
582 if (columnRange.fPhysicalColumnId == kInvalidDescriptorId) {
583 columnRange.fPhysicalColumnId = physicalId;
584 columnRange.fFirstElementIndex = 0;
585 columnRange.fNElements = 0;
587 pageRange.fPhysicalColumnId = physicalId;
595 if (c.IsDeferredColumn()) {
596 columnRange.fFirstElementIndex = fCluster.GetFirstEntryIndex() * nRepetitions;
597 columnRange.fNElements = fCluster.GetNEntries() * nRepetitions;
598 const auto element = Internal::RColumnElementBase::Generate<void>(c.GetModel().GetType());
599 pageRange.ExtendToFitColumnRange(columnRange, *element, Internal::RPage::kPageZeroSize);
612 return R__FAIL(
"unset cluster ID");
614 return R__FAIL(
"empty cluster");
615 for (
const auto &pr :
fCluster.fPageRanges) {
616 if (
fCluster.fColumnRanges.count(pr.first) == 0) {
617 return R__FAIL(
"missing column range");
645 return R__FAIL(
"unset cluster group ID");
657 return R__FAIL(
"unset column group ID");
668 if (
fDescriptor.fFieldDescriptors.count(fieldId) == 0)
669 return R__FAIL(
"field with id '" + std::to_string(fieldId) +
"' doesn't exist");
681 for (
const auto& key_val:
fDescriptor.fFieldDescriptors) {
682 const auto&
id = key_val.first;
683 const auto& desc = key_val.second;
686 return R__FAIL(
"field with id '" + std::to_string(
id) +
"' has an invalid parent id");
700 const std::string_view description)
703 fDescriptor.fDescription = std::string(description);
717 return R__FAIL(
"invalid logical column id");
719 return R__FAIL(
"invalid physical column id");
721 return R__FAIL(
"invalid column model");
723 return R__FAIL(
"invalid field id, dangling column");
753 return R__FAIL(
"invalid field id");
756 return R__FAIL(
"invalid field structure");
782 return R__FAIL(
"child field with id '" + std::to_string(linkId) +
"' doesn't exist in NTuple");
785 return R__FAIL(
"cannot make FieldZero a child field");
788 auto parentId =
fDescriptor.fFieldDescriptors.at(linkId).GetParentId();
790 return R__FAIL(
"field '" + std::to_string(linkId) +
"' already has a parent ('" +
791 std::to_string(parentId) +
")");
793 if (fieldId == linkId) {
794 return R__FAIL(
"cannot make field '" + std::to_string(fieldId) +
"' a child of itself");
796 fDescriptor.fFieldDescriptors.at(linkId).fParentId = fieldId;
797 fDescriptor.fFieldDescriptors.at(fieldId).fLinkIds.push_back(linkId);
805 std::uint64_t firstElementIdx)
808 c.fLogicalColumnId = logicalId;
809 c.fPhysicalColumnId = physicalId;
810 c.fFieldId = fieldId;
813 c.fFirstElementIndex = firstElementIdx;
814 if (!
c.IsAliasColumn())
817 fDescriptor.fHeaderExtension->AddColumn(
c.IsAliasColumn());
818 fDescriptor.fColumnDescriptors.emplace(logicalId, std::move(
c));
824 const auto fieldId = columnDesc.GetFieldId();
825 const auto index = columnDesc.GetIndex();
831 return R__FAIL(
"column index clash");
835 return R__FAIL(
"out of bounds column index");
837 if (columnDesc.IsAliasColumn()) {
838 if (columnDesc.GetModel() !=
fDescriptor.GetColumnDescriptor(columnDesc.GetPhysicalId()).GetModel())
839 return R__FAIL(
"alias column type mismatch");
842 auto logicalId = columnDesc.GetLogicalId();
843 if (!columnDesc.IsAliasColumn())
845 fDescriptor.fColumnDescriptors.emplace(logicalId, std::move(columnDesc));
847 fDescriptor.fHeaderExtension->AddColumn(columnDesc.IsAliasColumn());
855 const auto id = clusterGroup.GetId();
856 if (
fDescriptor.fClusterGroupDescriptors.count(
id) > 0)
857 return R__FAIL(
"cluster group id clash");
858 fDescriptor.fNEntries = std::max(
fDescriptor.fNEntries, clusterGroup.GetMinEntry() + clusterGroup.GetEntrySpan());
859 fDescriptor.fNClusters += clusterGroup.GetNClusters();
860 fDescriptor.fClusterGroupDescriptors.emplace(
id, std::move(clusterGroup));
878 fDescriptor.fHeaderExtension = std::make_unique<RNTupleDescriptor::RHeaderExtension>();
884 auto clusterId = clusterDesc.GetId();
885 if (
fDescriptor.fClusterDescriptors.count(clusterId) > 0)
886 return R__FAIL(
"cluster id clash");
887 fDescriptor.fClusterDescriptors.emplace(clusterId, std::move(clusterDesc));
#define R__FORWARD_ERROR(res)
Short-hand to return an RResult<T> in an error state (i.e. after checking)
#define R__FAIL(msg)
Short-hand to return an RResult<T> in an error state; the RError is implicitly converted into RResult...
TObject * clone(const char *newname) const override
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void char Point_t Rectangle_t WindowAttributes_t Float_t Float_t Float_t Int_t Int_t UInt_t UInt_t Rectangle_t result
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void char Point_t Rectangle_t WindowAttributes_t index
A helper class for piece-wise construction of an RClusterDescriptor.
RClusterDescriptorBuilder & AddDeferredColumnRanges(const RNTupleDescriptor &desc)
Add column and page ranges for deferred columns missing in this cluster.
RResult< RClusterDescriptor > MoveDescriptor()
Move out the full cluster descriptor including page locations.
RClusterDescriptor fCluster
RResult< void > CommitColumnRange(DescriptorId_t physicalId, std::uint64_t firstElementIndex, std::uint32_t compressionSettings, const RClusterDescriptor::RPageRange &pageRange)
A helper class for piece-wise construction of an RClusterGroupDescriptor.
RClusterGroupDescriptorBuilder & PageListLocator(const RNTupleLocator &pageListLocator)
RClusterGroupDescriptorBuilder & MinEntry(std::uint64_t minEntry)
RClusterGroupDescriptorBuilder & ClusterGroupId(DescriptorId_t clusterGroupId)
RClusterGroupDescriptorBuilder & EntrySpan(std::uint64_t entrySpan)
RClusterGroupDescriptorBuilder & NClusters(std::uint32_t nClusters)
RClusterGroupDescriptorBuilder & PageListLength(std::uint64_t pageListLength)
RResult< RClusterGroupDescriptor > MoveDescriptor()
static RClusterGroupDescriptorBuilder FromSummary(const RClusterGroupDescriptor &clusterGroupDesc)
RClusterGroupDescriptor fClusterGroup
RClusterGroupDescriptorBuilder()=default
RResult< RColumnDescriptor > MakeDescriptor() const
Attempt to make a column descriptor.
RColumnDescriptor fColumn
A column element encapsulates the translation between basic C++ types and their column representation...
std::size_t GetSize() const
std::size_t GetPackedSize(std::size_t nElements=1U) const
RResult< RColumnGroupDescriptor > MoveDescriptor()
RColumnGroupDescriptor fColumnGroup
A helper class for piece-wise construction of an RFieldDescriptor.
RFieldDescriptorBuilder & TypeVersion(std::uint32_t typeVersion)
RFieldDescriptorBuilder & NRepetitions(std::uint64_t nRepetitions)
RFieldDescriptorBuilder & FieldVersion(std::uint32_t fieldVersion)
RFieldDescriptorBuilder & Structure(const ENTupleStructure &structure)
RFieldDescriptorBuilder & TypeName(const std::string &typeName)
static RFieldDescriptorBuilder FromField(const RFieldBase &field)
Make a new RFieldDescriptorBuilder based off a live NTuple field.
RResult< RFieldDescriptor > MakeDescriptor() const
Attempt to make a field descriptor.
RFieldDescriptorBuilder & FieldName(const std::string &fieldName)
RFieldDescriptorBuilder()=default
Make an empty dangling field descriptor.
RFieldDescriptorBuilder & TypeAlias(const std::string &typeAlias)
RFieldDescriptorBuilder & FieldDescription(const std::string &fieldDescription)
void BeginHeaderExtension()
Mark the beginning of the header extension; any fields and columns added after a call to this functio...
RNTupleDescriptor fDescriptor
RResult< void > EnsureFieldExists(DescriptorId_t fieldId) const
RResult< void > AddFieldLink(DescriptorId_t fieldId, DescriptorId_t linkId)
RResult< void > EnsureValidDescriptor() const
Checks whether invariants hold:
RResult< void > AddCluster(RClusterDescriptor &&clusterDesc)
void SetNTuple(const std::string_view name, const std::string_view description)
RResult< void > AddClusterGroup(RClusterGroupDescriptor &&clusterGroup)
void SetFeature(unsigned int flag)
void AddField(const RFieldDescriptor &fieldDesc)
void AddColumn(DescriptorId_t logicalId, DescriptorId_t physicalId, DescriptorId_t fieldId, const RColumnModel &model, std::uint32_t index, std::uint64_t firstElementIdx=0U)
RNTupleDescriptor MoveDescriptor()
void Reset()
Clears so-far stored clusters, fields, and columns and return to a pristine ntuple descriptor.
Meta-data for a set of ntuple clusters.
std::unordered_map< DescriptorId_t, RPageRange > fPageRanges
NTupleSize_t fFirstEntryIndex
Clusters can be swapped by adjusting the entry offsets.
DescriptorId_t fClusterId
std::unordered_set< DescriptorId_t > GetColumnIds() const
RClusterDescriptor Clone() const
std::unordered_map< DescriptorId_t, RColumnRange > fColumnRanges
bool operator==(const RClusterDescriptor &other) const
std::uint64_t GetBytesOnStorage() const
RClusterDescriptor()=default
Clusters are bundled in cluster groups.
std::uint64_t fMinEntry
The minimum first entry number of the clusters in the cluster group.
RClusterGroupDescriptor Clone() const
std::uint64_t fEntrySpan
Number of entries that are (partially for sharded clusters) covered by this cluster group.
std::uint64_t fPageListLength
Uncompressed size of the page list.
std::uint64_t GetMinEntry() const
std::uint64_t GetPageListLength() const
RClusterGroupDescriptor CloneSummary() const
std::uint32_t fNClusters
Number of clusters is always known even if the cluster IDs are not (yet) populated.
std::uint32_t GetNClusters() const
RNTupleLocator fPageListLocator
The page list that corresponds to the cluster group.
RClusterGroupDescriptor()=default
DescriptorId_t fClusterGroupId
bool operator==(const RClusterGroupDescriptor &other) const
RNTupleLocator GetPageListLocator() const
std::vector< DescriptorId_t > fClusterIds
The cluster IDs can be empty if the corresponding page list is not loaded.
std::uint64_t GetEntrySpan() const
DescriptorId_t GetId() const
Meta-data stored for every column of an ntuple.
DescriptorId_t fPhysicalColumnId
Usually identical to the logical column ID, except for alias columns where it references the shadowed...
std::uint64_t fFirstElementIndex
Specifies the index for the first stored element for this column.
DescriptorId_t fLogicalColumnId
The actual column identifier, which is the link to the corresponding field.
RColumnDescriptor Clone() const
Get a copy of the descriptor.
DescriptorId_t fFieldId
Every column belongs to one and only one field.
RColumnDescriptor()=default
RColumnModel fModel
Contains the column type and whether it is sorted.
std::uint32_t fIndex
A field can be serialized into several columns, which are numbered from zero to $n$.
bool operator==(const RColumnDescriptor &other) const
Meta-data for a sets of columns; non-trivial column groups are used for sharded clusters.
std::unordered_set< DescriptorId_t > fPhysicalColumnIds
bool operator==(const RColumnGroupDescriptor &other) const
RColumnGroupDescriptor()=default
DescriptorId_t fColumnGroupId
Holds the static meta-data of an RNTuple column.
Base class for all ROOT issued exceptions.
A field translates read and write calls from/to underlying columns to/from tree values.
std::string GetFieldName() const
ENTupleStructure GetStructure() const
std::string GetTypeName() const
virtual std::uint32_t GetTypeVersion() const
Indicates an evolution of the C++ type itself.
virtual std::uint32_t GetFieldVersion() const
Indicates an evolution of the mapping scheme from C++ type to columns.
static RResult< std::unique_ptr< RFieldBase > > Create(const std::string &fieldName, const std::string &canonicalType, const std::string &typeAlias, bool fContinueOnError=false)
Factory method to resurrect a field from the stored on-disk type information.
std::string GetDescription() const
Get the field's description.
std::size_t GetNRepetitions() const
std::string GetTypeAlias() const
static RResult< void > EnsureValidFieldName(std::string_view fieldName)
Check whether a given string is a valid field name.
Meta-data stored for every field of an ntuple.
std::vector< DescriptorId_t > fLinkIds
The pointers in the other direction from parent to children.
DescriptorId_t GetParentId() const
std::unique_ptr< RFieldBase > CreateField(const RNTupleDescriptor &ntplDesc) const
In general, we create a field simply from the C++ type name.
std::string GetTypeAlias() const
std::uint32_t fTypeVersion
The version of the C++ type itself.
std::string GetFieldName() const
std::string fFieldDescription
Free text set by the user.
std::string fFieldName
The leaf name, not including parent fields.
RFieldDescriptor()=default
std::uint32_t fFieldVersion
The version of the C++-type-to-column translation mechanics.
DescriptorId_t GetId() const
std::string GetTypeName() const
DescriptorId_t fParentId
Establishes sub field relationships, such as classes and collections.
std::uint64_t GetNRepetitions() const
RFieldDescriptor Clone() const
Get a copy of the descriptor.
bool operator==(const RFieldDescriptor &other) const
std::string fTypeAlias
A typedef or using directive that resolved to the type name during field creation.
ENTupleStructure fStructure
The structural information carried by this field in the data model tree.
ENTupleStructure GetStructure() const
std::string fTypeName
The C++ type that was used when writing the field.
std::uint64_t fNRepetitions
The number of elements per entry for fixed-size arrays.
const RNTupleDescriptor & fNTuple
The associated NTuple for this range.
std::vector< DescriptorId_t > fColumns
The descriptor ids of the columns ordered by index id.
RColumnDescriptorIterable(const RNTupleDescriptor &ntuple, const RFieldDescriptor &field)
void CollectColumnIds(DescriptorId_t fieldId)
The on-storage meta-data of an ntuple.
std::uint64_t fNPhysicalColumns
Updated by the descriptor builder when columns are added.
std::unordered_map< DescriptorId_t, RClusterDescriptor > fClusterDescriptors
May contain only a subset of all the available clusters, e.g.
std::uint64_t fGeneration
Once constructed by an RNTupleDescriptorBuilder, the descriptor is mostly immutable except for set of...
std::uint64_t fOnDiskFooterSize
Like fOnDiskHeaderSize, contains both cluster summaries and page locations.
std::uint64_t fNEntries
Updated by the descriptor builder when the cluster groups are added.
DescriptorId_t FindPhysicalColumnId(DescriptorId_t fieldId, std::uint32_t columnIndex) const
std::set< unsigned int > fFeatureFlags
NTupleSize_t GetNElements(DescriptorId_t physicalColumnId) const
DescriptorId_t FindLogicalColumnId(DescriptorId_t fieldId, std::uint32_t columnIndex) const
std::unordered_map< DescriptorId_t, RClusterGroupDescriptor > fClusterGroupDescriptors
DescriptorId_t FindNextClusterId(DescriptorId_t clusterId) const
DescriptorId_t FindPrevClusterId(DescriptorId_t clusterId) const
DescriptorId_t GetFieldZeroId() const
Returns the logical parent of all top-level NTuple data fields.
std::unordered_map< DescriptorId_t, RColumnDescriptor > fColumnDescriptors
std::unique_ptr< RNTupleDescriptor > Clone() const
DescriptorId_t FindClusterId(DescriptorId_t physicalColumnId, NTupleSize_t index) const
std::uint64_t fNClusters
Updated by the descriptor builder when the cluster groups are added.
std::string fName
The ntuple name needs to be unique in a given storage location (file)
RFieldDescriptorIterable GetTopLevelFields() const
const RClusterDescriptor & GetClusterDescriptor(DescriptorId_t clusterId) const
std::unordered_map< DescriptorId_t, RFieldDescriptor > fFieldDescriptors
RFieldDescriptorIterable GetFieldIterable(const RFieldDescriptor &fieldDesc) const
RNTupleDescriptor()=default
std::uint64_t fOnDiskHeaderXxHash3
Set by the descriptor builder when deserialized.
bool operator==(const RNTupleDescriptor &other) const
std::string GetQualifiedFieldName(DescriptorId_t fieldId) const
Walks up the parents of the field ID and returns a field name of the form a.b.c.d In case of invalid ...
RResult< void > AddClusterGroupDetails(DescriptorId_t clusterGroupId, std::vector< RClusterDescriptor > &clusterDescs)
Methods to load and drop cluster group details (cluster IDs and page locations)
DescriptorId_t FindFieldId(std::string_view fieldName, DescriptorId_t parentId) const
const RColumnDescriptor & GetColumnDescriptor(DescriptorId_t columnId) const
const RFieldDescriptor & GetFieldDescriptor(DescriptorId_t fieldId) const
std::unique_ptr< RNTupleModel > CreateModel() const
Re-create the C++ model from the stored meta-data.
RResult< void > DropClusterGroupDetails(DescriptorId_t clusterGroupId)
std::unique_ptr< RHeaderExtension > fHeaderExtension
std::string fDescription
Free text from the user.
const RHeaderExtension * GetHeaderExtension() const
Return header extension information; if the descriptor does not have a header extension,...
std::uint64_t fOnDiskHeaderSize
Set by the descriptor builder when deserialized.
std::vector< std::uint64_t > GetFeatureFlags() const
static std::unique_ptr< RNTupleModel > Create()
The class is used as a return type for operations that can fail; wraps a value of type T or an RError...
RClusterSize ClusterSize_t
std::uint64_t NTupleSize_t
Integer type long enough to hold the maximum number of entries in a column.
std::uint64_t DescriptorId_t
Distriniguishes elements of the same type within a descriptor, e.g. different fields.
constexpr DescriptorId_t kInvalidDescriptorId
The window of element indexes of a particular column in a particular cluster.
int fCompressionSettings
The usual format for ROOT compression settings (see Compression.h).
ClusterSize_t fNElements
The number of column elements in the cluster.
DescriptorId_t fPhysicalColumnId