Files
traces/tempodb/encoding/vparquet5/coalesce_conditions_test.go
Martin DisibioandGitHub 8e57f1972c vParquet5 Preview 1 - low resolution timestamp columns (#5495)
* Experiments with next parquet version. Added rounded start time column

* Vparquet5 use lower precision timestamp column when possible based on step interval

* microoptimization

* leftjoiniterator use dynamic branch reordering, plus other performance improvements

* Add columns with other granularities

* Add new functionality: nocompactflg and short trace ID search

* Fix handling of large step intervals and split between backend and generator requests

* Repair tests and reduce divergence from main

* Cleanup, separate benchmark env vars

* Set version string to preview

* rename/comments

* Oops undo change to default encoding

* Fix tests and lint

* Bring in more updates from vparquet4

* Improve accuracy of estimate function, cleanup debug statements

* Reduce diff from main

* lint

* Add test parquet file

* Fix to maintain nano-second precision for blocks overlapping query range edges and recent/backend handoff where things don't align

* Fix tests after merging main, one more fix to maintain nanosecond precision when needed

* changelog

* Cleanup/reduce diff from main

* Review feedback
2025-08-18 15:06:58 -04:00

129 lines
5.9 KiB
Go

package vparquet5
import (
"fmt"
"testing"
"github.com/grafana/tempo/pkg/traceql"
"github.com/stretchr/testify/require"
)
func TestCoalesceConditions(t *testing.T) {
tcs := []struct {
f *traceql.FetchSpansRequest
expected *traceql.FetchSpansRequest
}{
{
f: &traceql.FetchSpansRequest{},
expected: &traceql.FetchSpansRequest{},
},
{
f: &traceql.FetchSpansRequest{
AllConditions: true,
Conditions: []traceql.Condition{
{Attribute: traceql.NewIntrinsic(traceql.IntrinsicTraceRootService), Op: traceql.OpEqual, Operands: []traceql.Static{traceql.NewStaticString("foo")}},
{Attribute: traceql.NewIntrinsic(traceql.IntrinsicTraceRootService), Op: traceql.OpEqual, Operands: []traceql.Static{traceql.NewStaticString("foo")}},
},
},
expected: &traceql.FetchSpansRequest{
AllConditions: true,
Conditions: []traceql.Condition{
{Attribute: traceql.NewIntrinsic(traceql.IntrinsicTraceRootService), Op: traceql.OpEqual, Operands: []traceql.Static{traceql.NewStaticString("foo")}},
{Attribute: traceql.NewIntrinsic(traceql.IntrinsicTraceRootService), Op: traceql.OpEqual, Operands: []traceql.Static{traceql.NewStaticString("foo")}},
},
},
},
{
f: &traceql.FetchSpansRequest{
Conditions: []traceql.Condition{
{Attribute: traceql.NewIntrinsic(traceql.IntrinsicTraceRootService), Op: traceql.OpEqual, Operands: []traceql.Static{traceql.NewStaticString("foo")}},
{Attribute: traceql.NewIntrinsic(traceql.IntrinsicTraceRootService), Op: traceql.OpNotEqual, Operands: []traceql.Static{traceql.NewStaticString("foo")}},
},
},
expected: &traceql.FetchSpansRequest{
Conditions: []traceql.Condition{
{Attribute: traceql.NewIntrinsic(traceql.IntrinsicTraceRootService), Op: traceql.OpNone, Operands: nil},
},
},
},
{
f: &traceql.FetchSpansRequest{
Conditions: []traceql.Condition{
{Attribute: traceql.NewIntrinsic(traceql.IntrinsicTraceRootService), Op: traceql.OpEqual, Operands: []traceql.Static{traceql.NewStaticString("foo")}},
{Attribute: traceql.NewIntrinsic(traceql.IntrinsicTraceRootService), Op: traceql.OpNotEqual, Operands: []traceql.Static{traceql.NewStaticString("bar")}},
},
},
expected: &traceql.FetchSpansRequest{
Conditions: []traceql.Condition{
{Attribute: traceql.NewIntrinsic(traceql.IntrinsicTraceRootService), Op: traceql.OpEqual, Operands: []traceql.Static{traceql.NewStaticString("foo")}},
{Attribute: traceql.NewIntrinsic(traceql.IntrinsicTraceRootService), Op: traceql.OpNotEqual, Operands: []traceql.Static{traceql.NewStaticString("bar")}},
},
},
},
{
f: &traceql.FetchSpansRequest{
Conditions: []traceql.Condition{
{Attribute: traceql.NewIntrinsic(traceql.IntrinsicKind), Op: traceql.OpEqual, Operands: []traceql.Static{traceql.NewStaticString("foo")}},
{Attribute: traceql.NewIntrinsic(traceql.IntrinsicTraceRootService), Op: traceql.OpNotEqual, Operands: []traceql.Static{traceql.NewStaticString("foo")}},
},
},
expected: &traceql.FetchSpansRequest{
Conditions: []traceql.Condition{
{Attribute: traceql.NewIntrinsic(traceql.IntrinsicKind), Op: traceql.OpEqual, Operands: []traceql.Static{traceql.NewStaticString("foo")}},
{Attribute: traceql.NewIntrinsic(traceql.IntrinsicTraceRootService), Op: traceql.OpNotEqual, Operands: []traceql.Static{traceql.NewStaticString("foo")}},
},
},
},
{
f: &traceql.FetchSpansRequest{
Conditions: []traceql.Condition{
{Attribute: traceql.NewIntrinsic(traceql.IntrinsicTraceRootService), Op: traceql.OpEqual, Operands: []traceql.Static{traceql.NewStaticString("foo")}},
{Attribute: traceql.NewIntrinsic(traceql.IntrinsicTraceRootService), Op: traceql.OpNotEqual, Operands: []traceql.Static{traceql.NewStaticString("foo")}},
{Attribute: traceql.NewIntrinsic(traceql.IntrinsicTraceRootService), Op: traceql.OpGreater, Operands: []traceql.Static{traceql.NewStaticString("foo")}},
},
},
expected: &traceql.FetchSpansRequest{
Conditions: []traceql.Condition{
{Attribute: traceql.NewIntrinsic(traceql.IntrinsicTraceRootService), Op: traceql.OpNone, Operands: nil},
},
},
},
{
f: &traceql.FetchSpansRequest{
Conditions: []traceql.Condition{
{Attribute: traceql.NewIntrinsic(traceql.IntrinsicTraceRootService), Op: traceql.OpGreater, Operands: []traceql.Static{traceql.NewStaticString("foo")}},
{Attribute: traceql.NewIntrinsic(traceql.IntrinsicTraceRootService), Op: traceql.OpEqual, Operands: []traceql.Static{traceql.NewStaticString("foo")}},
{Attribute: traceql.NewIntrinsic(traceql.IntrinsicTraceRootService), Op: traceql.OpNotEqual, Operands: []traceql.Static{traceql.NewStaticString("foo")}},
},
},
expected: &traceql.FetchSpansRequest{
Conditions: []traceql.Condition{
{Attribute: traceql.NewIntrinsic(traceql.IntrinsicTraceRootService), Op: traceql.OpNone, Operands: nil},
},
},
},
{
f: &traceql.FetchSpansRequest{
Conditions: []traceql.Condition{
{Attribute: traceql.NewIntrinsic(traceql.IntrinsicTraceRootService), Op: traceql.OpEqual, Operands: []traceql.Static{traceql.NewStaticString("foo")}},
{Attribute: traceql.NewIntrinsic(traceql.IntrinsicChildCount), Op: traceql.OpEqual, Operands: []traceql.Static{traceql.NewStaticString("bar")}},
{Attribute: traceql.NewIntrinsic(traceql.IntrinsicTraceRootService), Op: traceql.OpNotEqual, Operands: []traceql.Static{traceql.NewStaticString("foo")}},
},
},
expected: &traceql.FetchSpansRequest{
Conditions: []traceql.Condition{
{Attribute: traceql.NewIntrinsic(traceql.IntrinsicTraceRootService), Op: traceql.OpNone, Operands: nil},
{Attribute: traceql.NewIntrinsic(traceql.IntrinsicChildCount), Op: traceql.OpEqual, Operands: []traceql.Static{traceql.NewStaticString("bar")}},
},
},
},
}
for i, tc := range tcs {
t.Run(fmt.Sprintf("test-%d", i), func(t *testing.T) {
coalesceConditions(tc.f)
require.Equal(t, tc.expected, tc.f)
})
}
}