From ab7ace20a587278f5e2af9053e182789c17967b5 Mon Sep 17 00:00:00 2001 From: Aditya Hegde Date: Thu, 21 Dec 2023 10:55:18 +0530 Subject: [PATCH] Fix aggreagation query --- runtime/queries/metricsview_aggregation.go | 18 ++----- runtime/queries/metricsview_toplist_test.go | 6 +-- .../queries_metrics_aggregation_test.go | 53 +++++++++++++++---- .../dashboards/ad_bids_metrics.yaml | 8 +-- 4 files changed, 54 insertions(+), 31 deletions(-) diff --git a/runtime/queries/metricsview_aggregation.go b/runtime/queries/metricsview_aggregation.go index b2f9dcb4866..3708715142c 100644 --- a/runtime/queries/metricsview_aggregation.go +++ b/runtime/queries/metricsview_aggregation.go @@ -159,20 +159,12 @@ func (q *MetricsViewAggregation) buildMetricsAggregationSQL(mv *runtimev1.Metric if err != nil { return "", nil, err } - rawColName := metricsViewDimensionColumn(dim) - col := safeName(rawColName) - expr := metricsViewDimensionExpression(dim) - - if dim.Unnest && dialect != drivers.DialectDruid { - // TODO: handle unnest for expressions - // select "unnested_colName" as "colName" ... FROM "mv_table", LATERAL UNNEST("mv_table"."colName") tbl("unnested_colName") ... - unnestColName := safeName(tempName(fmt.Sprintf("%s_%s_", "unnested", d.Name))) - selectCols = append(selectCols, fmt.Sprintf(`%s as %s`, unnestColName, safeName(d.Name))) - unnestClauses = append(unnestClauses, fmt.Sprintf(`, LATERAL UNNEST(%s.%s) tbl(%s)`, safeName(mv.Table), col, unnestColName)) - } else { - selectCols = append(selectCols, fmt.Sprintf("%s as %s", expr, safeName(d.Name))) - groupCols = append(groupCols, safeName(d.Name)) + dimSel, unnestClause := dimensionSelect(mv, dim, dialect) + selectCols = append(selectCols, dimSel) + if unnestClause != "" { + unnestClauses = append(unnestClauses, unnestClause) } + groupCols = append(groupCols, safeName(d.Name)) continue } diff --git a/runtime/queries/metricsview_toplist_test.go b/runtime/queries/metricsview_toplist_test.go index 9bcb7e5b868..9907c1ccf95 100644 --- a/runtime/queries/metricsview_toplist_test.go +++ b/runtime/queries/metricsview_toplist_test.go @@ -71,7 +71,7 @@ func TestMetricsViewsToplist_measure_filters(t *testing.T) { require.NoError(t, err) require.NotEmpty(t, q.Result) require.Len(t, q.Result.Data, 3) - require.Equal(t, "sports.yahoo.com", q.Result.Data[0].AsMap()["domain"]) - require.Equal(t, "news.google.com", q.Result.Data[1].AsMap()["domain"]) - require.Equal(t, "instagram.com", q.Result.Data[2].AsMap()["domain"]) + require.Equal(t, "sports.yahoo.com", q.Result.Data[0].AsMap()["dom"]) + require.Equal(t, "news.google.com", q.Result.Data[1].AsMap()["dom"]) + require.Equal(t, "instagram.com", q.Result.Data[2].AsMap()["dom"]) } diff --git a/runtime/server/queries_metrics_aggregation_test.go b/runtime/server/queries_metrics_aggregation_test.go index 6477ea09e1e..46a1dc5f3f4 100644 --- a/runtime/server/queries_metrics_aggregation_test.go +++ b/runtime/server/queries_metrics_aggregation_test.go @@ -119,6 +119,7 @@ func TestMetricsViewAggregation_dimension_expression(t *testing.T) { MetricsView: "ad_bids_metrics", Dimensions: []*runtimev1.MetricsViewAggregationDimension{ {Name: "domain"}, + {Name: "domain_parts"}, {Name: "tld"}, }, Measures: []*runtimev1.MetricsViewAggregationMeasure{ @@ -127,21 +128,36 @@ func TestMetricsViewAggregation_dimension_expression(t *testing.T) { }, Sort: []*runtimev1.MetricsViewAggregationSort{ {Name: "tld", Desc: true}, + {Name: "domain_parts", Desc: true}, }, }) require.NoError(t, err) - require.Equal(t, 2, len(tr.Data)) - require.Equal(t, 4, len(tr.Data[0].Fields)) + require.Equal(t, 4, len(tr.Data)) + require.Equal(t, 5, len(tr.Data[0].Fields)) require.Equal(t, 1.0, tr.Data[0].Fields["__count"].GetNumberValue()) require.Equal(t, 1.0, tr.Data[0].Fields["measure_2"].GetNumberValue()) require.Equal(t, "yahoo.com", tr.Data[0].Fields["domain"].GetStringValue()) + require.Equal(t, "yahoo", tr.Data[0].Fields["domain_parts"].GetStringValue()) require.Equal(t, "yahoo.com", tr.Data[0].Fields["tld"].GetStringValue()) require.Equal(t, 1.0, tr.Data[1].Fields["__count"].GetNumberValue()) - require.Equal(t, 2.0, tr.Data[1].Fields["measure_2"].GetNumberValue()) - require.Equal(t, "msn.com", tr.Data[1].Fields["domain"].GetStringValue()) - require.Equal(t, "msn.com", tr.Data[1].Fields["tld"].GetStringValue()) + require.Equal(t, 1.0, tr.Data[1].Fields["measure_2"].GetNumberValue()) + require.Equal(t, "yahoo.com", tr.Data[1].Fields["domain"].GetStringValue()) + require.Equal(t, "com", tr.Data[1].Fields["domain_parts"].GetStringValue()) + require.Equal(t, "yahoo.com", tr.Data[1].Fields["tld"].GetStringValue()) + + require.Equal(t, 1.0, tr.Data[2].Fields["__count"].GetNumberValue()) + require.Equal(t, 2.0, tr.Data[2].Fields["measure_2"].GetNumberValue()) + require.Equal(t, "msn.com", tr.Data[2].Fields["domain"].GetStringValue()) + require.Equal(t, "msn", tr.Data[2].Fields["domain_parts"].GetStringValue()) + require.Equal(t, "msn.com", tr.Data[2].Fields["tld"].GetStringValue()) + + require.Equal(t, 1.0, tr.Data[3].Fields["__count"].GetNumberValue()) + require.Equal(t, 2.0, tr.Data[3].Fields["measure_2"].GetNumberValue()) + require.Equal(t, "msn.com", tr.Data[3].Fields["domain"].GetStringValue()) + require.Equal(t, "com", tr.Data[3].Fields["domain_parts"].GetStringValue()) + require.Equal(t, "msn.com", tr.Data[3].Fields["tld"].GetStringValue()) } func TestMetricsViewAggregation_dimension_expression_filters(t *testing.T) { @@ -153,6 +169,7 @@ func TestMetricsViewAggregation_dimension_expression_filters(t *testing.T) { MetricsView: "ad_bids_metrics", Dimensions: []*runtimev1.MetricsViewAggregationDimension{ {Name: "domain"}, + {Name: "domain_parts"}, {Name: "tld"}, }, Measures: []*runtimev1.MetricsViewAggregationMeasure{ @@ -161,18 +178,32 @@ func TestMetricsViewAggregation_dimension_expression_filters(t *testing.T) { }, Sort: []*runtimev1.MetricsViewAggregationSort{ {Name: "tld", Desc: true}, + {Name: "domain_parts", Desc: true}, }, - Where: expressionpb.In( - expressionpb.Identifier("tld"), - []*runtimev1.Expression{expressionpb.Value(structpb.NewStringValue("msn.com"))}, - ), + Where: expressionpb.And([]*runtimev1.Expression{ + expressionpb.In( + expressionpb.Identifier("tld"), + []*runtimev1.Expression{expressionpb.Value(structpb.NewStringValue("msn.com"))}, + ), + expressionpb.In( + expressionpb.Identifier("domain_parts"), + []*runtimev1.Expression{expressionpb.Value(structpb.NewStringValue("com"))}, + ), + }), }) require.NoError(t, err) - require.Equal(t, 1, len(tr.Data)) - require.Equal(t, 4, len(tr.Data[0].Fields)) + require.Equal(t, 2, len(tr.Data)) + require.Equal(t, 5, len(tr.Data[0].Fields)) require.Equal(t, 1.0, tr.Data[0].Fields["__count"].GetNumberValue()) require.Equal(t, 2.0, tr.Data[0].Fields["measure_2"].GetNumberValue()) require.Equal(t, "msn.com", tr.Data[0].Fields["domain"].GetStringValue()) + require.Equal(t, "msn", tr.Data[0].Fields["domain_parts"].GetStringValue()) require.Equal(t, "msn.com", tr.Data[0].Fields["tld"].GetStringValue()) + + require.Equal(t, 1.0, tr.Data[1].Fields["__count"].GetNumberValue()) + require.Equal(t, 2.0, tr.Data[1].Fields["measure_2"].GetNumberValue()) + require.Equal(t, "msn.com", tr.Data[1].Fields["domain"].GetStringValue()) + require.Equal(t, "com", tr.Data[1].Fields["domain_parts"].GetStringValue()) + require.Equal(t, "msn.com", tr.Data[1].Fields["tld"].GetStringValue()) } diff --git a/runtime/testruntime/testdata/ad_bids_2rows/dashboards/ad_bids_metrics.yaml b/runtime/testruntime/testdata/ad_bids_2rows/dashboards/ad_bids_metrics.yaml index 258c5bcc2ad..a66a8e1c68e 100644 --- a/runtime/testruntime/testdata/ad_bids_2rows/dashboards/ad_bids_metrics.yaml +++ b/runtime/testruntime/testdata/ad_bids_2rows/dashboards/ad_bids_metrics.yaml @@ -20,10 +20,10 @@ dimensions: property: device - label: Ad Words property: ad words -# - label: Domain Parts -# name: domain_parts -# expression: "string_split(domain, '.')" -# unnest: true + - label: Domain Parts + name: domain_parts + expression: "string_split(domain, '.')" + unnest: true - label: TLD name: tld expression: "regexp_extract(domain, '(.*\\.)?(.*\\.com)', 2)"