@@ -53,7 +53,7 @@ impl Iterator for PyArrowBatchesAdapter {
53
53
54
54
fn next ( & mut self ) -> Option < Self :: Item > {
55
55
Python :: with_gil ( |py| {
56
- let mut batches: & PyIterator = self . batches . as_ref ( py) ;
56
+ let mut batches = self . batches . clone ( ) . into_bound ( py) ;
57
57
Some (
58
58
batches
59
59
. next ( ) ?
@@ -79,7 +79,7 @@ pub(crate) struct DatasetExec {
79
79
impl DatasetExec {
80
80
pub fn new (
81
81
py : Python ,
82
- dataset : & PyAny ,
82
+ dataset : & Bound < ' _ , PyAny > ,
83
83
projection : Option < Vec < usize > > ,
84
84
filters : & [ Expr ] ,
85
85
) -> Result < Self , DataFusionError > {
@@ -103,15 +103,15 @@ impl DatasetExec {
103
103
} )
104
104
. transpose ( ) ?;
105
105
106
- let kwargs = PyDict :: new ( py) ;
106
+ let kwargs = PyDict :: new_bound ( py) ;
107
107
108
108
kwargs. set_item ( "columns" , columns. clone ( ) ) ?;
109
109
kwargs. set_item (
110
110
"filter" ,
111
111
filter_expr. as_ref ( ) . map ( |expr| expr. clone_ref ( py) ) ,
112
112
) ?;
113
113
114
- let scanner = dataset. call_method ( "scanner" , ( ) , Some ( kwargs) ) ?;
114
+ let scanner = dataset. call_method ( "scanner" , ( ) , Some ( & kwargs) ) ?;
115
115
116
116
let schema = Arc :: new (
117
117
scanner
@@ -120,19 +120,17 @@ impl DatasetExec {
120
120
. 0 ,
121
121
) ;
122
122
123
- let builtins = Python :: import ( py, "builtins" ) ?;
123
+ let builtins = Python :: import_bound ( py, "builtins" ) ?;
124
124
let pylist = builtins. getattr ( "list" ) ?;
125
125
126
126
// Get the fragments or partitions of the dataset
127
- let fragments_iterator: & PyAny = dataset. call_method1 (
127
+ let fragments_iterator: Bound < ' _ , PyAny > = dataset. call_method1 (
128
128
"get_fragments" ,
129
129
( filter_expr. as_ref ( ) . map ( |expr| expr. clone_ref ( py) ) , ) ,
130
130
) ?;
131
131
132
- let fragments: & PyList = pylist
133
- . call1 ( ( fragments_iterator, ) ) ?
134
- . downcast ( )
135
- . map_err ( PyErr :: from) ?;
132
+ let fragments_iter = pylist. call1 ( ( fragments_iterator, ) ) ?;
133
+ let fragments = fragments_iter. downcast :: < PyList > ( ) . map_err ( PyErr :: from) ?;
136
134
137
135
let projected_statistics = Statistics :: new_unknown ( & schema) ;
138
136
let plan_properties = datafusion:: physical_plan:: PlanProperties :: new (
@@ -142,9 +140,9 @@ impl DatasetExec {
142
140
) ;
143
141
144
142
Ok ( DatasetExec {
145
- dataset : dataset. into ( ) ,
143
+ dataset : dataset. clone ( ) . unbind ( ) ,
146
144
schema,
147
- fragments : fragments. into ( ) ,
145
+ fragments : fragments. clone ( ) . unbind ( ) ,
148
146
columns,
149
147
filter_expr,
150
148
projected_statistics,
@@ -183,8 +181,8 @@ impl ExecutionPlan for DatasetExec {
183
181
) -> DFResult < SendableRecordBatchStream > {
184
182
let batch_size = context. session_config ( ) . batch_size ( ) ;
185
183
Python :: with_gil ( |py| {
186
- let dataset = self . dataset . as_ref ( py) ;
187
- let fragments = self . fragments . as_ref ( py) ;
184
+ let dataset = self . dataset . bind ( py) ;
185
+ let fragments = self . fragments . bind ( py) ;
188
186
let fragment = fragments
189
187
. get_item ( partition)
190
188
. map_err ( |err| InnerDataFusionError :: External ( Box :: new ( err) ) ) ?;
@@ -193,7 +191,7 @@ impl ExecutionPlan for DatasetExec {
193
191
let dataset_schema = dataset
194
192
. getattr ( "schema" )
195
193
. map_err ( |err| InnerDataFusionError :: External ( Box :: new ( err) ) ) ?;
196
- let kwargs = PyDict :: new ( py) ;
194
+ let kwargs = PyDict :: new_bound ( py) ;
197
195
kwargs
198
196
. set_item ( "columns" , self . columns . clone ( ) )
199
197
. map_err ( |err| InnerDataFusionError :: External ( Box :: new ( err) ) ) ?;
@@ -207,15 +205,15 @@ impl ExecutionPlan for DatasetExec {
207
205
. set_item ( "batch_size" , batch_size)
208
206
. map_err ( |err| InnerDataFusionError :: External ( Box :: new ( err) ) ) ?;
209
207
let scanner = fragment
210
- . call_method ( "scanner" , ( dataset_schema, ) , Some ( kwargs) )
208
+ . call_method ( "scanner" , ( dataset_schema, ) , Some ( & kwargs) )
211
209
. map_err ( |err| InnerDataFusionError :: External ( Box :: new ( err) ) ) ?;
212
210
let schema: SchemaRef = Arc :: new (
213
211
scanner
214
212
. getattr ( "projected_schema" )
215
213
. and_then ( |schema| Ok ( schema. extract :: < PyArrowType < _ > > ( ) ?. 0 ) )
216
214
. map_err ( |err| InnerDataFusionError :: External ( Box :: new ( err) ) ) ?,
217
215
) ;
218
- let record_batches: & PyIterator = scanner
216
+ let record_batches: Bound < ' _ , PyIterator > = scanner
219
217
. call_method0 ( "to_batches" )
220
218
. map_err ( |err| InnerDataFusionError :: External ( Box :: new ( err) ) ) ?
221
219
. iter ( )
@@ -264,7 +262,7 @@ impl ExecutionPlanProperties for DatasetExec {
264
262
impl DisplayAs for DatasetExec {
265
263
fn fmt_as ( & self , t : DisplayFormatType , f : & mut std:: fmt:: Formatter ) -> std:: fmt:: Result {
266
264
Python :: with_gil ( |py| {
267
- let number_of_fragments = self . fragments . as_ref ( py) . len ( ) ;
265
+ let number_of_fragments = self . fragments . bind ( py) . len ( ) ;
268
266
match t {
269
267
DisplayFormatType :: Default | DisplayFormatType :: Verbose => {
270
268
let projected_columns: Vec < String > = self
@@ -274,7 +272,7 @@ impl DisplayAs for DatasetExec {
274
272
. map ( |x| x. name ( ) . to_owned ( ) )
275
273
. collect ( ) ;
276
274
if let Some ( filter_expr) = & self . filter_expr {
277
- let filter_expr = filter_expr. as_ref ( py) . str ( ) . or ( Err ( std:: fmt:: Error ) ) ?;
275
+ let filter_expr = filter_expr. bind ( py) . str ( ) . or ( Err ( std:: fmt:: Error ) ) ?;
278
276
write ! (
279
277
f,
280
278
"DatasetExec: number_of_fragments={}, filter_expr={}, projection=[{}]" ,
0 commit comments