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

import (
aaronchen2k2k's avatar
aaronchen2k2k 已提交
4
	"errors"
aaronchen2k2k's avatar
aaronchen2k2k 已提交
5
	"fmt"
aaronchen2k2k's avatar
aaronchen2k2k 已提交
6
	"github.com/easysoft/zendata/src/gen/helper"
aaronchen2k2k's avatar
aaronchen2k2k 已提交
7
	"github.com/easysoft/zendata/src/model"
aaronchen2k2k's avatar
aaronchen2k2k 已提交
8
	commonUtils "github.com/easysoft/zendata/src/utils/common"
aaronchen2k2k's avatar
aaronchen2k2k 已提交
9
	constant "github.com/easysoft/zendata/src/utils/const"
aaronchen2k2k's avatar
aaronchen2k2k 已提交
10
	fileUtils "github.com/easysoft/zendata/src/utils/file"
aaronchen2k2k's avatar
aaronchen2k2k 已提交
11 12
	i118Utils "github.com/easysoft/zendata/src/utils/i118"
	logUtils "github.com/easysoft/zendata/src/utils/log"
aaronchen2k2k's avatar
aaronchen2k2k 已提交
13
	stringUtils "github.com/easysoft/zendata/src/utils/string"
aaronchen2k2k's avatar
aaronchen2k2k 已提交
14
	"github.com/easysoft/zendata/src/utils/vari"
aaronchen2k2k's avatar
aaronchen2k2k 已提交
15
	"github.com/fatih/color"
16
	"github.com/mattn/go-runewidth"
aaronchen2k2k's avatar
aaronchen2k2k 已提交
17
	"regexp"
aaronchen2k2k's avatar
aaronchen2k2k 已提交
18
	"strconv"
aaronchen2k2k's avatar
aaronchen2k2k 已提交
19
	"strings"
20
	"time"
aaronchen2k2k's avatar
aaronchen2k2k 已提交
21 22
)

陈琦 已提交
23 24
func GenerateOnTopLevel(defaultFile, configFile string, fieldsToExport *[]string) (
	rows [][]string, colIsNumArr []bool, err error) {
aaronchen2k2k's avatar
aaronchen2k2k 已提交
25

陈琦 已提交
26 27
	vari.DefaultFileDir = fileUtils.GetAbsDir(defaultFile)
	vari.ConfigFileDir = fileUtils.GetAbsDir(configFile)
aaronchen2k2k's avatar
aaronchen2k2k 已提交
28

陈琦 已提交
29
	vari.Def = LoadDataDef(defaultFile, configFile, fieldsToExport)
aaronchen2k2k's avatar
aaronchen2k2k 已提交
30

aaronchen2k2k's avatar
aaronchen2k2k 已提交
31 32 33 34
	if len(vari.Def.Fields) == 0 {
		err = errors.New("")
		return
	}
aaronchen2k2k's avatar
aaronchen2k2k 已提交
35

aaronchen2k2k's avatar
aaronchen2k2k 已提交
36 37 38 39 40 41
	if vari.Total < 0 {
		if vari.Def.Type == constant.ConfigTypeArticle {
			vari.Total = 1
		} else {
			vari.Total = constant.DefaultNumber
		}
aaronchen2k2k's avatar
aaronchen2k2k 已提交
42 43
	}

44
	vari.ResLoading = true // not to use placeholder when loading res
aaronchen2k2k's avatar
aaronchen2k2k 已提交
45
	vari.Res = LoadResDef(*fieldsToExport)
46
	vari.ResLoading = false
47

aaronchen2k2k's avatar
aaronchen2k2k 已提交
48
	topLevelFieldNameToValuesMap := map[string][]string{}
aaronchen2k2k's avatar
aaronchen2k2k 已提交
49

aaronchen2k2k's avatar
aaronchen2k2k 已提交
50
	// 为每个field生成值列表
aaronchen2k2k's avatar
aaronchen2k2k 已提交
51
	for index, field := range vari.Def.Fields {
aaronchen2k2k's avatar
aaronchen2k2k 已提交
52
		if !stringUtils.StrInArr(field.Field, *fieldsToExport) {
aaronchen2k2k's avatar
aaronchen2k2k 已提交
53 54
			continue
		}
aaronchen2k2k's avatar
aaronchen2k2k 已提交
55

aaronchen2k2k's avatar
aaronchen2k2k 已提交
56 57 58
		if field.Use != "" && field.From == "" {
			field.From = vari.Def.From
		}
aaronchen2k2k's avatar
aaronchen2k2k 已提交
59
		values := GenerateForField(&field, true)
aaronchen2k2k's avatar
aaronchen2k2k 已提交
60

aaronchen2k2k's avatar
aaronchen2k2k 已提交
61
		vari.Def.Fields[index].Precision = field.Precision
aaronchen2k2k's avatar
aaronchen2k2k 已提交
62

aaronchen2k2k's avatar
aaronchen2k2k 已提交
63
		topLevelFieldNameToValuesMap[field.Field] = values
aaronchen2k2k's avatar
aaronchen2k2k 已提交
64
		colIsNumArr = append(colIsNumArr, field.IsNumb)
aaronchen2k2k's avatar
aaronchen2k2k 已提交
65 66
	}

aaronchen2k2k's avatar
aaronchen2k2k 已提交
67 68 69
	// 处理数据
	arrOfArr := make([][]string, 0) // 2 dimension arr for child, [ [a,b,c], [1,2,3] ]
	for _, child := range vari.Def.Fields {
aaronchen2k2k's avatar
aaronchen2k2k 已提交
70
		if !stringUtils.StrInArr(child.Field, *fieldsToExport) {
aaronchen2k2k's avatar
aaronchen2k2k 已提交
71
			continue
aaronchen2k2k's avatar
aaronchen2k2k 已提交
72
		}
aaronchen2k2k's avatar
aaronchen2k2k 已提交
73

aaronchen2k2k's avatar
aaronchen2k2k 已提交
74 75 76 77 78
		childValues := topLevelFieldNameToValuesMap[child.Field]
		if child.Value != "" { // is value expression
			childValues = helper.GenExpressionValues(child, topLevelFieldNameToValuesMap)
		}

aaronchen2k2k's avatar
aaronchen2k2k 已提交
79
		arrOfArr = append(arrOfArr, childValues)
aaronchen2k2k's avatar
aaronchen2k2k 已提交
80
	}
aaronchen2k2k's avatar
aaronchen2k2k 已提交
81
	rows = putChildrenToArr(arrOfArr, vari.Recursive)
aaronchen2k2k's avatar
aaronchen2k2k 已提交
82

aaronchen2k2k's avatar
aaronchen2k2k 已提交
83
	return
aaronchen2k2k's avatar
aaronchen2k2k 已提交
84 85
}

aaronchen2k2k's avatar
aaronchen2k2k 已提交
86
func GenerateForField(field *model.DefField, withFix bool) (values []string) {
aaronchen2k2k's avatar
aaronchen2k2k 已提交
87
	if len(field.Fields) > 0 { // sub fields
88
		arrOfArr := make([][]string, 0) // 2 dimension arr for child, [ [a,b,c], [1,2,3] ]
aaronchen2k2k's avatar
aaronchen2k2k 已提交
89

aaronchen2k2k's avatar
aaronchen2k2k 已提交
90
		for _, child := range field.Fields {
aaronchen2k2k's avatar
aaronchen2k2k 已提交
91 92 93 94
			if child.From == "" {
				child.From = field.From
			}

陈琦 已提交
95
			child.FileDir = field.FileDir
aaronchen2k2k's avatar
aaronchen2k2k 已提交
96
			childValues := GenerateForField(&child, withFix)
97
			arrOfArr = append(arrOfArr, childValues)
aaronchen2k2k's avatar
aaronchen2k2k 已提交
98 99
		}

aaronchen2k2k's avatar
aaronchen2k2k 已提交
100
		count := vari.Total
aaronchen2k2k's avatar
aaronchen2k2k 已提交
101
		count = getRecordCount(arrOfArr)
aaronchen2k2k's avatar
aaronchen2k2k 已提交
102 103
		if count > vari.Total {
			count = vari.Total
aaronchen2k2k's avatar
aaronchen2k2k 已提交
104
		}
aaronchen2k2k's avatar
aaronchen2k2k 已提交
105 106 107 108 109 110 111

		recursive := vari.Recursive
		if stringUtils.InArray(field.Mode, constant.Modes) { // set on field level
			recursive = field.Mode == constant.ModeRecursive || field.Mode == constant.ModeRecursiveShort
		}

		values = combineChildrenValues(arrOfArr, recursive)
aaronchen2k2k's avatar
aaronchen2k2k 已提交
112
		values = loopFieldValues(field, values, count, true)
aaronchen2k2k's avatar
aaronchen2k2k 已提交
113

aaronchen2k2k's avatar
aaronchen2k2k 已提交
114
	} else if len(field.Froms) > 0 { // from muti items
115
		unionValues := make([]string, 0) // 2 dimension arr for child, [ [a,b,c], [1,2,3] ]
aaronchen2k2k's avatar
aaronchen2k2k 已提交
116 117 118 119 120
		for _, child := range field.Froms {
			if child.From == "" {
				child.From = field.From
			}

陈琦 已提交
121
			child.FileDir = field.FileDir
aaronchen2k2k's avatar
aaronchen2k2k 已提交
122
			childValues := GenerateForField(&child, withFix)
123
			unionValues = append(unionValues, childValues...)
aaronchen2k2k's avatar
aaronchen2k2k 已提交
124 125
		}

126
		count := len(unionValues)
aaronchen2k2k's avatar
aaronchen2k2k 已提交
127 128
		if count > vari.Total {
			count = vari.Total
aaronchen2k2k's avatar
aaronchen2k2k 已提交
129
		}
130
		values = loopFieldValues(field, unionValues, count, true)
aaronchen2k2k's avatar
aaronchen2k2k 已提交
131

aaronchen2k2k's avatar
aaronchen2k2k 已提交
132
	} else if field.From != "" && field.Type != constant.FieldTypeArticle { // refer to res
133
		if field.Use != "" { // refer to ranges or instance
aaronchen2k2k's avatar
aaronchen2k2k 已提交
134
			groupValues := vari.Res[field.From]
aaronchen2k2k's avatar
aaronchen2k2k 已提交
135 136
			groups := strings.Split(field.Use, ",")
			for _, group := range groups {
aaronchen2k2k's avatar
aaronchen2k2k 已提交
137 138 139 140 141 142 143 144 145
				regx := regexp.MustCompile(`\{(.*)\}`)
				arr := regx.FindStringSubmatch(group)
				group = regx.ReplaceAllString(group, "")
				num := 0
				if len(arr) == 2 {
					num, _ = strconv.Atoi(arr[1])
				}

				i := num
aaronchen2k2k's avatar
aaronchen2k2k 已提交
146 147
				if group == "all" {
					for _, arr := range groupValues { // add all
148 149 150 151 152 153 154
						valuesFromGroup := make([]string, 0)
						if num == 0 {
							valuesFromGroup = arr
						} else {
							valuesFromGroup = arr[:num]
						}

aaronchen2k2k's avatar
aaronchen2k2k 已提交
155 156 157
						values = append(values, valuesFromGroup...)

						i = i - len(valuesFromGroup)
158
						if i <= 0 {
159
							continue
160
						}
aaronchen2k2k's avatar
aaronchen2k2k 已提交
161 162
					}
				} else {
163 164 165 166
					valuesFromGroup := make([]string, 0)
					if num == 0 {
						valuesFromGroup = groupValues[group]
					} else {
167 168 169 170 171
						mode := num % len(groupValues[group])
						if mode == 0 {
							mode = len(groupValues[group])
						}
						valuesFromGroup = groupValues[group][:mode]
172 173
					}

aaronchen2k2k's avatar
aaronchen2k2k 已提交
174 175 176
					values = append(values, valuesFromGroup...)

					i = i - len(valuesFromGroup)
177
					if i <= 0 {
178
						continue
179
					}
aaronchen2k2k's avatar
aaronchen2k2k 已提交
180
				}
aaronchen2k2k's avatar
aaronchen2k2k 已提交
181
			}
aaronchen2k2k's avatar
aaronchen2k2k 已提交
182 183
		} else if field.Select != "" { // refer to excel
			groupValues := vari.Res[field.From]
aaronchen2k2k's avatar
aaronchen2k2k 已提交
184 185 186 187 188 189 190 191
			resKey := field.Select

			// deal with the key
			if vari.Def.Type == constant.ConfigTypeArticle {
				resKey = resKey + "_" + field.Field
			}

			values = append(values, groupValues[resKey]...)
aaronchen2k2k's avatar
aaronchen2k2k 已提交
192 193
		}

aaronchen2k2k's avatar
aaronchen2k2k 已提交
194
		values = loopFieldValues(field, values, vari.Total, true)
aaronchen2k2k's avatar
aaronchen2k2k 已提交
195

aaronchen2k2k's avatar
aaronchen2k2k 已提交
196
	} else if field.Config != "" { // refer to config
aaronchen2k2k's avatar
aaronchen2k2k 已提交
197 198
		groupValues := vari.Res[field.Config]
		values = append(values, groupValues["all"]...)
199

aaronchen2k2k's avatar
aaronchen2k2k 已提交
200
		values = loopFieldValues(field, values, vari.Total, true)
aaronchen2k2k's avatar
aaronchen2k2k 已提交
201

202
	} else { // leaf field
aaronchen2k2k's avatar
aaronchen2k2k 已提交
203
		values = GenerateFieldValuesForDef(field)
aaronchen2k2k's avatar
aaronchen2k2k 已提交
204 205
	}

aaronchen2k2k's avatar
aaronchen2k2k 已提交
206
	if field.Rand && field.Type != constant.FieldTypeArticle {
aaronchen2k2k's avatar
aaronchen2k2k 已提交
207 208 209
		values = randomValues(values)
	}

aaronchen2k2k's avatar
aaronchen2k2k 已提交
210 211
	return values
}
212

aaronchen2k2k's avatar
aaronchen2k2k 已提交
213
func GenerateFieldValuesForDef(field *model.DefField) []string {
aaronchen2k2k's avatar
aaronchen2k2k 已提交
214 215
	values := make([]string, 0)

aaronchen2k2k's avatar
aaronchen2k2k 已提交
216
	fieldWithValues := CreateField(field)
aaronchen2k2k's avatar
aaronchen2k2k 已提交
217

aaronchen2k2k's avatar
aaronchen2k2k 已提交
218 219
	computerLoop(field)
	indexOfRow := 0
aaronchen2k2k's avatar
aaronchen2k2k 已提交
220 221
	count := 0
	for {
222
		// 2. random replacement
223
		isRandomAndLoopEnd := !vari.ResLoading && //  ignore rand in resource
224
			!(*field).ReferToAnotherYaml && (*field).IsRand && (*field).LoopIndex == (*field).LoopEnd
aaronchen2k2k's avatar
aaronchen2k2k 已提交
225
		// isNotRandomAndValOver := !(*field).IsRand && indexOfRow >= len(fieldWithValues.Values)
aaronchen2k2k's avatar
aaronchen2k2k 已提交
226
		if count >= vari.Total || count >= len(fieldWithValues.Values) || isRandomAndLoopEnd {
227
			for _, v := range fieldWithValues.Values {
aaronchen2k2k's avatar
aaronchen2k2k 已提交
228
				values = append(values, fmt.Sprintf("%v", v))
229
			}
aaronchen2k2k's avatar
aaronchen2k2k 已提交
230 231
			break
		}
aaronchen2k2k's avatar
aaronchen2k2k 已提交
232

233 234 235 236 237 238
		// 处理格式、前后缀、loop等
		val := loopFieldValWithFix(field, fieldWithValues, &indexOfRow, true)
		values = append(values, val)

		count++

239 240 241
		if count >= vari.Total || count >= len(fieldWithValues.Values) {
			break
		}
aaronchen2k2k's avatar
aaronchen2k2k 已提交
242 243 244 245
		(*field).LoopIndex = (*field).LoopIndex + 1
		if (*field).LoopIndex > (*field).LoopEnd {
			(*field).LoopIndex = (*field).LoopStart
		}
aaronchen2k2k's avatar
aaronchen2k2k 已提交
246 247 248 249 250
	}

	return values
}

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

255
	format := strings.TrimSpace(field.Format)
256 257 258 259 260 261

	if field.Type == constant.FieldTypeTimestamp && field.Format != "" {
		str = time.Unix(val.(int64), 0).Format(field.Format)
		return str
	}

aaronchen2k2k's avatar
gen int  
aaronchen2k2k 已提交
262
	switch val.(type) {
263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286
	case int64:
		if format != "" {
			str, success = stringUtils.FormatStr(format, val.(int64), 0)
		}
		if !success {
			str = strconv.FormatInt(val.(int64), 10)
		}
	case float64:
		precision := 0
		if field.Precision > 0 {
			precision = field.Precision
		}
		if format != "" {
			str, success = stringUtils.FormatStr(format, val.(float64), precision)
		}
		if !success {
			str = strconv.FormatFloat(val.(float64), 'f', precision, 64)
		}
	case byte:
		str = string(val.(byte))
		if format != "" {
			str, success = stringUtils.FormatStr(format, str, 0)
		}
		if !success {
aaronchen2k2k's avatar
gen int  
aaronchen2k2k 已提交
287
			str = string(val.(byte))
288 289 290 291 292 293 294 295 296
		}
	case string:
		str = val.(string)

		match, _ := regexp.MatchString("%[0-9]*d", format)
		if match {
			valInt, err := strconv.Atoi(str)
			if err == nil {
				str, success = stringUtils.FormatStr(format, valInt, 0)
aaronchen2k2k's avatar
aaronchen2k2k 已提交
297
			}
298 299 300 301
		} else {
			str, success = stringUtils.FormatStr(format, str, 0)
		}
	default:
aaronchen2k2k's avatar
gen int  
aaronchen2k2k 已提交
302 303 304
	}

	return str
aaronchen2k2k's avatar
aaronchen2k2k 已提交
305 306
}

aaronchen2k2k's avatar
aaronchen2k2k 已提交
307
func loopFieldValues(field *model.DefField, oldValues []string, total int, withFix bool) (values []string) {
308
	fieldValue := model.FieldWithValues{}
aaronchen2k2k's avatar
aaronchen2k2k 已提交
309 310

	for _, val := range oldValues {
aaronchen2k2k's avatar
aaronchen2k2k 已提交
311
		fieldValue.Values = append(fieldValue.Values, val)
aaronchen2k2k's avatar
aaronchen2k2k 已提交
312 313
	}

aaronchen2k2k's avatar
aaronchen2k2k 已提交
314
	computerLoop(field)
aaronchen2k2k's avatar
aaronchen2k2k 已提交
315
	indexOfRow := 0
aaronchen2k2k's avatar
aaronchen2k2k 已提交
316 317 318
	count := 0
	for {
		// 处理格式、前后缀、loop等
aaronchen2k2k's avatar
aaronchen2k2k 已提交
319
		str := loopFieldValWithFix(field, fieldValue, &indexOfRow, withFix)
aaronchen2k2k's avatar
aaronchen2k2k 已提交
320 321 322
		values = append(values, str)

		count++
323 324
		isRandomAndLoopEnd := (*field).IsRand && (*field).LoopIndex == (*field).LoopEnd
		isNotRandomAndValOver := !(*field).IsRand && indexOfRow >= len(fieldValue.Values)
aaronchen2k2k's avatar
aaronchen2k2k 已提交
325
		if count >= total || isRandomAndLoopEnd || isNotRandomAndValOver {
aaronchen2k2k's avatar
aaronchen2k2k 已提交
326 327
			break
		}
aaronchen2k2k's avatar
aaronchen2k2k 已提交
328 329 330 331 332

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

335
	return
aaronchen2k2k's avatar
aaronchen2k2k 已提交
336 337
}

aaronchen2k2k's avatar
aaronchen2k2k 已提交
338
func loopFieldValWithFix(field *model.DefField, fieldValue model.FieldWithValues,
339
	indexOfRow *int, withFix bool) (loopStr string) {
aaronchen2k2k's avatar
aaronchen2k2k 已提交
340 341 342
	prefix := field.Prefix
	postfix := field.Postfix

aaronchen2k2k's avatar
aaronchen2k2k 已提交
343
	for j := 0; j < (*field).LoopIndex; j++ {
aaronchen2k2k's avatar
aaronchen2k2k 已提交
344 345 346 347
		if loopStr != "" {
			loopStr = loopStr + field.Loopfix
		}

aaronchen2k2k's avatar
aaronchen2k2k 已提交
348 349 350 351
		str, err := GenerateFieldVal(*field, fieldValue, indexOfRow)
		if err != nil {
			str = "N/A"
		}
aaronchen2k2k's avatar
aaronchen2k2k 已提交
352 353 354 355 356
		loopStr = loopStr + str

		*indexOfRow++
	}

357 358 359
	if field.Length > runewidth.StringWidth(loopStr) {
		loopStr = stringUtils.AddPad(loopStr, *field)
	}
aaronchen2k2k's avatar
aaronchen2k2k 已提交
360
	if withFix && !vari.Trim {
aaronchen2k2k's avatar
aaronchen2k2k 已提交
361 362
		loopStr = prefix + loopStr + postfix
	}
aaronchen2k2k's avatar
aaronchen2k2k 已提交
363

364 365 366
	return
}

aaronchen2k2k's avatar
aaronchen2k2k 已提交
367
func GenerateFieldVal(field model.DefField, fieldValue model.FieldWithValues, index *int) (val string, err error) {
368
	// 叶节点
aaronchen2k2k's avatar
aaronchen2k2k 已提交
369 370 371 372 373 374
	if len(fieldValue.Values) == 0 {
		logUtils.PrintToWithColor(i118Utils.I118Prt.Sprintf("fail_to_generate_field", field.Field), color.FgCyan)
		err = errors.New("")
		return
	}

375 376 377 378 379
	idx := *index % len(fieldValue.Values)
	str := fieldValue.Values[idx]
	val = GetFieldValStr(field, str)

	return
aaronchen2k2k's avatar
aaronchen2k2k 已提交
380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400
}

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
401 402
}

aaronchen2k2k's avatar
aaronchen2k2k 已提交
403
func putChildrenToArr(arrOfArr [][]string, recursive bool) (values [][]string) {
aaronchen2k2k's avatar
aaronchen2k2k 已提交
404
	indexArr := make([]int, 0)
aaronchen2k2k's avatar
aaronchen2k2k 已提交
405
	if recursive {
aaronchen2k2k's avatar
aaronchen2k2k 已提交
406 407
		indexArr = getModArr(arrOfArr)
	}
408

aaronchen2k2k's avatar
aaronchen2k2k 已提交
409
	for i := 0; i < vari.Total; i++ {
aaronchen2k2k's avatar
aaronchen2k2k 已提交
410
		strArr := make([]string, 0)
aaronchen2k2k's avatar
aaronchen2k2k 已提交
411 412 413
		for j := 0; j < len(arrOfArr); j++ {
			child := arrOfArr[j]

aaronchen2k2k's avatar
aaronchen2k2k 已提交
414
			var index int
aaronchen2k2k's avatar
aaronchen2k2k 已提交
415
			if recursive {
aaronchen2k2k's avatar
aaronchen2k2k 已提交
416 417 418 419 420 421
				mod := indexArr[j]
				index = i / mod % len(child)
			} else {
				index = i % len(child)
			}

aaronchen2k2k's avatar
aaronchen2k2k 已提交
422 423
			val := child[index]
			strArr = append(strArr, val)
424 425
		}

aaronchen2k2k's avatar
aaronchen2k2k 已提交
426 427 428 429 430 431
		values = append(values, strArr)
	}

	return
}

aaronchen2k2k's avatar
aaronchen2k2k 已提交
432 433 434 435 436 437 438 439 440
func randomValuesArr(values [][]string) (ret [][]string) {
	length := len(values)
	for i := 0; i < length; i++ {
		val := commonUtils.RandNum(length)
		ret = append(ret, values[val])
	}

	return
}
441 442 443 444 445 446 447 448 449
func randomInterfaces(values []interface{}) (ret []interface{}) {
	length := len(values)
	for i := 0; i < length; i++ {
		val := commonUtils.RandNum(length)
		ret = append(ret, values[val])
	}

	return
}
aaronchen2k2k's avatar
aaronchen2k2k 已提交
450
func randomValues(values []string) (ret []string) {
aaronchen2k2k's avatar
aaronchen2k2k 已提交
451 452 453 454 455 456 457 458 459
	length := len(values)
	for i := 0; i < length; i++ {
		val := commonUtils.RandNum(length)
		ret = append(ret, values[val])
	}

	return
}

460
func combineChildrenValues(arrOfArr [][]string, recursive bool) (ret []string) {
aaronchen2k2k's avatar
aaronchen2k2k 已提交
461
	valueArr := putChildrenToArr(arrOfArr, recursive)
aaronchen2k2k's avatar
aaronchen2k2k 已提交
462 463 464

	for _, arr := range valueArr {
		ret = append(ret, strings.Join(arr, ""))
465
	}
aaronchen2k2k's avatar
aaronchen2k2k 已提交
466
	return
467 468
}

aaronchen2k2k's avatar
aaronchen2k2k 已提交
469 470 471 472 473 474 475 476 477
func getRecordCount(arrOfArr [][]string) int {
	count := 1
	for i := 0; i < len(arrOfArr); i++ {
		arr := arrOfArr[i]
		count = len(arr) * count
	}
	return count
}

478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494
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
}