Skip to content

Commit 607601a

Browse files
feat: Better handling for const columns
1 parent cb5091f commit 607601a

File tree

10 files changed

+134
-34
lines changed

10 files changed

+134
-34
lines changed

README.md

-3
Original file line numberDiff line numberDiff line change
@@ -735,7 +735,6 @@ Thanks to the maintainers of the following fantastic packages, whose code this t
735735
736736
### Todos
737737
738-
* Better support for post generation (e.g. `IMPORT`)
739738
* Improve code coverage
740739
* Write file after generating, then only keep columns that other tables need
741740
* Support for range without a table count (e.g. the following results in zero rows unless a count is provided)
@@ -755,5 +754,3 @@ Thanks to the maintainers of the following fantastic packages, whose code this t
755754
processor:
756755
values: [Win, Lose, Draw]
757756
```
758-
759-
* Default step value for int range (of 1)

dg.go

+16-10
Original file line numberDiff line numberDiff line change
@@ -146,11 +146,17 @@ func generateTable(t model.Table, files map[string]model.CSVFile, tt ui.TimerFun
146146
defer tt(time.Now(), fmt.Sprintf("generated table: %s", t.Name))
147147

148148
// Create the Cartesian product of any each types first.
149-
var g generator.EachGenerator
150-
if err := g.Generate(t, files); err != nil {
149+
var eg generator.EachGenerator
150+
if err := eg.Generate(t, files); err != nil {
151151
return fmt.Errorf("generating each columns: %w", err)
152152
}
153153

154+
// Create any const columns next.
155+
var cg generator.ConstGenerator
156+
if err := cg.Generate(t, files); err != nil {
157+
return fmt.Errorf("generating const columns: %w", err)
158+
}
159+
154160
for _, col := range t.Columns {
155161
switch col.Type {
156162
case "ref":
@@ -180,14 +186,14 @@ func generateTable(t model.Table, files map[string]model.CSVFile, tt ui.TimerFun
180186
return fmt.Errorf("running set process for %s.%s: %w", t.Name, col.Name, err)
181187
}
182188

183-
case "const":
184-
var g generator.ConstGenerator
185-
if err := col.Generator.UnmarshalFunc(&g); err != nil {
186-
return fmt.Errorf("parsing const process for %s.%s: %w", t.Name, col.Name, err)
187-
}
188-
if err := g.Generate(t, col, files); err != nil {
189-
return fmt.Errorf("running const process for %s.%s: %w", t.Name, col.Name, err)
190-
}
189+
// case "const":
190+
// var g generator.ConstGenerator
191+
// if err := col.Generator.UnmarshalFunc(&g); err != nil {
192+
// return fmt.Errorf("parsing const process for %s.%s: %w", t.Name, col.Name, err)
193+
// }
194+
// if err := g.Generate(t, col, files); err != nil {
195+
// return fmt.Errorf("running const process for %s.%s: %w", t.Name, col.Name, err)
196+
// }
191197

192198
case "inc":
193199
var g generator.IncGenerator

examples/const_test/config.yaml

+23-4
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,31 @@
11
tables:
22
- name: one
33
columns:
4-
- name: a
4+
- name: c1
55
type: const
66
processor:
7-
values: [val_1, val_2, val_3]
7+
values: [a, b, c]
8+
9+
- name: two
10+
columns:
11+
- name: c1
12+
type: const
13+
processor:
14+
values: [a, b, c, d, e]
15+
16+
- name: c2
17+
type: const
18+
processor:
19+
values: [a, b]
20+
21+
- name: three
22+
columns:
23+
- name: c1
24+
type: const
25+
processor:
26+
values: [a, b]
827

9-
- name: b
28+
- name: c2
1029
type: const
1130
processor:
12-
values: [val_1, val_2, val_3]
31+
values: [a, b, c, d, e]

examples/range_test/config.yaml

+22
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,26 @@
11
tables:
2+
- name: auto_incrementing_id
3+
count: 20
4+
columns:
5+
- name: id
6+
type: range
7+
processor:
8+
type: int
9+
from: 1
10+
11+
- name: bet_types
12+
columns:
13+
- name: id
14+
type: range
15+
processor:
16+
type: int
17+
from: 1
18+
step: 1
19+
- name: description
20+
type: const
21+
processor:
22+
values: [Win, Lose, Draw]
23+
224
- name: previous_table
325
count: 20
426
columns:

internal/pkg/generator/const_generator.go

+43-3
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package generator
22

33
import (
44
"fmt"
5+
"sort"
56

67
"github.com/codingconcepts/dg/internal/pkg/model"
78
"github.com/samber/lo"
@@ -12,8 +13,44 @@ type ConstGenerator struct {
1213
Values []string `yaml:"values"`
1314
}
1415

15-
// Generate generates values for a column based on a series of provided values.
16-
func (g ConstGenerator) Generate(t model.Table, c model.Column, files map[string]model.CSVFile) error {
16+
// Generate values for a column based on a series of provided values.
17+
func (g ConstGenerator) Generate(t model.Table, files map[string]model.CSVFile) error {
18+
cols := lo.Filter(t.Columns, func(c model.Column, _ int) bool {
19+
return c.Type == "const"
20+
})
21+
22+
sortColumns(cols)
23+
24+
for _, c := range cols {
25+
var cg ConstGenerator
26+
if err := c.Generator.UnmarshalFunc(&cg); err != nil {
27+
return fmt.Errorf("parsing const process for %s.%s: %w", t.Name, c.Name, err)
28+
}
29+
if err := cg.generate(t, c, files); err != nil {
30+
return fmt.Errorf("generating const columns: %w", err)
31+
}
32+
}
33+
34+
return nil
35+
}
36+
37+
func sortColumns(cols []model.Column) {
38+
sort.Slice(cols, func(i, j int) bool {
39+
var g1 ConstGenerator
40+
if err := cols[i].Generator.UnmarshalFunc(&g1); err != nil {
41+
return false
42+
}
43+
44+
var g2 ConstGenerator
45+
if err := cols[j].Generator.UnmarshalFunc(&g2); err != nil {
46+
return false
47+
}
48+
49+
return len(g1.Values) > len(g2.Values)
50+
})
51+
}
52+
53+
func (g ConstGenerator) generate(t model.Table, c model.Column, files map[string]model.CSVFile) error {
1754
if len(g.Values) == 0 {
1855
return fmt.Errorf("no values provided for const generator")
1956
}
@@ -26,8 +63,11 @@ func (g ConstGenerator) Generate(t model.Table, c model.Column, files map[string
2663
count = t.Count
2764
}
2865

66+
// Repeat the values until they equal the count.
2967
if count > len(g.Values) {
30-
return fmt.Errorf("wrong number of values provided for const generator (need %d, got %d)", count, len(g.Values))
68+
for i := 0; len(g.Values) < count; i++ {
69+
g.Values = append(g.Values, g.Values[i%len(g.Values)])
70+
}
3171
}
3272

3373
AddTable(t, c.Name, g.Values, files)

internal/pkg/generator/const_generator_test.go

+13-11
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
package generator
22

33
import (
4-
"fmt"
54
"testing"
65

76
"github.com/codingconcepts/dg/internal/pkg/model"
7+
"github.com/samber/lo"
88
"github.com/stretchr/testify/assert"
99
)
1010

@@ -14,6 +14,7 @@ func TestGenerateConstColumn(t *testing.T) {
1414
tableCount int
1515
files map[string]model.CSVFile
1616
values []string
17+
exp []string
1718
expErr error
1819
}{
1920
{
@@ -34,8 +35,8 @@ func TestGenerateConstColumn(t *testing.T) {
3435
},
3536
},
3637
},
37-
values: []string{"a"},
38-
expErr: fmt.Errorf("wrong number of values provided for const generator (need 3, got 1)"),
38+
values: []string{"a", "b"},
39+
exp: []string{"a", "b", "a"},
3940
},
4041
{
4142
name: "less than current table size with table count",
@@ -50,8 +51,8 @@ func TestGenerateConstColumn(t *testing.T) {
5051
},
5152
},
5253
},
53-
values: []string{"a"},
54-
expErr: fmt.Errorf("wrong number of values provided for const generator (need 3, got 1)"),
54+
values: []string{"a", "b"},
55+
exp: []string{"a", "b", "a"},
5556
},
5657
{
5758
name: "same as current table size",
@@ -92,19 +93,20 @@ func TestGenerateConstColumn(t *testing.T) {
9293
table := model.Table{
9394
Name: "table",
9495
Count: c.tableCount,
96+
Columns: []model.Column{
97+
{Name: "col", Type: "const", Generator: model.ToRawMessage(t, g)},
98+
},
9599
}
96100

97-
column := model.Column{
98-
Name: "col",
99-
}
100-
101-
actErr := g.Generate(table, column, c.files)
101+
actErr := g.Generate(table, c.files)
102102
assert.Equal(t, c.expErr, actErr)
103103
if actErr != nil {
104104
return
105105
}
106106

107-
assert.Equal(t, c.values, c.files["table"].Lines[len(c.files["table"].Lines)-1])
107+
exp := lo.Ternary(c.exp != nil, c.exp, c.values)
108+
109+
assert.Equal(t, exp, c.files["table"].Lines[len(c.files["table"].Lines)-1])
108110
})
109111
}
110112
}

internal/pkg/generator/gen_generator.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ func (g GenGenerator) GetFormat() string {
1919
return g.Format
2020
}
2121

22-
// Generate generates random data for a given column.
22+
// Generate random data for a given column.
2323
func (g GenGenerator) Generate(t model.Table, c model.Column, files map[string]model.CSVFile) error {
2424
if t.Count == 0 {
2525
t.Count = len(lo.MaxBy(files[t.Name].Lines, func(a, b []string) bool {

internal/pkg/generator/inc_generator.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ func (pi IncGenerator) GetFormat() string {
1515
return pi.Format
1616
}
1717

18-
// Generate generates an incrementing number value for a column.
18+
// Generate an incrementing number value for a column.
1919
func (g IncGenerator) Generate(t model.Table, c model.Column, files map[string]model.CSVFile) error {
2020
if t.Count == 0 {
2121
t.Count = len(lo.MaxBy(files[t.Name].Lines, func(a, b []string) bool {

internal/pkg/generator/range_generator.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ type RangeGenerator struct {
1818
Format string `yaml:"format"`
1919
}
2020

21-
// Generate generates sequential data between a given start and end range.
21+
// Generate sequential data between a given start and end range.
2222
func (g RangeGenerator) Generate(t model.Table, c model.Column, files map[string]model.CSVFile) error {
2323
count := len(lo.MaxBy(files[t.Name].Lines, func(a, b []string) bool {
2424
return len(a) > len(b)

internal/pkg/generator/range_generator_test.go

+14
Original file line numberDiff line numberDiff line change
@@ -137,6 +137,20 @@ func TestGenerateRangeColumn(t *testing.T) {
137137
"40",
138138
},
139139
},
140+
{
141+
name: "generates int range for const",
142+
files: map[string]model.CSVFile{},
143+
rtype: "int",
144+
count: 4,
145+
from: "1",
146+
step: "1",
147+
expLines: []string{
148+
"1",
149+
"2",
150+
"3",
151+
"4",
152+
},
153+
},
140154
}
141155

142156
for _, c := range cases {

0 commit comments

Comments
 (0)