From 9bc7f44f0ad3700596d565b8b7a2e0a3f42eb837 Mon Sep 17 00:00:00 2001 From: Vincent Bernat Date: Thu, 9 Feb 2023 23:27:03 +0100 Subject: [PATCH] console/graph: also invert unit direction on bidirectional --- console/graph.go | 28 ++++++++++++++++++++++------ console/graph_test.go | 43 +++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 65 insertions(+), 6 deletions(-) diff --git a/console/graph.go b/console/graph.go index aac8d7a3..16aa9ed1 100644 --- a/console/graph.go +++ b/console/graph.go @@ -100,8 +100,9 @@ func (input graphHandlerInput) previousPeriod() graphHandlerInput { } type toSQL1Options struct { - skipWithClause bool - offsetedStart time.Time + skipWithClause bool + reverseDirection bool + offsetedStart time.Time } func (input graphHandlerInput) toSQL1(axis int, options toSQL1Options) string { @@ -155,6 +156,17 @@ func (input graphHandlerInput) toSQL1(axis int, options toSQL1Options) string { withStr = fmt.Sprintf("\nWITH\n %s", strings.Join(with, ",\n ")) } + // Units + units := input.Units + if options.reverseDirection { + switch units { + case "inl2%": + units = "outl2%" + case "outl2%": + units = "inl2%" + } + } + sqlQuery := fmt.Sprintf(` {{ with %s }}%s SELECT %d AS axis, * FROM ( @@ -175,7 +187,7 @@ ORDER BY time WITH FILL StartForInterval: startForInterval, MainTableRequired: requireMainTable(input.schema, input.Dimensions, input.Filter), Points: input.Points, - Units: input.Units, + Units: units, }), withStr, axis, strings.Join(fields, ",\n "), where, offsetShift, offsetShift, dimensionsInterpolate, @@ -189,7 +201,10 @@ func (input graphHandlerInput) toSQL() string { // Handle specific options. We have to align time periods in // case the previous period does not use the same offsets. if input.Bidirectional { - parts = append(parts, input.reverseDirection().toSQL1(2, toSQL1Options{skipWithClause: true})) + parts = append(parts, input.reverseDirection().toSQL1(2, toSQL1Options{ + skipWithClause: true, + reverseDirection: true, + })) } if input.PreviousPeriod { parts = append(parts, input.previousPeriod().toSQL1(3, toSQL1Options{ @@ -199,8 +214,9 @@ func (input graphHandlerInput) toSQL() string { } if input.Bidirectional && input.PreviousPeriod { parts = append(parts, input.reverseDirection().previousPeriod().toSQL1(4, toSQL1Options{ - skipWithClause: true, - offsetedStart: input.Start, + skipWithClause: true, + reverseDirection: true, + offsetedStart: input.Start, })) } return strings.Join(parts, "\nUNION ALL\n") diff --git a/console/graph_test.go b/console/graph_test.go index cc991302..0f37d06e 100644 --- a/console/graph_test.go +++ b/console/graph_test.go @@ -312,6 +312,49 @@ SELECT FROM {{ .Table }} WHERE {{ .Timefilter }} AND (SrcCountry = 'FR' AND DstCountry = 'US') GROUP BY time, dimensions +ORDER BY time WITH FILL + FROM {{ .TimefilterStart }} + TO {{ .TimefilterEnd }} + INTERVAL 1 second + STEP {{ .Interval }} + INTERPOLATE (dimensions AS emptyArrayString())) +{{ end }}`, + }, { + Description: "no dimensions, reverse direction, inl2%", + Input: graphHandlerInput{ + Start: time.Date(2022, 04, 10, 15, 45, 10, 0, time.UTC), + End: time.Date(2022, 04, 11, 15, 45, 10, 0, time.UTC), + Points: 100, + Dimensions: []query.Column{}, + Filter: query.NewFilter("DstCountry = 'FR' AND SrcCountry = 'US'"), + Units: "inl2%", + Bidirectional: true, + }, + Expected: ` +{{ with context @@{"start":"2022-04-10T15:45:10Z","end":"2022-04-11T15:45:10Z","points":100,"units":"inl2%"}@@ }} +SELECT 1 AS axis, * FROM ( +SELECT + {{ call .ToStartOfInterval "TimeReceived" }} AS time, + {{ .Units }}/{{ .Interval }} AS xps, + emptyArrayString() AS dimensions +FROM {{ .Table }} +WHERE {{ .Timefilter }} AND (DstCountry = 'FR' AND SrcCountry = 'US') +GROUP BY time, dimensions +ORDER BY time WITH FILL + FROM {{ .TimefilterStart }} + TO {{ .TimefilterEnd }} + INTERVAL 1 second + STEP {{ .Interval }} + INTERPOLATE (dimensions AS emptyArrayString())) +{{ end }} +UNION ALL +{{ with context @@{"start":"2022-04-10T15:45:10Z","end":"2022-04-11T15:45:10Z","points":100,"units":"outl2%"}@@ }} +SELECT 2 AS axis, * FROM ( +SELECT + {{ call .ToStartOfInterval "TimeReceived" }} AS time, + {{ .Units }}/{{ .Interval }} AS xps, + emptyArrayString() AS dimensions +FROM {{ .Table }} +WHERE {{ .Timefilter }} AND (SrcCountry = 'FR' AND DstCountry = 'US') +GROUP BY time, dimensions ORDER BY time WITH FILL FROM {{ .TimefilterStart }} TO {{ .TimefilterEnd }} + INTERVAL 1 second