package influx import ( "context" "fmt" "net/url" "strings" "time" ) const ( dbphasor = "ssuBucket" dbsample = "ssuBucket" ) // keep consistent with telegraf const ( FieldYCPrefix string = "tm" FieldYXPrefix string = "ts" // FieldP string = "p" // FieldQ string = "q" // FieldS string = "s" // FieldPF string = "pf" // FieldF string = "f" FieldDF string = "df" // FieldUABPrefix string = "uab" // FieldUBCPrefix string = "ubc" // FieldUCAPrefix string = "uca" FieldSuffixAMP = "_amp" FieldSuffixPA = "_pa" FieldSuffixRMS = "_rms" ) const adaptedms = 5000 func GetSSUPointLastLimit(ctx context.Context, req *Request, limit int) ([]TV, error) { req.Begin = time.Now().UnixMilli() - int64(limit*20+adaptedms) return client.GetSSUPointLastLimit(ctx, req, limit) } func GetSSUPointsLastLimit(ctx context.Context, req *Request, limit int) (map[string][]TV, error) { req.Begin = time.Now().UnixMilli() - int64(limit*20+adaptedms) return client.GetSSUPointsLastLimit(ctx, req, limit) } func GetSSUPointDurationData(ctx context.Context, req *Request) ([]TV, error) { return client.GetSSUPointDurationData(ctx, req) } func GetSSUPointsDurationData(ctx context.Context, req *Request) (map[string][]TV, error) { return client.GetSSUPointsDurationData(ctx, req) } func GetSSUPointsAfterLimit(ctx context.Context, req *Request, limit int) (map[string][]TV, error) { req.End = req.Begin + int64(limit*20+20) return client.GetSSUPointsAfterLimit(ctx, req, limit) } func GetSSUPointsBeforeLimit(ctx context.Context, req *Request, limit int) (map[string][]TV, error) { req.Begin = req.End - int64(limit*20+20) return client.GetSSUPointsBeforeLimit(ctx, req, limit) } func (client *influxClient) GetSSUPointLastLimit(ctx context.Context, req *Request, limit int) ([]TV, error) { sql := fmt.Sprintf("select last(%s) as %s from %s where station='%s' and device='%s';", req.SubPos, req.SubPos, req.Table, req.Station, req.MainPos) if limit > 1 { sql = fmt.Sprintf("select %s from %s where station='%s' and device='%s' and time>=%dms order by time desc limit %d;", req.SubPos, req.Table, req.Station, req.MainPos, req.Begin, limit) } reqData := url.Values{ "db": {req.DB}, "q": {sql}, } return client.getTVsResp(ctx, reqData, "csv") } func (client *influxClient) GetSSUPointsLastLimit(ctx context.Context, req *Request, limit int) (map[string][]TV, error) { sql := "" if limit == 1 { fields := strings.Split(req.SubPos, ",") for i, field := range fields { fields[i] = "last(" + field + ") as " + field } sql = fmt.Sprintf("select %s from %s where station='%s' and device='%s';", strings.Join(fields, ","), req.Table, req.Station, req.MainPos) } else { sql = fmt.Sprintf("select %s from %s where station='%s' and device='%s' and time>=%dms order by time desc limit %d;", req.SubPos, req.Table, req.Station, req.MainPos, req.Begin, limit) } reqData := url.Values{ "db": {req.DB}, "q": {sql}, } f2tvs, err := client.getF2TVsResp(ctx, reqData, "csv") if err != nil { return f2tvs, nil } ret := make(map[string][]TV, len(f2tvs)) for f, tvs := range f2tvs { ret[strings.Join([]string{req.Station, req.MainPos, f}, ".")] = tvs } return ret, nil } func (client *influxClient) GetSSUPointDurationData(ctx context.Context, req *Request) ([]TV, error) { sql := fmt.Sprintf("select %s from %s where station='%s' and device='%s' and time>=%dms and time<=%dms;", req.SubPos, req.Table, req.Station, req.MainPos, req.Begin, req.End) if req.Operate != "" && req.Step != "" && req.Default != "" { sql = fmt.Sprintf("select %s(%s) as %s from %s where station='%s' and device='%s' and time>=%dms and time<=%dms group by time(%s) fill(%s);", req.Operate, req.SubPos, req.SubPos, req.Table, req.Station, req.MainPos, req.Begin, req.End, req.Step, req.Default) } reqData := url.Values{ "db": {req.DB}, "q": {sql}, } return client.getTVsResp(ctx, reqData, "csv") } func (client *influxClient) GetSSUPointsDurationData(ctx context.Context, req *Request) (map[string][]TV, error) { sql := fmt.Sprintf("select %s from %s where station='%s' and device='%s' and time>=%dms and time<=%dms;", req.SubPos, req.Table, req.Station, req.MainPos, req.Begin, req.End) if req.Operate != "" && req.Step != "" && req.Default != "" { subPoss := strings.Split(req.SubPos, ",") selectSections := make([]string, len(subPoss)) for i, subPos := range subPoss { selectSections[i] = req.Operate + "(" + subPos + ")" + " as " + subPos } sql = fmt.Sprintf("select %s from %s where station='%s' and device='%s' and time>=%dms and time<=%dms group by time(%s) fill(%s);", strings.Join(selectSections, ", "), req.Table, req.Station, req.MainPos, req.Begin, req.End, req.Step, req.Default) } reqData := url.Values{ "db": {req.DB}, "q": {sql}, } f2tvs, err := client.getF2TVsResp(ctx, reqData, "csv") if err != nil { return f2tvs, nil } ret := make(map[string][]TV, len(f2tvs)) for f, tvs := range f2tvs { ret[strings.Join([]string{req.Station, req.MainPos, f}, ".")] = tvs } return ret, nil } func (client *influxClient) GetSSUPointAfterLimit(ctx context.Context, req *Request, limit int) ([]TV, error) { sql := fmt.Sprintf("select %s from %s where station='%s' and device='%s' and time>=%dms and time<=%dms limit %d;", req.SubPos, req.Table, req.Station, req.MainPos, req.Begin, req.End, limit) reqData := url.Values{ "db": {req.DB}, "q": {sql}, } return client.getTVsResp(ctx, reqData, "csv") } func (client *influxClient) GetSSUPointsAfterLimit(ctx context.Context, req *Request, limit int) (map[string][]TV, error) { sql := fmt.Sprintf("select %s from %s where station='%s' and device='%s' and time>=%dms and time<=%dms limit %d;", req.SubPos, req.Table, req.Station, req.MainPos, req.Begin, req.End, limit) reqData := url.Values{ "db": {req.DB}, "q": {sql}, } f2tvs, err := client.getF2TVsResp(ctx, reqData, "csv") if err != nil { return f2tvs, nil } ret := make(map[string][]TV, len(f2tvs)) for f, tvs := range f2tvs { ret[strings.Join([]string{req.Station, req.MainPos, f}, ".")] = tvs } return ret, nil } func (client *influxClient) GetSSUPointsBeforeLimit(ctx context.Context, req *Request, limit int) (map[string][]TV, error) { reqData := url.Values{ "db": {req.DB}, "q": {fmt.Sprintf("select %s from %s where station='%s' and device='%s' and time>=%dms and time<=%dms order by time desc limit %d;", req.SubPos, req.Table, req.Station, req.MainPos, req.Begin, req.End, limit)}, } f2tvs, err := client.getF2TVsResp(ctx, reqData, "csv") if err != nil { return f2tvs, nil } ret := make(map[string][]TV, len(f2tvs)) for f, tvs := range f2tvs { ret[strings.Join([]string{req.Station, req.MainPos, f}, ".")] = tvs } return ret, nil } func (client *influxClient) WriteLinesData(ctx context.Context, db string, data []byte) error { return client.writeLinesData(ctx, db, data, true) }