@@ -53,7 +53,7 @@ impl Iterator for PyArrowBatchesAdapter {
5353
5454 fn next ( & mut self ) -> Option < Self :: Item > {
5555 Python :: with_gil ( |py| {
56- let mut batches: & PyIterator = self . batches . as_ref ( py) ;
56+ let mut batches = self . batches . clone ( ) . into_bound ( py) ;
5757 Some (
5858 batches
5959 . next ( ) ?
@@ -79,7 +79,7 @@ pub(crate) struct DatasetExec {
7979impl DatasetExec {
8080 pub fn new (
8181 py : Python ,
82- dataset : & PyAny ,
82+ dataset : & Bound < ' _ , PyAny > ,
8383 projection : Option < Vec < usize > > ,
8484 filters : & [ Expr ] ,
8585 ) -> Result < Self , DataFusionError > {
@@ -103,15 +103,15 @@ impl DatasetExec {
103103 } )
104104 . transpose ( ) ?;
105105
106- let kwargs = PyDict :: new ( py) ;
106+ let kwargs = PyDict :: new_bound ( py) ;
107107
108108 kwargs. set_item ( "columns" , columns. clone ( ) ) ?;
109109 kwargs. set_item (
110110 "filter" ,
111111 filter_expr. as_ref ( ) . map ( |expr| expr. clone_ref ( py) ) ,
112112 ) ?;
113113
114- let scanner = dataset. call_method ( "scanner" , ( ) , Some ( kwargs) ) ?;
114+ let scanner = dataset. call_method ( "scanner" , ( ) , Some ( & kwargs) ) ?;
115115
116116 let schema = Arc :: new (
117117 scanner
@@ -120,19 +120,17 @@ impl DatasetExec {
120120 . 0 ,
121121 ) ;
122122
123- let builtins = Python :: import ( py, "builtins" ) ?;
123+ let builtins = Python :: import_bound ( py, "builtins" ) ?;
124124 let pylist = builtins. getattr ( "list" ) ?;
125125
126126 // 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 (
128128 "get_fragments" ,
129129 ( filter_expr. as_ref ( ) . map ( |expr| expr. clone_ref ( py) ) , ) ,
130130 ) ?;
131131
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) ?;
136134
137135 let projected_statistics = Statistics :: new_unknown ( & schema) ;
138136 let plan_properties = datafusion:: physical_plan:: PlanProperties :: new (
@@ -142,9 +140,9 @@ impl DatasetExec {
142140 ) ;
143141
144142 Ok ( DatasetExec {
145- dataset : dataset. into ( ) ,
143+ dataset : dataset. clone ( ) . unbind ( ) ,
146144 schema,
147- fragments : fragments. into ( ) ,
145+ fragments : fragments. clone ( ) . unbind ( ) ,
148146 columns,
149147 filter_expr,
150148 projected_statistics,
@@ -183,8 +181,8 @@ impl ExecutionPlan for DatasetExec {
183181 ) -> DFResult < SendableRecordBatchStream > {
184182 let batch_size = context. session_config ( ) . batch_size ( ) ;
185183 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) ;
188186 let fragment = fragments
189187 . get_item ( partition)
190188 . map_err ( |err| InnerDataFusionError :: External ( Box :: new ( err) ) ) ?;
@@ -193,7 +191,7 @@ impl ExecutionPlan for DatasetExec {
193191 let dataset_schema = dataset
194192 . getattr ( "schema" )
195193 . map_err ( |err| InnerDataFusionError :: External ( Box :: new ( err) ) ) ?;
196- let kwargs = PyDict :: new ( py) ;
194+ let kwargs = PyDict :: new_bound ( py) ;
197195 kwargs
198196 . set_item ( "columns" , self . columns . clone ( ) )
199197 . map_err ( |err| InnerDataFusionError :: External ( Box :: new ( err) ) ) ?;
@@ -207,15 +205,15 @@ impl ExecutionPlan for DatasetExec {
207205 . set_item ( "batch_size" , batch_size)
208206 . map_err ( |err| InnerDataFusionError :: External ( Box :: new ( err) ) ) ?;
209207 let scanner = fragment
210- . call_method ( "scanner" , ( dataset_schema, ) , Some ( kwargs) )
208+ . call_method ( "scanner" , ( dataset_schema, ) , Some ( & kwargs) )
211209 . map_err ( |err| InnerDataFusionError :: External ( Box :: new ( err) ) ) ?;
212210 let schema: SchemaRef = Arc :: new (
213211 scanner
214212 . getattr ( "projected_schema" )
215213 . and_then ( |schema| Ok ( schema. extract :: < PyArrowType < _ > > ( ) ?. 0 ) )
216214 . map_err ( |err| InnerDataFusionError :: External ( Box :: new ( err) ) ) ?,
217215 ) ;
218- let record_batches: & PyIterator = scanner
216+ let record_batches: Bound < ' _ , PyIterator > = scanner
219217 . call_method0 ( "to_batches" )
220218 . map_err ( |err| InnerDataFusionError :: External ( Box :: new ( err) ) ) ?
221219 . iter ( )
@@ -264,7 +262,7 @@ impl ExecutionPlanProperties for DatasetExec {
264262impl DisplayAs for DatasetExec {
265263 fn fmt_as ( & self , t : DisplayFormatType , f : & mut std:: fmt:: Formatter ) -> std:: fmt:: Result {
266264 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 ( ) ;
268266 match t {
269267 DisplayFormatType :: Default | DisplayFormatType :: Verbose => {
270268 let projected_columns: Vec < String > = self
@@ -274,7 +272,7 @@ impl DisplayAs for DatasetExec {
274272 . map ( |x| x. name ( ) . to_owned ( ) )
275273 . collect ( ) ;
276274 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 ) ) ?;
278276 write ! (
279277 f,
280278 "DatasetExec: number_of_fragments={}, filter_expr={}, projection=[{}]" ,
0 commit comments