@@ -1189,14 +1189,12 @@ class Table
11891189 {
11901190 uint64_t offset = 0 ;
11911191 std::shared_ptr<arrow::Table> result = nullptr ;
1192- auto status = this ->getSliceFor (value, node.name .c_str (), result, offset);
1193- if (status.ok ()) {
1194- auto t = table_t ({result}, offset);
1195- copyIndexBindings (t);
1196- return t;
1192+ if (!this ->getSliceFor (value, node.name .c_str (), result, offset).ok ()) {
1193+ o2::framework::throw_error (o2::framework::runtime_error (" Failed to slice table" ));
11971194 }
1198- o2::framework::throw_error (o2::framework::runtime_error (" Failed to slice table" ));
1199- O2_BUILTIN_UNREACHABLE ();
1195+ auto t = table_t ({result}, offset);
1196+ copyIndexBindings (t);
1197+ return t;
12001198 }
12011199
12021200 auto sliceBy (framework::expressions::BindingNode const & node, int value) const
@@ -2126,6 +2124,18 @@ struct Join : JoinBase<Ts...> {
21262124 using const_iterator = iterator;
21272125 using filtered_iterator = typename table_t ::template RowViewFiltered<Join<Ts...>, Ts...>;
21282126 using filtered_const_iterator = filtered_iterator;
2127+
2128+ auto sliceByCached (framework::expressions::BindingNode const & node, int value)
2129+ {
2130+ uint64_t offset = 0 ;
2131+ std::shared_ptr<arrow::Table> result = nullptr ;
2132+ if (!this ->getSliceFor (value, node.name .c_str (), result, offset).ok ()) {
2133+ o2::framework::throw_error (o2::framework::runtime_error (" Failed to slice table" ));
2134+ }
2135+ auto t = Join<Ts...>({result}, offset);
2136+ this ->copyIndexBindings (t);
2137+ return t;
2138+ }
21292139};
21302140
21312141template <typename ... Ts>
@@ -2318,23 +2328,26 @@ class FilteredBase : public T
23182328 {
23192329 uint64_t offset = 0 ;
23202330 std::shared_ptr<arrow::Table> result = nullptr ;
2321- auto status = ((table_t *)this )->getSliceFor (value, node.name .c_str (), result, offset);
2322- if (status.ok ()) {
2323- auto start = offset;
2324- auto end = start + result->num_rows ();
2325- auto start_iterator = std::lower_bound (mSelectedRows .begin (), mSelectedRows .end (), start);
2326- auto stop_iterator = std::lower_bound (start_iterator, mSelectedRows .end (), end);
2327- SelectionVector slicedSelection{start_iterator, stop_iterator};
2328- std::transform (slicedSelection.begin (), slicedSelection.end (), slicedSelection.begin (),
2329- [&](int64_t idx) {
2330- return idx - static_cast <int64_t >(start);
2331- });
2332- self_t fresult{{result}, std::move (slicedSelection), start};
2333- copyIndexBindings (fresult);
2331+ if (!((table_t *)this )->getSliceFor (value, node.name .c_str (), result, offset).ok ()) {
2332+ o2::framework::throw_error (o2::framework::runtime_error (" Failed to slice table" ));
2333+ }
2334+ if (offset >= this ->tableSize ()) {
2335+ self_t fresult{{result}, SelectionVector{}, 0 }; // empty slice
2336+ this ->copyIndexBindings (fresult);
23342337 return fresult;
23352338 }
2336- o2::framework::throw_error (o2::framework::runtime_error (" Failed to slice table" ));
2337- O2_BUILTIN_UNREACHABLE ();
2339+ auto start = offset;
2340+ auto end = start + result->num_rows ();
2341+ auto start_iterator = std::lower_bound (mSelectedRows .begin (), mSelectedRows .end (), start);
2342+ auto stop_iterator = std::lower_bound (start_iterator, mSelectedRows .end (), end);
2343+ SelectionVector slicedSelection{start_iterator, stop_iterator};
2344+ std::transform (slicedSelection.begin (), slicedSelection.end (), slicedSelection.begin (),
2345+ [&start](int64_t idx) {
2346+ return idx - static_cast <int64_t >(start);
2347+ });
2348+ self_t fresult{{result}, std::move (slicedSelection), start};
2349+ copyIndexBindings (fresult);
2350+ return fresult;
23382351 }
23392352
23402353 auto sliceBy (framework::expressions::BindingNode const & node, int value) const
@@ -2440,6 +2453,8 @@ class Filtered : public FilteredBase<T>
24402453{
24412454 public:
24422455 using self_t = Filtered<T>;
2456+ using table_t = typename FilteredBase<T>::table_t ;
2457+
24432458 Filtered (std::vector<std::shared_ptr<arrow::Table>>&& tables, gandiva::Selection const & selection, uint64_t offset = 0 )
24442459 : FilteredBase<T>(std::move(tables), selection, offset) {}
24452460
@@ -2520,7 +2535,33 @@ class Filtered : public FilteredBase<T>
25202535 {
25212536 return operator *=(other.getSelectedRows ());
25222537 }
2523- using FilteredBase<T>::sliceByCached;
2538+
2539+ auto sliceByCached (framework::expressions::BindingNode const & node, int value)
2540+ {
2541+ uint64_t offset = 0 ;
2542+ std::shared_ptr<arrow::Table> result = nullptr ;
2543+ if (!((table_t *)this )->getSliceFor (value, node.name .c_str (), result, offset).ok ()) {
2544+ o2::framework::throw_error (o2::framework::runtime_error (" Failed to slice table" ));
2545+ }
2546+ if (offset >= this ->tableSize ()) {
2547+ self_t fresult{{result}, SelectionVector{}, 0 }; // empty slice
2548+ this ->copyIndexBindings (fresult);
2549+ return fresult;
2550+ }
2551+ auto start = offset;
2552+ auto end = start + result->num_rows ();
2553+ auto start_iterator = std::lower_bound (this ->getSelectedRows ().begin (), this ->getSelectedRows ().end (), start);
2554+ auto stop_iterator = std::lower_bound (start_iterator, this ->getSelectedRows ().end (), end);
2555+ SelectionVector slicedSelection{start_iterator, stop_iterator};
2556+ std::transform (slicedSelection.begin (), slicedSelection.end (), slicedSelection.begin (),
2557+ [&start](int64_t idx) {
2558+ return idx - static_cast <int64_t >(start);
2559+ });
2560+ auto slicedSize = slicedSelection.size ();
2561+ self_t fresult{{result}, std::move (slicedSelection), start};
2562+ this ->copyIndexBindings (fresult);
2563+ return fresult;
2564+ }
25242565};
25252566
25262567template <typename T>
@@ -2531,23 +2572,23 @@ class Filtered<Filtered<T>> : public FilteredBase<typename T::table_t>
25312572 using table_t = typename FilteredBase<typename T::table_t >::table_t ;
25322573
25332574 Filtered (std::vector<Filtered<T>>&& tables, gandiva::Selection const & selection, uint64_t offset = 0 )
2534- : FilteredBase<typename T::table_t >(std::move(extractTablesFromFiltered(std::move( tables) )), selection, offset)
2575+ : FilteredBase<typename T::table_t >(std::move(extractTablesFromFiltered(tables)), selection, offset)
25352576 {
25362577 for (auto & table : tables) {
25372578 *this *= table;
25382579 }
25392580 }
25402581
25412582 Filtered (std::vector<Filtered<T>>&& tables, SelectionVector&& selection, uint64_t offset = 0 )
2542- : FilteredBase<typename T::table_t >(std::move(extractTablesFromFiltered(std::move( tables) )), std::forward<SelectionVector>(selection), offset)
2583+ : FilteredBase<typename T::table_t >(std::move(extractTablesFromFiltered(tables)), std::forward<SelectionVector>(selection), offset)
25432584 {
25442585 for (auto & table : tables) {
25452586 *this *= table;
25462587 }
25472588 }
25482589
25492590 Filtered (std::vector<Filtered<T>>&& tables, gsl::span<int64_t const > const & selection, uint64_t offset = 0 )
2550- : FilteredBase<typename T::table_t >(std::move(extractTablesFromFiltered(std::move( tables) )), selection, offset)
2591+ : FilteredBase<typename T::table_t >(std::move(extractTablesFromFiltered(tables)), selection, offset)
25512592 {
25522593 for (auto & table : tables) {
25532594 *this *= table;
@@ -2626,10 +2667,32 @@ class Filtered<Filtered<T>> : public FilteredBase<typename T::table_t>
26262667 return operator *=(other.getSelectedRows ());
26272668 }
26282669
2629- using FilteredBase<typename T::table_t >::sliceByCached;
2670+ auto sliceByCached (framework::expressions::BindingNode const & node, int value)
2671+ {
2672+ uint64_t offset = 0 ;
2673+ std::shared_ptr<arrow::Table> result = nullptr ;
2674+ if (!((table_t *)this )->getSliceFor (value, node.name .c_str (), result, offset).ok ()) {
2675+ o2::framework::throw_error (o2::framework::runtime_error (" Failed to slice table" ));
2676+ }
2677+ auto start = offset;
2678+ auto end = start + result->num_rows ();
2679+ auto start_iterator = std::lower_bound (this ->getSelectedRows ().begin (), this ->getSelectedRows ().end (), start);
2680+ auto stop_iterator = std::lower_bound (start_iterator, this ->getSelectedRows ().end (), end);
2681+ SelectionVector slicedSelection{start_iterator, stop_iterator};
2682+ std::transform (slicedSelection.begin (), slicedSelection.end (), slicedSelection.begin (),
2683+ [&start](int64_t idx) {
2684+ return idx - static_cast <int64_t >(start);
2685+ });
2686+ SelectionVector copy = slicedSelection;
2687+ Filtered<T> filteredTable{{result}, std::move (slicedSelection), start};
2688+ std::vector<Filtered<T>> filtered{filteredTable};
2689+ self_t fresult{std::move (filtered), std::move (copy), start};
2690+ this ->copyIndexBindings (fresult);
2691+ return fresult;
2692+ }
26302693
26312694 private:
2632- std::vector<std::shared_ptr<arrow::Table>> extractTablesFromFiltered (std::vector<Filtered<T>>&& tables)
2695+ std::vector<std::shared_ptr<arrow::Table>> extractTablesFromFiltered (std::vector<Filtered<T>>& tables)
26332696 {
26342697 std::vector<std::shared_ptr<arrow::Table>> outTables;
26352698 for (auto & table : tables) {
0 commit comments