generator.go 5.2 KB
Newer Older
aaronchen2k2k's avatar
aaronchen2k2k 已提交
1 2 3
package gen

import (
aaronchen2k2k's avatar
aaronchen2k2k 已提交
4
	"fmt"
aaronchen2k2k's avatar
aaronchen2k2k 已提交
5 6 7
	"github.com/easysoft/zendata/src/model"
	constant "github.com/easysoft/zendata/src/utils/const"
	stringUtils "github.com/easysoft/zendata/src/utils/string"
aaronchen2k2k's avatar
aaronchen2k2k 已提交
8
	"strconv"
aaronchen2k2k's avatar
aaronchen2k2k 已提交
9 10 11
	"strings"
)

aaronchen2k2k's avatar
aaronchen2k2k 已提交
12
func GenerateForDefinition(total int, fieldsToExport []string) ([][]string, []bool) {
aaronchen2k2k's avatar
aaronchen2k2k 已提交
13
	def := constant.RootDef
14

aaronchen2k2k's avatar
aaronchen2k2k 已提交
15 16
	fieldNameToValues := map[string][]string{}

aaronchen2k2k's avatar
aaronchen2k2k 已提交
17 18
	colTypes := make([]bool, 0)

aaronchen2k2k's avatar
aaronchen2k2k 已提交
19
	// 为每个field生成值列表
aaronchen2k2k's avatar
aaronchen2k2k 已提交
20
	for index, field := range def.Fields {
aaronchen2k2k's avatar
aaronchen2k2k 已提交
21
		if !stringUtils.FindInArr(field.Field, fieldsToExport) {
aaronchen2k2k's avatar
aaronchen2k2k 已提交
22 23
			continue
		}
aaronchen2k2k's avatar
aaronchen2k2k 已提交
24 25

		values := GenerateForField(&field, total)
aaronchen2k2k's avatar
aaronchen2k2k 已提交
26
		def.Fields[index].Precision = field.Precision
aaronchen2k2k's avatar
aaronchen2k2k 已提交
27

aaronchen2k2k's avatar
aaronchen2k2k 已提交
28
		fieldNameToValues[field.Field] = values
aaronchen2k2k's avatar
aaronchen2k2k 已提交
29
		colTypes = append(colTypes, field.IsNumb)
aaronchen2k2k's avatar
aaronchen2k2k 已提交
30 31
	}

aaronchen2k2k's avatar
aaronchen2k2k 已提交
32
	// 生成指定数量行的数据
aaronchen2k2k's avatar
aaronchen2k2k 已提交
33 34 35
	rows := make([][]string, 0)
	for i := 0; i < total; i++ {
		for _, field := range def.Fields {
aaronchen2k2k's avatar
aaronchen2k2k 已提交
36
			if !stringUtils.FindInArr(field.Field, fieldsToExport) {
aaronchen2k2k's avatar
aaronchen2k2k 已提交
37 38
				continue
			}
aaronchen2k2k's avatar
aaronchen2k2k 已提交
39

aaronchen2k2k's avatar
aaronchen2k2k 已提交
40
			values := fieldNameToValues[field.Field]
aaronchen2k2k's avatar
aaronchen2k2k 已提交
41
			fieldVal := values[i % len(values)]
aaronchen2k2k's avatar
aaronchen2k2k 已提交
42
			if len(rows) == i { rows = append(rows, make([]string, 0)) }
aaronchen2k2k's avatar
aaronchen2k2k 已提交
43
			rows[i] = append(rows[i], fieldVal)
aaronchen2k2k's avatar
aaronchen2k2k 已提交
44
		}
aaronchen2k2k's avatar
aaronchen2k2k 已提交
45
	}
aaronchen2k2k's avatar
aaronchen2k2k 已提交
46

aaronchen2k2k's avatar
aaronchen2k2k 已提交
47
	return rows, colTypes
aaronchen2k2k's avatar
aaronchen2k2k 已提交
48 49
}

aaronchen2k2k's avatar
aaronchen2k2k 已提交
50
func GenerateForField(field *model.DefField,  total int) []string {
aaronchen2k2k's avatar
aaronchen2k2k 已提交
51 52
	values := make([]string, 0)

aaronchen2k2k's avatar
aaronchen2k2k 已提交
53
	if len(field.Fields) > 0 { // sub fields
aaronchen2k2k's avatar
aaronchen2k2k 已提交
54
		arr := make([][]string, 0) // 2 dimension arr for child, [ [a,b,c], [1,2,3] ]
aaronchen2k2k's avatar
aaronchen2k2k 已提交
55 56 57 58 59 60 61 62
		for _, child := range field.Fields {
			childValues := GenerateForField(&child, total)
			arr = append(arr, childValues)
		}

		for i := 0; i < total; i++ {
			concat := ""
			for _, row := range arr {
aaronchen2k2k's avatar
aaronchen2k2k 已提交
63
				concat = concat + row[i] // a1 or b2
aaronchen2k2k's avatar
aaronchen2k2k 已提交
64 65
			}

aaronchen2k2k's avatar
aaronchen2k2k 已提交
66
			concat = field.Prefix + concat + field.Postfix
aaronchen2k2k's avatar
aaronchen2k2k 已提交
67 68
			values = append(values, concat)
		}
aaronchen2k2k's avatar
aaronchen2k2k 已提交
69 70
		values = LoopSubFields(field, values, total)

aaronchen2k2k's avatar
aaronchen2k2k 已提交
71 72
	} else if field.From != "" && field.Select != "" { // refer to excel
		arr := strings.Split(field.From, ".")
aaronchen2k2k's avatar
aaronchen2k2k 已提交
73
		referField := constant.ResMap[arr[0]]
74

aaronchen2k2k's avatar
aaronchen2k2k 已提交
75 76 77
		referField.From = field.From
		referField.Select = field.Select
		referField.Where = field.Where
78

aaronchen2k2k's avatar
aaronchen2k2k 已提交
79
		referField.Format = field.Format
80 81 82 83
		referField.Prefix = field.Prefix
		referField.Postfix = field.Postfix
		referField.Loop = field.Loop
		referField.Loopfix = field.Loopfix
84

aaronchen2k2k's avatar
aaronchen2k2k 已提交
85 86 87 88
		//values = GenerateFieldItemsFromDefinition(&referField, total)

	} else if field.From != "" && field.Range != "" { // refer to yaml file
		if field.Range != "" { // specific custom file
aaronchen2k2k's avatar
aaronchen2k2k 已提交
89
			//LoadRootDef(constant.InputDir + field.Range)
aaronchen2k2k's avatar
aaronchen2k2k 已提交
90 91
		}

aaronchen2k2k's avatar
aaronchen2k2k 已提交
92
		//referField := constant.ResMap[field.Field]
aaronchen2k2k's avatar
aaronchen2k2k 已提交
93 94 95 96
		//values = GenerateForField(&referField, total)
		// TODO: 需要处理range: small,large等逻辑

	} else {
aaronchen2k2k's avatar
aaronchen2k2k 已提交
97
		values = GenerateFieldItemsFromDefinition(field)
aaronchen2k2k's avatar
aaronchen2k2k 已提交
98 99 100 101
	}

	return values
}
102

aaronchen2k2k's avatar
aaronchen2k2k 已提交
103
func GenerateFieldItemsFromDefinition(field *model.DefField) []string {
aaronchen2k2k's avatar
aaronchen2k2k 已提交
104 105
	if field.Loop == 0 {field.Loop = 1}

aaronchen2k2k's avatar
aaronchen2k2k 已提交
106 107 108
	values := make([]string, 0)

	// 整理出值的列表
aaronchen2k2k's avatar
aaronchen2k2k 已提交
109 110
	//datatype := strings.TrimSpace(field.Type)
	//if datatype == "" { datatype = "list" }
111

aaronchen2k2k's avatar
aaronchen2k2k 已提交
112
	fieldValue := GenerateList(field)
aaronchen2k2k's avatar
aaronchen2k2k 已提交
113 114 115 116 117

	index := 0
	count := 0
	for {
		// 处理格式、前后缀、loop等
aaronchen2k2k's avatar
aaronchen2k2k 已提交
118
		str := GenerateFieldValWithFix(*field, fieldValue, &index, true)
aaronchen2k2k's avatar
aaronchen2k2k 已提交
119 120 121
		values = append(values, str)

		count++
aaronchen2k2k's avatar
aaronchen2k2k 已提交
122
		if count >= constant.Total {
aaronchen2k2k's avatar
aaronchen2k2k 已提交
123 124 125 126 127 128 129
			break
		}
	}

	return values
}

aaronchen2k2k's avatar
aaronchen2k2k 已提交
130
func GenerateFieldVal(field model.DefField, fieldValue model.FieldValue, index *int) string {
131
	str := ""
132

aaronchen2k2k's avatar
aaronchen2k2k 已提交
133 134
	// 叶节点
	idx := *index % len(fieldValue.Values)
aaronchen2k2k's avatar
aaronchen2k2k 已提交
135
	val := fieldValue.Values[idx]
aaronchen2k2k's avatar
aaronchen2k2k 已提交
136
	str = GetFieldValStr(field, val)
137

aaronchen2k2k's avatar
aaronchen2k2k 已提交
138
	return str
139 140
}

aaronchen2k2k's avatar
aaronchen2k2k 已提交
141
func GetFieldValStr(field model.DefField, val interface{}) string {
aaronchen2k2k's avatar
gen int  
aaronchen2k2k 已提交
142
	str := "n/a"
aaronchen2k2k's avatar
format  
aaronchen2k2k 已提交
143
	success := false
144

aaronchen2k2k's avatar
gen int  
aaronchen2k2k 已提交
145 146
	switch val.(type) {
		case int64:
aaronchen2k2k's avatar
format  
aaronchen2k2k 已提交
147 148 149 150 151 152
			if field.Format != "" {
				str, success = stringUtils.FormatStr(field.Format, val.(int64))
			}
			if !success {
				str = strconv.FormatInt(val.(int64), 10)
			}
aaronchen2k2k's avatar
gen int  
aaronchen2k2k 已提交
153 154 155 156 157
		case float64:
			precision := 0
			if field.Precision > 0 {
				precision = field.Precision
			}
aaronchen2k2k's avatar
format  
aaronchen2k2k 已提交
158 159 160 161 162 163
			if field.Format != "" {
				str, success = stringUtils.FormatStr(field.Format, val.(float64))
			}
			if !success {
				str = strconv.FormatFloat(val.(float64), 'f', precision, 64)
			}
aaronchen2k2k's avatar
gen int  
aaronchen2k2k 已提交
164 165
		case byte:
			str = string(val.(byte))
aaronchen2k2k's avatar
format  
aaronchen2k2k 已提交
166 167 168 169 170 171
			if field.Format != "" {
				str, success = stringUtils.FormatStr(field.Format, str)
			}
			if !success {
				str = string(val.(byte))
			}
aaronchen2k2k's avatar
aaronchen2k2k 已提交
172 173
		case string:
			str = val.(string)
aaronchen2k2k's avatar
aaronchen2k2k 已提交
174
			fmt.Sprintf(str)
aaronchen2k2k's avatar
gen int  
aaronchen2k2k 已提交
175 176 177 178
		default:
	}

	return str
aaronchen2k2k's avatar
aaronchen2k2k 已提交
179 180
}

aaronchen2k2k's avatar
aaronchen2k2k 已提交
181
func LoopSubFields(field *model.DefField, oldValues []string, total int) []string {
aaronchen2k2k's avatar
aaronchen2k2k 已提交
182 183 184 185 186 187
	if field.Loop == 0 {field.Loop = 1}

	values := make([]string, 0)
	fieldValue := model.FieldValue{}

	for _, val := range oldValues {
aaronchen2k2k's avatar
aaronchen2k2k 已提交
188
		fieldValue.Values = append(fieldValue.Values, val)
aaronchen2k2k's avatar
aaronchen2k2k 已提交
189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206
	}

	index := 0
	count := 0
	for {
		// 处理格式、前后缀、loop等
		str := GenerateFieldValWithFix(*field, fieldValue, &index, false)
		values = append(values, str)

		count++
		if count >= total {
			break
		}
	}

	return values
}

aaronchen2k2k's avatar
aaronchen2k2k 已提交
207
func GenerateFieldValWithFix(field model.DefField, fieldValue model.FieldValue, indexOfRow *int, withLoop bool) string {
aaronchen2k2k's avatar
aaronchen2k2k 已提交
208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227
	prefix := field.Prefix
	postfix := field.Postfix

	loopStr := ""
	for j := 0; j < field.Loop; j++ {
		if loopStr != "" {
			loopStr = loopStr + field.Loopfix
		}

		str := GenerateFieldVal(field, fieldValue, indexOfRow)
		loopStr = loopStr + str

		*indexOfRow++
	}

	if withLoop {
		loopStr = prefix + loopStr + postfix
	}

	return loopStr
228
}