@@ -66,7 +66,9 @@ pub(crate) fn handle(ast: DeriveInput) -> Result<TokenStream, Error> {
6666 ) ) ;
6767 } ;
6868
69- let mut assignments = Vec :: new ( ) ;
69+ let mut field_initializers = Vec :: new ( ) ;
70+ let mut field_index_declarations = Vec :: new ( ) ;
71+ let mut field_index_resolvers = Vec :: new ( ) ;
7072 let mut params = Vec :: new ( ) ;
7173 let mut orm_fields = Vec :: new ( ) ;
7274 let mut orm_columns = Vec :: new ( ) ;
@@ -132,6 +134,13 @@ pub(crate) fn handle(ast: DeriveInput) -> Result<TokenStream, Error> {
132134 "decimal field cannot be skipped" ,
133135 ) ) ;
134136 }
137+ generics
138+ . make_where_clause ( )
139+ . predicates
140+ . push ( parse_quote ! ( #field_ty : :: core:: default :: Default ) ) ;
141+ field_initializers. push ( quote ! {
142+ #field_name: :: core:: default :: Default :: default ( )
143+ } ) ;
135144 continue ;
136145 }
137146
@@ -163,6 +172,7 @@ pub(crate) fn handle(ast: DeriveInput) -> Result<TokenStream, Error> {
163172 let is_unique = field. unique ;
164173 let is_index = field. index ;
165174 let column_index = orm_columns. len ( ) ;
175+ let field_index_ident = format_ident ! ( "__kite_orm_{field_name}_index" ) ;
166176
167177 persisted_columns. push ( ( field_name_string, column_name. clone ( ) ) ) ;
168178 column_names. push ( column_name. clone ( ) ) ;
@@ -223,11 +233,22 @@ pub(crate) fn handle(ast: DeriveInput) -> Result<TokenStream, Error> {
223233 quote ! { None :: <:: kite_sql:: types:: value:: DataValue > }
224234 } ;
225235
226- assignments. push ( quote ! {
227- if let Some ( value) = :: kite_sql:: orm:: try_get:: <#field_ty>( & mut tuple, schema, #column_name_lit) {
228- struct_instance. #field_name = value;
236+ field_index_declarations. push ( quote ! {
237+ let mut #field_index_ident = None ;
238+ } ) ;
239+ field_index_resolvers. push ( quote ! {
240+ if #field_index_ident. is_none( ) && __kite_orm_column_name == #column_name_lit {
241+ #field_index_ident = Some ( __kite_orm_index) ;
242+ __kite_orm_found_fields += 1 ;
229243 }
230244 } ) ;
245+ field_initializers. push ( quote ! {
246+ #field_name: :: kite_sql:: orm:: take_value_at:: <#field_ty>(
247+ & mut tuple,
248+ #field_index_ident,
249+ #column_name_lit,
250+ ) ?
251+ } ) ;
231252 params. push ( quote ! {
232253 ( #placeholder_lit, :: kite_sql:: orm:: ToDataValue :: to_data_value( & self . #field_name) )
233254 } ) ;
@@ -379,23 +400,31 @@ pub(crate) fn handle(ast: DeriveInput) -> Result<TokenStream, Error> {
379400 let primary_key_value = primary_key_value. expect ( "primary key checked above" ) ;
380401 let _primary_key_column = primary_key_column. expect ( "primary key checked above" ) ;
381402 let _primary_key_placeholder = primary_key_placeholder. expect ( "primary key checked above" ) ;
382- let mut from_generics = generics. clone ( ) ;
383- from_generics. params . insert ( 0 , parse_quote ! ( ' __kite_arena) ) ;
384- from_generics. params . insert ( 0 , parse_quote ! ( ' __kite_schema) ) ;
385- let ( from_impl_generics, _, from_where_clause) = from_generics. split_for_impl ( ) ;
403+ let field_count = field_index_declarations. len ( ) ;
386404 let ( impl_generics, ty_generics, where_clause) = generics. split_for_impl ( ) ;
387405
388406 Ok ( quote ! {
389- impl #from_impl_generics :: core :: convert :: From < ( & :: kite_sql:: types :: tuple :: SchemaView < ' __kite_schema , ' __kite_arena> , :: kite_sql :: types :: tuple :: Tuple ) >
407+ impl #impl_generics :: kite_sql:: orm :: FromQueryRow
390408 for #struct_name #ty_generics
391- #from_where_clause
409+ #where_clause
392410 {
393- fn from( ( schema, mut tuple) : ( & :: kite_sql:: types:: tuple:: SchemaView <' __kite_schema, ' __kite_arena>, :: kite_sql:: types:: tuple:: Tuple ) ) -> Self {
394- let mut struct_instance = <Self as :: core:: default :: Default >:: default ( ) ;
395-
396- #( #assignments) *
411+ fn from_query_row(
412+ schema: & :: kite_sql:: types:: tuple:: SchemaView <' _, ' _>,
413+ mut tuple: :: kite_sql:: types:: tuple:: Tuple ,
414+ ) -> :: std:: result:: Result <Self , :: kite_sql:: errors:: DatabaseError > {
415+ let mut __kite_orm_found_fields = 0usize ;
416+ #( #field_index_declarations) *
417+ for ( __kite_orm_index, __kite_orm_column) in schema. iter( ) . enumerate( ) {
418+ let __kite_orm_column_name = __kite_orm_column. name( ) ;
419+ #( #field_index_resolvers) *
420+ if __kite_orm_found_fields == #field_count {
421+ break ;
422+ }
423+ }
397424
398- struct_instance
425+ Ok ( Self {
426+ #( #field_initializers) , *
427+ } )
399428 }
400429 }
401430
0 commit comments