11#define __STDC_FORMAT_MACROS
22
3- #include " httplib.hpp"
43#include " rapi.hpp"
54#include " typesr.hpp"
65#include " reltoaltrep.hpp"
76#include " signal.hpp"
87#include " cpp11/declarations.hpp"
98
9+ #include " httplib.hpp"
1010#include < cinttypes>
1111
1212using namespace duckdb ;
@@ -85,8 +85,8 @@ struct AltrepRelationWrapper {
8585 return GetFromExternalPtr<AltrepRelationWrapper>(x);
8686 }
8787
88- AltrepRelationWrapper (duckdb::shared_ptr<Relation> rel_p , bool allow_materialization_)
89- : allow_materialization(allow_materialization_), rel(rel_p ) {
88+ AltrepRelationWrapper (rel_extptr_t rel_ , bool allow_materialization_)
89+ : allow_materialization(allow_materialization_), rel_eptr(rel_), rel(rel_->rel ) {
9090 }
9191
9292 bool HasQueryResult () const {
@@ -99,12 +99,15 @@ struct AltrepRelationWrapper {
9999 cpp11::stop (" Materialization is disabled, use collect() or as_tibble() to materialize" );
100100 }
101101
102- auto option = Rf_GetOption (RStrings::get ().materialize_sym , R_BaseEnv);
103- if (option != R_NilValue && !Rf_isNull (option) && LOGICAL_ELT (option, 0 ) == true ) {
104- Rprintf (" duckplyr: materializing, review details with duckplyr::last_rel()\n " );
102+ auto materialize_callback = Rf_GetOption (RStrings::get ().materialize_callback_sym , R_BaseEnv);
103+ if (Rf_isFunction (materialize_callback)) {
104+ sexp call = Rf_lang2 (materialize_callback, rel_eptr);
105+ Rf_eval (call, R_BaseEnv);
106+ }
107+ else if (Rf_isLogical (materialize_callback) && Rf_length (materialize_callback) == 1 && LOGICAL_ELT (materialize_callback, 0 ) == true ) {
108+ // Legacy
109+ Rprintf (" duckplyr: materializing\n " );
105110 }
106-
107- last_rel = rel;
108111
109112 ScopedInterruptHandler signal_handler (rel->context .GetContext ());
110113
@@ -142,14 +145,11 @@ struct AltrepRelationWrapper {
142145
143146 bool allow_materialization;
144147
148+ rel_extptr_t rel_eptr;
145149 duckdb::shared_ptr<Relation> rel;
146150 duckdb::unique_ptr<QueryResult> res;
147-
148- static duckdb::shared_ptr<Relation> last_rel;
149151};
150152
151- duckdb::shared_ptr<Relation> AltrepRelationWrapper::last_rel;
152-
153153struct AltrepRownamesWrapper {
154154
155155 AltrepRownamesWrapper (duckdb::shared_ptr<AltrepRelationWrapper> rel_p) : rel(rel_p) {
@@ -338,17 +338,12 @@ static R_altrep_class_t LogicalTypeToAltrepType(const LogicalType &type) {
338338 }
339339}
340340
341- [[cpp11::register ]] SEXP rapi_get_last_rel () {
342- auto last_rel = AltrepRelationWrapper::last_rel;
343- return sexp (make_external_prot<RelationWrapper>(" duckdb_relation" , R_NilValue, std::move (last_rel)));
344- }
345-
346341[[cpp11::register ]] SEXP rapi_rel_to_altrep (duckdb::rel_extptr_t rel, bool allow_materialization) {
347342 D_ASSERT (rel && rel->rel );
348343 auto drel = rel->rel ;
349344 auto ncols = drel->Columns ().size ();
350345
351- auto relation_wrapper = make_shared_ptr<AltrepRelationWrapper>(drel , allow_materialization);
346+ auto relation_wrapper = make_shared_ptr<AltrepRelationWrapper>(rel , allow_materialization);
352347
353348 cpp11::writable::list data_frame;
354349 data_frame.reserve (ncols);
0 commit comments