Like Prometheus, but for logs.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 
loki/pkg/dataobj/sections/pointers/row_predicate_test.go

92 lines
2.2 KiB

package pointers
import (
"testing"
"github.com/bits-and-blooms/bloom/v3"
"github.com/stretchr/testify/require"
"github.com/grafana/loki/v3/pkg/dataobj/internal/dataset"
)
type fakeColumn struct{ dataset.Column }
var (
fakePodColumn = &fakeColumn{
Column: &dataset.MemColumn{
Desc: dataset.ColumnDesc{
Tag: "values_bloom_filter",
},
},
}
fakeNameColumn = &fakeColumn{
Column: &dataset.MemColumn{
Desc: dataset.ColumnDesc{
Tag: "column_name",
},
},
}
)
func TestMatchBloomExistencePredicate(t *testing.T) {
bf := bloom.New(100, 100)
bf.AddString("testValuePresent")
bfBytes, err := bf.MarshalBinary()
require.NoError(t, err)
tests := []struct {
name string
pointer SectionPointer
pred RowPredicate
expected bool
}{
{
name: "bloom filter contains value",
pointer: SectionPointer{
Path: "testPath1",
ColumnName: "pod",
ValuesBloomFilter: bfBytes,
},
pred: BloomExistenceRowPredicate{
Name: "pod",
Value: "testValuePresent",
},
expected: true,
},
{
name: "bloom filter does not contain value", // our false positive rate is very low for this test, so it should never return true
pointer: SectionPointer{
Path: "testPath1",
ColumnName: "pod",
ValuesBloomFilter: bfBytes,
},
pred: BloomExistenceRowPredicate{
Name: "pod",
Value: "testValueAbsent",
},
expected: false,
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
predicate := convertBloomExistenceRowPredicate(tt.pred.(BloomExistenceRowPredicate), fakeNameColumn, fakePodColumn)
result := evaluateBloomExistencePredicate(predicate, tt.pointer)
require.Equal(t, tt.expected, result, "matchBloomExistencePredicate returned unexpected result")
})
}
}
func evaluateBloomExistencePredicate(p dataset.Predicate, s SectionPointer) bool {
switch p := p.(type) {
case dataset.AndPredicate:
return evaluateBloomExistencePredicate(p.Left, s) && evaluateBloomExistencePredicate(p.Right, s)
case dataset.EqualPredicate:
return s.ColumnName == unsafeString(p.Value.Binary())
case dataset.FuncPredicate:
return p.Keep(p.Column, dataset.BinaryValue(s.ValuesBloomFilter))
default:
panic("unexpected predicate")
}
}