@@ -100,6 +100,27 @@ consteval auto merge()
100100 return out;
101101}
102102
103+ template <size_t N1, size_t N2, std::array<TableRef, N1> ar1, std::array<TableRef, N2> ar2, typename L>
104+ consteval auto merge_if (L l)
105+ {
106+ constexpr const int to_remove = std::ranges::count_if (ar1.begin (), ar1.end (), [&](TableRef const & a){ return !l (a); });
107+ constexpr const int duplicates = std::ranges::count_if (ar2.begin (), ar2.end (), [&](TableRef const & a) { return std::any_of (ar1.begin (), ar1.end (), [&](TableRef const & e) { return e == a; }) || !l (a); });
108+ std::array<TableRef, N1 + N2 - duplicates - to_remove> out;
109+
110+ auto pos = std::copy_if (ar1.begin (), ar1.end (), out.begin (), [&](TableRef const & a){ return l (a); });
111+ std::copy_if (ar2.begin (), ar2.end (), pos, [&](TableRef const & a) { return std::none_of (ar1.begin (), ar1.end (), [&](TableRef const & e) { return e == a; }) && l (a); });
112+ return out;
113+ }
114+
115+ template <size_t N, std::array<TableRef, N> ar, typename L>
116+ consteval auto remove_if (L l)
117+ {
118+ constexpr const int to_remove = std::ranges::count_if (ar.begin (), ar.end (), [&l](TableRef const & e){ return l (e);});
119+ std::array<TableRef, N - to_remove> out;
120+ std::copy_if (ar.begin (), ar.end (), out.begin (), [&l](TableRef const & e){ return !l (e); });
121+ return out;
122+ }
123+
103124template <size_t N1, size_t N2, std::array<TableRef, N1> ar1, std::array<TableRef, N2> ar2>
104125consteval auto intersect ()
105126{
@@ -298,6 +319,18 @@ struct Hash {
298319 static constexpr char const * const str{" " };
299320};
300321
322+ template <size_t N, std::array<soa::TableRef, N> ar, typename Key>
323+ consteval auto filterForKey ()
324+ {
325+ constexpr std::array<bool , N> test = []<size_t ... Is>(std::index_sequence<Is...>) {
326+ return std::array<bool , N>{(Key::template hasOriginal<ar[Is]>() || (o2::aod::MetadataTraitNG<o2::aod::Hash<ar[Is].desc_hash >>::metadata::template getIndexPosToKey<Key>() >= 0 ))...};
327+ }(std::make_index_sequence<N>());
328+ constexpr int correct = std::ranges::count (test.begin (), test.end (), true );
329+ std::array<soa::TableRef, correct> out;
330+ std::ranges::copy_if (ar.begin (), ar.end (), out.begin (), [&test](soa::TableRef const & r){ return test[std::distance (ar.begin (), std::find (ar.begin (), ar.end (), r))]; });
331+ return out;
332+ }
333+
301334#define O2HASH (_Str_ ) \
302335 template <> \
303336 struct Hash <_Str_ " " _h> { \
@@ -2176,6 +2209,11 @@ class TableNG
21762209 return std::find_if (originals.begin (), originals.end (), [](TableRef const & o){ return o.desc_hash == r.desc_hash ;}) != originals.end ();
21772210 }
21782211
2212+ static consteval bool hasOriginal_alt (TableRef const & r)
2213+ {
2214+ return std::ranges::find_if (originals.begin (), originals.end (), [&](TableRef const & o){ return o.desc_hash == r.desc_hash ;}) != originals.end ();
2215+ }
2216+
21792217 using columns_t = decltype (
21802218 []() {
21812219 if constexpr (sizeof ...(Ts) == 0 ) {
@@ -3989,7 +4027,7 @@ consteval auto getIndexTargets()
39894027 O2HASH (_Label_); \
39904028 O2HASH (_Desc_ " /" #_Version_); \
39914029 template <typename O> \
3992- using _Name_##ExtensionFrom = TableNG<o2::aod::Hash<_Label_ " " _h>, o2::aod::Hash<_Desc_ " /" #_Version_ " " _h>, O>; \
4030+ using _Name_##ExtensionFrom = soa:: TableNG<o2::aod::Hash<_Label_ " " _h>, o2::aod::Hash<_Desc_ " /" #_Version_ " " _h>, O>; \
39934031 using _Name_##Extension = _Name_##ExtensionFrom<o2::aod::Hash<_Origin_ " " _h>>; \
39944032 template <typename O = o2::aod::Hash<_Origin_ " " _h>> \
39954033 struct _Name_ ##ExtensionMetadataFrom : TableMetadataNG<o2::aod::Hash<_Desc_ " /" #_Version_ " " _h>, __VA_ARGS__> { \
@@ -4059,19 +4097,21 @@ consteval auto getIndexTargets()
40594097 O2HASH (#_Name_); \
40604098 O2HASH (_Desc_ " /" #_Version_); \
40614099 template <typename O = o2::aod::Hash<_Origin_ " " _h>> \
4062- using _Name_##From = o2::soa::IndexTableNG<o2::aod::Hash<#_Name_ " " _h>, o2::aod::Hash<_Desc_ " /" #_Version_ " " _h>, O, _Key_, __VA_ARGS__>; \
4063- using _Name_ = _Name_##From<o2::aod::Hash<_Origin_ " " _h>>; \
4064- \
4065- template <typename O = o2::aod::Hash<_Origin_ " " _h>> \
4066- struct _Name_ ##MetadataFrom : o2::aod::TableMetadataNG<o2::aod::Hash<_Desc_ " /" #_Version_ " " _h>, Index<>, __VA_ARGS__> { \
4100+ struct _Name_ ##MetadataFrom : o2::aod::TableMetadataNG<o2::aod::Hash<_Desc_ " /" #_Version_ " " _h>, soa::Index<>, __VA_ARGS__> { \
40674101 static constexpr bool exclusive = _Exclusive_; \
4068- using table_t = _Name_##From<O>; \
40694102 using Key = _Key_; \
40704103 using index_pack_t = framework::pack<__VA_ARGS__>; \
4071- static constexpr auto sources = table_t ::originals; \
4104+ static constexpr const auto sources = []<typename ... Cs>(framework::pack<Cs...>){ \
4105+ constexpr auto a = o2::soa::mergeOriginals<typename Cs::binding_t ...>(); \
4106+ return o2::aod::filterForKey<a.size (), a, Key>(); \
4107+ }(framework::pack<__VA_ARGS__>{}); \
40724108 }; \
40734109 using _Name_##Metadata = _Name_##MetadataFrom<o2::aod::Hash<_Origin_ " " _h>>; \
40744110 \
4111+ template <typename O = o2::aod::Hash<_Origin_ " " _h>> \
4112+ using _Name_##From = o2::soa::IndexTableNG<o2::aod::Hash<#_Name_ " " _h>, o2::aod::Hash<_Desc_ " /" #_Version_ " " _h>, O, _Key_, __VA_ARGS__>; \
4113+ using _Name_ = _Name_##From<o2::aod::Hash<_Origin_ " " _h>>; \
4114+ \
40754115 template <> \
40764116 struct MetadataTraitNG <o2::aod::Hash<_Desc_ " /" #_Version_ " " _h>> { \
40774117 using metadata = _Name_##Metadata; \
@@ -5557,7 +5597,6 @@ struct IndexTableNG : TableNG<L, D, O> {
55575597 using indexing_t = Key;
55585598 using first_t = typename H::binding_t ;
55595599 using rest_t = framework::pack<typename Ts::binding_t ...>;
5560- static constexpr const auto originals = o2::soa::mergeOriginals<typename H::binding_t , typename Ts::binding_t ...>();
55615600
55625601 IndexTableNG (std::shared_ptr<arrow::Table> table, uint64_t offset = 0 )
55635602 : base_t {table, offset}
0 commit comments