diff --git a/.github/workflows/reusable-test.yml b/.github/workflows/reusable-test.yml index afc5e84f4c..88313c330e 100644 --- a/.github/workflows/reusable-test.yml +++ b/.github/workflows/reusable-test.yml @@ -307,7 +307,7 @@ jobs: create-args: >- python=3.14 numpy - root=6.36.06 + root - name: Generate build files run: pipx run nox -s prepare -- --headers --signatures --tests diff --git a/src/awkward/_connect/rdataframe/to_rdataframe.py b/src/awkward/_connect/rdataframe/to_rdataframe.py index 51ddf0cabc..a910ae20c2 100644 --- a/src/awkward/_connect/rdataframe/to_rdataframe.py +++ b/src/awkward/_connect/rdataframe/to_rdataframe.py @@ -54,7 +54,7 @@ def class_type(self): def data_frame(self, layouts): cpp_code_declare_slots = "" - cpp_code_define_readers = "" + cpp_code_retrieve_col_reader = "" cpp_code_column_names = "" cpp_code_column_type_names = "" cpp_code_column_types_map = "" @@ -64,6 +64,8 @@ def data_frame(self, layouts): k = 0 + array_data_source = self.class_type() + for key in layouts: self.generators[key] = ak._connect.cling.togenerator( layouts[key].form, flatlist_as_rvec=self.flatlist_as_rvec @@ -136,18 +138,17 @@ def data_frame(self, layouts): """ ) - cpp_code_define_readers = ( - cpp_code_define_readers + cpp_code_retrieve_col_reader = ( + cpp_code_retrieve_col_reader + f""" - if (name == "{key}") {{ - for (auto i : ROOT::TSeqU(fNSlots)) {{ - addrs_{key}[i] = &slots_{key}[i]; - reader.emplace_back((void *)(&addrs_{key}[i])); - }} - }} - """ + if (colName == "{key}") {{ + + addrs_{key}[slot] = &slots_{key}[slot]; + return std::make_unique<{array_data_source}_column_reader>(addrs_{key}[slot]); + }} + """ ) - cpp_code_define_readers = cpp_code_define_readers + "else " + cpp_code_retrieve_col_reader += "else " cpp_code_column_names = ( cpp_code_column_names @@ -198,8 +199,6 @@ def data_frame(self, layouts): cpp_code_column_type_names = cpp_code_column_type_names + ", " cpp_code_column_types_map = cpp_code_column_types_map + ", " - array_data_source = self.class_type() - if self.use_cached: cpp_code = cache.get(array_data_source) else: @@ -212,9 +211,18 @@ def data_frame(self, layouts): ) if cpp_code is None: + err_col_not_found = r'throw std::runtime_error("Could not find column \"" + std::string(colName) + "\" in the available columns.");' cpp_code = f""" namespace awkward {{ + class {array_data_source}_column_reader final : public ROOT::Detail::RDF::RColumnReaderBase {{ + void *fValuePtr; + void *GetImpl(Long64_t) final {{ return fValuePtr; }} + + public: + {array_data_source}_column_reader(void *valuePtr) : fValuePtr(valuePtr) {{}} + }}; + class {array_data_source} final : public ROOT::RDF::RDataSource {{ private: @@ -232,15 +240,7 @@ class {array_data_source} final Record_t GetColumnReadersImpl(std::string_view name, const std::type_info &id) {{ - Record_t reader; - - {cpp_code_define_readers} - {{ - for (auto i : ROOT::TSeqU(fNSlots)) {{ - reader.emplace_back(nullptr); - }} - }} - return reader; + return {{}}; }} public: @@ -307,6 +307,13 @@ class {array_data_source} final return true; }} + std::unique_ptr + GetColumnReaders(unsigned int slot, std::string_view colName, const std::type_info &tid) final + {{ + {cpp_code_retrieve_col_reader} + + {err_col_not_found} + }} }}; ROOT::RDataFrame* MakeAwkwardArrayDS_{array_data_source}(PyObject* lookup, ULong64_t size, std::initializer_list ptrs_list) {{