1- package leveledindex
1+ package indexes
22
33import (
44 "fmt"
55
66 "github.com/tableauio/loader/cmd/protoc-gen-cpp-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)
@@ -15,29 +14,30 @@ type Generator struct {
1514 descriptor * index.IndexDescriptor
1615 message * protogen.Message
1716
17+ // level message
1818 maxDepth int
19- Keys helper.MapKeys
20- MapFds []protoreflect.FieldDescriptor
19+ keys helper.MapKeys
20+ mapFds []protoreflect.FieldDescriptor
2121}
2222
2323func NewGenerator (g * protogen.GeneratedFile , descriptor * index.IndexDescriptor , message * protogen.Message ) * Generator {
24- gen := & Generator {
24+ generator := & Generator {
2525 g : g ,
2626 descriptor : descriptor ,
2727 message : message ,
2828 }
29- gen . init ()
30- return gen
29+ generator . initLevelMessage ()
30+ return generator
3131}
3232
33- func (x * Generator ) init () {
33+ func (x * Generator ) initLevelMessage () {
3434 for levelMessage := x .descriptor .LevelMessage ; levelMessage != nil ; levelMessage = levelMessage .NextLevel {
3535 if fd := levelMessage .FD ; fd != nil && fd .IsMap () {
36- x .Keys = x .Keys .AddMapKey (helper.MapKey {
36+ x .keys = x .keys .AddMapKey (helper.MapKey {
3737 Type : helper .ParseMapKeyType (fd .MapKey ()),
3838 Name : helper .ParseMapFieldName (fd ),
3939 })
40- x .MapFds = append (x .MapFds , fd )
40+ x .mapFds = append (x .mapFds , fd )
4141 }
4242 if len (levelMessage .Indexes ) != 0 || len (levelMessage .OrderedIndexes ) != 0 {
4343 x .maxDepth = levelMessage .Depth
@@ -46,27 +46,54 @@ func (x *Generator) init() {
4646}
4747
4848func (x * Generator ) NeedGenerate () bool {
49- return options . NeedGenIndex ( x . message . Desc , options . LangCPP ) || options . NeedGenOrderedIndex ( x . message . Desc , options . LangCPP )
49+ return x . needGenerateIndex ( ) || x . needGenerateOrderedIndex ( )
5050}
5151
52- func (x * Generator ) KeyType (mapFd protoreflect.FieldDescriptor ) string {
52+ func (x * Generator ) messagerName () string {
53+ return string (x .message .Desc .Name ())
54+ }
55+
56+ func (x * Generator ) levelKeyType (mapFd protoreflect.FieldDescriptor ) string {
5357 return fmt .Sprintf ("LeveledIndex_%sKey" , helper .ParseLeveledMapPrefix (x .message .Desc , mapFd ))
5458}
5559
56- func (x * Generator ) GenHppLeveledIndexKeys () {
60+ func (x * Generator ) mapValueType (index * index.LevelIndex ) string {
61+ return helper .ParseCppClassType (index .MD )
62+ }
63+
64+ func (x * Generator ) fieldGetter (fd protoreflect.FieldDescriptor ) string {
65+ return fmt .Sprintf (".%s()" , helper .ParseIndexFieldName (fd ))
66+ }
67+
68+ func (x * Generator ) parseKeyFieldNameAndSuffix (field * index.LevelField ) (string , string ) {
69+ var fieldName , suffix string
70+ for i , leveledFd := range field .LeveledFDList {
71+ fieldName += x .fieldGetter (leveledFd )
72+ if i == len (field .LeveledFDList )- 1 && leveledFd .Message () != nil {
73+ switch leveledFd .Message ().FullName () {
74+ case "google.protobuf.Timestamp" , "google.protobuf.Duration" :
75+ suffix = ".seconds()"
76+ default :
77+ }
78+ }
79+ }
80+ return fieldName , suffix
81+ }
82+
83+ func (x * Generator ) GenHppIndexFinders () {
5784 if ! x .NeedGenerate () {
5885 return
5986 }
60- for i := 1 ; i <= x .maxDepth - 3 && i <= len (x .MapFds )- 1 ; i ++ {
87+ for i := 1 ; i <= x .maxDepth - 3 && i <= len (x .mapFds )- 1 ; i ++ {
6188 if i == 1 {
6289 x .g .P ()
6390 x .g .P (helper .Indent (1 ), "// LeveledIndex keys." )
6491 x .g .P (" public:" )
6592 }
66- fd := x .MapFds [i ]
67- keyType := x .KeyType (fd )
93+ fd := x .mapFds [i ]
94+ keyType := x .levelKeyType (fd )
6895 x .g .P (helper .Indent (1 ), "struct " , keyType , " {" )
69- keys := x .Keys [:i + 1 ]
96+ keys := x .keys [:i + 1 ]
7097 for _ , key := range keys {
7198 x .g .P (helper .Indent (2 ), key .Type , " " , key .Name , ";" )
7299 }
@@ -84,4 +111,16 @@ func (x *Generator) GenHppLeveledIndexKeys() {
84111 x .g .P (helper .Indent (2 ), "}" )
85112 x .g .P (helper .Indent (1 ), "};" )
86113 }
114+ x .genHppIndexFinders ()
115+ x .genHppOrderedIndexFinders ()
116+ }
117+
118+ func (x * Generator ) GenIndexLoader () {
119+ x .genIndexLoader ()
120+ x .genOrderedIndexLoader ()
121+ }
122+
123+ func (x * Generator ) GenCppIndexFinders () {
124+ x .genCppIndexFinders ()
125+ x .genCppOrderedIndexFinders ()
87126}
0 commit comments