2024-07-11 12:00:43 +00:00
|
|
|
internal
|
2024-07-12 09:58:55 +00:00
|
|
|
String8 rntuple_description(Arena *arena, const RNTuple_Data &ntuple)
|
2024-07-11 12:00:43 +00:00
|
|
|
{
|
|
|
|
String8 desc = push_str8f(arena, "version %u.%u.%u.%u",
|
2024-07-12 08:25:58 +00:00
|
|
|
ntuple.version.epoch,
|
|
|
|
ntuple.version.major,
|
|
|
|
ntuple.version.minor,
|
|
|
|
ntuple.version.patch);
|
2024-07-11 12:00:43 +00:00
|
|
|
return desc;
|
|
|
|
}
|
|
|
|
|
|
|
|
internal
|
2024-07-12 13:56:04 +00:00
|
|
|
ROOT::Experimental::RNTupleDescriptor create_descriptor(Arena *arena, RMicroFileReader &reader, const RNTuple_File_Info &info)
|
2024-07-11 12:00:43 +00:00
|
|
|
{
|
2024-07-12 09:58:55 +00:00
|
|
|
using namespace ROOT::Experimental;
|
|
|
|
using namespace ROOT::Experimental::Internal;
|
|
|
|
|
|
|
|
Temp scratch = temp_begin(arena);
|
|
|
|
defer { temp_end(scratch); };
|
|
|
|
|
|
|
|
const RNTuple_Anchor &anchor = info.anchor;
|
|
|
|
|
|
|
|
// Read compressed header+footer
|
|
|
|
u8 *header_zip = arena_push_contiguous(scratch.arena, anchor.fNBytesHeader);
|
|
|
|
u8 *footer_zip = arena_push_contiguous(scratch.arena, anchor.fNBytesFooter);
|
|
|
|
reader.ReadBuffer(header_zip, anchor.fNBytesHeader, anchor.fSeekHeader);
|
|
|
|
reader.ReadBuffer(footer_zip, anchor.fNBytesFooter, anchor.fSeekFooter);
|
|
|
|
|
|
|
|
// Decompress header+footer
|
|
|
|
u8 *header = arena_push_contiguous(scratch.arena, anchor.fLenHeader);
|
|
|
|
u8 *footer = arena_push_contiguous(scratch.arena, anchor.fLenFooter);
|
|
|
|
RNTupleDecompressor::Unzip(header_zip, anchor.fNBytesHeader, anchor.fLenHeader, header);
|
|
|
|
RNTupleDecompressor::Unzip(footer_zip, anchor.fNBytesFooter, anchor.fLenFooter, footer);
|
|
|
|
|
|
|
|
// Deserialize header+footer
|
|
|
|
RNTupleDescriptorBuilder desc_builder;
|
|
|
|
RNTupleSerializer::DeserializeHeader(header, anchor.fLenHeader, desc_builder);
|
|
|
|
RNTupleSerializer::DeserializeFooter(footer, anchor.fLenFooter, desc_builder);
|
|
|
|
|
|
|
|
RNTupleDescriptor descriptor = desc_builder.MoveDescriptor();
|
|
|
|
for (const RClusterGroupDescriptor &cgdesc : descriptor.GetClusterGroupIterable()) {
|
|
|
|
u64 arena_start = arena_pos(scratch.arena);
|
|
|
|
|
|
|
|
// Read page list
|
|
|
|
u64 page_list_zip_size = cgdesc.GetPageListLocator().fBytesOnStorage;
|
|
|
|
u64 page_list_seek = cgdesc.GetPageListLocator().GetPosition<u64>();
|
|
|
|
u8 *page_list_zip = arena_push_contiguous(scratch.arena, page_list_zip_size);
|
|
|
|
reader.ReadBuffer(page_list_zip, page_list_zip_size, page_list_seek);
|
|
|
|
|
|
|
|
// Decompress page list
|
|
|
|
u64 page_list_len = cgdesc.GetPageListLength();
|
|
|
|
u8 *page_list = arena_push_contiguous(scratch.arena, page_list_len);
|
|
|
|
RNTupleDecompressor::Unzip(page_list_zip, page_list_zip_size, page_list_len, page_list);
|
|
|
|
|
|
|
|
// Deserialize page list
|
|
|
|
DescriptorId_t cluster_grpid = cgdesc.GetId();
|
|
|
|
RNTupleSerializer::DeserializePageList(page_list, page_list_len, cluster_grpid, descriptor);
|
|
|
|
|
|
|
|
arena_pop_to(scratch.arena, arena_start);
|
|
|
|
}
|
2024-07-12 13:56:04 +00:00
|
|
|
|
|
|
|
return descriptor;
|
|
|
|
}
|
|
|
|
|
|
|
|
internal
|
|
|
|
void gather_metadata(Arena *arena, RMicroFileReader &reader, const RNTuple_File_Info &info)
|
|
|
|
{
|
|
|
|
using namespace ROOT::Experimental;
|
|
|
|
using namespace ROOT::Experimental::Internal;
|
|
|
|
|
|
|
|
RNTupleDescriptor descriptor = create_descriptor(arena, reader, info);
|
|
|
|
|
|
|
|
// for all clusters ...
|
|
|
|
DescriptorId_t cluster_id = descriptor.FindClusterId(0, 0);
|
|
|
|
while (cluster_id != kInvalidDescriptorId) {
|
|
|
|
const RClusterDescriptor &cluster_desc = descriptor.GetClusterDescriptor(cluster_id);
|
|
|
|
for (const auto &[col_id, col_range] : cluster_desc.GetColumnRangeIterable()) {
|
|
|
|
// TODO gather column metadata
|
|
|
|
// TODO gather page metadata
|
|
|
|
const auto &page_range = cluster_desc.GetPageRange(col_id);
|
|
|
|
for (const auto &page_info : page_range.fPageInfos) {
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2024-07-12 09:58:55 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
internal
|
|
|
|
RNTuple_Data get_rntuple_data(Arena *arena, const char *fname, const char *ntpl_name)
|
|
|
|
{
|
|
|
|
RNTuple_Data rndata = {};
|
2024-07-11 12:00:43 +00:00
|
|
|
|
2024-07-11 14:29:44 +00:00
|
|
|
// TODO: proper error handling
|
2024-07-12 09:58:55 +00:00
|
|
|
RMicroFileReader file_reader { fname };
|
|
|
|
RNTuple_File_Info file_info = file_reader.GetNTupleProper(ntpl_name);
|
2024-07-12 07:53:01 +00:00
|
|
|
if (!file_info.failed) {
|
2024-07-12 09:58:55 +00:00
|
|
|
rndata.version.epoch = file_info.anchor.fVersionEpoch;
|
|
|
|
rndata.version.major = file_info.anchor.fVersionMajor;
|
|
|
|
rndata.version.minor = file_info.anchor.fVersionMinor;
|
|
|
|
rndata.version.patch = file_info.anchor.fVersionPatch;
|
|
|
|
rndata.rng_header.start = file_info.anchor.fSeekHeader;
|
|
|
|
rndata.rng_header.len = file_info.anchor.fNBytesHeader;
|
|
|
|
rndata.rng_footer.start = file_info.anchor.fSeekFooter;
|
|
|
|
rndata.rng_footer.len = file_info.anchor.fNBytesFooter;
|
|
|
|
rndata.rng_anchor.start = file_info.anchor_seek;
|
|
|
|
rndata.rng_anchor.len = file_info.anchor_nbytes;
|
|
|
|
rndata.rng_anchor_key.start = file_info.anchor_key_seek;
|
|
|
|
rndata.rng_anchor_key.len = file_info.anchor_key_nbytes;
|
|
|
|
rndata.rblob_header_size = file_info.rblob_key_header_nbytes;
|
|
|
|
rndata.root_file_header_size = file_info.tfile_header_nbytes;
|
|
|
|
|
|
|
|
gather_metadata(arena, file_reader, file_info);
|
2024-07-11 14:29:44 +00:00
|
|
|
}
|
|
|
|
|
2024-07-12 09:58:55 +00:00
|
|
|
return rndata;
|
2024-07-11 12:00:43 +00:00
|
|
|
}
|
2024-07-12 09:58:55 +00:00
|
|
|
|