-
Notifications
You must be signed in to change notification settings - Fork 13
/
Copy pathmutate_column.go
147 lines (129 loc) · 3.2 KB
/
mutate_column.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
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
package datatable
import (
"strings"
"github.com/datasweet/expr"
"github.com/pkg/errors"
)
func (t *DataTable) addColumn(col *column) error {
if col == nil {
return ErrNilColumn
}
// Check name
if len(col.name) == 0 {
return ErrNilColumnName
}
if c := t.Column(col.name); c != nil {
err := errors.Errorf("column '%s' already exists", col.name)
return errors.Wrap(err, ErrColumnAlreadyExists.Error())
}
// Check typ
if len(col.typ) == 0 {
return ErrNilColumnType
}
// Check formula
if len(col.formulae) > 0 {
parsed, err := expr.Parse(col.formulae)
if err != nil {
return errors.Wrapf(err, ErrFormulaeSyntax.Error())
}
col.expr = parsed
t.hasExpr = true
}
// Check serie
if col.serie == nil {
return ErrNilSerie
}
ln := col.serie.Len()
if ln < t.nrows {
col.serie.Grow(t.nrows - ln)
} else if ln > t.nrows {
size := ln - t.nrows
for _, col := range t.cols {
col.serie.Grow(size)
}
t.nrows = ln
}
t.cols = append(t.cols, col)
t.dirty = true
return nil
}
// AddColumn to datatable with a serie of T
func (t *DataTable) AddColumn(name string, ctyp ColumnType, opt ...ColumnOption) error {
var options ColumnOptions
for _, o := range opt {
o(&options)
}
// create serie based on ctyp
sr, err := newColumnSerie(ctyp, options)
if err != nil {
return errors.Wrap(err, ErrCreateSerie.Error())
}
return t.addColumn(&column{
name: strings.TrimSpace(name),
typ: ctyp,
serie: sr,
hidden: options.Hidden,
formulae: strings.TrimSpace(options.Expr),
})
}
// RenameColumn to rename a column
func (t *DataTable) RenameColumn(old, name string) error {
name = strings.TrimSpace(name)
if len(name) == 0 {
err := errors.New("you must provided a column name")
return errors.Wrap(err, ErrNilColumnName.Error())
}
if c := t.Column(name); c != nil {
err := errors.Errorf("column '%s' already exists", name)
return errors.Wrap(err, ErrColumnAlreadyExists.Error())
}
if col := t.Column(old); col != nil {
col.(*column).name = name
return nil
}
err := errors.Errorf("column '%s' does not exist", name)
return errors.Wrap(err, ErrColumnNotFound.Error())
}
// HideAll to hides all column
// a hidden column will not be exported
func (t *DataTable) HideAll() {
for _, col := range t.cols {
col.hidden = true
}
}
// HideColumn hides a column
// a hidden column will not be exported
func (t *DataTable) HideColumn(name string) {
if c := t.Column(name); c != nil {
(c.(*column)).hidden = true
}
}
// ShowAll to show all column
// a shown column will be exported
func (t *DataTable) ShowAll() {
for _, col := range t.cols {
col.hidden = false
}
}
// ShowColumn shows a column
// a shown column will be exported
func (t *DataTable) ShowColumn(name string) {
if c := t.Column(name); c != nil {
(c.(*column)).hidden = false
}
}
// SwapColumn to swap 2 columns
func (t *DataTable) SwapColumn(a, b string) error {
i := t.ColumnIndex(a)
if i < 0 {
err := errors.Errorf("column '%s' not found", a)
return errors.Wrap(err, ErrColumnNotFound.Error())
}
j := t.ColumnIndex(b)
if j < 0 {
err := errors.Errorf("column '%s' not found", b)
return errors.Wrap(err, ErrColumnNotFound.Error())
}
t.cols[i], t.cols[j] = t.cols[j], t.cols[i]
return nil
}