-
Notifications
You must be signed in to change notification settings - Fork 0
/
xdataset_fields.go
122 lines (108 loc) · 2.71 KB
/
xdataset_fields.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
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
package xdataset
import (
"fmt"
"github.com/go-xe2/x/xf/ef/xqi"
"io"
)
type tDatasetFields struct {
names []string
ds *tDataset
fieldMap map[string]*tDsField
fields []*tDsField
fieldCount int
}
var _ xqi.DSFields = (*tDatasetFields)(nil)
func newDataSetFields(ds *tDataset) *tDatasetFields {
return &tDatasetFields{
ds: ds,
fieldMap: make(map[string]*tDsField),
fieldCount: 0,
fields: make([]*tDsField, 0),
}
}
func (dfs *tDatasetFields) Count() int {
return dfs.fieldCount
}
func (dfs *tDatasetFields) Clear() xqi.DSFields {
dfs.fieldCount = 0
dfs.fields = make([]*tDsField, 0)
dfs.fieldMap = make(map[string]*tDsField)
dfs.names = nil
dfs.ds.Clear()
return dfs
}
func (dfs *tDatasetFields) Add(fieldName string, fieldType xqi.FieldDataType) xqi.DSFields {
fd := newDsField(dfs.ds, fieldName, dfs.fieldCount, fieldType)
dfs.fieldCount += 1
dfs.fieldMap[fieldName] = fd
dfs.fields = append(dfs.fields, fd)
dfs.names = nil
return dfs
}
func (dfs *tDatasetFields) AddDef(fieldDef *xqi.TQueryColDef) xqi.DSFields {
fd := newDsField(dfs.ds, fieldDef.ColName, dfs.fieldCount, fieldDef.ColType)
dfs.fieldCount += 1
dfs.fieldMap[fieldDef.ColName] = fd
dfs.fields = append(dfs.fields, fd)
dfs.names = nil
return dfs
}
func (dfs *tDatasetFields) fieldByIndex(index int) *tDsField {
return dfs.fields[index]
}
func (dfs *tDatasetFields) Field(index int) xqi.DSField {
return dfs.fieldByIndex(index)
}
func (dfs *tDatasetFields) fieldByName(name string) *tDsField {
return dfs.fieldMap[name]
}
func (dfs *tDatasetFields) FieldByName(name string) xqi.DSField {
return dfs.fieldByName(name)
}
func (dfs *tDatasetFields) Names() []string {
if dfs.names == nil || len(dfs.names) != dfs.fieldCount {
dfs.names = make([]string, dfs.fieldCount)
for i := 0; i < dfs.fieldCount; i++ {
dfs.names[i] = dfs.Field(i).FieldName()
}
}
return dfs.names
}
func (dfs *tDatasetFields) WriteJson(writer io.Writer) (n int, err error) {
size := 0
if n, err := writer.Write([]byte("{ ")); err != nil {
return size, err
} else {
size += n
}
if n, err := writer.Write([]byte(fmt.Sprintf(`"count": %d`, dfs.fieldCount))); err != nil {
return n, err
} else {
size += n
}
for i := 0; i < dfs.fieldCount; i++ {
fd := dfs.fieldByIndex(i)
if n, err := writer.Write([]byte{','}); err != nil {
return size, err
} else {
size += n
}
s := fmt.Sprintf(`"%d":`, i)
if n, err := writer.Write([]byte(s)); err != nil {
return size, err
} else {
size += n
}
if n, err := fd.writeDefineJson(writer); err != nil {
return size, err
} else {
size += n
}
}
if n, err := writer.Write([]byte{' ', '}'}); err != nil {
return size, err
} else {
size += n
}
return size, nil
}