This repository has been archived by the owner on Aug 16, 2022. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 6
/
schema_builder.go
87 lines (72 loc) · 1.69 KB
/
schema_builder.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
package dataset
type SchemaBuilder struct {
d *Schema
}
func NewSchema() *SchemaBuilder {
return &SchemaBuilder{d: &Schema{}}
}
func (b *SchemaBuilder) Build() (*Schema, error) {
if b.d.id.IsNil() {
return nil, ErrInvalidID
}
if b.d.fields == nil || b.d.order == nil {
b.d.fields = map[FieldID]*SchemaField{}
b.d.order = []FieldID{}
}
return b.d, nil
}
func (b *SchemaBuilder) MustBuild() *Schema {
r, err := b.Build()
if err != nil {
panic(err)
}
return r
}
func (b *SchemaBuilder) ID(id SchemaID) *SchemaBuilder {
b.d.id = id
return b
}
func (b *SchemaBuilder) NewID() *SchemaBuilder {
b.d.id = NewSchemaID()
return b
}
func (b *SchemaBuilder) Scene(scene SceneID) *SchemaBuilder {
b.d.scene = scene
return b
}
func (b *SchemaBuilder) Name(name string) *SchemaBuilder {
b.d.name = name
return b
}
func (b *SchemaBuilder) Dynamic(dynamic bool) *SchemaBuilder {
b.d.dynamic = dynamic
return b
}
func (b *SchemaBuilder) Source(source string) *SchemaBuilder {
b.d.source = source
return b
}
func (b *SchemaBuilder) RepresentativeField(representativeField FieldID) *SchemaBuilder {
rf := representativeField
b.d.representativeField = &rf
return b
}
func (b *SchemaBuilder) Fields(fields []*SchemaField) *SchemaBuilder {
b.d.fields = map[FieldID]*SchemaField{}
b.d.order = make([]FieldID, 0, len(fields))
sources := map[string]struct{}{}
for _, f := range fields {
if f == nil {
continue
}
if source := f.Source(); source == "" {
b.d.fields[f.ID()] = f.Clone()
b.d.order = append(b.d.order, f.ID())
} else if _, ok := sources[source]; !ok {
b.d.fields[f.ID()] = f.Clone()
b.d.order = append(b.d.order, f.ID())
sources[source] = struct{}{}
}
}
return b
}