generator.go 4.6 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
	"regexp"
aaronchen2k2k's avatar
aaronchen2k2k 已提交
9
	"strconv"
aaronchen2k2k's avatar
aaronchen2k2k 已提交
10 11 12
	"strings"
)

13 14 15
func GenerateForDefinition(total int, fieldsToExport string, out string, table string) [][]string {
	def := constant.Definition

aaronchen2k2k's avatar
aaronchen2k2k 已提交
16 17 18 19
	fieldsToExportArr := strings.Split(fieldsToExport, ",")
	fieldNameToValues := map[string][]string{}

	// 为每个field生成值列表
aaronchen2k2k's avatar
aaronchen2k2k 已提交
20
	for index, field := range def.Fields {
aaronchen2k2k's avatar
aaronchen2k2k 已提交
21
		if !stringUtils.FindInArr(field.Name, fieldsToExportArr) {
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 28

		fieldNameToValues[field.Name] = values
aaronchen2k2k's avatar
aaronchen2k2k 已提交
29 30
	}

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

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

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

49
func GenerateForField(field *model.Field,  total int) []string {
aaronchen2k2k's avatar
aaronchen2k2k 已提交
50 51
	convertFieldReferToNestedIfNeeded(field)

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

aaronchen2k2k's avatar
aaronchen2k2k 已提交
54 55 56 57 58
	if field.Type == "custom" {
		if field.Range != "" { // specific custom file
			LoadDefinitionFromFile(constant.ResDir + field.Range)
		}

aaronchen2k2k's avatar
aaronchen2k2k 已提交
59 60
		referField := constant.LoadedFields[field.Name]
		values = GenerateFieldItemsFromDefinition(&referField, total)
61 62

	} else if len(field.Fields) > 0 { // nested definition
aaronchen2k2k's avatar
aaronchen2k2k 已提交
63 64 65 66 67 68 69 70 71 72 73 74
		arr := make([][]string, 0)
		for _, child := range field.Fields {
			childValues := GenerateForField(&child, total)
			arr = append(arr, childValues)
		}

		for i := 0; i < total; i++ {
			concat := ""
			for _, row := range arr {
				concat = concat + row[i]
			}

aaronchen2k2k's avatar
aaronchen2k2k 已提交
75
			concat = field.Prefix + concat + field.Postfix
aaronchen2k2k's avatar
aaronchen2k2k 已提交
76 77
			values = append(values, concat)
		}
78 79
	} else {
		values = GenerateFieldItemsFromDefinition(field, total)
aaronchen2k2k's avatar
aaronchen2k2k 已提交
80 81 82 83
	}

	return values
}
84 85

func GenerateFieldItemsFromDefinition(field *model.Field, total int) []string {
aaronchen2k2k's avatar
aaronchen2k2k 已提交
86 87
	if field.Loop == 0 {field.Loop = 1}

aaronchen2k2k's avatar
aaronchen2k2k 已提交
88 89 90
	values := make([]string, 0)

	// 整理出值的列表
91 92 93 94 95 96 97 98 99 100 101
	datatype := strings.TrimSpace(field.Type)
	if datatype == "" { datatype = "list" }

	fieldValue := model.FieldValue{}

	switch datatype {
	case constant.LIST.String():
		fieldValue = GenerateList(field, total)

	default:
	}
aaronchen2k2k's avatar
aaronchen2k2k 已提交
102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119

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

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

	return values
}

func GenerateFieldValWithLoop(field model.Field, fieldValue model.FieldValue, indexOfRow *int) string {
120 121 122 123 124 125 126 127
	prefix := field.Prefix
	postfix := field.Postfix

	loopStr := ""
	for j := 0; j < field.Loop; j++ {
		if loopStr != "" {
			loopStr = loopStr + field.Loopfix
		}
aaronchen2k2k's avatar
aaronchen2k2k 已提交
128 129

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

aaronchen2k2k's avatar
aaronchen2k2k 已提交
132
		*indexOfRow++
133 134 135 136 137
	}

	return prefix + loopStr + postfix
}

aaronchen2k2k's avatar
aaronchen2k2k 已提交
138
func GenerateFieldVal(field model.Field, fieldValue model.FieldValue, index *int) string {
139
	str := ""
140

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

aaronchen2k2k's avatar
aaronchen2k2k 已提交
146
	return str
147 148 149
}

func GetFieldValStr(field model.Field, val interface{}) string {
aaronchen2k2k's avatar
gen int  
aaronchen2k2k 已提交
150
	str := "n/a"
aaronchen2k2k's avatar
format  
aaronchen2k2k 已提交
151
	success := false
152

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

	return str
aaronchen2k2k's avatar
aaronchen2k2k 已提交
186 187 188
}

func convertFieldReferToNestedIfNeeded(field *model.Field) {
aaronchen2k2k's avatar
aaronchen2k2k 已提交
189
	// ${user_name}_${numb}@${domain}
aaronchen2k2k's avatar
aaronchen2k2k 已提交
190
	regx := regexp.MustCompile(`\$\{([a-zA-z0-9_]+)\}`)
aaronchen2k2k's avatar
aaronchen2k2k 已提交
191 192
	arrOfName := regx.FindAllStringSubmatch(field.Range, -1)
	fmt.Println(arrOfName)
aaronchen2k2k's avatar
aaronchen2k2k 已提交
193

aaronchen2k2k's avatar
aaronchen2k2k 已提交
194 195 196
	if len(arrOfName) > 0 {
		for _, a := range arrOfName {
			nameWapper := a[0]
aaronchen2k2k's avatar
aaronchen2k2k 已提交
197 198 199 200 201 202 203 204 205 206 207 208 209
			name := a[1]

			child := model.Field{}
			if constant.LoadedFields[name].Name != "" {
				child = constant.LoadedFields[name]
			} else {
				child.Name = a[1]
				child.Type = "custom"
			}

			field.Fields = append(field.Fields, child)
		}
	}
210
}