Skip to content

Commit c15014c

Browse files
authored
DPL Analysis: fix for iterator not setting the originals correctly (#13771)
1 parent 808730c commit c15014c

File tree

2 files changed

+26
-22
lines changed

2 files changed

+26
-22
lines changed

Framework/Core/include/Framework/ASoA.h

Lines changed: 17 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1451,12 +1451,7 @@ using PresliceOptional = PresliceBase<T, true, true>;
14511451

14521452
namespace o2::soa
14531453
{
1454-
template <typename T>
1455-
class FilteredBase;
1456-
template <typename T>
1457-
class Filtered;
1458-
1459-
template <typename T>
1454+
template <soa::is_table T>
14601455
class FilteredBase;
14611456
template <typename T>
14621457
class Filtered;
@@ -1728,7 +1723,8 @@ class Table
17281723
using columns_t = typename Parent::columns_t;
17291724
using external_index_columns_t = typename Parent::external_index_columns_t;
17301725
using bindings_pack_t = decltype([]<typename... C>(framework::pack<C...>) -> framework::pack<typename C::binding_t...> {}(external_index_columns_t{}));
1731-
static constexpr const std::array<TableRef, sizeof...(T)> originals{T::ref...};
1726+
// static constexpr const std::array<TableRef, sizeof...(T)> originals{T::ref...};
1727+
static constexpr auto originals = Parent::originals;
17321728
using policy_t = IP;
17331729
using parent_t = Parent;
17341730

@@ -1741,7 +1737,7 @@ class Table
17411737

17421738
template <typename P, typename... Os>
17431739
TableIteratorBase& operator=(TableIteratorBase<IP, P, Os...> other)
1744-
requires(P::ref::signature == Parent::ref::signature)
1740+
requires(P::ref.desc_hash == Parent::ref.desc_hash)
17451741
{
17461742
static_cast<base_iterator<IP>&>(*this) = static_cast<base_iterator<IP>>(other);
17471743
return *this;
@@ -1762,16 +1758,16 @@ class Table
17621758
return *this;
17631759
}
17641760

1765-
template <typename P, typename... Os>
1766-
TableIteratorBase(TableIteratorBase<IP, P, Os...> const& other)
1767-
requires(P::ref::signature == Parent::ref::signature)
1761+
template <typename P, typename O1, typename... Os>
1762+
TableIteratorBase(TableIteratorBase<IP, P, O1, Os...> const& other)
1763+
requires(P::ref.desc_hash == Parent::ref.desc_hash)
17681764
{
17691765
*this = other;
17701766
}
17711767

1772-
template <typename P, typename... Os>
1773-
TableIteratorBase(TableIteratorBase<IP, P, Os...>&& other) noexcept
1774-
requires(P::ref::signature == Parent::ref::signature)
1768+
template <typename P, typename O1, typename... Os>
1769+
TableIteratorBase(TableIteratorBase<IP, P, O1, Os...>&& other) noexcept
1770+
requires(P::ref.desc_hash == Parent::ref.desc_hash)
17751771
{
17761772
*this = other;
17771773
}
@@ -2503,7 +2499,7 @@ consteval auto getIndexTargets()
25032499
for (auto const& i : *mColumnIterator) { \
25042500
auto pos = mBinding.get<T>()->isInSelectedRows(i); \
25052501
if (pos > 0) { \
2506-
result.push_back(mBinding.get<T>()->iteratorAt(pos)); \
2502+
result.emplace_back(mBinding.get<T>()->iteratorAt(pos)); \
25072503
} \
25082504
} \
25092505
return result; \
@@ -3061,9 +3057,6 @@ consteval auto getIndexTargets()
30613057

30623058
namespace o2::soa
30633059
{
3064-
// template <typename T>
3065-
// class FilteredBase;
3066-
30673060
template <typename D, typename... Ts>
30683061
struct JoinFull : Table<o2::aod::Hash<"JOIN"_h>, D, o2::aod::Hash<"JOIN"_h>, Ts...> {
30693062
using base = Table<o2::aod::Hash<"JOIN"_h>, D, o2::aod::Hash<"JOIN"_h>, Ts...>;
@@ -3201,7 +3194,7 @@ constexpr auto concat(Ts const&... t)
32013194
return Concat<Ts...>{t...};
32023195
}
32033196

3204-
template <typename T>
3197+
template <soa::is_table T>
32053198
class FilteredBase : public T
32063199
{
32073200
public:
@@ -3473,7 +3466,8 @@ class Filtered : public FilteredBase<T>
34733466
public:
34743467
using base_t = T;
34753468
using self_t = Filtered<T>;
3476-
using table_t = typename FilteredBase<T>::table_t;
3469+
using table_t = typename T::table_t;
3470+
using columns_t = typename T::columns_t;
34773471

34783472
using iterator = T::template iterator_template_o<FilteredIndexPolicy, self_t>;
34793473
using unfiltered_iterator = T::template iterator_template_o<DefaultIndexPolicy, self_t>;
@@ -3633,9 +3627,10 @@ class Filtered<Filtered<T>> : public FilteredBase<typename T::table_t>
36333627
using self_t = Filtered<Filtered<T>>;
36343628
using base_t = T;
36353629
using table_t = typename FilteredBase<typename T::table_t>::table_t;
3630+
using columns_t = typename T::columns_t;
36363631

3637-
using iterator = FilteredBase<typename T::table_t>::iterator;
3638-
using unfiltered_iterator = FilteredBase<typename T::table_t>::unfiltered_iterator;
3632+
using iterator = typename T::template iterator_template_o<FilteredIndexPolicy, self_t>;
3633+
using unfiltered_iterator = typename T::template iterator_template_o<DefaultIndexPolicy, self_t>;
36393634
using const_iterator = iterator;
36403635

36413636
iterator begin()

Framework/Core/test/test_GroupSlicer.cxx

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,10 +10,12 @@
1010
// or submit itself to any jurisdiction.
1111

1212
#include "Framework/ASoA.h"
13+
#include "Framework/AnalysisDataModel.h"
1314
#include "Framework/TableBuilder.h"
1415
#include "Framework/GroupSlicer.h"
1516
#include "Framework/ArrowTableSlicingCache.h"
1617
#include <arrow/util/config.h>
18+
#include <iostream>
1719

1820
#include <catch_amalgamated.hpp>
1921

@@ -85,6 +87,13 @@ DECLARE_SOA_COLUMN(Lst, lst, std::vector<double>);
8587
DECLARE_SOA_TABLE(EventExtra, "AOD", "EVTSXTRA", test::Arr, test::Boo, test::Lst);
8688

8789
} // namespace o2::aod
90+
TEST_CASE("RelatedByIndex")
91+
{
92+
using Trks = soa::Join<aod::Tracks, aod::TracksExtra>;
93+
CHECK(soa::relatedByIndex<aod::Collision, Trks>() == true);
94+
CHECK(soa::relatedByIndex<aod::Collision, aod::Tracks>() == true);
95+
}
96+
8897
TEST_CASE("GroupSlicerOneAssociated")
8998
{
9099
TableBuilder builderE;

0 commit comments

Comments
 (0)