1- package leveledindex
1+ package indexes
22
33import (
44 "fmt"
55
66 "github.com/tableauio/loader/cmd/protoc-gen-go-tableau-loader/helper"
77 "github.com/tableauio/loader/internal/index"
8- "github.com/tableauio/loader/internal/options"
98 "google.golang.org/protobuf/compiler/protogen"
109 "google.golang.org/protobuf/reflect/protoreflect"
1110)
@@ -16,9 +15,10 @@ type Generator struct {
1615 descriptor * index.IndexDescriptor
1716 message * protogen.Message
1817
18+ // level message
1919 maxDepth int
20- Keys helper.MapKeys
21- MapFds []protoreflect.FieldDescriptor
20+ keys helper.MapKeys
21+ mapFds []protoreflect.FieldDescriptor
2222}
2323
2424func NewGenerator (gen * protogen.Plugin , g * protogen.GeneratedFile , descriptor * index.IndexDescriptor , message * protogen.Message ) * Generator {
@@ -28,19 +28,19 @@ func NewGenerator(gen *protogen.Plugin, g *protogen.GeneratedFile, descriptor *i
2828 descriptor : descriptor ,
2929 message : message ,
3030 }
31- generator .init ()
31+ generator .initLevelMessage ()
3232 return generator
3333}
3434
35- func (x * Generator ) init () {
35+ func (x * Generator ) initLevelMessage () {
3636 for levelMessage := x .descriptor .LevelMessage ; levelMessage != nil ; levelMessage = levelMessage .NextLevel {
3737 if fd := levelMessage .FD ; fd != nil && fd .IsMap () {
38- x .Keys = x .Keys .AddMapKey (helper.MapKey {
38+ x .keys = x .keys .AddMapKey (helper.MapKey {
3939 Type : helper .ParseMapKeyType (fd .MapKey ()),
4040 Name : helper .ParseMapFieldNameAsFuncParam (fd ),
4141 FieldName : helper .ParseMapFieldNameAsKeyStructFieldName (fd ),
4242 })
43- x .MapFds = append (x .MapFds , fd )
43+ x .mapFds = append (x .mapFds , fd )
4444 }
4545 if len (levelMessage .Indexes ) != 0 || len (levelMessage .OrderedIndexes ) != 0 {
4646 x .maxDepth = levelMessage .Depth
@@ -49,33 +49,73 @@ func (x *Generator) init() {
4949}
5050
5151func (x * Generator ) NeedGenerate () bool {
52- return options . NeedGenIndex ( x . message . Desc , options . LangCPP ) || options . NeedGenOrderedIndex ( x . message . Desc , options . LangCPP )
52+ return x . needGenerateIndex ( ) || x . needGenerateOrderedIndex ( )
5353}
5454
5555func (x * Generator ) messagerName () string {
5656 return string (x .message .Desc .Name ())
5757}
5858
59- func (x * Generator ) KeyType (mapFd protoreflect.FieldDescriptor ) string {
59+ func (x * Generator ) levelKeyType (mapFd protoreflect.FieldDescriptor ) string {
6060 return fmt .Sprintf ("%s_LeveledIndex_%sKey" , x .messagerName (), helper .ParseLeveledMapPrefix (x .message .Desc , mapFd ))
6161}
6262
63- func (x * Generator ) GenLeveledIndexTypeDef () {
63+ func (x * Generator ) mapValueType (index * index.LevelIndex ) protogen.GoIdent {
64+ return helper .FindMessageGoIdent (x .gen , index .MD )
65+ }
66+
67+ func (x * Generator ) fieldGetter (fd protoreflect.FieldDescriptor ) string {
68+ return fmt .Sprintf (".Get%s()" , helper .ParseIndexFieldName (x .gen , fd ))
69+ }
70+
71+ func (x * Generator ) parseKeyFieldNameAndSuffix (field * index.LevelField ) (string , string ) {
72+ var fieldName , suffix string
73+ for i , leveledFd := range field .LeveledFDList {
74+ fieldName += x .fieldGetter (leveledFd )
75+ if i == len (field .LeveledFDList )- 1 && leveledFd .Message () != nil {
76+ switch leveledFd .Message ().FullName () {
77+ case "google.protobuf.Timestamp" , "google.protobuf.Duration" :
78+ suffix = ".GetSeconds()"
79+ default :
80+ }
81+ }
82+ }
83+ return fieldName , suffix
84+ }
85+
86+ func (x * Generator ) GenIndexTypeDef () {
6487 if ! x .NeedGenerate () {
6588 return
6689 }
67- for i := 1 ; i <= x .maxDepth - 3 && i <= len (x .MapFds )- 1 ; i ++ {
90+ for i := 1 ; i <= x .maxDepth - 3 && i <= len (x .mapFds )- 1 ; i ++ {
6891 if i == 1 {
6992 x .g .P ()
7093 x .g .P ("// LeveledIndex keys." )
7194 }
72- fd := x .MapFds [i ]
73- keyType := x .KeyType (fd )
74- keys := x .Keys [:i + 1 ]
95+ fd := x .mapFds [i ]
96+ keyType := x .levelKeyType (fd )
97+ keys := x .keys [:i + 1 ]
7598 x .g .P ("type " , keyType , " struct {" )
7699 for _ , key := range keys {
77100 x .g .P (key .FieldName , " " , key .Type )
78101 }
79102 x .g .P ("}" )
80103 }
104+ x .genIndexTypeDef ()
105+ x .genOrderedIndexTypeDef ()
106+ }
107+
108+ func (x * Generator ) GenIndexField () {
109+ x .genIndexField ()
110+ x .genOrderedIndexField ()
111+ }
112+
113+ func (x * Generator ) GenIndexLoader () {
114+ x .genIndexLoader ()
115+ x .genOrderedIndexLoader ()
116+ }
117+
118+ func (x * Generator ) GenIndexFinders () {
119+ x .genIndexFinders ()
120+ x .genOrderedIndexFinders ()
81121}
0 commit comments