Skip to content

Commit b59f405

Browse files
committed
feat(go): unify index logic
1 parent cf98891 commit b59f405

File tree

5 files changed

+191
-252
lines changed

5 files changed

+191
-252
lines changed
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,10 @@
1-
package leveledindex
1+
package indexes
22

33
import (
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

2424
func 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

5151
func (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

5555
func (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

Comments
 (0)