@@ -52,85 +52,6 @@ pub struct VariantArray {
52
52
shredding_state : ShreddingState ,
53
53
}
54
54
55
- /// Variant arrays can be shredded in one of three states, encoded here
56
- #[ derive( Debug ) ]
57
- pub enum ShreddingState {
58
- /// This variant has no typed_value field
59
- Unshredded {
60
- metadata : BinaryViewArray ,
61
- value : BinaryViewArray ,
62
- } ,
63
- /// This variant has a typed_value field and no value field
64
- /// meaning it is fully shredded (aka the value is stored in typed_value)
65
- FullyShredded {
66
- metadata : BinaryViewArray ,
67
- typed_value : ArrayRef ,
68
- } ,
69
- /// This variant has both a value field and a typed_value field
70
- /// meaning it is partially shredded: first the typed_value is used, and
71
- /// if that is null, the value field is used.
72
- PartiallyShredded {
73
- metadata : BinaryViewArray ,
74
- value : BinaryViewArray ,
75
- typed_value : ArrayRef ,
76
- } ,
77
- }
78
-
79
- impl ShreddingState {
80
- /// Return a reference to the metadata field
81
- pub fn metadata_field ( & self ) -> & BinaryViewArray {
82
- match self {
83
- ShreddingState :: Unshredded { metadata, .. } => metadata,
84
- ShreddingState :: FullyShredded { metadata, .. } => metadata,
85
- ShreddingState :: PartiallyShredded { metadata, .. } => metadata,
86
- }
87
- }
88
-
89
- /// Return a reference to the value field, if present
90
- pub fn value_field ( & self ) -> Option < & BinaryViewArray > {
91
- match self {
92
- ShreddingState :: Unshredded { value, .. } => Some ( value) ,
93
- ShreddingState :: FullyShredded { .. } => None ,
94
- ShreddingState :: PartiallyShredded { value, .. } => Some ( value) ,
95
- }
96
- }
97
-
98
- /// Return a reference to the typed_value field, if present
99
- pub fn typed_value_field ( & self ) -> Option < & ArrayRef > {
100
- match self {
101
- ShreddingState :: Unshredded { .. } => None ,
102
- ShreddingState :: FullyShredded { typed_value, .. } => Some ( typed_value) ,
103
- ShreddingState :: PartiallyShredded { typed_value, .. } => Some ( typed_value) ,
104
- }
105
- }
106
-
107
- /// Slice all the underlying arrays
108
- pub fn slice ( & self , offset : usize , length : usize ) -> Self {
109
- match self {
110
- ShreddingState :: Unshredded { metadata, value } => ShreddingState :: Unshredded {
111
- metadata : metadata. slice ( offset, length) ,
112
- value : value. slice ( offset, length) ,
113
- } ,
114
- ShreddingState :: FullyShredded {
115
- metadata,
116
- typed_value,
117
- } => ShreddingState :: FullyShredded {
118
- metadata : metadata. slice ( offset, length) ,
119
- typed_value : typed_value. slice ( offset, length) ,
120
- } ,
121
- ShreddingState :: PartiallyShredded {
122
- metadata,
123
- value,
124
- typed_value,
125
- } => ShreddingState :: PartiallyShredded {
126
- metadata : metadata. slice ( offset, length) ,
127
- value : value. slice ( offset, length) ,
128
- typed_value : typed_value. slice ( offset, length) ,
129
- } ,
130
- }
131
- }
132
- }
133
-
134
55
impl VariantArray {
135
56
/// Creates a new `VariantArray` from a [`StructArray`].
136
57
///
@@ -200,27 +121,8 @@ impl VariantArray {
200
121
201
122
// Note these clones are cheap, they just bump the ref count
202
123
let inner = inner. clone ( ) ;
203
- let metadata = metadata. clone ( ) ;
204
- let value = value. cloned ( ) ;
205
- let typed_value = typed_value. cloned ( ) ;
206
-
207
- let shredding_state = match ( metadata, value, typed_value) {
208
- ( metadata, Some ( value) , Some ( typed_value) ) => ShreddingState :: PartiallyShredded {
209
- metadata,
210
- value,
211
- typed_value,
212
- } ,
213
- ( metadata, Some ( value) , None ) => ShreddingState :: Unshredded { metadata, value } ,
214
- ( metadata, None , Some ( typed_value) ) => ShreddingState :: FullyShredded {
215
- metadata,
216
- typed_value,
217
- } ,
218
- ( _metadata_field, None , None ) => {
219
- return Err ( ArrowError :: InvalidArgumentError ( String :: from (
220
- "VariantArray has neither value nor typed_value field" ,
221
- ) ) ) ;
222
- }
223
- } ;
124
+ let shredding_state =
125
+ ShreddingState :: try_new ( metadata. clone ( ) , value. cloned ( ) , typed_value. cloned ( ) ) ?;
224
126
225
127
Ok ( Self {
226
128
inner,
@@ -308,6 +210,108 @@ impl VariantArray {
308
210
}
309
211
}
310
212
213
+ /// Variant arrays can be shredded in one of three states, encoded here
214
+ #[ derive( Debug ) ]
215
+ pub enum ShreddingState {
216
+ /// This variant has no typed_value field
217
+ Unshredded {
218
+ metadata : BinaryViewArray ,
219
+ value : BinaryViewArray ,
220
+ } ,
221
+ /// This variant has a typed_value field and no value field
222
+ /// meaning it is fully shredded (aka the value is stored in typed_value)
223
+ FullyShredded {
224
+ metadata : BinaryViewArray ,
225
+ typed_value : ArrayRef ,
226
+ } ,
227
+ /// This variant has both a value field and a typed_value field
228
+ /// meaning it is partially shredded: first the typed_value is used, and
229
+ /// if that is null, the value field is used.
230
+ PartiallyShredded {
231
+ metadata : BinaryViewArray ,
232
+ value : BinaryViewArray ,
233
+ typed_value : ArrayRef ,
234
+ } ,
235
+ }
236
+
237
+ impl ShreddingState {
238
+ /// try to create a new `ShreddingState` from the given fields
239
+ pub fn try_new (
240
+ metadata : BinaryViewArray ,
241
+ value : Option < BinaryViewArray > ,
242
+ typed_value : Option < ArrayRef > ,
243
+ ) -> Result < Self , ArrowError > {
244
+ match ( metadata, value, typed_value) {
245
+ ( metadata, Some ( value) , Some ( typed_value) ) => Ok ( Self :: PartiallyShredded {
246
+ metadata,
247
+ value,
248
+ typed_value,
249
+ } ) ,
250
+ ( metadata, Some ( value) , None ) => Ok ( Self :: Unshredded { metadata, value } ) ,
251
+ ( metadata, None , Some ( typed_value) ) => Ok ( Self :: FullyShredded {
252
+ metadata,
253
+ typed_value,
254
+ } ) ,
255
+ ( _metadata_field, None , None ) => Err ( ArrowError :: InvalidArgumentError ( String :: from (
256
+ "VariantArray has neither value nor typed_value field" ,
257
+ ) ) ) ,
258
+ }
259
+ }
260
+
261
+ /// Return a reference to the metadata field
262
+ pub fn metadata_field ( & self ) -> & BinaryViewArray {
263
+ match self {
264
+ ShreddingState :: Unshredded { metadata, .. } => metadata,
265
+ ShreddingState :: FullyShredded { metadata, .. } => metadata,
266
+ ShreddingState :: PartiallyShredded { metadata, .. } => metadata,
267
+ }
268
+ }
269
+
270
+ /// Return a reference to the value field, if present
271
+ pub fn value_field ( & self ) -> Option < & BinaryViewArray > {
272
+ match self {
273
+ ShreddingState :: Unshredded { value, .. } => Some ( value) ,
274
+ ShreddingState :: FullyShredded { .. } => None ,
275
+ ShreddingState :: PartiallyShredded { value, .. } => Some ( value) ,
276
+ }
277
+ }
278
+
279
+ /// Return a reference to the typed_value field, if present
280
+ pub fn typed_value_field ( & self ) -> Option < & ArrayRef > {
281
+ match self {
282
+ ShreddingState :: Unshredded { .. } => None ,
283
+ ShreddingState :: FullyShredded { typed_value, .. } => Some ( typed_value) ,
284
+ ShreddingState :: PartiallyShredded { typed_value, .. } => Some ( typed_value) ,
285
+ }
286
+ }
287
+
288
+ /// Slice all the underlying arrays
289
+ pub fn slice ( & self , offset : usize , length : usize ) -> Self {
290
+ match self {
291
+ ShreddingState :: Unshredded { metadata, value } => ShreddingState :: Unshredded {
292
+ metadata : metadata. slice ( offset, length) ,
293
+ value : value. slice ( offset, length) ,
294
+ } ,
295
+ ShreddingState :: FullyShredded {
296
+ metadata,
297
+ typed_value,
298
+ } => ShreddingState :: FullyShredded {
299
+ metadata : metadata. slice ( offset, length) ,
300
+ typed_value : typed_value. slice ( offset, length) ,
301
+ } ,
302
+ ShreddingState :: PartiallyShredded {
303
+ metadata,
304
+ value,
305
+ typed_value,
306
+ } => ShreddingState :: PartiallyShredded {
307
+ metadata : metadata. slice ( offset, length) ,
308
+ value : value. slice ( offset, length) ,
309
+ typed_value : typed_value. slice ( offset, length) ,
310
+ } ,
311
+ }
312
+ }
313
+ }
314
+
311
315
/// returns the non-null element at index as a Variant
312
316
fn typed_value_to_variant ( typed_value : & ArrayRef , index : usize ) -> Variant {
313
317
match typed_value. data_type ( ) {
0 commit comments