16 #ifndef ROOT7_RNTupleDescriptor
17 #define ROOT7_RNTupleDescriptor
28 #include <unordered_map>
31 namespace Experimental {
33 class RNTupleDescriptorBuilder;
43 class RFieldDescriptor {
44 friend class RNTupleDescriptorBuilder;
47 DescriptorId_t fFieldId = kInvalidDescriptorId;
49 RNTupleVersion fFieldVersion;
51 RNTupleVersion fTypeVersion;
53 std::string fFieldName;
55 std::string fFieldDescription;
57 std::string fTypeName;
59 std::uint64_t fNRepetitions;
61 ENTupleStructure fStructure;
63 DescriptorId_t fParentId = kInvalidDescriptorId;
66 std::vector<DescriptorId_t> fLinkIds;
70 static constexpr std::uint16_t kFrameVersionCurrent = 0;
71 static constexpr std::uint16_t kFrameVersionMin = 0;
73 RFieldDescriptor() =
default;
74 RFieldDescriptor(
const RFieldDescriptor &other) =
delete;
75 RFieldDescriptor &operator =(
const RFieldDescriptor &other) =
delete;
76 RFieldDescriptor(RFieldDescriptor &&other) =
default;
77 RFieldDescriptor &operator =(RFieldDescriptor &&other) =
default;
79 bool operator==(
const RFieldDescriptor &other)
const;
81 DescriptorId_t GetId()
const {
return fFieldId; }
82 RNTupleVersion GetFieldVersion()
const {
return fFieldVersion; }
83 RNTupleVersion GetTypeVersion()
const {
return fTypeVersion; }
84 std::string GetFieldName()
const {
return fFieldName; }
85 std::string GetFieldDescription()
const {
return fFieldDescription; }
86 std::string GetTypeName()
const {
return fTypeName; }
87 std::uint64_t GetNRepetitions()
const {
return fNRepetitions; }
88 ENTupleStructure GetStructure()
const {
return fStructure; }
89 DescriptorId_t GetParentId()
const {
return fParentId; }
90 const std::vector<DescriptorId_t> &GetLinkIds()
const {
return fLinkIds; }
101 class RColumnDescriptor {
102 friend class RNTupleDescriptorBuilder;
105 DescriptorId_t fColumnId = kInvalidDescriptorId;
107 RNTupleVersion fVersion;
111 DescriptorId_t fFieldId = kInvalidDescriptorId;
113 std::uint32_t fIndex;
117 static constexpr std::uint16_t kFrameVersionCurrent = 0;
118 static constexpr std::uint16_t kFrameVersionMin = 0;
120 RColumnDescriptor() =
default;
121 RColumnDescriptor(
const RColumnDescriptor &other) =
delete;
122 RColumnDescriptor &operator =(
const RColumnDescriptor &other) =
delete;
123 RColumnDescriptor(RColumnDescriptor &&other) =
default;
124 RColumnDescriptor &operator =(RColumnDescriptor &&other) =
default;
126 bool operator==(
const RColumnDescriptor &other)
const;
128 DescriptorId_t GetId()
const {
return fColumnId; }
129 RNTupleVersion GetVersion()
const {
return fVersion; }
130 RColumnModel GetModel()
const {
return fModel; }
131 std::uint32_t GetIndex()
const {
return fIndex; }
132 DescriptorId_t GetFieldId()
const {
return fFieldId; }
146 class RClusterDescriptor {
147 friend class RNTupleDescriptorBuilder;
154 std::int64_t fPosition = 0;
155 std::uint32_t fBytesOnStorage = 0;
158 bool operator==(
const RLocator &other)
const {
159 return fPosition == other.fPosition && fBytesOnStorage == other.fBytesOnStorage && fUrl == other.fUrl;
164 struct RColumnRange {
165 DescriptorId_t fColumnId = kInvalidDescriptorId;
167 NTupleSize_t fFirstElementIndex = kInvalidNTupleIndex;
169 ClusterSize_t fNElements = kInvalidClusterIndex;
172 std::int64_t fCompressionSettings = 0;
177 bool operator==(
const RColumnRange &other)
const {
178 return fColumnId == other.fColumnId && fFirstElementIndex == other.fFirstElementIndex &&
179 fNElements == other.fNElements && fCompressionSettings == other.fCompressionSettings;
182 bool Contains(NTupleSize_t index)
const {
183 return (fFirstElementIndex <= index && (fFirstElementIndex + fNElements) > index);
193 ClusterSize_t fNElements = kInvalidClusterIndex;
197 bool operator==(
const RPageInfo &other)
const {
198 return fNElements == other.fNElements && fLocator == other.fLocator;
202 RPageRange() =
default;
203 RPageRange(
const RPageRange &other) =
delete;
204 RPageRange &operator =(
const RPageRange &other) =
delete;
205 RPageRange(RPageRange &&other) =
default;
206 RPageRange &operator =(RPageRange &&other) =
default;
208 DescriptorId_t fColumnId = kInvalidDescriptorId;
209 std::vector<RPageInfo> fPageInfos;
211 bool operator==(
const RPageRange &other)
const {
212 return fColumnId == other.fColumnId && fPageInfos == other.fPageInfos;
217 DescriptorId_t fClusterId = kInvalidDescriptorId;
219 RNTupleVersion fVersion;
221 NTupleSize_t fFirstEntryIndex = kInvalidNTupleIndex;
222 ClusterSize_t fNEntries = kInvalidClusterIndex;
226 std::unordered_map<DescriptorId_t, RColumnRange> fColumnRanges;
227 std::unordered_map<DescriptorId_t, RPageRange> fPageRanges;
231 static constexpr std::uint16_t kFrameVersionCurrent = 0;
232 static constexpr std::uint16_t kFrameVersionMin = 0;
234 RClusterDescriptor() =
default;
235 RClusterDescriptor(
const RClusterDescriptor &other) =
delete;
236 RClusterDescriptor &operator =(
const RClusterDescriptor &other) =
delete;
237 RClusterDescriptor(RClusterDescriptor &&other) =
default;
238 RClusterDescriptor &operator =(RClusterDescriptor &&other) =
default;
240 bool operator==(
const RClusterDescriptor &other)
const;
242 DescriptorId_t GetId()
const {
return fClusterId; }
243 RNTupleVersion GetVersion()
const {
return fVersion; }
244 NTupleSize_t GetFirstEntryIndex()
const {
return fFirstEntryIndex; }
245 ClusterSize_t GetNEntries()
const {
return fNEntries; }
246 RLocator GetLocator()
const {
return fLocator; }
247 const RColumnRange &GetColumnRange(DescriptorId_t columnId)
const {
return fColumnRanges.at(columnId); }
248 const RPageRange &GetPageRange(DescriptorId_t columnId)
const {
return fPageRanges.at(columnId); }
272 class RNTupleDescriptor {
273 friend class RNTupleDescriptorBuilder;
279 std::string fDescription;
283 std::string fCustodian;
285 std::chrono::system_clock::time_point fTimeStampData;
287 std::chrono::system_clock::time_point fTimeStampWritten;
289 RNTupleVersion fVersion;
291 RNTupleUuid fOwnUuid;
294 RNTupleUuid fGroupUuid;
296 std::unordered_map<DescriptorId_t, RFieldDescriptor> fFieldDescriptors;
297 std::unordered_map<DescriptorId_t, RColumnDescriptor> fColumnDescriptors;
300 std::unordered_map<DescriptorId_t, RClusterDescriptor> fClusterDescriptors;
304 static constexpr std::uint16_t kFrameVersionCurrent = 0;
305 static constexpr std::uint16_t kFrameVersionMin = 0;
307 static constexpr
unsigned int kNBytesPreamble = 8;
309 static constexpr
unsigned int kNBytesPostscript = 16;
311 RNTupleDescriptor() =
default;
312 RNTupleDescriptor(
const RNTupleDescriptor &other) =
delete;
313 RNTupleDescriptor &operator=(
const RNTupleDescriptor &other) =
delete;
314 RNTupleDescriptor(RNTupleDescriptor &&other) =
default;
315 RNTupleDescriptor &operator=(RNTupleDescriptor &&other) =
default;
317 bool operator ==(
const RNTupleDescriptor &other)
const;
322 std::uint32_t SerializeHeader(
void* buffer)
const;
324 std::uint32_t SerializeFooter(
void* buffer)
const;
326 static void LocateMetadata(
const void *postscript, std::uint32_t &szHeader, std::uint32_t &szFooter);
328 const RFieldDescriptor& GetFieldDescriptor(DescriptorId_t fieldId)
const {
return fFieldDescriptors.at(fieldId); }
329 const RColumnDescriptor& GetColumnDescriptor(DescriptorId_t columnId)
const {
330 return fColumnDescriptors.at(columnId);
332 const RClusterDescriptor& GetClusterDescriptor(DescriptorId_t clusterId)
const {
333 return fClusterDescriptors.at(clusterId);
335 std::string GetName()
const {
return fName; }
336 std::string GetDescription()
const {
return fDescription; }
337 std::string GetAuthor()
const {
return fAuthor; }
338 std::string GetCustodian()
const {
return fCustodian; }
339 std::chrono::system_clock::time_point GetTimeStampData()
const {
return fTimeStampData; }
340 std::chrono::system_clock::time_point GetTimeStampWritten()
const {
return fTimeStampWritten; }
341 RNTupleVersion GetVersion()
const {
return fVersion; }
342 RNTupleUuid GetOwnUuid()
const {
return fOwnUuid; }
343 RNTupleUuid GetGroupUuid()
const {
return fGroupUuid; }
345 std::size_t GetNFields()
const {
return fFieldDescriptors.size(); }
346 std::size_t GetNColumns()
const {
return fColumnDescriptors.size(); }
347 std::size_t GetNClusters()
const {
return fClusterDescriptors.size(); }
350 NTupleSize_t GetNEntries()
const;
351 NTupleSize_t GetNElements(DescriptorId_t columnId)
const;
353 DescriptorId_t FindFieldId(std::string_view fieldName, DescriptorId_t parentId)
const;
355 DescriptorId_t FindFieldId(std::string_view fieldName)
const;
356 DescriptorId_t FindColumnId(DescriptorId_t fieldId, std::uint32_t columnIndex)
const;
357 DescriptorId_t FindClusterId(DescriptorId_t columnId, NTupleSize_t index)
const;
360 std::unique_ptr<RNTupleModel> GenerateModel()
const;
361 void PrintInfo(std::ostream &output)
const;
374 class RNTupleDescriptorBuilder {
376 RNTupleDescriptor fDescriptor;
379 bool IsValid()
const {
return true; }
380 const RNTupleDescriptor& GetDescriptor()
const {
return fDescriptor; }
381 RNTupleDescriptor MoveDescriptor();
383 void SetNTuple(
const std::string_view name,
const std::string_view description,
const std::string_view author,
384 const RNTupleVersion &version,
const RNTupleUuid &uuid);
386 void AddField(DescriptorId_t fieldId,
const RNTupleVersion &fieldVersion,
const RNTupleVersion &typeVersion,
387 std::string_view fieldName, std::string_view typeName, std::uint64_t nRepetitions,
388 ENTupleStructure structure);
389 void AddFieldLink(DescriptorId_t fieldId, DescriptorId_t linkId);
391 void AddColumn(DescriptorId_t columnId, DescriptorId_t fieldId,
392 const RNTupleVersion &version,
const RColumnModel &model, std::uint32_t index);
394 void SetFromHeader(
void* headerBuffer);
396 void AddCluster(DescriptorId_t clusterId, RNTupleVersion version,
397 NTupleSize_t firstEntryIndex, ClusterSize_t nEntries);
398 void SetClusterLocator(DescriptorId_t clusterId, RClusterDescriptor::RLocator locator);
399 void AddClusterColumnRange(DescriptorId_t clusterId,
const RClusterDescriptor::RColumnRange &columnRange);
400 void AddClusterPageRange(DescriptorId_t clusterId, RClusterDescriptor::RPageRange &&pageRange);
402 void AddClustersFromFooter(
void* footerBuffer);