From f8bfd1abc429b06a780b61da4009adfc8cf8e6d4 Mon Sep 17 00:00:00 2001 From: Vishal Sharma Date: Tue, 22 Aug 2023 10:42:53 +0530 Subject: [PATCH] feat: add regex support to traces (#3393) --- pkg/query-service/app/traces/v3/query_builder.go | 5 ++++- .../app/traces/v3/query_builder_test.go | 14 ++++++++++++++ 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/pkg/query-service/app/traces/v3/query_builder.go b/pkg/query-service/app/traces/v3/query_builder.go index ce4a252668..38ab6fc70b 100644 --- a/pkg/query-service/app/traces/v3/query_builder.go +++ b/pkg/query-service/app/traces/v3/query_builder.go @@ -50,6 +50,8 @@ var tracesOperatorMappingV3 = map[v3.FilterOperator]string{ v3.FilterOperatorGreaterThanOrEq: ">=", v3.FilterOperatorLike: "ILIKE", v3.FilterOperatorNotLike: "NOT ILIKE", + v3.FilterOperatorRegex: "match(%s, %s)", + v3.FilterOperatorNotRegex: "NOT match(%s, %s)", v3.FilterOperatorContains: "ILIKE", v3.FilterOperatorNotContains: "NOT ILIKE", v3.FilterOperatorExists: "has(%s%s, '%s')", @@ -173,7 +175,8 @@ func buildTracesFilterQuery(fs *v3.FilterSet, keys map[string]v3.AttributeKey) ( switch item.Operator { case v3.FilterOperatorContains, v3.FilterOperatorNotContains: conditions = append(conditions, fmt.Sprintf("%s %s '%%%s%%'", columnName, operator, item.Value)) - + case v3.FilterOperatorRegex, v3.FilterOperatorNotRegex: + conditions = append(conditions, fmt.Sprintf(operator, columnName, fmtVal)) case v3.FilterOperatorExists, v3.FilterOperatorNotExists: if key.IsColumn { subQuery, err := existsSubQueryForFixedColumn(key, item.Operator) diff --git a/pkg/query-service/app/traces/v3/query_builder_test.go b/pkg/query-service/app/traces/v3/query_builder_test.go index 20c6d86c1b..91eebf01ca 100644 --- a/pkg/query-service/app/traces/v3/query_builder_test.go +++ b/pkg/query-service/app/traces/v3/query_builder_test.go @@ -107,6 +107,20 @@ var buildFilterQueryData = []struct { }}, ExpectedFilter: " AND stringTagMap['host'] NOT ILIKE '%102.%'", }, + { + Name: "Test regex", + FilterSet: &v3.FilterSet{Operator: "AND", Items: []v3.FilterItem{ + {Key: v3.AttributeKey{Key: "name", DataType: v3.AttributeKeyDataTypeString, Type: v3.AttributeKeyTypeTag, IsColumn: true}, Value: "name: \"(?P\\S+)\"", Operator: "regex"}, + }}, + ExpectedFilter: " AND match(name, 'name: \"(?P\\\\S+)\"')", + }, + { + Name: "Test not regex", + FilterSet: &v3.FilterSet{Operator: "AND", Items: []v3.FilterItem{ + {Key: v3.AttributeKey{Key: "name", DataType: v3.AttributeKeyDataTypeString, Type: v3.AttributeKeyTypeTag}, Value: "102.", Operator: "nregex"}, + }}, + ExpectedFilter: " AND NOT match(stringTagMap['name'], '102.')", + }, } func TestBuildTracesFilterQuery(t *testing.T) {