From 2b3a920fae5242850f7bdab11c28a0220b21d081 Mon Sep 17 00:00:00 2001 From: Anton Alkin Date: Wed, 7 Jul 2021 10:46:56 +0200 Subject: [PATCH] Make sure index uses unfiltered iterator --- Framework/Core/include/Framework/ASoA.h | 6 +++- Framework/Core/test/test_ASoA.cxx | 37 +++++++++++++++++++++++++ 2 files changed, 42 insertions(+), 1 deletion(-) diff --git a/Framework/Core/include/Framework/ASoA.h b/Framework/Core/include/Framework/ASoA.h index f7be0d723396e..c27f15587c2ec 100644 --- a/Framework/Core/include/Framework/ASoA.h +++ b/Framework/Core/include/Framework/ASoA.h @@ -1370,7 +1370,7 @@ constexpr auto is_binding_compatible_v() auto _Getter_##_as() const \ { \ assert(mBinding != nullptr); \ - return static_cast(mBinding)->begin() + *mColumnIterator; \ + return static_cast(mBinding)->iteratorAt(*mColumnIterator); \ } \ \ auto _Getter_() const \ @@ -1589,6 +1589,8 @@ struct Join : JoinBase { using persistent_columns_t = typename table_t::persistent_columns_t; using iterator = typename table_t::template RowView, Ts...>; using const_iterator = iterator; + using unfiltered_iterator = iterator; + using unfiltered_const_iterator = const_iterator; using filtered_iterator = typename table_t::template RowViewFiltered, Ts...>; using filtered_const_iterator = filtered_iterator; }; @@ -1661,6 +1663,8 @@ class FilteredPolicy : public T } using iterator = decltype(make_it>(originals{})); using const_iterator = iterator; + using unfiltered_iterator = typename table_t::iterator; + using unfiltered_const_iterator = typename table_t::const_iterator; FilteredPolicy(std::vector>&& tables, SelectionVector&& selection, uint64_t offset = 0) : T{std::move(tables), offset}, diff --git a/Framework/Core/test/test_ASoA.cxx b/Framework/Core/test/test_ASoA.cxx index 74269b93f43a9..e25dae33c196b 100644 --- a/Framework/Core/test/test_ASoA.cxx +++ b/Framework/Core/test/test_ASoA.cxx @@ -628,6 +628,43 @@ BOOST_AUTO_TEST_CASE(TestNestedFiltering) BOOST_CHECK_EQUAL(i, 1); } +DECLARE_SOA_TABLE(Origins, "TST", "ORIG", o2::soa::Index<>, test::X, test::SomeBool); +namespace test +{ +DECLARE_SOA_INDEX_COLUMN(Origin, origin); +} +DECLARE_SOA_TABLE(References, "TST", "REFS", o2::soa::Index<>, test::OriginId); + +BOOST_AUTO_TEST_CASE(TestIndexToFiltered) +{ + TableBuilder b; + auto writer = b.cursor(); + for (auto i = 0; i < 20; ++i) { + writer(0, i, i % 3 == 0); + } + auto origins = b.finalize(); + Origins o{origins}; + + TableBuilder w; + auto writer_w = w.cursor(); + for (auto i = 0; i < 5 * 20; ++i) { + writer_w(0, i % 20); + } + auto refs = w.finalize(); + References r{refs}; + expressions::Filter flt = test::someBool == true; + using Flt = o2::soa::Filtered; + Flt f{{o.asArrowTable()}, expressions::createSelection(o.asArrowTable(), flt)}; + r.bindExternalIndices(&f); + auto it = r.begin(); + it.moveByIndex(23); + BOOST_CHECK_EQUAL(it.origin().globalIndex(), 3); + it++; + BOOST_CHECK_EQUAL(it.origin().globalIndex(), 4); + it++; + BOOST_CHECK_EQUAL(it.origin().globalIndex(), 5); +} + BOOST_AUTO_TEST_CASE(TestEmptyTables) { TableBuilder bPoints;