@@ -472,4 +472,115 @@ mod tests {
472472
473473 assert ! ( parsed. is_err( ) ) ;
474474 }
475+
476+ #[ test]
477+ fn updates_field_type_to_timestamp_for_time_related_fields ( ) {
478+ let field = Field :: new ( "created_time" , DataType :: Utf8 , true ) ;
479+ let fields = Fields :: from ( vec ! [ field] ) ;
480+ let mut schema = Schema :: new ( fields) ;
481+
482+ // Create a JSON log record with a time field in RFC3339 format
483+ let log_record = serde_json:: json!( {
484+ "created_time" : "2023-01-01T12:00:00Z"
485+ } ) ;
486+
487+ // Call the function to override the inferred data type
488+ override_inferred_data_type ( & mut schema, & log_record, SchemaVersion :: V1 ) ;
489+
490+ // Check that the field type was updated to Timestamp
491+ let updated_field = schema. field ( 0 ) ;
492+ assert_eq ! (
493+ updated_field. data_type( ) ,
494+ & DataType :: Timestamp ( TimeUnit :: Millisecond , None )
495+ ) ;
496+ assert_eq ! ( updated_field. name( ) , "created_time" ) ;
497+ assert ! ( updated_field. is_nullable( ) ) ;
498+ }
499+
500+ #[ test]
501+ fn update_field_type_to_timestamp_for_rfc2822_format ( ) {
502+ let field = Field :: new ( "event_time" , DataType :: Utf8 , true ) ;
503+ let fields = Fields :: from ( vec ! [ field] ) ;
504+ let mut schema = Schema :: new ( fields) ;
505+
506+ // Create a JSON log record with a time field in RFC2822 format
507+ let log_record = serde_json:: json!( {
508+ "event_time" : "Wed, 02 Oct 2002 15:00:00 +0200"
509+ } ) ;
510+
511+ // Call the function to override the inferred data type
512+ override_inferred_data_type ( & mut schema, & log_record, SchemaVersion :: V1 ) ;
513+
514+ // Check that the field type was updated to Timestamp
515+ let updated_field = schema. field ( 0 ) ;
516+ assert_eq ! (
517+ updated_field. data_type( ) ,
518+ & DataType :: Timestamp ( TimeUnit :: Millisecond , None )
519+ ) ;
520+ assert_eq ! ( updated_field. name( ) , "event_time" ) ;
521+ assert ! ( updated_field. is_nullable( ) ) ;
522+ }
523+
524+ #[ test]
525+ fn update_numeric_fields_to_float64 ( ) {
526+ let field = Field :: new ( "numeric_field" , DataType :: Int32 , true ) ;
527+ let fields = Fields :: from ( vec ! [ field] ) ;
528+ let mut schema = Schema :: new ( fields) ;
529+
530+ // Create a JSON log record with a numeric field
531+ let log_record = serde_json:: json!( {
532+ "numeric_field" : 42
533+ } ) ;
534+
535+ // Call the function to override the inferred data type
536+ override_inferred_data_type ( & mut schema, & log_record, SchemaVersion :: V1 ) ;
537+
538+ // Check that the field type was updated to Float64
539+ let updated_field = schema. field ( 0 ) ;
540+ assert_eq ! ( updated_field. data_type( ) , & DataType :: Float64 ) ;
541+ assert_eq ! ( updated_field. name( ) , "numeric_field" ) ;
542+ assert ! ( updated_field. is_nullable( ) ) ;
543+ }
544+
545+ #[ test]
546+ fn handles_numeric_fields_already_float64 ( ) {
547+ let field = Field :: new ( "numeric_value" , DataType :: Float64 , true ) ;
548+ let fields = Fields :: from ( vec ! [ field] ) ;
549+ let mut schema = Schema :: new ( fields) ;
550+
551+ // Create a JSON log record with a numeric field
552+ let log_record = serde_json:: json!( {
553+ "numeric_value" : 42.0
554+ } ) ;
555+
556+ // Call the function to override the inferred data type
557+ override_inferred_data_type ( & mut schema, & log_record, SchemaVersion :: V1 ) ;
558+
559+ // Check that the field type remains Float64
560+ let updated_field = schema. field ( 0 ) ;
561+ assert_eq ! ( updated_field. data_type( ) , & DataType :: Float64 ) ;
562+ assert_eq ! ( updated_field. name( ) , "numeric_value" ) ;
563+ assert ! ( updated_field. is_nullable( ) ) ;
564+ }
565+
566+ #[ test]
567+ fn does_not_update_field_type_for_v0_schema_version ( ) {
568+ let field = Field :: new ( "some_field" , DataType :: Utf8 , true ) ;
569+ let fields = Fields :: from ( vec ! [ field] ) ;
570+ let mut schema = Schema :: new ( fields) ;
571+
572+ // Create a JSON log record with a string field
573+ let log_record = serde_json:: json!( {
574+ "some_field" : "some_value"
575+ } ) ;
576+
577+ // Call the function to override the inferred data type with a non-V1 schema version
578+ override_inferred_data_type ( & mut schema, & log_record, SchemaVersion :: V0 ) ;
579+
580+ // Check that the field type was not updated
581+ let updated_field = schema. field ( 0 ) ;
582+ assert_eq ! ( updated_field. data_type( ) , & DataType :: Utf8 ) ;
583+ assert_eq ! ( updated_field. name( ) , "some_field" ) ;
584+ assert ! ( updated_field. is_nullable( ) ) ;
585+ }
475586}
0 commit comments