Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
33 changes: 11 additions & 22 deletions Framework/Core/include/Framework/TableBuilder.h
Original file line number Diff line number Diff line change
Expand Up @@ -556,6 +556,8 @@ struct HolderTrait<int64_t> {
/// to build an arrow::Table from a TDataFrame.
class TableBuilder
{
static void throwError(RuntimeErrorRef const& ref);

template <typename... ARGS>
using HoldersTuple = typename std::tuple<typename HolderTrait<ARGS>::Holder...>;

Expand All @@ -567,17 +569,7 @@ class TableBuilder
return (HoldersTuple<ARGS...>*)mHolders;
}

template <typename... ARGS>
void validate(std::vector<std::string> const& columnNames)
{
constexpr int nColumns = sizeof...(ARGS);
if (nColumns != columnNames.size()) {
throw runtime_error("Mismatching number of column types and names");
}
if (mHolders != nullptr) {
throw runtime_error("TableBuilder::persist can only be invoked once per instance");
}
}
void validate(const int nColumns, std::vector<std::string> const& columnNames) const;

template <typename... ARGS>
auto makeBuilders(std::vector<std::string> const& columnNames, size_t nRows)
Expand All @@ -595,11 +587,8 @@ class TableBuilder
template <typename... ARGS>
auto makeFinalizer()
{
mFinalizer = [schema = mSchema, &arrays = mArrays, holders = mHolders]() -> void {
auto status = TableBuilderHelpers::finalize(arrays, *(HoldersTuple<ARGS...>*)holders, std::make_index_sequence<sizeof...(ARGS)>{});
if (status == false) {
throw runtime_error("Unable to finalize");
}
mFinalizer = [schema = mSchema, &arrays = mArrays, holders = mHolders]() -> bool {
return TableBuilderHelpers::finalize(arrays, *(HoldersTuple<ARGS...>*)holders, std::make_index_sequence<sizeof...(ARGS)>{});
};
}

Expand Down Expand Up @@ -650,7 +639,7 @@ class TableBuilder
auto persistTuple(framework::pack<ARGS...>, std::vector<std::string> const& columnNames)
{
constexpr int nColumns = sizeof...(ARGS);
validate<ARGS...>(columnNames);
validate(nColumns, columnNames);
mArrays.resize(nColumns);
makeBuilders<ARGS...>(columnNames, 1000);
makeFinalizer<ARGS...>();
Expand All @@ -660,7 +649,7 @@ class TableBuilder
return [holders = mHolders](unsigned int slot, FillTuple const& t) -> void {
auto status = TableBuilderHelpers::append(*(HoldersTuple<ARGS...>*)holders, std::index_sequence_for<ARGS...>{}, t);
if (status == false) {
throw runtime_error("Unable to append");
throwError(runtime_error("Unable to append"));
}
};
}
Expand All @@ -687,7 +676,7 @@ class TableBuilder
auto preallocatedPersist(std::vector<std::string> const& columnNames, int nRows)
{
constexpr int nColumns = sizeof...(ARGS);
validate<ARGS...>(columnNames);
validate(nColumns, columnNames);
mArrays.resize(nColumns);
makeBuilders<ARGS...>(columnNames, nRows);
makeFinalizer<ARGS...>();
Expand All @@ -702,7 +691,7 @@ class TableBuilder
auto bulkPersist(std::vector<std::string> const& columnNames, size_t nRows)
{
constexpr int nColumns = sizeof...(ARGS);
validate<ARGS...>(columnNames);
validate(nColumns, columnNames);
mArrays.resize(nColumns);
makeBuilders<ARGS...>(columnNames, nRows);
makeFinalizer<ARGS...>();
Expand All @@ -716,7 +705,7 @@ class TableBuilder
auto bulkPersistChunked(std::vector<std::string> const& columnNames, size_t nRows)
{
constexpr int nColumns = sizeof...(ARGS);
validate<ARGS...>(columnNames);
validate(nColumns, columnNames);
mArrays.resize(nColumns);
makeBuilders<ARGS...>(columnNames, nRows);
makeFinalizer<ARGS...>();
Expand Down Expand Up @@ -764,7 +753,7 @@ class TableBuilder
return this->template persist<E>(columnNames);
}

std::function<void(void)> mFinalizer;
std::function<bool(void)> mFinalizer;
void* mHolders;
arrow::MemoryPool* mMemoryPool;
std::shared_ptr<arrow::Schema> mSchema;
Expand Down
20 changes: 19 additions & 1 deletion Framework/Core/src/TableBuilder.cxx
Original file line number Diff line number Diff line change
Expand Up @@ -50,9 +50,27 @@ namespace o2::framework
std::shared_ptr<arrow::Table>
TableBuilder::finalize()
{
mFinalizer();
bool status = mFinalizer();
if (status == false) {
throwError(runtime_error("Unable to finalize"));
}
assert(mSchema->num_fields() > 0 && "Schema needs to be non-empty");
return arrow::Table::Make(mSchema, mArrays);
}

void TableBuilder::throwError(RuntimeErrorRef const& ref)
{
throw ref;
}

void TableBuilder::validate(const int nColumns, std::vector<std::string> const& columnNames) const
{
if (nColumns != columnNames.size()) {
throwError(runtime_error("Mismatching number of column types and names"));
}
if (mHolders != nullptr) {
throwError(runtime_error("TableBuilder::persist can only be invoked once per instance"));
}
}

} // namespace o2::framework