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