1414
1515#include < ROOT/RNTupleJoinTable.hxx>
1616
17- namespace {
18- ROOT ::Experimental::Internal::RNTupleJoinTable::JoinValue_t CastValuePtr (void *valuePtr, std::size_t fieldValueSize)
19- {
20- ROOT ::Experimental::Internal::RNTupleJoinTable::JoinValue_t value;
21-
22- switch (fieldValueSize) {
23- case 1 : value = *reinterpret_cast <std::uint8_t *>(valuePtr); break ;
24- case 2 : value = *reinterpret_cast <std::uint16_t *>(valuePtr); break ;
25- case 4 : value = *reinterpret_cast <std::uint32_t *>(valuePtr); break ;
26- case 8 : value = *reinterpret_cast <std::uint64_t *>(valuePtr); break ;
27- default : throw ROOT::RException (R__FAIL (" value size not supported" ));
28- }
29-
30- return value;
31- }
32- } // anonymous namespace
33-
3417ROOT ::Experimental::Internal::RNTupleJoinTable::REntryMapping::REntryMapping(
3518 ROOT ::Internal::RPageSource &pageSource, const std::vector<std::string> &joinFieldNames,
3619 ROOT ::NTupleSize_t entryOffset)
@@ -60,7 +43,8 @@ ROOT::Experimental::Internal::RNTupleJoinTable::REntryMapping::REntryMapping(
6043 " \" in join table: only integral types are allowed" ));
6144 }
6245
63- auto field = fieldDesc.CreateField (desc.GetRef ());
46+ auto field = std::make_unique<ROOT ::RField<JoinValue_t>>(fieldDesc.GetFieldName ());
47+ field->SetOnDiskId (fieldDesc.GetId ());
6448 ROOT::Internal::CallConnectPageSourceOnField (*field, pageSource);
6549
6650 fieldValues.emplace_back (field->CreateValue ());
@@ -77,29 +61,20 @@ ROOT::Experimental::Internal::RNTupleJoinTable::REntryMapping::REntryMapping(
7761 for (auto &fieldValue : fieldValues) {
7862 // TODO(fdegeus): use bulk reading
7963 fieldValue.Read (i);
80-
81- auto valuePtr = fieldValue.GetPtr <void >();
82- castJoinValues.push_back (CastValuePtr (valuePtr.get (), fieldValue.GetField ().GetValueSize ()));
64+ castJoinValues.push_back (fieldValue.GetRef <JoinValue_t>());
8365 }
8466
8567 fMapping [RCombinedJoinFieldValue (castJoinValues)].push_back (i + entryOffset);
8668 }
8769}
8870
89- const std::vector<ROOT ::NTupleSize_t> *
90- ROOT ::Experimental::Internal::RNTupleJoinTable::REntryMapping::GetEntryIndexes ( std::vector<void *> valuePtrs ) const
71+ const std::vector<ROOT ::NTupleSize_t> *ROOT ::Experimental::Internal::RNTupleJoinTable::REntryMapping::GetEntryIndexes (
72+ const std::vector<JoinValue_t> &joinValues ) const
9173{
92- if (valuePtrs .size () != fJoinFieldNames .size ())
74+ if (joinValues .size () != fJoinFieldNames .size ())
9375 throw RException (R__FAIL (" number of value pointers must match number of join fields" ));
9476
95- std::vector<JoinValue_t> castJoinValues;
96- castJoinValues.reserve (valuePtrs.size ());
97-
98- for (unsigned i = 0 ; i < valuePtrs.size (); ++i) {
99- castJoinValues.push_back (CastValuePtr (valuePtrs[i], fJoinFieldValueSizes [i]));
100- }
101-
102- if (const auto &entries = fMapping .find (RCombinedJoinFieldValue (castJoinValues)); entries != fMapping .end ()) {
77+ if (const auto &entries = fMapping .find (RCombinedJoinFieldValue (joinValues)); entries != fMapping .end ()) {
10378 return &entries->second ;
10479 }
10580
@@ -125,11 +100,11 @@ ROOT::Experimental::Internal::RNTupleJoinTable::Add(ROOT::Internal::RPageSource
125100}
126101
127102ROOT ::NTupleSize_t
128- ROOT ::Experimental::Internal::RNTupleJoinTable::GetEntryIndex(const std::vector<void * > &valuePtrs ) const
103+ ROOT ::Experimental::Internal::RNTupleJoinTable::GetEntryIndex(const std::vector<JoinValue_t > &joinValues ) const
129104{
130105 for (const auto &partition : fPartitions ) {
131106 for (const auto &joinMapping : partition.second ) {
132- auto entriesForMapping = joinMapping->GetEntryIndexes (valuePtrs );
107+ auto entriesForMapping = joinMapping->GetEntryIndexes (joinValues );
133108 if (entriesForMapping) {
134109 return (*entriesForMapping)[0 ];
135110 }
0 commit comments