diff --git a/src/rntuple.cpp b/src/rntuple.cpp index 720370e..2f13904 100644 --- a/src/rntuple.cpp +++ b/src/rntuple.cpp @@ -99,11 +99,18 @@ void gather_ntuple_metadata(Arena *arena, RMicroFileReader &reader, const RNTupl Cluster_Info *clusters = arena_push_array(arena, descriptor.GetNActiveClusters()); + // @ForeignAlloc: currently using directly the RColumnElementBase API which forces foreign allocations. + // If we don't want to have this we could create our own function to retrieve a column type name. + std::string elem_type_name; + // gather clusters and pages metadata for (const RClusterDescriptor &cluster_desc : descriptor.GetClusterIterable()) { ++n_clusters; for (const RClusterDescriptor::RColumnRange &col_range : cluster_desc.GetColumnRangeIterable()) { + const auto &col_descriptor = descriptor.GetColumnDescriptor(col_range.fPhysicalColumnId); + elem_type_name = RColumnElementBase::GetTypeName(col_descriptor.GetType()); // @ForeignAlloc + // insert page infos sorted by byte range const auto &page_range = cluster_desc.GetPageRange(col_range.fPhysicalColumnId); for (const auto &page_info : page_range.fPageInfos) { @@ -116,6 +123,7 @@ void gather_ntuple_metadata(Arena *arena, RMicroFileReader &reader, const RNTupl // If in the future we get RNTuples with more than 4B clusters we can just change the type to u64. assert(cluster_desc.GetId() <= UINT_MAX); pinfo->cluster_id = cluster_desc.GetId(); + pinfo->elem_type_name = push_str8f(arena, "%s", elem_type_name.c_str()); Cluster_Info &cluster = clusters[pinfo->cluster_id]; if (!cluster.first_page || pinfo->range.start < cluster.first_page->range.start) { @@ -474,6 +482,7 @@ Section find_section(App_State &app, u64 off, i64 hilite_cluster = -1) sec.pre_size = pre_size; sec.post_size = app.last_pinfo->checksum_size(); sec.highlighted = hilite_cluster >= 0 && app.last_pinfo->cluster_id == (u64)hilite_cluster; + sec.info = app.last_pinfo; return sec; } @@ -488,6 +497,7 @@ Section find_section(App_State &app, u64 off, i64 hilite_cluster = -1) sec.pre_size = pre_size; sec.post_size = app.last_pinfo->checksum_size(); sec.highlighted = hilite_cluster >= 0 && app.last_pinfo->cluster_id == (u64)hilite_cluster; + sec.info = app.last_pinfo; return sec; } } @@ -561,6 +571,7 @@ Section find_section(App_State &app, u64 off, i64 hilite_cluster = -1) sec.pre_size = pre_size; sec.post_size = pinfo->checksum_size(); sec.highlighted = hilite_cluster >= 0 && pinfo->cluster_id == (u64)hilite_cluster; + sec.info = pinfo; return sec; } } @@ -788,7 +799,14 @@ Sec_Hover_Info get_section_hover_info(Arena *arena, Section section, u64 off, co // printf("off: 0x%lX, sec start - pre_size: (0x%lX - %lu) = 0x%lX\n", off, section.range.start, section.pre_size, section.range.start - section.pre_size); assert(off >= section.range.start - section.pre_size); - info.desc = push_str8_node(arena, nullptr, section_names[section.id].c()); + // Hover info header + String8 sec_name = section_names[section.id]; + if (section.id == Sec_Page && section.info) { + Page_Info_Node *pinfo = (Page_Info_Node *)section.info; + info.desc = push_str8_node(arena, nullptr, "%s [%s, n.elems: %d]", sec_name.c(), pinfo->elem_type_name.c(), abs(pinfo->n_elems)); + } else { + info.desc = push_str8_node(arena, nullptr, "%s", sec_name.c()); + } u64 start = section.range.start - section.pre_size; u64 roff = off - start; // offset relative to `section` diff --git a/src/rntuple.h b/src/rntuple.h index b231c08..5cf18b8 100644 --- a/src/rntuple.h +++ b/src/rntuple.h @@ -18,6 +18,8 @@ struct Page_Info_Node { u32 cluster_id; b8 is_first_in_cluster; + String8 elem_type_name; + inline u64 checksum_size() const { return (n_elems < 0) * 8; } @@ -120,6 +122,10 @@ struct Section { u64 pre_size; // usually the TKey header, excluded from `range` u64 post_size; // usually the checksum, included in `range` b8 highlighted; + + // Optional pointer to the specific information for the section. + // e.g. if the section is a Page this points to the relative Page_Info_Node + const void *info; }; internal const String8 section_names[Sec_COUNT] = { diff --git a/src/root/root_inc.h b/src/root/root_inc.h index 2045d0b..fcf9884 100644 --- a/src/root/root_inc.h +++ b/src/root/root_inc.h @@ -1,3 +1,4 @@ #include #include #include +#include