@@ -878,49 +878,87 @@ impl KeyGenerationPolicy {
878878}
879879
880880pub struct IdentityParser {
881- value_fields : Vec < String > ,
882881 parse_utf8 : bool ,
883882 metadata_column_value : Value ,
884883 session_type : SessionType ,
885884 key_generation_policy : KeyGenerationPolicy ,
885+
886+ n_value_fields : usize ,
887+ key_field_index : Option < usize > ,
888+ metadata_field_index : Option < usize > ,
889+ value_field_index : usize ,
886890}
887891
888892impl IdentityParser {
889893 pub fn new (
890- value_fields : Vec < String > ,
894+ value_fields : & [ String ] ,
891895 parse_utf8 : bool ,
896+ message_queue_key_field : Option < & String > ,
892897 key_generation_policy : KeyGenerationPolicy ,
893898 session_type : SessionType ,
894899 ) -> IdentityParser {
900+ let mut key_field_index = None ;
901+ let mut metadata_field_index = None ;
902+ let mut value_field_index = None ;
903+ for ( index, value_field) in value_fields. iter ( ) . enumerate ( ) {
904+ if value_field == METADATA_FIELD_NAME {
905+ assert ! ( metadata_field_index. is_none( ) ) ;
906+ metadata_field_index = Some ( index) ;
907+ } else if Some ( value_field) == message_queue_key_field {
908+ assert ! ( key_field_index. is_none( ) ) ;
909+ key_field_index = Some ( index) ;
910+ } else {
911+ assert ! ( value_field_index. is_none( ) ) ;
912+ value_field_index = Some ( index) ;
913+ }
914+ }
915+
895916 Self {
896- value_fields,
917+ n_value_fields : value_fields. len ( ) ,
897918 parse_utf8,
898919 metadata_column_value : Value :: None ,
899920 key_generation_policy,
900921 session_type,
922+ key_field_index,
923+ metadata_field_index,
924+ value_field_index : value_field_index
925+ . expect ( "value field must be present in the schema" ) ,
901926 }
902927 }
903928}
904929
905930impl Parser for IdentityParser {
906931 fn parse ( & mut self , data : & ReaderContext ) -> ParseResult {
932+ let mut values = Vec :: with_capacity ( self . n_value_fields ) ;
933+ for _ in 0 ..self . n_value_fields {
934+ // clone isn't available for the array element type, hence constructing manually
935+ values. push ( Ok ( Value :: None ) ) ;
936+ }
937+
907938 let ( event, key, value, metadata) = match data {
908939 RawBytes ( event, raw_bytes) => (
909940 * event,
910941 None ,
911942 value_from_bytes ( raw_bytes, self . parse_utf8 ) ,
912943 Ok ( None ) ,
913944 ) ,
914- KeyValue ( ( key, value) ) => match value {
915- Some ( bytes) => (
916- DataEventType :: Insert ,
917- self . key_generation_policy
918- . generate ( key. as_ref ( ) , self . parse_utf8 ) ,
919- value_from_bytes ( bytes, self . parse_utf8 ) ,
920- Ok ( None ) ,
921- ) ,
922- None => return Err ( ParseError :: EmptyKafkaPayload . into ( ) ) ,
923- } ,
945+ KeyValue ( ( key, value) ) => {
946+ if let Some ( key_field_index) = self . key_field_index {
947+ values[ key_field_index] = key
948+ . as_ref ( )
949+ . map_or_else ( || Ok ( Value :: None ) , |k| value_from_bytes ( k, self . parse_utf8 ) ) ;
950+ }
951+ match value {
952+ Some ( bytes) => (
953+ DataEventType :: Insert ,
954+ self . key_generation_policy
955+ . generate ( key. as_ref ( ) , self . parse_utf8 ) ,
956+ value_from_bytes ( bytes, self . parse_utf8 ) ,
957+ Ok ( None ) ,
958+ ) ,
959+ None => return Err ( ParseError :: EmptyKafkaPayload . into ( ) ) ,
960+ }
961+ }
924962 Diff ( _) | TokenizedEntries ( _, _) => {
925963 return Err ( ParseError :: UnsupportedReaderContext . into ( ) )
926964 }
@@ -932,22 +970,11 @@ impl Parser for IdentityParser {
932970 let event = if is_commit {
933971 ParsedEventWithErrors :: AdvanceTime
934972 } else {
935- let mut values = Vec :: new ( ) ;
936- let mut metadata = Some ( metadata) ;
937- let mut value = Some ( value) ;
938- for field in & self . value_fields {
939- let to_insert = if field == METADATA_FIELD_NAME {
940- metadata
941- . take ( )
942- . expect ( "metadata column should be used exactly once in IdentityParser" )
943- . map ( |metadata| metadata. unwrap_or ( self . metadata_column_value . clone ( ) ) )
944- } else {
945- value
946- . take ( )
947- . expect ( "value column should be used exactly once in IdentityParser" )
948- } ;
949- values. push ( to_insert) ;
973+ if let Some ( metadata_field_index) = self . metadata_field_index {
974+ values[ metadata_field_index] =
975+ metadata. map ( |metadata| metadata. unwrap_or ( self . metadata_column_value . clone ( ) ) ) ;
950976 }
977+ values[ self . value_field_index ] = value;
951978 ParsedEventWithErrors :: new ( self . session_type ( ) , event, key, values)
952979 } ;
953980
@@ -960,7 +987,7 @@ impl Parser for IdentityParser {
960987 }
961988
962989 fn column_count ( & self ) -> usize {
963- self . value_fields . len ( )
990+ self . n_value_fields
964991 }
965992
966993 fn session_type ( & self ) -> SessionType {
0 commit comments