@@ -1176,12 +1176,6 @@ struct TableIterator : IP, C... {
11761176 return *this ;
11771177 }
11781178
1179- template <typename ... CL, typename TA>
1180- void doSetCurrentIndex (framework::pack<CL...>, TA* current)
1181- {
1182- (CL::setCurrent (current), ...);
1183- }
1184-
11851179 template <typename CL>
11861180 auto getCurrent () const
11871181 {
@@ -1202,7 +1196,18 @@ struct TableIterator : IP, C... {
12021196 template <typename ... TA>
12031197 void bindExternalIndices (TA*... current)
12041198 {
1205- (doSetCurrentIndex (external_index_columns_t {}, current), ...);
1199+ ([this ]<soa::is_index_column... CCs>(TA* cur, framework::pack<CCs...>) {
1200+ (CCs::setCurrent (cur), ...);
1201+ }(current, external_index_columns_t {}),
1202+ ...);
1203+ }
1204+
1205+ template <typename TA>
1206+ void bindExternalIndex (TA* current)
1207+ {
1208+ [this ]<soa::is_index_column... CCs>(TA* cur, framework::pack<CCs...>) {
1209+ (CCs::setCurrent (cur), ...);
1210+ }(current, external_index_columns_t {});
12061211 }
12071212
12081213 template <typename ... Cs>
@@ -1812,6 +1817,12 @@ consteval auto computeOriginals()
18121817 return o2::soa::mergeOriginals<Ts...>();
18131818}
18141819
1820+ template <size_t N, std::array<TableRef, N> refs>
1821+ consteval auto commonOrigin ()
1822+ {
1823+ return (refs | std::ranges::views::filter ([](TableRef const & r) { return (!(r.origin_hash == " DYN" _h || r.origin_hash == " IDX" _h)); })).front ().origin_hash ;
1824+ }
1825+
18151826// / A Table class which observes an arrow::Table and provides
18161827// / It is templated on a set of Column / DynamicColumn types.
18171828template <aod::is_aod_hash L, aod::is_aod_hash D, aod::is_origin_hash O, typename ... Ts>
@@ -1823,7 +1834,10 @@ class Table
18231834 using table_t = self_t ;
18241835
18251836 static constexpr const auto originals = computeOriginals<ref, Ts...>();
1826- static constexpr const auto originalLabels = []<size_t N, std::array<TableRef, N> refs, size_t ... Is>(std::index_sequence<Is...>) { return std::array<const char *, N>{o2::aod::label<refs[Is]>()...}; }.template operator ()<originals.size(), originals>(std::make_index_sequence<originals.size()>());
1837+ static constexpr const auto originalLabels = []<size_t N, std::array<TableRef, N> refs, size_t ... Is>(std::index_sequence<Is...>) {
1838+ return std::array<const char *, N>{o2::aod::label<refs[Is]>()...};
1839+ }.template operator ()<originals.size(), originals>(std::make_index_sequence<originals.size()>());
1840+ static constexpr const uint32_t binding_origin = commonOrigin<originals.size(), originals>();
18271841
18281842 template <size_t N, std::array<TableRef, N> bindings>
18291843 requires (ref.origin_hash == " CONC" _h)
@@ -1836,10 +1850,10 @@ class Table
18361850 requires (ref.origin_hash == " JOIN" _h)
18371851 static consteval auto isIndexTargetOf ()
18381852 {
1839- return std::find_if ( self_t ::originals. begin (), self_t ::originals. end () ,
1840- [](TableRef const & r) {
1841- return std::find (bindings. begin (), bindings. end () , r) != bindings.end ();
1842- }) != self_t ::originals.end ();
1853+ return std::ranges::find_if ( self_t ::originals,
1854+ [](TableRef const & r) {
1855+ return std::ranges:: find (bindings, r) != bindings.end ();
1856+ }) != self_t ::originals.end ();
18431857 }
18441858
18451859 template <size_t N, std::array<TableRef, N> bindings>
@@ -2179,7 +2193,18 @@ class Table
21792193 template <typename ... TA>
21802194 void bindExternalIndices (TA*... current)
21812195 {
2182- mBegin .bindExternalIndices (current...);
2196+ ([this ](TA* cur) {
2197+ if constexpr (binding_origin == TA::binding_origin) {
2198+ mBegin .bindExternalIndex (cur);
2199+ }
2200+ }(current),
2201+ ...);
2202+ }
2203+
2204+ template <typename TA>
2205+ void bindExternalIndex (TA* current)
2206+ {
2207+ mBegin .bindExternalIndex (current); // unchecked binding for the derived tables
21832208 }
21842209
21852210 template <typename I>
@@ -3395,6 +3420,18 @@ struct JoinFull : Table<o2::aod::Hash<"JOIN"_h>, D, o2::aod::Hash<"JOIN"_h>, Ts.
33953420 }
33963421 using base::bindExternalIndices;
33973422 using base::bindInternalIndicesTo;
3423+ static constexpr const uint32_t binding_origin = base::binding_origin;
3424+
3425+ template <typename ... TA>
3426+ void bindExternalIndices (TA*... current)
3427+ {
3428+ ([this ](TA* cur) {
3429+ if constexpr (binding_origin == TA::binding_origin) {
3430+ this ->bindExternalIndex (cur);
3431+ }
3432+ }(current),
3433+ ...);
3434+ }
33983435
33993436 using self_t = JoinFull<D, Ts...>;
34003437 using table_t = base;
@@ -3524,6 +3561,18 @@ class FilteredBase : public T
35243561 using self_t = FilteredBase<T>;
35253562 using table_t = typename T::table_t ;
35263563 using T::originals;
3564+ static constexpr const uint32_t binding_origin = T::binding_origin;
3565+ template <typename ... TA>
3566+ void bindExternalIndices (TA*... current)
3567+ {
3568+ ([this ](TA* cur) {
3569+ if constexpr (binding_origin == TA::binding_origin) {
3570+ this ->bindExternalIndex (cur);
3571+ mFilteredBegin .bindExternalIndex (cur);
3572+ }
3573+ }(current),
3574+ ...);
3575+ }
35273576 using columns_t = typename T::columns_t ;
35283577 using persistent_columns_t = typename T::persistent_columns_t ;
35293578 using external_index_columns_t = typename T::external_index_columns_t ;
@@ -3645,13 +3694,6 @@ class FilteredBase : public T
36453694
36463695 // / Bind the columns which refer to other tables
36473696 // / to the associated tables.
3648- template <typename ... TA>
3649- void bindExternalIndices (TA*... current)
3650- {
3651- table_t::bindExternalIndices (current...);
3652- mFilteredBegin .bindExternalIndices (current...);
3653- }
3654-
36553697 void bindExternalIndicesRaw (std::vector<o2::soa::Binding>&& ptrs)
36563698 {
36573699 mFilteredBegin .bindExternalIndicesRaw (std::forward<std::vector<o2::soa::Binding>>(ptrs));
@@ -4134,6 +4176,19 @@ struct IndexTable : Table<L, D, O> {
41344176 using first_t = typename H::binding_t ;
41354177 using rest_t = framework::pack<typename Ts::binding_t ...>;
41364178
4179+ static constexpr const uint32_t binding_origin = Key::binding_origin;
4180+
4181+ template <typename ... TA>
4182+ void bindExternalIndices (TA*... current)
4183+ {
4184+ ([this ](TA* cur) {
4185+ if constexpr (binding_origin == TA::binding_origin) {
4186+ this ->bindExternalIndex (cur);
4187+ }
4188+ }(current),
4189+ ...);
4190+ }
4191+
41374192 IndexTable (std::shared_ptr<arrow::Table> table, uint64_t offset = 0 )
41384193 : base_t {table, offset}
41394194 {
0 commit comments