Files
signoz/pkg/querybuilder/query_to_keys.go
Tushar Vats f71d5bf8f1 fix: added validations for having expression (#10286)
* fix: added validations for having expression

* fix: added extra validation and unit tests

* fix: added antlr based parsing for validation

* fix: added more unit tests

* fix: removed validation on having in range request validations

* fix: generated lexer files and added more unit tests

* fix: edge cases

* fix: added cmnd to scripts for generating lexer

* fix: use std libg sorting instead of selection sort

* fix: support implicit and

* fix: allow bare not in expression

* fix: added suggestion for having expression

* fix: typo

* fix: added more unit tests, handle white space difference in aggregation exp and having exp

* fix: added support for in and not, updated errors

* fix: added support for brackets list

* fix: lint error

* fix: handle non spaced expression

---------

Co-authored-by: Srikanth Chekuri <srikanth.chekuri92@gmail.com>
2026-04-02 03:52:11 +00:00

64 lines
2.2 KiB
Go

package querybuilder
import (
grammar "github.com/SigNoz/signoz/pkg/parser/filterquery/grammar"
"github.com/SigNoz/signoz/pkg/types/telemetrytypes"
"github.com/antlr4-go/antlr/v4"
)
// QueryStringToKeysSelectors converts a query string to a list of field key selectors
//
// e.g. "service.name="query-service" AND http.status_code=200 AND resource.k8s.namespace.name="application"" -> []*telemetrytypes.FieldKeySelector{
// {
// Name: "service.name",
// FieldContext: telemetrytypes.FieldContextUnspecified,
// FieldDataType: telemetrytypes.FieldDataTypeUnspecified,
// },
// {
// Name: "http.status_code",
// FieldContext: telemetrytypes.FieldContextUnspecified,
// FieldDataType: telemetrytypes.FieldDataTypeUnspecified,
// },
// {
// Name: "resource.k8s.namespace.name",
// FieldContext: telemetrytypes.FieldContextResource,
// FieldDataType: telemetrytypes.FieldDataTypeUnspecified,
// },
// }
func QueryStringToKeysSelectors(query string) []*telemetrytypes.FieldKeySelector {
lexer := grammar.NewFilterQueryLexer(antlr.NewInputStream(query))
keys := []*telemetrytypes.FieldKeySelector{}
for {
tok := lexer.NextToken()
if tok.GetTokenType() == antlr.TokenEOF {
break
}
if tok.GetTokenType() == grammar.FilterQueryLexerKEY {
key := telemetrytypes.GetFieldKeyFromKeyText(tok.GetText())
keys = append(keys, &telemetrytypes.FieldKeySelector{
Name: key.Name,
Signal: key.Signal,
FieldContext: key.FieldContext,
FieldDataType: key.FieldDataType,
})
if key.FieldContext == telemetrytypes.FieldContextLog ||
key.FieldContext == telemetrytypes.FieldContextSpan ||
key.FieldContext == telemetrytypes.FieldContextMetric ||
key.FieldContext == telemetrytypes.FieldContextTrace {
// span.kind in metrics or metric.max_count in span etc.. should get the search on span.kind
// see note in where_clause_visitor.go in VisitKey(...)
keys = append(keys, &telemetrytypes.FieldKeySelector{
Name: key.FieldContext.StringValue() + "." + key.Name,
Signal: key.Signal,
FieldContext: telemetrytypes.FieldContextAttribute, // do not keep the original context because this is attribute
FieldDataType: key.FieldDataType,
})
}
}
}
return keys
}