Skip to content

Commit 4edb7a8

Browse files
authored
DPL Analysis: force index to only bind with tables of the same origin (#15177)
1 parent 80ca8b8 commit 4edb7a8

File tree

1 file changed

+75
-20
lines changed
  • Framework/Core/include/Framework

1 file changed

+75
-20
lines changed

Framework/Core/include/Framework/ASoA.h

Lines changed: 75 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -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.
18171828
template <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

Comments
 (0)