package model import ( "encoding/json" "fmt" "strconv" "strings" cuej "git.loafle.net/commons/util-go/encoding/json" ) type ResultSetCol struct { *ResultSet } func (rsc *ResultSetCol) setMeta() { meta := rsc.Item.Keys arrayColumns := rsc.Item.MappingInfo.ArrayColumns if nil == rsc.Meta { rsc.Meta = make(map[string]json.Number, 0) } for i := 0; i < len(meta); i++ { rsc.Meta[meta[i].Key] = json.Number(strconv.Itoa(i)) } if nil != arrayColumns { for i := 0; i < len(arrayColumns); i++ { if _, ok := rsc.Meta[arrayColumns[i]]; ok { continue } rsc.Meta[arrayColumns[i]] = json.Number(strconv.Itoa(i + len(meta))) } } } func (rsc *ResultSetCol) GetData() map[string]string { return rsc.parse() } func (rsc *ResultSetCol) parse() map[string]string { metrics := rsc.Item.Keys arrayColumns := rsc.Item.MappingInfo.ArrayColumns rm := make(map[string]string, 0) for i := 0; i < len(rsc.Rows); i++ { row := rsc.Rows[i] for j := 0; j < len(row); j++ { arrayValue := make([]string, 0) if nil != arrayColumns { for k := 0; k < len(arrayColumns); k++ { idxN := rsc.Meta[arrayColumns[k]] idx, _ := cuej.NumberToInt(idxN) arrayValue = append(arrayValue, row[idx]) } } for k := 0; k < len(metrics); k++ { metric := metrics[k].Metric metric = rsc.convertMetric(metric, arrayValue) rm[metric] = row[k] } } } return rm } func (rsc *ResultSetCol) convertMetric(metric string, arrayValue []string) string { if nil == arrayValue || 0 == len(arrayValue) { return metric } convertChar := "$" for i := 0; i < len(arrayValue); i++ { convertStr := fmt.Sprintf("%s%d", convertChar, i) metric = strings.Replace(metric, convertStr, arrayValue[i], -1) } return metric }