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

import (
aaronchen2k2k's avatar
aaronchen2k2k 已提交
4
	"fmt"
aaronchen2k2k's avatar
aaronchen2k2k 已提交
5
	"github.com/easysoft/zendata/src/model"
aaronchen2k2k's avatar
aaronchen2k2k 已提交
6
	fileUtils "github.com/easysoft/zendata/src/utils/file"
aaronchen2k2k's avatar
aaronchen2k2k 已提交
7
	stringUtils "github.com/easysoft/zendata/src/utils/string"
aaronchen2k2k's avatar
aaronchen2k2k 已提交
8
	"github.com/easysoft/zendata/src/utils/vari"
aaronchen2k2k's avatar
aaronchen2k2k 已提交
9
	"github.com/mattn/go-runewidth"
aaronchen2k2k's avatar
aaronchen2k2k 已提交
10
	"strconv"
aaronchen2k2k's avatar
aaronchen2k2k 已提交
11 12 13
	"strings"
)

aaronchen2k2k's avatar
aaronchen2k2k 已提交
14
func GenerateForDefinition(defaultFile, configFile string, fieldsToExport *[]string, total int) ([][]string, []bool) {
aaronchen2k2k's avatar
aaronchen2k2k 已提交
15 16 17 18 19
	vari.DefaultDir = fileUtils.GetAbsDir(defaultFile)
	vari.ConfigDir = fileUtils.GetAbsDir(configFile)

	vari.Def = LoadConfigDef(defaultFile, configFile, fieldsToExport)
	vari.Res = LoadResDef(*fieldsToExport)
20

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

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

aaronchen2k2k's avatar
aaronchen2k2k 已提交
25
	// 为每个field生成值列表
aaronchen2k2k's avatar
aaronchen2k2k 已提交
26
	for index, field := range vari.Def.Fields {
27
		if !stringUtils.FindInArr(field.Field, *fieldsToExport) {
aaronchen2k2k's avatar
aaronchen2k2k 已提交
28 29
			continue
		}
aaronchen2k2k's avatar
aaronchen2k2k 已提交
30

31
		values := GenerateForField(&field, total, true)
aaronchen2k2k's avatar
aaronchen2k2k 已提交
32
		vari.Def.Fields[index].Precision = field.Precision
aaronchen2k2k's avatar
aaronchen2k2k 已提交
33

aaronchen2k2k's avatar
aaronchen2k2k 已提交
34
		fieldNameToValues[field.Field] = values
aaronchen2k2k's avatar
aaronchen2k2k 已提交
35
		colTypes = append(colTypes, field.IsNumb)
aaronchen2k2k's avatar
aaronchen2k2k 已提交
36 37
	}

aaronchen2k2k's avatar
aaronchen2k2k 已提交
38
	// 生成指定数量行的数据
aaronchen2k2k's avatar
aaronchen2k2k 已提交
39 40
	rows := make([][]string, 0)
	for i := 0; i < total; i++ {
aaronchen2k2k's avatar
aaronchen2k2k 已提交
41
		for _, field := range vari.Def.Fields {
42
			if !stringUtils.FindInArr(field.Field, *fieldsToExport) {
aaronchen2k2k's avatar
aaronchen2k2k 已提交
43 44
				continue
			}
aaronchen2k2k's avatar
aaronchen2k2k 已提交
45

aaronchen2k2k's avatar
aaronchen2k2k 已提交
46
			values := fieldNameToValues[field.Field]
aaronchen2k2k's avatar
aaronchen2k2k 已提交
47
			fieldVal := values[i % len(values)]
aaronchen2k2k's avatar
aaronchen2k2k 已提交
48
			if len(rows) == i { rows = append(rows, make([]string, 0)) }
aaronchen2k2k's avatar
aaronchen2k2k 已提交
49
			rows[i] = append(rows[i], fieldVal)
aaronchen2k2k's avatar
aaronchen2k2k 已提交
50
		}
aaronchen2k2k's avatar
aaronchen2k2k 已提交
51
	}
aaronchen2k2k's avatar
aaronchen2k2k 已提交
52

aaronchen2k2k's avatar
aaronchen2k2k 已提交
53
	return rows, colTypes
aaronchen2k2k's avatar
aaronchen2k2k 已提交
54 55
}

56
func GenerateForField(field *model.DefField, total int, withFix bool) []string {
aaronchen2k2k's avatar
aaronchen2k2k 已提交
57 58
	values := make([]string, 0)

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

aaronchen2k2k's avatar
aaronchen2k2k 已提交
66 67 68
		count := total
		if strings.Index(field.Path, "") > -1 { // is child, gen x*y records
			count = getRecordCount(arrOfArr)
aaronchen2k2k's avatar
aaronchen2k2k 已提交
69 70 71
			if count > total {
				count = total
			}
aaronchen2k2k's avatar
aaronchen2k2k 已提交
72 73 74
		}
		connectChildrenToSingleStr(arrOfArr, count, &values)
		values = LoopSubFields(field, values, count, true)
aaronchen2k2k's avatar
aaronchen2k2k 已提交
75

aaronchen2k2k's avatar
aaronchen2k2k 已提交
76
	} else if field.From != "" { // refer to res
77

aaronchen2k2k's avatar
aaronchen2k2k 已提交
78
		if field.Use != "" { // refer to instance
79 80 81 82
			if field.Use == "privateIP" {
				fmt.Println("")
			}

aaronchen2k2k's avatar
aaronchen2k2k 已提交
83
			groupValues := vari.Res[field.From]
aaronchen2k2k's avatar
aaronchen2k2k 已提交
84 85
			groups := strings.Split(field.Use, ",")
			for _, group := range groups {
aaronchen2k2k's avatar
aaronchen2k2k 已提交
86 87 88 89 90 91 92
				if group == "all" {
					for _, arr := range groupValues { // add all
						values = append(values, arr...)
					}
				} else {
					values = append(values, groupValues[group]...)
				}
aaronchen2k2k's avatar
aaronchen2k2k 已提交
93
			}
aaronchen2k2k's avatar
aaronchen2k2k 已提交
94 95
		} else if field.Select != "" { // refer to excel
			groupValues := vari.Res[field.From]
aaronchen2k2k's avatar
aaronchen2k2k 已提交
96 97
			slct := field.Select
			values = append(values, groupValues[slct]...)
aaronchen2k2k's avatar
aaronchen2k2k 已提交
98 99
		}

100
		values = LoopSubFields(field, values, total, true)
aaronchen2k2k's avatar
aaronchen2k2k 已提交
101

aaronchen2k2k's avatar
aaronchen2k2k 已提交
102 103 104
	} else if field.Config != "" { // refer to another define
		groupValues := vari.Res[field.Config]
		values = append(values, groupValues["all"]...)
aaronchen2k2k's avatar
aaronchen2k2k 已提交
105
	} else { // basic field
aaronchen2k2k's avatar
aaronchen2k2k 已提交
106
		values = GenerateFieldItemsFromDefinition(field)
aaronchen2k2k's avatar
aaronchen2k2k 已提交
107 108 109 110
	}

	return values
}
111

aaronchen2k2k's avatar
aaronchen2k2k 已提交
112
func GenerateFieldItemsFromDefinition(field *model.DefField) []string {
aaronchen2k2k's avatar
aaronchen2k2k 已提交
113
	//if field.Loop == "" {field.Loop = "1"}
aaronchen2k2k's avatar
aaronchen2k2k 已提交
114

aaronchen2k2k's avatar
aaronchen2k2k 已提交
115 116
	values := make([]string, 0)

aaronchen2k2k's avatar
aaronchen2k2k 已提交
117
	fieldValue := GenerateList(field)
aaronchen2k2k's avatar
aaronchen2k2k 已提交
118 119 120 121 122

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

		count++
aaronchen2k2k's avatar
aaronchen2k2k 已提交
127
		if index >= len(fieldValue.Values) || count >= vari.Total {
aaronchen2k2k's avatar
aaronchen2k2k 已提交
128 129 130 131 132 133 134
			break
		}
	}

	return values
}

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

aaronchen2k2k's avatar
aaronchen2k2k 已提交
138 139
	// 叶节点
	idx := *index % len(fieldValue.Values)
aaronchen2k2k's avatar
aaronchen2k2k 已提交
140
	val := fieldValue.Values[idx]
aaronchen2k2k's avatar
aaronchen2k2k 已提交
141
	str = GetFieldValStr(field, val)
142

aaronchen2k2k's avatar
aaronchen2k2k 已提交
143
	return str
144 145
}

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

aaronchen2k2k's avatar
gen int  
aaronchen2k2k 已提交
150 151
	switch val.(type) {
		case int64:
aaronchen2k2k's avatar
format  
aaronchen2k2k 已提交
152 153 154 155 156 157
			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 已提交
158 159 160 161 162
		case float64:
			precision := 0
			if field.Precision > 0 {
				precision = field.Precision
			}
aaronchen2k2k's avatar
format  
aaronchen2k2k 已提交
163 164 165 166 167 168
			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 已提交
169 170
		case byte:
			str = string(val.(byte))
aaronchen2k2k's avatar
format  
aaronchen2k2k 已提交
171 172 173 174 175 176
			if field.Format != "" {
				str, success = stringUtils.FormatStr(field.Format, str)
			}
			if !success {
				str = string(val.(byte))
			}
aaronchen2k2k's avatar
aaronchen2k2k 已提交
177 178
		case string:
			str = val.(string)
aaronchen2k2k's avatar
aaronchen2k2k 已提交
179
			fmt.Sprintf(str)
aaronchen2k2k's avatar
gen int  
aaronchen2k2k 已提交
180 181 182 183
		default:
	}

	return str
aaronchen2k2k's avatar
aaronchen2k2k 已提交
184 185
}

186
func LoopSubFields(field *model.DefField, oldValues []string, total int, withFix bool) []string {
aaronchen2k2k's avatar
aaronchen2k2k 已提交
187
	//if field.Loop == "" {field.Loop = "1"}
aaronchen2k2k's avatar
aaronchen2k2k 已提交
188 189 190 191 192

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

	for _, val := range oldValues {
aaronchen2k2k's avatar
aaronchen2k2k 已提交
193
		fieldValue.Values = append(fieldValue.Values, val)
aaronchen2k2k's avatar
aaronchen2k2k 已提交
194 195
	}

aaronchen2k2k's avatar
aaronchen2k2k 已提交
196
	indexOfRow := 0
aaronchen2k2k's avatar
aaronchen2k2k 已提交
197 198 199
	count := 0
	for {
		// 处理格式、前后缀、loop等
aaronchen2k2k's avatar
aaronchen2k2k 已提交
200
		str := GenerateFieldValWithFix(field, fieldValue, &indexOfRow, withFix)
aaronchen2k2k's avatar
aaronchen2k2k 已提交
201 202 203
		values = append(values, str)

		count++
aaronchen2k2k's avatar
aaronchen2k2k 已提交
204
		if indexOfRow >= len(fieldValue.Values) || count >= total {
aaronchen2k2k's avatar
aaronchen2k2k 已提交
205 206 207 208 209 210 211
			break
		}
	}

	return values
}

aaronchen2k2k's avatar
aaronchen2k2k 已提交
212
func GenerateFieldValWithFix(field *model.DefField, fieldValue model.FieldValue, indexOfRow *int, withFix bool) string {
aaronchen2k2k's avatar
aaronchen2k2k 已提交
213 214 215
	prefix := field.Prefix
	postfix := field.Postfix

aaronchen2k2k's avatar
aaronchen2k2k 已提交
216
	computerLoop(field)
aaronchen2k2k's avatar
aaronchen2k2k 已提交
217
	loopStr := ""
aaronchen2k2k's avatar
aaronchen2k2k 已提交
218
	for j := 0; j < (*field).LoopIndex; j++ {
aaronchen2k2k's avatar
aaronchen2k2k 已提交
219 220 221 222
		if loopStr != "" {
			loopStr = loopStr + field.Loopfix
		}

aaronchen2k2k's avatar
aaronchen2k2k 已提交
223
		str := GenerateFieldVal(*field, fieldValue, indexOfRow)
aaronchen2k2k's avatar
aaronchen2k2k 已提交
224 225 226 227 228
		loopStr = loopStr + str

		*indexOfRow++
	}

aaronchen2k2k's avatar
aaronchen2k2k 已提交
229
	if withFix && !vari.Trim {
aaronchen2k2k's avatar
aaronchen2k2k 已提交
230 231 232
		loopStr = prefix + loopStr + postfix
	}

aaronchen2k2k's avatar
aaronchen2k2k 已提交
233
	if field.Width > runewidth.StringWidth(loopStr) {
aaronchen2k2k's avatar
aaronchen2k2k 已提交
234 235 236 237 238 239
		loopStr = stringUtils.AddPad(loopStr, *field)
	}

	(*field).LoopIndex = (*field).LoopIndex + 1
	if (*field).LoopIndex > (*field).LoopEnd {
		(*field).LoopIndex = (*field).LoopStart
aaronchen2k2k's avatar
aaronchen2k2k 已提交
240 241
	}

aaronchen2k2k's avatar
aaronchen2k2k 已提交
242
	return loopStr
aaronchen2k2k's avatar
aaronchen2k2k 已提交
243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263
}

func computerLoop(field *model.DefField) {
	if (*field).LoopIndex != 0 {
		return
	}

	arr := strings.Split(field.Loop, "-")
	(*field).LoopStart, _ = strconv.Atoi(arr[0])
	if len(arr) > 1 {
		field.LoopEnd, _ = strconv.Atoi(arr[1])
	}

	if (*field).LoopStart == 0 {
		(*field).LoopStart = 1
	}
	if (*field).LoopEnd == 0 {
		(*field).LoopEnd = 1
	}

	(*field).LoopIndex = (*field).LoopStart
264 265 266 267 268
}

func connectChildrenToSingleStr(arrOfArr [][]string, total int, values *[]string) {
	indexArr := getModArr(arrOfArr)

aaronchen2k2k's avatar
aaronchen2k2k 已提交
269 270
	for i := 0; i < total; i++ {
		str := ""
aaronchen2k2k's avatar
aaronchen2k2k 已提交
271 272 273 274
		for j := 0; j < len(arrOfArr); j++ {
			child := arrOfArr[j]

			mod := indexArr[j]
aaronchen2k2k's avatar
aaronchen2k2k 已提交
275
			remainder := i / mod % len(child)
aaronchen2k2k's avatar
aaronchen2k2k 已提交
276
			str = str + child[remainder]
277 278
		}

279
		*values = append(*values, str)
280 281 282
	}
}

aaronchen2k2k's avatar
aaronchen2k2k 已提交
283 284 285 286 287 288 289 290 291
func getRecordCount(arrOfArr [][]string) int {
	count := 1
	for i := 0; i < len(arrOfArr); i++ {
		arr := arrOfArr[i]
		count = len(arr) * count
	}
	return count
}

292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308
func getModArr(arrOfArr [][]string) []int {
	indexArr := make([]int, 0)
	for _, _ = range arrOfArr {
		indexArr = append(indexArr, 0)
	}

	for i := 0; i < len(arrOfArr); i++ {
		loop := 1
		for j := i + 1; j < len(arrOfArr); j++ {
			loop = loop * len(arrOfArr[j])
		}

		indexArr[i] = loop
	}

	return indexArr
}