@@ -1663,11 +1663,6 @@ auto select(T const& t, framework::expressions::Filter const& f)
16631663
16641664arrow::ChunkedArray* getIndexFromLabel (arrow::Table* table, std::string_view label);
16651665
1666- template <typename D, typename O, typename IP , typename ... C>
1667- consteval auto base_iter (framework::pack<C...>&&) -> TableIterator<D, O, IP, C...>
1668- {
1669- }
1670-
16711666template <TableRef ref, typename ... Ts>
16721667 requires ((sizeof ...(Ts) > 0) && (soa::is_column<Ts> && ...))
16731668consteval auto getColumns()
@@ -1726,7 +1721,7 @@ class Table
17261721 static constexpr const auto originalLabels = []<size_t N, std::array<TableRef, N> refs, size_t ... Is>(std::index_sequence<Is...>) {
17271722 return std::array<const char *, N>{o2::aod::label<refs[Is]>()...};
17281723 }.template operator ()<originals.size(), originals>(std::make_index_sequence<originals.size()>());
1729- static constexpr const uint32_t binding_origin = originals[0 ].origin_hash; // commonOrigin<originals.size(), originals>();
1724+ static constexpr const uint32_t binding_origin = originals[0 ].origin_hash;
17301725 static constexpr header::DataOrigin binding_origin_ = o2::aod::Hash<binding_origin>::origin;
17311726
17321727 template <size_t N, std::array<TableRef, N> bindings>
@@ -1767,14 +1762,13 @@ class Table
17671762 using external_index_columns_t = decltype ([]<typename ... C>(framework::pack<C...>&&) -> framework::selected_pack<soa::is_external_index_t , C...> {}(columns_t {}));
17681763 using internal_index_columns_t = decltype ([]<typename ... C>(framework::pack<C...>&&) -> framework::selected_pack<soa::is_self_index_t , C...> {}(columns_t {}));
17691764 template <typename IP >
1770- using base_iterator = decltype (base_iter< D, O, IP > (columns_t {}));
1765+ using base_iterator = decltype ([]< typename ... Cs>(framework::pack<Cs...>&&) -> TableIterator< D, O, IP , Cs...> {} (columns_t {}));
17711766
17721767 template <typename IP , typename Parent, typename ... T>
17731768 struct TableIteratorBase : base_iterator<IP > {
17741769 using columns_t = typename Parent::columns_t ;
17751770 using external_index_columns_t = typename Parent::external_index_columns_t ;
17761771 using bindings_pack_t = decltype ([]<typename ... C>(framework::pack<C...>) -> framework::pack<typename C::binding_t ...> {}(external_index_columns_t {}));
1777- // static constexpr const std::array<TableRef, sizeof...(T)> originals{T::ref...};
17781772 static constexpr auto originals = Parent::originals;
17791773 using policy_t = IP ;
17801774 using parent_t = Parent;
@@ -1926,8 +1920,7 @@ class Table
19261920 using iterator_template = TableIteratorBase<IP , Parent, T...>;
19271921
19281922 template <typename IP , typename Parent>
1929- static consteval auto full_iter ()
1930- {
1923+ using iterator_template_o = decltype ([](){
19311924 if constexpr (sizeof ...(Ts) == 0 ) {
19321925 return iterator_template<IP , Parent>{};
19331926 } else {
@@ -1937,10 +1930,7 @@ class Table
19371930 return iterator_template<IP , Parent, Ts...>{};
19381931 }
19391932 }
1940- }
1941-
1942- template <typename IP , typename Parent>
1943- using iterator_template_o = decltype (full_iter<IP , Parent>());
1933+ }());
19441934
19451935 using iterator = iterator_template_o<DefaultIndexPolicy, table_t >;
19461936 using filtered_iterator = iterator_template_o<FilteredIndexPolicy, table_t >;
@@ -1954,6 +1944,26 @@ class Table
19541944 return []<typename ... C>(framework::pack<C...>) { return std::set{{C::hash...}}; }(columns_t {});
19551945 }
19561946
1947+ Table (o2::soa::ArrowTableRef tableRef)
1948+ : mTable (tableRef.tablePtr),
1949+ mOffset (tableRef.offset),
1950+ mEnd{tableRef.size }
1951+ {
1952+ if (mTable ->num_rows () == 0 ) {
1953+ for (size_t ci = 0 ; ci < framework::pack_size (columns_t {}); ++ci) {
1954+ mColumnChunks [ci] = nullptr ;
1955+ }
1956+ mBegin = mEnd ;
1957+ } else {
1958+ auto lookups = [this ]<typename ... C>(framework::pack<C...>) -> std::array<arrow::ChunkedArray*, framework::pack_size (columns_t {})> { return {lookupColumn<C>()...}; }(columns_t {});
1959+ for (size_t ci = 0 ; ci < framework::pack_size (columns_t {}); ++ci) {
1960+ mColumnChunks [ci] = lookups[ci];
1961+ }
1962+ mBegin = unfiltered_iterator{mColumnChunks , {mEnd .index , mOffset }};
1963+ mBegin .bindInternalIndices (this );
1964+ }
1965+ }
1966+
19571967 Table (std::shared_ptr<arrow::Table> table, uint64_t offset = 0 )
19581968 : mTable (table),
19591969 mOffset (offset),
0 commit comments