From c716d8a47b35786077d508ba6abb741458671963 Mon Sep 17 00:00:00 2001 From: Fabian Reinartz Date: Fri, 12 Jun 2015 09:42:36 +0200 Subject: [PATCH] promql: fix aggregation expression String() method. Fixes #794. --- promql/printer.go | 6 +++++- promql/printer_test.go | 48 ++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 53 insertions(+), 1 deletion(-) create mode 100644 promql/printer_test.go diff --git a/promql/printer.go b/promql/printer.go index 4a3a8fded..6ff55dfd8 100644 --- a/promql/printer.go +++ b/promql/printer.go @@ -178,7 +178,11 @@ func (es Expressions) String() (s string) { func (node *AggregateExpr) String() string { aggrString := fmt.Sprintf("%s(%s)", node.Op, node.Expr) if len(node.Grouping) > 0 { - return fmt.Sprintf("%s BY (%s)", aggrString, node.Grouping) + format := "%s BY (%s)" + if node.KeepExtraLabels { + format += " KEEPING_EXTRA" + } + return fmt.Sprintf(format, aggrString, node.Grouping) } return aggrString } diff --git a/promql/printer_test.go b/promql/printer_test.go new file mode 100644 index 000000000..87c4330ab --- /dev/null +++ b/promql/printer_test.go @@ -0,0 +1,48 @@ +// Copyright 2015 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package promql + +import ( + "testing" +) + +func TestExprString(t *testing.T) { + // A list of valid expressions that are expected to be + // returned as out when calling String(). If out is empty the output + // is expected to equal the input. + inputs := []struct { + in, out string + }{ + { + in: `sum(task:errors:rate10s{job="s"}) BY (code)`, + }, + { + in: `sum(task:errors:rate10s{job="s"}) BY (code) KEEPING_EXTRA`, + }, + } + + for _, test := range inputs { + expr, err := ParseExpr(test.in) + if err != nil { + t.Fatalf("parsing error for %q: %s", test.in, err) + } + exp := test.in + if test.out != "" { + exp = test.out + } + if expr.String() != exp { + t.Fatalf("expected %q to be returned as:\n%s\ngot:\n%s\n", test.in, exp, expr.String()) + } + } +}