@@ -321,7 +321,7 @@ func (f *fieldReader) Get(_ context.Context, n protoreflect.Name) iter.Seq2[pfin
321321
322322type keyField struct {
323323 name protoreflect.Name
324- fd protoreflect.FieldDescriptor
324+ fds [] protoreflect.FieldDescriptor
325325 dataPrefix []byte
326326 txn badgerd.Tx
327327 entries []keyEntry
@@ -371,7 +371,7 @@ func (k *keyField) iterate(yield func(pfindex.Field, error) bool) {
371371 }
372372 for _ , e := range k .entries {
373373 entry := & field {
374- descriptors : []protoreflect. FieldDescriptor { k . fd } ,
374+ descriptors : k . fds ,
375375 value : protoreflect .ValueOfString (e .value ),
376376 bitmap : e .bitmap ,
377377 }
@@ -558,13 +558,7 @@ func fieldPathFromNames(fds []protoreflect.FieldDescriptor) string {
558558}
559559
560560func lookupByNumberPath (md protoreflect.MessageDescriptor , fieldPath string ) ([]protoreflect.FieldDescriptor , error ) {
561- parts := strings .Split (fieldPath , "." )
562- if len (parts ) == 0 {
563- return nil , fmt .Errorf ("empty field path" )
564- }
565- var fds []protoreflect.FieldDescriptor
566- cur := md
567- for _ , part := range parts {
561+ return lookupByPath (md , fieldPath , func (cur protoreflect.MessageDescriptor , part string ) (protoreflect.FieldDescriptor , error ) {
568562 num , err := strconv .Atoi (part )
569563 if err != nil {
570564 return nil , fmt .Errorf ("invalid field number %q" , part )
@@ -573,15 +567,40 @@ func lookupByNumberPath(md protoreflect.MessageDescriptor, fieldPath string) ([]
573567 if fd == nil {
574568 return nil , fmt .Errorf ("%s does not contain field number %d" , cur .FullName (), num )
575569 }
570+ return fd , nil
571+ })
572+ }
573+
574+ func lookupByNamePath (md protoreflect.MessageDescriptor , fieldPath string ) ([]protoreflect.FieldDescriptor , error ) {
575+ return lookupByPath (md , fieldPath , func (cur protoreflect.MessageDescriptor , part string ) (protoreflect.FieldDescriptor , error ) {
576+ fd := cur .Fields ().ByName (protoreflect .Name (part ))
577+ if fd == nil {
578+ return nil , fmt .Errorf ("%s does not contain field '%s'" , cur .FullName (), part )
579+ }
580+ return fd , nil
581+ })
582+ }
583+
584+ func lookupByPath (md protoreflect.MessageDescriptor , fieldPath string , lookup func (protoreflect.MessageDescriptor , string ) (protoreflect.FieldDescriptor , error )) ([]protoreflect.FieldDescriptor , error ) {
585+ if fieldPath == "" {
586+ return nil , fmt .Errorf ("empty field path" )
587+ }
588+ parts := strings .Split (fieldPath , "." )
589+ var fds []protoreflect.FieldDescriptor
590+ cur := md
591+ for i , part := range parts {
592+ fd , err := lookup (cur , part )
593+ if err != nil {
594+ return nil , err
595+ }
576596 fds = append (fds , fd )
577- if fd .Kind () == protoreflect .MessageKind {
578- cur = fd .Message ()
579- } else {
580- cur = nil
597+ if i == len (parts )- 1 {
598+ continue
581599 }
582- if cur == nil && part != parts [ len ( parts ) - 1 ] {
600+ if fd . Kind () != protoreflect . MessageKind {
583601 return nil , fmt .Errorf ("%s does not contain '%s'" , md .FullName (), fieldPath )
584602 }
603+ cur = fd .Message ()
585604 }
586605 return fds , nil
587606}
@@ -598,11 +617,11 @@ func buildFieldReader(txn badgerd.Tx, resolver protodesc.Resolver, name protoref
598617 var key * keyField
599618 keyName , ok := protodb .KeyFieldName (md )
600619 if ok {
601- fd := md . Fields (). ByName ( protoreflect . Name ( keyName ) )
602- if fd ! = nil {
620+ fds , err := lookupByNamePath ( md , keyName )
621+ if err = = nil {
603622 key = & keyField {
604- name : fd .Name (),
605- fd : fd ,
623+ name : protoreflect .Name (fieldPathFromNames ( fds ) ),
624+ fds : fds ,
606625 dataPrefix : []byte (protodb .Data + "/" + string (name ) + "/" ),
607626 txn : txn ,
608627 }
0 commit comments