Skip to content

Commit 360de51

Browse files
authored
Fix Partition<Filtered>, add separate sliceByCached for joins, filtered and nested filtered (#8626)
* Introduce separate sliceByCached for joins, filtered, partitions. Fix sliceByCached for partitions. * Simplify logics * Nitpick * Lambda capture
1 parent b6c90b3 commit 360de51

1 file changed

Lines changed: 91 additions & 28 deletions

File tree

  • Framework/Core/include/Framework

Framework/Core/include/Framework/ASoA.h

Lines changed: 91 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -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

21312141
template <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

25262567
template <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

Comments
 (0)