45      return R__FAIL(
"field mapping structural mismatch: " + 
source->GetFieldName() + 
" --> " + 
target->GetFieldName());
 
   48         return R__FAIL(
"field mapping type mismatch: " + 
source->GetFieldName() + 
" --> " + 
target->GetFieldName());
 
   60         parent = parent->GetParent();
 
   69      return R__FAIL(
"unsupported field mapping (source structure)");
 
   72      return R__FAIL(
"unsupported field mapping (target structure)");
 
   88      return R__FAIL(
"field mapping structure mismatch: " + 
source->GetFieldName() + 
" --> " + 
target->GetFieldName());
 
   92   return R__FAIL(
"field mapping structure mismatch: " + 
source->GetFieldName() + 
" --> " + 
target->GetFieldName());
 
 
  101   for (
const auto &
f : *
field) {
 
 
  115   if (
auto it = fFieldMap.find(
target); it != fFieldMap.end())
 
 
  120std::unique_ptr<ROOT::Experimental::RNTupleModel::RProjectedFields>
 
  128   for (
const auto &[k, 
v] : fFieldMap) {
 
  129      for (
const auto &
f : *
clone->GetFieldZero()) {
 
  130         if (
f.GetQualifiedFieldName() == k->GetQualifiedFieldName()) {
 
  131            clone->fFieldMap[&
f] = 
clone->fModel->FindField(
v->GetQualifiedFieldName());
 
 
  140   : fWriter(
writer), fOpenChangeset(fWriter.GetUpdatableModel())
 
 
  146   fOpenChangeset.fModel.Unfreeze();
 
  149   std::swap(fOpenChangeset.fModel.fModelId, fNewModelId);
 
 
  154   fOpenChangeset.fModel.Freeze();
 
  155   std::swap(fOpenChangeset.fModel.fModelId, fNewModelId);
 
  156   if (fOpenChangeset.IsEmpty())
 
  159   std::swap(fOpenChangeset.fAddedFields, 
toCommit.fAddedFields);
 
  160   std::swap(fOpenChangeset.fAddedProjectedFields, 
toCommit.fAddedProjectedFields);
 
  161   fWriter.GetSink().UpdateSchema(
toCommit, fWriter.GetNEntries());
 
 
  167   fOpenChangeset.fModel.AddField(std::move(
field));
 
  168   fOpenChangeset.fAddedFields.emplace_back(
fieldp);
 
 
  173                                                              std::function<std::string(
const std::string &)> 
mapping)
 
  178      fOpenChangeset.fAddedProjectedFields.emplace_back(
fieldp);
 
 
  211   return CreateBare(std::make_unique<RFieldZero>());
 
 
  214std::unique_ptr<ROOT::Experimental::RNTupleModel>
 
  218   model->fProjectedFields = std::make_unique<RProjectedFields>(model.get());
 
 
  224   return Create(std::make_unique<RFieldZero>());
 
 
  227std::unique_ptr<ROOT::Experimental::RNTupleModel>
 
  230   auto model = CreateBare(std::move(
fieldZero));
 
  231   model->fDefaultEntry = std::unique_ptr<REntry>(
new REntry(model->fModelId));
 
 
  237   auto cloneModel = std::unique_ptr<RNTupleModel>(
 
  238      new RNTupleModel(std::unique_ptr<RFieldZero>(
static_cast<RFieldZero *
>(fFieldZero->Clone(
"").release()))));
 
  240   cloneModel->fIsFrozen = fIsFrozen;
 
  241   cloneModel->fFieldNames = fFieldNames;
 
  242   cloneModel->fDescription = fDescription;
 
  243   cloneModel->fProjectedFields = fProjectedFields->Clone(cloneModel.get());
 
  245      cloneModel->fDefaultEntry = std::unique_ptr<REntry>(
new REntry(cloneModel->fModelId));
 
  246      for (
const auto &
f : cloneModel->fFieldZero->GetSubFields()) {
 
  247         cloneModel->fDefaultEntry->AddValue(
f->CreateValue());
 
 
  262                             [&](
const auto *
f) { return f->GetFieldName() == subfieldName; });
 
 
  279   EnsureValidFieldName(
field->GetFieldName());
 
  282      fDefaultEntry->AddValue(
field->CreateValue());
 
  283   fFieldNames.insert(
field->GetFieldName());
 
  284   fFieldZero->Attach(std::move(
field));
 
 
  289                                                    std::function<std::string(
const std::string &)> 
mapping)
 
 
  317std::shared_ptr<ROOT::Experimental::RNTupleCollectionWriter>
 
  333      fDefaultEntry->AddValue(
field->BindValue(std::shared_ptr<void>(
collectionWriter->GetOffsetPtr(), [](
void *) {})));
 
  335   fFieldNames.insert(
field->GetFieldName());
 
  336   fFieldZero->Attach(std::move(
field));
 
 
  343      throw RException(
R__FAIL(
"invalid attempt to get mutable zero field of unfrozen model"));
 
 
  359   return *fDefaultEntry;
 
 
  365      throw RException(
R__FAIL(
"invalid attempt to get default entry of unfrozen model"));
 
  367   return *fDefaultEntry;
 
 
  375   auto entry = std::unique_ptr<REntry>(
new REntry(fModelId));
 
  376   for (
const auto &
f : fFieldZero->GetSubFields()) {
 
  377      entry->AddValue(
f->CreateValue());
 
 
  387   auto entry = std::unique_ptr<REntry>(
new REntry(fModelId));
 
  388   for (
const auto &
f : fFieldZero->GetSubFields()) {
 
  389      entry->AddValue(
f->BindValue(
nullptr));
 
 
  397      throw RException(
R__FAIL(
"invalid attempt to get field token of unfrozen model"));
 
 
  417   return f->CreateBulk();
 
 
  427      fDefaultEntry->fModelId = fModelId;
 
 
#define R__FORWARD_ERROR(res)
Short-hand to return an RResult<T> in an error state (i.e. after checking)
 
#define R__FORWARD_RESULT(res)
Short-hand to return an RResult<T> value from a subroutine to the calling stack frame.
 
#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
 
ROOT::Detail::TRangeCast< T, true > TRangeDynCast
TRangeDynCast is an adapter class that allows the typed iteration through a TCollection.
 
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 Int_t Int_t Window_t TString Int_t GCValues_t GetPrimarySelectionOwner GetDisplay GetScreen GetColormap GetNativeEvent const char const char dpyName wid window const char font_name cursor keysym reg const char only_if_exist regb h Point_t winding char text const char depth char const char Int_t count const char ColorStruct_t color const char Pixmap_t Pixmap_t PictureAttributes_t attr const char char ret_data h unsigned char height h Atom_t Int_t ULong_t ULong_t unsigned char prop_list Atom_t Atom_t target
 
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
 
An artificial field that transforms an RNTuple column that contains the offset of collections into co...
 
The field token identifies a top-level field in this entry.
 
The REntry is a collection of values in an ntuple corresponding to a complete row in the data set.
 
Base class for all ROOT issued exceptions.
 
Similar to RValue but manages an array of consecutive values.
 
A field translates read and write calls from/to underlying columns to/from tree values.
 
const RFieldBase * GetParent() const
 
static RResult< void > EnsureValidFieldName(std::string_view fieldName)
Check whether a given string is a valid field name.
 
The container field for an ntuple model, which itself has no physical representation.
 
Projected fields are fields whose columns are reused from existing fields.
 
RResult< void > EnsureValidMapping(const RFieldBase *target, const FieldMap_t &fieldMap)
Asserts that the passed field is a valid target of the source field provided in the field map.
 
std::unordered_map< const RFieldBase *, const RFieldBase * > FieldMap_t
The map keys are the projected target fields, the map values are the backing source fields Note that ...
 
const RFieldBase * GetSourceField(const RFieldBase *target) const
 
RResult< void > Add(std::unique_ptr< RFieldBase > field, const FieldMap_t &fieldMap)
Adds a new projected field.
 
std::unique_ptr< RProjectedFields > Clone(const RNTupleModel *newModel) const
The new model needs to be a clone of fModel.
 
RUpdater(RNTupleWriter &writer)
 
void CommitUpdate()
Commit changes since the last call to BeginUpdate().
 
void BeginUpdate()
Begin a new set of alterations to the underlying model.
 
RResult< void > AddProjectedField(std::unique_ptr< RFieldBase > field, std::function< std::string(const std::string &)> mapping)
 
void AddField(std::unique_ptr< RFieldBase > field)
 
The RNTupleModel encapulates the schema of an ntuple.
 
std::unordered_set< std::string > fFieldNames
Keeps track of which field names are taken, including projected field names.
 
void EnsureValidFieldName(std::string_view fieldName)
Checks that user-provided field names are valid in the context of this NTuple model.
 
std::uint64_t fModelId
Every model has a unique ID to distinguish it from other models.
 
REntry::RFieldToken GetToken(std::string_view fieldName) const
Creates a token to be used in REntry methods to address a top-level field.
 
RResult< void > AddProjectedField(std::unique_ptr< RFieldBase > field, std::function< std::string(const std::string &)> mapping)
Adds a top-level field based on existing fields.
 
void EnsureNotBare() const
Throws an RException if fDefaultEntry is nullptr.
 
std::unique_ptr< RNTupleModel > Clone() const
 
void EnsureNotFrozen() const
Throws an RException if fFrozen is true.
 
REntry & GetDefaultEntry()
 
std::shared_ptr< RNTupleCollectionWriter > MakeCollection(std::string_view fieldName, std::unique_ptr< RNTupleModel > collectionModel)
Ingests a model for a sub collection and attaches it to the current model.
 
const RFieldBase & GetField(std::string_view fieldName) const
 
std::unique_ptr< REntry > CreateBareEntry() const
In a bare entry, all values point to nullptr.
 
std::unique_ptr< REntry > CreateEntry() const
 
RFieldBase::RBulk CreateBulk(std::string_view fieldName) const
Calls the given field's CreateBulk() method. Throws an exception if no field with the given name exis...
 
static std::unique_ptr< RNTupleModel > Create()
 
void SetDescription(std::string_view description)
 
std::unique_ptr< REntry > fDefaultEntry
Contains field values corresponding to the created top-level fields.
 
RFieldBase * FindField(std::string_view fieldName) const
The field name can be a top-level field or a nested field. Returns nullptr if the field is not in the...
 
RNTupleModel(std::unique_ptr< RFieldZero > fieldZero)
 
static std::unique_ptr< RNTupleModel > CreateBare()
A bare model has no default entry.
 
void AddField(std::unique_ptr< RFieldBase > field)
Adds a field whose type is not known at compile time.
 
RFieldZero & GetFieldZero()
Non-const access to the root field is used to commit clusters during writing and to set the on-disk f...
 
std::unique_ptr< RFieldZero > fFieldZero
Hierarchy of fields consisting of simple types and collections (sub trees)
 
An RNTuple that gets filled with entries (data) and writes them to storage.
 
The class is used as a return type for operations that can fail; wraps a value of type T or an RError...
 
const_iterator begin() const
 
const_iterator end() const
 
std::vector< std::string > Split(std::string_view str, std::string_view delims, bool skipEmpty=false)
Splits a string at each character in delims.
 
The incremental changes to a RNTupleModel