16 #ifndef ROOT7_RPageStorage
17 #define ROOT7_RPageStorage
31 namespace Experimental {
43 enum class EPageStorageType {
60 std::string fNTupleName;
63 explicit RPageStorage(std::string_view name);
64 RPageStorage(
const RPageStorage &other) =
delete;
65 RPageStorage& operator =(
const RPageStorage &other) =
delete;
66 virtual ~RPageStorage();
68 struct RColumnHandle {
69 RColumnHandle() : fId(-1), fColumn(nullptr) {}
70 RColumnHandle(
int id,
const RColumn *column) : fId(id), fColumn(column) {}
72 const RColumn *fColumn;
75 using ColumnHandle_t = RColumnHandle;
79 virtual ColumnHandle_t AddColumn(DescriptorId_t fieldId,
const RColumn &column) = 0;
81 virtual EPageStorageType GetType() = 0;
85 virtual void ReleasePage(RPage &page) = 0;
88 virtual RNTupleMetrics &GetMetrics() = 0;
102 class RPageSink :
public RPageStorage {
104 const RNTupleWriteOptions fOptions;
108 DescriptorId_t fLastFieldId = 0;
109 DescriptorId_t fLastColumnId = 0;
110 DescriptorId_t fLastClusterId = 0;
111 NTupleSize_t fPrevClusterNEntries = 0;
113 std::vector<RClusterDescriptor::RColumnRange> fOpenColumnRanges;
115 std::vector<RClusterDescriptor::RPageRange> fOpenPageRanges;
116 RNTupleDescriptorBuilder fDescriptorBuilder;
118 virtual void DoCreate(
const RNTupleModel &model) = 0;
119 virtual RClusterDescriptor::RLocator DoCommitPage(ColumnHandle_t columnHandle,
const RPage &page) = 0;
120 virtual RClusterDescriptor::RLocator DoCommitCluster(NTupleSize_t nEntries) = 0;
121 virtual void DoCommitDataset() = 0;
124 RPageSink(std::string_view ntupleName,
const RNTupleWriteOptions &options);
125 virtual ~RPageSink();
127 static std::unique_ptr<RPageSink> Create(std::string_view ntupleName, std::string_view location,
128 const RNTupleWriteOptions &options = RNTupleWriteOptions());
129 EPageStorageType GetType() final {
return EPageStorageType::kSink; }
131 ColumnHandle_t AddColumn(DescriptorId_t fieldId,
const RColumn &column)
final;
136 void Create(RNTupleModel &model);
138 void CommitPage(ColumnHandle_t columnHandle,
const RPage &page);
140 void CommitCluster(NTupleSize_t nEntries);
142 void CommitDataset() { DoCommitDataset(); }
146 virtual RPage ReservePage(ColumnHandle_t columnHandle, std::size_t nElements = 0) = 0;
159 class RPageSource :
public RPageStorage {
161 const RNTupleReadOptions fOptions;
162 RNTupleDescriptor fDescriptor;
164 virtual RNTupleDescriptor DoAttach() = 0;
167 RPageSource(std::string_view ntupleName,
const RNTupleReadOptions &fOptions);
168 virtual ~RPageSource();
170 static std::unique_ptr<RPageSource> Create(std::string_view ntupleName, std::string_view location,
171 const RNTupleReadOptions &options = RNTupleReadOptions());
173 virtual std::unique_ptr<RPageSource> Clone()
const = 0;
175 EPageStorageType GetType() final {
return EPageStorageType::kSource; }
176 const RNTupleDescriptor &GetDescriptor()
const {
return fDescriptor; }
177 ColumnHandle_t AddColumn(DescriptorId_t fieldId,
const RColumn &column)
final;
180 void Attach() { fDescriptor = DoAttach(); }
181 NTupleSize_t GetNEntries();
182 NTupleSize_t GetNElements(ColumnHandle_t columnHandle);
183 ColumnId_t GetColumnId(ColumnHandle_t columnHandle);
186 virtual RPage PopulatePage(ColumnHandle_t columnHandle, NTupleSize_t globalIndex) = 0;
188 virtual RPage PopulatePage(ColumnHandle_t columnHandle,
const RClusterIndex &clusterIndex) = 0;