Commit fe126d0
authored
make_decoder accepts borrowed DataType instead of owned (#9270)
# Which issue does this PR close?
- Part of #8987
# Rationale for this change
Today's json decoder helper, `make_decoder`, takes an owned data type
whose components are cloned at every level during the recursive decoder
initialization process. This breaks pointer stability of the resulting
`DataType` instances that a custom JSON decoder factory would see, vs.
those of the schema it and the reader builder were initialized with.
The lack of pointer stability prevents users from creating "path based"
decoder factories, that are able to customize decoder behavior based not
only on type, but also on the field's path in the schema. See the
`PathBasedDecoderFactory` in arrow-json/tests/custom_decoder_tests.rs of
#9259, for an example.
# What changes are included in this PR?
By passing `&DataType` instead, we change code like this:
```rust
let decoder = make_decoder(field.data_type().clone(), ...);
Ok(Self {
data_type,
decoder,
...
})
```
to this:
```rust
let child_decoder = make_decoder(field.data_type(), ...);
Ok(Self {
data_type: data_type.clone(),
decoder,
...
})
```
Result: Every call to `make_decoder` receives a reference to the actual
original data type from the builder's input schema. The final decoder
`Self` is unchanged -- it already received a clone and continues to do
so.
NOTE: There is one additional clone of the top-level `DataType::Struct`
we create for normal (`!is_field`) builders. But that's a cheap arc
clone of a `Fields` member.
# Are these changes tested?
Yes, existing unit tests validate the change.
# Are there any user-facing changes?
No. All functions and data types involved are private -- the array
decoders are marked `pub` but are defined in a private mod with no
public re-export that would make them available outside the crate.1 parent 4cd2d14 commit fe126d0
File tree
6 files changed
+37
-33
lines changed- arrow-json/src/reader
6 files changed
+37
-33
lines changed| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
34 | 34 | | |
35 | 35 | | |
36 | 36 | | |
37 | | - | |
| 37 | + | |
38 | 38 | | |
39 | 39 | | |
40 | | - | |
| 40 | + | |
41 | 41 | | |
42 | 42 | | |
43 | 43 | | |
44 | 44 | | |
45 | | - | |
| 45 | + | |
46 | 46 | | |
47 | 47 | | |
48 | | - | |
| 48 | + | |
49 | 49 | | |
50 | 50 | | |
51 | 51 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
33 | 33 | | |
34 | 34 | | |
35 | 35 | | |
36 | | - | |
| 36 | + | |
37 | 37 | | |
38 | 38 | | |
39 | | - | |
| 39 | + | |
40 | 40 | | |
41 | 41 | | |
42 | 42 | | |
| |||
53 | 53 | | |
54 | 54 | | |
55 | 55 | | |
56 | | - | |
57 | | - | |
| 56 | + | |
| 57 | + | |
58 | 58 | | |
59 | 59 | | |
60 | | - | |
| 60 | + | |
61 | 61 | | |
62 | 62 | | |
63 | 63 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
137 | 137 | | |
138 | 138 | | |
139 | 139 | | |
| 140 | + | |
140 | 141 | | |
141 | 142 | | |
142 | 143 | | |
| |||
295 | 296 | | |
296 | 297 | | |
297 | 298 | | |
298 | | - | |
299 | | - | |
300 | | - | |
301 | | - | |
302 | | - | |
303 | | - | |
| 299 | + | |
| 300 | + | |
| 301 | + | |
| 302 | + | |
| 303 | + | |
| 304 | + | |
| 305 | + | |
304 | 306 | | |
305 | 307 | | |
306 | 308 | | |
307 | 309 | | |
308 | 310 | | |
309 | 311 | | |
310 | 312 | | |
311 | | - | |
| 313 | + | |
312 | 314 | | |
313 | 315 | | |
314 | 316 | | |
| |||
713 | 715 | | |
714 | 716 | | |
715 | 717 | | |
716 | | - | |
| 718 | + | |
717 | 719 | | |
718 | 720 | | |
719 | 721 | | |
| |||
728 | 730 | | |
729 | 731 | | |
730 | 732 | | |
731 | | - | |
| 733 | + | |
732 | 734 | | |
733 | 735 | | |
734 | 736 | | |
735 | 737 | | |
736 | | - | |
| 738 | + | |
737 | 739 | | |
738 | 740 | | |
739 | 741 | | |
| |||
792 | 794 | | |
793 | 795 | | |
794 | 796 | | |
795 | | - | |
| 797 | + | |
796 | 798 | | |
797 | 799 | | |
798 | 800 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
80 | 80 | | |
81 | 81 | | |
82 | 82 | | |
83 | | - | |
| 83 | + | |
84 | 84 | | |
85 | | - | |
| 85 | + | |
86 | 86 | | |
87 | 87 | | |
88 | 88 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
81 | 81 | | |
82 | 82 | | |
83 | 83 | | |
84 | | - | |
| 84 | + | |
85 | 85 | | |
86 | 86 | | |
87 | | - | |
88 | | - | |
89 | | - | |
90 | | - | |
91 | | - | |
92 | | - | |
| 87 | + | |
93 | 88 | | |
94 | 89 | | |
95 | | - | |
| 90 | + | |
| 91 | + | |
| 92 | + | |
| 93 | + | |
| 94 | + | |
| 95 | + | |
| 96 | + | |
96 | 97 | | |
97 | 98 | | |
| 99 | + | |
98 | 100 | | |
99 | 101 | | |
100 | 102 | | |
101 | 103 | | |
102 | 104 | | |
103 | 105 | | |
104 | 106 | | |
105 | | - | |
| 107 | + | |
106 | 108 | | |
107 | 109 | | |
108 | 110 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
37 | 37 | | |
38 | 38 | | |
39 | 39 | | |
40 | | - | |
| 40 | + | |
41 | 41 | | |
42 | | - | |
| 42 | + | |
43 | 43 | | |
44 | 44 | | |
45 | 45 | | |
| |||
0 commit comments