generator.go 6.0 KB
Newer Older
aaronchen2k2k's avatar
init  
aaronchen2k2k 已提交
1 2
package action

aaronchen2k2k's avatar
aaronchen2k2k 已提交
3
import (
aaronchen2k2k's avatar
aaronchen2k2k 已提交
4
	"encoding/json"
aaronchen2k2k's avatar
aaronchen2k2k 已提交
5
	"fmt"
aaronchen2k2k's avatar
aaronchen2k2k 已提交
6
	"github.com/easysoft/zendata/src/gen"
aaronchen2k2k's avatar
aaronchen2k2k 已提交
7
	constant "github.com/easysoft/zendata/src/utils/const"
aaronchen2k2k's avatar
aaronchen2k2k 已提交
8
	i118Utils "github.com/easysoft/zendata/src/utils/i118"
aaronchen2k2k's avatar
aaronchen2k2k 已提交
9
	logUtils "github.com/easysoft/zendata/src/utils/log"
aaronchen2k2k's avatar
aaronchen2k2k 已提交
10
	stringUtils "github.com/easysoft/zendata/src/utils/string"
aaronchen2k2k's avatar
aaronchen2k2k 已提交
11
	"github.com/easysoft/zendata/src/utils/vari"
12
	"github.com/mattn/go-runewidth"
aaronchen2k2k's avatar
aaronchen2k2k 已提交
13
	"regexp"
aaronchen2k2k's avatar
aaronchen2k2k 已提交
14
	"strings"
aaronchen2k2k's avatar
aaronchen2k2k 已提交
15
	"time"
aaronchen2k2k's avatar
aaronchen2k2k 已提交
16
)
aaronchen2k2k's avatar
init  
aaronchen2k2k 已提交
17

aaronchen2k2k's avatar
aaronchen2k2k 已提交
18
func Generate(defaultFile string, configFile string, total int, fieldsToExportStr string, out string, format string, table string) {
aaronchen2k2k's avatar
aaronchen2k2k 已提交
19
	startTime := time.Now().Unix()
aaronchen2k2k's avatar
aaronchen2k2k 已提交
20

aaronchen2k2k's avatar
aaronchen2k2k 已提交
21 22 23
	if defaultFile != "" && configFile == "" {
		configFile = defaultFile
		defaultFile = ""
aaronchen2k2k's avatar
aaronchen2k2k 已提交
24 25
	}

26 27 28 29
	fieldsToExport := make([]string, 0)
	if fieldsToExportStr != "" {
		fieldsToExport = strings.Split(fieldsToExportStr, ",")
	}
aaronchen2k2k's avatar
aaronchen2k2k 已提交
30

aaronchen2k2k's avatar
aaronchen2k2k 已提交
31
	vari.Total = total
32

aaronchen2k2k's avatar
aaronchen2k2k 已提交
33 34 35 36
	rows, colIsNumArr, err := gen.GenerateForDefinition(defaultFile, configFile, &fieldsToExport, total)
	if err != nil {
		return
	}
aaronchen2k2k's avatar
aaronchen2k2k 已提交
37
	Print(rows, format, table, colIsNumArr, fieldsToExport)
aaronchen2k2k's avatar
aaronchen2k2k 已提交
38

aaronchen2k2k's avatar
aaronchen2k2k 已提交
39
	entTime := time.Now().Unix()
aaronchen2k2k's avatar
aaronchen2k2k 已提交
40
	if vari.RunMode == constant.RunModeServerRequest {
aaronchen2k2k's avatar
aaronchen2k2k 已提交
41
		logUtils.PrintTo(i118Utils.I118Prt.Sprintf("server_response", len(rows), entTime - startTime))
42
	}
aaronchen2k2k's avatar
init  
aaronchen2k2k 已提交
43
}
aaronchen2k2k's avatar
aaronchen2k2k 已提交
44

aaronchen2k2k's avatar
aaronchen2k2k 已提交
45
func Print(rows [][]string, format string, table string, colIsNumArr []bool, fields []string) {
aaronchen2k2k's avatar
aaronchen2k2k 已提交
46 47 48 49 50 51 52 53
	if format == constant.FormatText {
		printTextHeader(fields)
	} else if format == constant.FormatSql {
		printSqlHeader(fields, table)
	} else if format == constant.FormatJson {
		printJsonHeader()
	} else if format == constant.FormatXml {
		printXmlHeader(fields, table)
aaronchen2k2k's avatar
aaronchen2k2k 已提交
54 55
	}

aaronchen2k2k's avatar
aaronchen2k2k 已提交
56
	for i, cols := range rows {
aaronchen2k2k's avatar
aaronchen2k2k 已提交
57
		row := make([]string, 0)
aaronchen2k2k's avatar
aaronchen2k2k 已提交
58
		rowMap := map[string]string{}
aaronchen2k2k's avatar
aaronchen2k2k 已提交
59
		valuesForSql := make([]string, 0)
aaronchen2k2k's avatar
aaronchen2k2k 已提交
60
		lineForText := ""
aaronchen2k2k's avatar
aaronchen2k2k 已提交
61

aaronchen2k2k's avatar
aaronchen2k2k 已提交
62
		for j, col := range cols {
aaronchen2k2k's avatar
aaronchen2k2k 已提交
63
			col = replacePlaceholder(col)
64 65 66 67
			field := vari.TopFiledMap[fields[j]]
			if field.Width > runewidth.StringWidth(col) {
				col = stringUtils.AddPad(col, field)
			}
aaronchen2k2k's avatar
aaronchen2k2k 已提交
68

aaronchen2k2k's avatar
aaronchen2k2k 已提交
69 70 71 72 73 74 75 76
			if j > 0 && vari.Human {
				lineForText = strings.TrimRight(lineForText, "\t")
				col = strings.TrimLeft(col, "\t")

				lineForText = lineForText + "\t" + col
			} else {
				lineForText = lineForText + col
			}
aaronchen2k2k's avatar
aaronchen2k2k 已提交
77

aaronchen2k2k's avatar
aaronchen2k2k 已提交
78
			row = append(row, col)
aaronchen2k2k's avatar
aaronchen2k2k 已提交
79
			rowMap[field.Field] = col
aaronchen2k2k's avatar
aaronchen2k2k 已提交
80

aaronchen2k2k's avatar
aaronchen2k2k 已提交
81
			colVal := stringUtils.ConvertForSql(col)
aaronchen2k2k's avatar
aaronchen2k2k 已提交
82
			if !colIsNumArr[j] { colVal = "'" + colVal + "'" }
aaronchen2k2k's avatar
aaronchen2k2k 已提交
83
			valuesForSql = append(valuesForSql, colVal)
aaronchen2k2k's avatar
aaronchen2k2k 已提交
84
		}
aaronchen2k2k's avatar
aaronchen2k2k 已提交
85

aaronchen2k2k's avatar
aaronchen2k2k 已提交
86
		if format == constant.FormatText {
aaronchen2k2k's avatar
aaronchen2k2k 已提交
87
			logUtils.PrintLine(lineForText)
aaronchen2k2k's avatar
aaronchen2k2k 已提交
88
		} else if format == constant.FormatSql {
aaronchen2k2k's avatar
aaronchen2k2k 已提交
89
			logUtils.PrintLine(genSqlLine(strings.Join(valuesForSql, ", "), i, len(rows)))
aaronchen2k2k's avatar
aaronchen2k2k 已提交
90
		} else if format == constant.FormatJson {
aaronchen2k2k's avatar
aaronchen2k2k 已提交
91
			logUtils.PrintLine(genJsonLine(i, row, len(rows), fields))
aaronchen2k2k's avatar
aaronchen2k2k 已提交
92
		} else if format == constant.FormatXml {
aaronchen2k2k's avatar
aaronchen2k2k 已提交
93
			logUtils.PrintLine(getXmlLine(i, rowMap, len(rows)))
aaronchen2k2k's avatar
aaronchen2k2k 已提交
94
		}
aaronchen2k2k's avatar
aaronchen2k2k 已提交
95 96
	}
}
aaronchen2k2k's avatar
aaronchen2k2k 已提交
97

aaronchen2k2k's avatar
aaronchen2k2k 已提交
98 99 100 101 102 103 104 105
func printTextHeader(fields []string) {
	if !vari.WithHead {
		return
	}
	headerLine := ""
	for idx, field := range fields {
		headerLine += field
		if idx < len(fields)-1 {
aaronchen2k2k's avatar
aaronchen2k2k 已提交
106
			headerLine += "\t"
aaronchen2k2k's avatar
aaronchen2k2k 已提交
107
		}
aaronchen2k2k's avatar
aaronchen2k2k 已提交
108
	}
aaronchen2k2k's avatar
aaronchen2k2k 已提交
109

aaronchen2k2k's avatar
aaronchen2k2k 已提交
110
	logUtils.PrintLine(headerLine)
aaronchen2k2k's avatar
aaronchen2k2k 已提交
111
}
aaronchen2k2k's avatar
aaronchen2k2k 已提交
112

aaronchen2k2k's avatar
aaronchen2k2k 已提交
113 114 115
func printSqlHeader(fields []string, table string) {
	fieldNames := make([]string, 0)
	for _, f := range fields { fieldNames = append(fieldNames, "`" + f + "`") }
aaronchen2k2k's avatar
aaronchen2k2k 已提交
116
	logUtils.PrintLine(fmt.Sprintf("INSERT INTO %s(%s)", table, strings.Join(fieldNames, ", ")))
aaronchen2k2k's avatar
aaronchen2k2k 已提交
117
}
aaronchen2k2k's avatar
aaronchen2k2k 已提交
118

aaronchen2k2k's avatar
aaronchen2k2k 已提交
119
func printJsonHeader() {
aaronchen2k2k's avatar
aaronchen2k2k 已提交
120
	logUtils.PrintLine("[")
aaronchen2k2k's avatar
aaronchen2k2k 已提交
121 122 123
}

func printXmlHeader(fields []string, table string) {
aaronchen2k2k's avatar
aaronchen2k2k 已提交
124
	logUtils.PrintLine("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<testdata>\n  <title>Test Data</title>")
aaronchen2k2k's avatar
aaronchen2k2k 已提交
125 126 127 128 129 130
}

func RowToJson(cols []string, fieldsToExport []string) string {
	rowMap := map[string]string{}
	for j, col := range cols {
		rowMap[fieldsToExport[j]] = col
aaronchen2k2k's avatar
aaronchen2k2k 已提交
131
	}
aaronchen2k2k's avatar
aaronchen2k2k 已提交
132

aaronchen2k2k's avatar
aaronchen2k2k 已提交
133 134 135 136 137 138 139
	jsonObj, _ := json.Marshal(rowMap)
	respJson := string(jsonObj)

	return respJson
}

func genSqlLine(valuesForSql string, i int, length int) string {
aaronchen2k2k's avatar
aaronchen2k2k 已提交
140

aaronchen2k2k's avatar
aaronchen2k2k 已提交
141 142 143 144 145
	temp := ""
	if i == 0 {
		temp = fmt.Sprintf("  VALUES (%s)", valuesForSql)
	} else {
		temp = fmt.Sprintf("         (%s)", valuesForSql)
aaronchen2k2k's avatar
aaronchen2k2k 已提交
146 147
	}

aaronchen2k2k's avatar
aaronchen2k2k 已提交
148 149 150 151
	if i < length - 1 {
		temp = temp + ", "
	} else {
		temp = temp + "; "
aaronchen2k2k's avatar
aaronchen2k2k 已提交
152 153
	}

aaronchen2k2k's avatar
aaronchen2k2k 已提交
154
	return temp
aaronchen2k2k's avatar
aaronchen2k2k 已提交
155 156
}

aaronchen2k2k's avatar
aaronchen2k2k 已提交
157 158 159 160 161 162 163
func genJsonLine(i int, row []string,  length int, fields []string) string {
	temp := "  " + RowToJson(row, fields)
	if i < length - 1 {
		temp = temp + ", "
	} else {
		temp = temp + "\n]"
	}
aaronchen2k2k's avatar
aaronchen2k2k 已提交
164

aaronchen2k2k's avatar
aaronchen2k2k 已提交
165 166 167
	return temp
}

aaronchen2k2k's avatar
aaronchen2k2k 已提交
168 169 170 171 172 173 174 175 176 177 178 179 180
func getXmlLine(i int, mp map[string]string, length int) string {
	str := ""
	j := 0
	for key, val := range mp {
		str += fmt.Sprintf("    <%s>%s</%s>", key, val, key)
		if j != len(mp) - 1 {
			str = str + "\n"
		}

		j++
	}

	text := fmt.Sprintf("  <row>\n%s\n  </row>", str)
aaronchen2k2k's avatar
aaronchen2k2k 已提交
181 182 183 184 185
	if i == length - 1 {
		text = text + "\n</testdata>"
	}
	return text
}
aaronchen2k2k's avatar
aaronchen2k2k 已提交
186

aaronchen2k2k's avatar
aaronchen2k2k 已提交
187 188 189 190 191 192 193 194 195
func replacePlaceholder(col string) string {
	ret := col

	re := regexp.MustCompile("(?siU)\\${(.*)}")
	arr := re.FindAllStringSubmatch(col, -1)

	strForReplaceMap := map[string][]string{}
	for _, childArr := range arr {
		placeholderStr := childArr[1]
aaronchen2k2k's avatar
aaronchen2k2k 已提交
196
		strForReplaceMap[placeholderStr] = getValForPlaceholder(placeholderStr, len(childArr))
aaronchen2k2k's avatar
aaronchen2k2k 已提交
197 198

		for _, str := range strForReplaceMap[placeholderStr] {
aaronchen2k2k's avatar
aaronchen2k2k 已提交
199 200
			temp := gen.Placeholder(placeholderStr)
			ret = strings.Replace(ret, temp, str, 1)
aaronchen2k2k's avatar
aaronchen2k2k 已提交
201 202 203 204 205 206 207 208
		}
	}

	return ret
}

func getValForPlaceholder(placeholderStr string, count int) []string {
	mp := vari.RandFieldNameToValuesMap[placeholderStr]
209

aaronchen2k2k's avatar
aaronchen2k2k 已提交
210 211
	tp := mp["type"].(string)
	repeatObj := mp["repeat"]
212

aaronchen2k2k's avatar
aaronchen2k2k 已提交
213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237
	repeat := "1"
	if repeatObj != nil {
		repeat = repeatObj.(string)
	}

	strs := make([]string, 0)
	if tp == "int" {
		start := mp["start"].(string)
		end := mp["end"].(string)
		precision := mp["precision"].(string)

		strs = gen.GetRandFromRange("int", start, end, "1", repeat, precision, count)
	} else if tp == "float" {
		start := mp["start"].(string)
		end := mp["end"].(string)
		precision := mp["precision"].(string)

		strs = gen.GetRandFromRange("float", start, end, "1", repeat, precision, count)
	} else if tp == "char" {
		start := mp["start"].(string)
		end := mp["end"].(string)
		precision := mp["precision"].(string)

		strs = gen.GetRandFromRange("char", start, end, "1", repeat, precision, count)
	} else if tp == "list" {
aaronchen2k2k's avatar
aaronchen2k2k 已提交
238
		list := mp["list"].([]string)
aaronchen2k2k's avatar
aaronchen2k2k 已提交
239 240 241 242
		strs = gen.GetRandFromList(list, repeat, count)
	}

	return strs
aaronchen2k2k's avatar
aaronchen2k2k 已提交
243
}