15
15
// specific language governing permissions and limitations
16
16
// under the License.
17
17
18
- use iceberg:: spec:: { DataFile , DataFileFormat , FieldSummary , FormatVersion , Literal , Manifest , ManifestEntry , ManifestFile , ManifestList , ManifestStatus , PrimitiveLiteral , StructType , Type } ;
19
- use iceberg:: { Error , ErrorKind } ;
20
- use pyo3:: prelude:: * ;
21
- use pyo3:: types:: PyAny ;
22
18
use std:: collections:: HashMap ;
23
19
use std:: sync:: Arc ;
24
20
25
- # [ pyclass ]
26
- pub struct PyLiteral {
27
- inner : Literal ,
28
- }
29
-
21
+ use iceberg :: spec :: {
22
+ DataFile , DataFileFormat , FieldSummary , FormatVersion , Manifest , ManifestEntry , ManifestFile ,
23
+ ManifestList , ManifestStatus , PrimitiveLiteral ,
24
+ } ;
25
+ use pyo3 :: prelude :: * ;
30
26
31
27
#[ pyclass]
28
+ #[ allow( dead_code) ]
32
29
pub struct PyPrimitiveLiteral {
33
- inner : PrimitiveLiteral ,
30
+ inner : Option < PrimitiveLiteral > ,
34
31
}
35
32
36
-
37
33
#[ pyclass]
38
34
pub struct PyDataFile {
39
35
inner : DataFile ,
40
36
}
41
37
42
38
#[ pymethods]
43
39
impl PyDataFile {
44
-
45
40
#[ getter]
46
41
fn content ( & self ) -> i32 {
47
42
self . inner . content_type ( ) as i32
@@ -63,11 +58,14 @@ impl PyDataFile {
63
58
}
64
59
65
60
#[ getter]
66
- fn partition ( & self ) -> Vec < Option < PyLiteral > > {
67
- self . inner . partition ( ) . fields ( ) . iter ( ) . map ( |p| match p {
68
- Some ( lit) => Some ( PyLiteral { inner : lit. clone ( ) } ) ,
69
- _ => None
70
- } ) . collect ( )
61
+ fn partition ( & self ) -> Vec < PyPrimitiveLiteral > {
62
+ self . inner
63
+ . partition ( )
64
+ . iter ( )
65
+ . map ( |lit| PyPrimitiveLiteral {
66
+ inner : lit. map ( |l| l. as_primitive_literal ( ) . unwrap ( ) ) ,
67
+ } )
68
+ . collect ( )
71
69
}
72
70
73
71
#[ getter]
@@ -102,16 +100,24 @@ impl PyDataFile {
102
100
103
101
#[ getter]
104
102
fn upper_bounds ( & self ) -> HashMap < i32 , Vec < u8 > > {
105
- self . inner . upper_bounds ( ) . into_iter ( ) . map ( |( k, v) | ( k. clone ( ) , v. to_bytes ( ) . unwrap ( ) . to_vec ( ) ) ) . collect ( )
103
+ self . inner
104
+ . upper_bounds ( )
105
+ . iter ( )
106
+ . map ( |( k, v) | ( * k, v. to_bytes ( ) . unwrap ( ) . to_vec ( ) ) )
107
+ . collect ( )
106
108
}
107
109
108
110
#[ getter]
109
111
fn lower_bounds ( & self ) -> HashMap < i32 , Vec < u8 > > {
110
- self . inner . lower_bounds ( ) . into_iter ( ) . map ( |( k, v) | ( k. clone ( ) , v. to_bytes ( ) . unwrap ( ) . to_vec ( ) ) ) . collect ( )
112
+ self . inner
113
+ . lower_bounds ( )
114
+ . iter ( )
115
+ . map ( |( k, v) | ( * k, v. to_bytes ( ) . unwrap ( ) . to_vec ( ) ) )
116
+ . collect ( )
111
117
}
112
118
113
119
#[ getter]
114
- fn key_metadata ( & self ) -> Option < & [ u8 ] > {
120
+ fn key_metadata ( & self ) -> Option < & [ u8 ] > {
115
121
self . inner . key_metadata ( )
116
122
}
117
123
@@ -129,36 +135,37 @@ impl PyDataFile {
129
135
fn sort_order_id ( & self ) -> Option < i32 > {
130
136
self . inner . sort_order_id ( )
131
137
}
132
-
133
138
}
134
139
135
140
#[ pyclass]
136
141
pub struct PyManifest {
137
142
inner : Manifest ,
138
143
}
139
144
140
-
141
145
#[ pymethods]
142
146
impl PyManifest {
143
147
fn entries ( & self ) -> Vec < PyManifestEntry > {
144
148
// TODO: Most of the time, we're only interested in 'alive' entries,
145
149
// that are the ones that are either ADDED or EXISTING
146
150
// so we can add a boolean to skip the DELETED entries right away before
147
151
// moving it into the Python world
148
- self . inner . entries ( ) . iter ( ) . map ( |entry| PyManifestEntry { inner : entry. clone ( ) } ) . collect ( )
152
+ self . inner
153
+ . entries ( )
154
+ . iter ( )
155
+ . map ( |entry| PyManifestEntry {
156
+ inner : entry. clone ( ) ,
157
+ } )
158
+ . collect ( )
149
159
}
150
160
}
151
161
152
-
153
162
#[ pyclass]
154
163
pub struct PyFieldSummary {
155
164
inner : FieldSummary ,
156
165
}
157
166
158
-
159
167
#[ pymethods]
160
168
impl crate :: manifest:: PyFieldSummary {
161
-
162
169
#[ getter]
163
170
fn contains_null ( & self ) -> bool {
164
171
self . inner . contains_null
@@ -170,25 +177,21 @@ impl crate::manifest::PyFieldSummary {
170
177
}
171
178
172
179
#[ getter]
173
- fn lower_bound ( & self ) -> Option < PyPrimitiveLiteral > {
174
- self . inner . lower_bound . clone ( ) . map ( |v| PyPrimitiveLiteral { inner : v . literal ( ) . clone ( ) } )
180
+ fn lower_bound ( & self ) -> Option < Vec < u8 > > {
181
+ self . inner . lower_bound . clone ( ) . map ( |b| b . to_vec ( ) )
175
182
}
176
183
177
184
#[ getter]
178
- fn upper_bound ( & self ) -> Option < PyPrimitiveLiteral > {
179
- self . inner . upper_bound . clone ( ) . map ( |v| PyPrimitiveLiteral { inner : v . literal ( ) . clone ( ) } )
185
+ fn upper_bound ( & self ) -> Option < Vec < u8 > > {
186
+ self . inner . upper_bound . clone ( ) . map ( |b| b . to_vec ( ) )
180
187
}
181
-
182
-
183
-
184
188
}
185
189
186
190
#[ pyclass]
187
191
pub struct PyManifestFile {
188
192
inner : ManifestFile ,
189
193
}
190
194
191
-
192
195
#[ pymethods]
193
196
impl crate :: manifest:: PyManifestFile {
194
197
#[ getter]
@@ -214,7 +217,6 @@ impl crate::manifest::PyManifestFile {
214
217
self . inner . sequence_number
215
218
}
216
219
217
-
218
220
#[ getter]
219
221
fn min_sequence_number ( & self ) -> i64 {
220
222
self . inner . min_sequence_number
@@ -225,7 +227,6 @@ impl crate::manifest::PyManifestFile {
225
227
self . inner . added_snapshot_id
226
228
}
227
229
228
-
229
230
#[ getter]
230
231
fn added_files_count ( & self ) -> Option < u32 > {
231
232
self . inner . added_files_count
@@ -258,16 +259,19 @@ impl crate::manifest::PyManifestFile {
258
259
259
260
#[ getter]
260
261
fn partitions ( & self ) -> Vec < PyFieldSummary > {
261
- self . inner . partitions . iter ( ) . map ( |s| PyFieldSummary {
262
- inner : s. clone ( )
263
- } ) . collect ( )
262
+ self . inner
263
+ . partitions
264
+ . clone ( )
265
+ . unwrap ( )
266
+ . iter ( )
267
+ . map ( |s| PyFieldSummary { inner : s. clone ( ) } )
268
+ . collect ( )
264
269
}
265
270
266
271
#[ getter]
267
272
fn key_metadata ( & self ) -> Vec < u8 > {
268
273
self . inner . key_metadata . clone ( )
269
274
}
270
-
271
275
}
272
276
273
277
#[ pyclass]
@@ -277,7 +281,6 @@ pub struct PyManifestEntry {
277
281
278
282
#[ pymethods]
279
283
impl PyManifestEntry {
280
-
281
284
#[ getter]
282
285
fn status ( & self ) -> i32 {
283
286
ManifestStatus :: Existing as i32
@@ -301,17 +304,16 @@ impl PyManifestEntry {
301
304
#[ getter]
302
305
fn data_file ( & self ) -> PyDataFile {
303
306
PyDataFile {
304
- inner : self . inner . data_file . clone ( )
307
+ inner : self . inner . data_file . clone ( ) ,
305
308
}
306
309
}
307
310
}
308
311
309
-
310
312
#[ pyfunction]
311
313
pub fn read_manifest_entries ( bs : & [ u8 ] ) -> PyManifest {
312
314
// TODO: Some error handling
313
315
PyManifest {
314
- inner : Manifest :: parse_avro ( bs) . unwrap ( )
316
+ inner : Manifest :: parse_avro ( bs) . unwrap ( ) ,
315
317
}
316
318
}
317
319
@@ -320,19 +322,23 @@ pub struct PyManifestList {
320
322
inner : ManifestList ,
321
323
}
322
324
323
-
324
325
#[ pymethods]
325
326
impl crate :: manifest:: PyManifestList {
326
327
fn entries ( & self ) -> Vec < PyManifestFile > {
327
- self . inner . entries ( ) . iter ( ) . map ( |file| PyManifestFile { inner : file. clone ( ) } ) . collect ( )
328
+ self . inner
329
+ . entries ( )
330
+ . iter ( )
331
+ . map ( |file| PyManifestFile {
332
+ inner : file. clone ( ) ,
333
+ } )
334
+ . collect ( )
328
335
}
329
336
}
330
337
331
-
332
338
#[ pyfunction]
333
339
pub fn read_manifest_list ( bs : & [ u8 ] ) -> PyManifestList {
334
340
PyManifestList {
335
- inner : ManifestList :: parse_with_version ( bs, FormatVersion :: V2 ) . unwrap ( )
341
+ inner : ManifestList :: parse_with_version ( bs, FormatVersion :: V2 ) . unwrap ( ) ,
336
342
}
337
343
}
338
344
0 commit comments