signoz/pkg/telemetrytraces/trace_operator_statement_builder.go

90 lines
2.8 KiB
Go
Raw Normal View History

package telemetrytraces
import (
"context"
"github.com/SigNoz/signoz/pkg/errors"
"github.com/SigNoz/signoz/pkg/factory"
"github.com/SigNoz/signoz/pkg/querybuilder"
qbtypes "github.com/SigNoz/signoz/pkg/types/querybuildertypes/querybuildertypesv5"
"github.com/SigNoz/signoz/pkg/types/telemetrytypes"
"log/slog"
)
type traceOperatorStatementBuilder struct {
logger *slog.Logger
metadataStore telemetrytypes.MetadataStore
fm qbtypes.FieldMapper
cb qbtypes.ConditionBuilder
traceStmtBuilder qbtypes.StatementBuilder[qbtypes.TraceAggregation]
aggExprRewriter qbtypes.AggExprRewriter
}
var _ qbtypes.TraceOperatorStatementBuilder = (*traceOperatorStatementBuilder)(nil)
func NewTraceOperatorStatementBuilder(
settings factory.ProviderSettings,
metadataStore telemetrytypes.MetadataStore,
fieldMapper qbtypes.FieldMapper,
conditionBuilder qbtypes.ConditionBuilder,
traceStmtBuilder qbtypes.StatementBuilder[qbtypes.TraceAggregation],
aggExprRewriter qbtypes.AggExprRewriter,
) *traceOperatorStatementBuilder {
tracesSettings := factory.NewScopedProviderSettings(settings, "github.com/SigNoz/signoz/pkg/telemetrytraces")
return &traceOperatorStatementBuilder{
logger: tracesSettings.Logger(),
metadataStore: metadataStore,
fm: fieldMapper,
cb: conditionBuilder,
traceStmtBuilder: traceStmtBuilder,
aggExprRewriter: aggExprRewriter,
}
}
2025-07-29 13:06:32 +05:30
// Build builds a SQL query based on the given parameters.
func (b *traceOperatorStatementBuilder) Build(
ctx context.Context,
start uint64,
end uint64,
requestType qbtypes.RequestType,
query qbtypes.QueryBuilderTraceOperator,
2025-07-29 13:06:32 +05:30
compositeQuery *qbtypes.CompositeQuery,
) (*qbtypes.Statement, error) {
start = querybuilder.ToNanoSecs(start)
end = querybuilder.ToNanoSecs(end)
// Parse the expression if not already parsed
if query.ParsedExpression == nil {
if err := query.ParseExpression(); err != nil {
return nil, err
}
}
2025-07-29 13:06:32 +05:30
// Validate compositeQuery parameter
if compositeQuery == nil {
return nil, errors.NewInvalidInputf(errors.CodeInvalidInput, "compositeQuery cannot be nil")
}
// Build the CTE-based query
builder := &traceOperatorCTEBuilder{
ctx: ctx,
start: start,
end: end,
operator: &query,
stmtBuilder: b,
queries: make(map[string]*qbtypes.QueryBuilderQuery[qbtypes.TraceAggregation]),
ctes: []cteNode{}, // Use slice to maintain order
cteNameToIndex: make(map[string]int),
queryToCTEName: make(map[string]string),
2025-07-29 13:06:32 +05:30
compositeQuery: compositeQuery, // Now passed as explicit parameter
}
// Collect all referenced queries
if err := builder.collectQueries(); err != nil {
return nil, err
}
// Build the query
return builder.build(requestType)
}