1
1
use async_trait:: async_trait;
2
- use serde_json:: Value ;
3
2
use log:: * ;
3
+ use serde_json:: Value ;
4
4
5
5
use crate :: { dead_letters:: DeadLetter , MessageDeserializationError , MessageFormat } ;
6
6
@@ -24,6 +24,13 @@ pub struct DeserializedMessage {
24
24
}
25
25
26
26
impl DeserializedMessage {
27
+ fn new ( message : Value ) -> Self {
28
+ Self {
29
+ message,
30
+ ..Default :: default ( )
31
+ }
32
+ }
33
+
27
34
pub fn schema ( & self ) -> & Option < ArrowSchema > {
28
35
& self . schema
29
36
}
@@ -41,9 +48,7 @@ impl DeserializedMessage {
41
48
/// Allow for `.into()` on [Value] for ease of use
42
49
impl From < Value > for DeserializedMessage {
43
50
fn from ( message : Value ) -> Self {
44
- // XXX: This seems wasteful, this function should go away, and the deserializers should
45
- // infer straight from the buffer stream
46
- let iter = vec ! [ message. clone( ) ] . into_iter ( ) . map ( Ok ) ;
51
+ let iter = std:: iter:: once ( & message) . map ( Ok ) ;
47
52
let schema =
48
53
match deltalake_core:: arrow:: json:: reader:: infer_json_schema_from_iterator ( iter) {
49
54
Ok ( schema) => Some ( schema) ,
@@ -169,7 +174,10 @@ impl MessageDeserializer for DefaultDeserializer {
169
174
}
170
175
} ;
171
176
172
- Ok ( value. into ( ) )
177
+ match self . can_evolve_schema ( ) {
178
+ true => Ok ( value. into ( ) ) ,
179
+ false => Ok ( DeserializedMessage :: new ( value) ) ,
180
+ }
173
181
}
174
182
}
175
183
@@ -183,8 +191,20 @@ mod default_tests {
183
191
}
184
192
185
193
#[ tokio:: test]
186
- async fn deserialize_with_schema ( ) {
194
+ async fn deserializer_default_without_evolution ( ) {
187
195
let mut deser = DefaultDeserializer :: default ( ) ;
196
+ let dm = deser
197
+ . deserialize ( r#"{"hello" : "world"}"# . as_bytes ( ) )
198
+ . await
199
+ . unwrap ( ) ;
200
+ assert_eq ! ( true , dm. schema( ) . is_none( ) ) ;
201
+ }
202
+
203
+ #[ tokio:: test]
204
+ async fn deserialize_with_schema ( ) {
205
+ let mut deser = DefaultDeserializer {
206
+ schema_evolution : true ,
207
+ } ;
188
208
let message = deser
189
209
. deserialize ( r#"{"hello" : "world"}"# . as_bytes ( ) )
190
210
. await
0 commit comments