mirror of
https://github.com/grafana/loki.git
synced 2026-03-13 09:33:58 +08:00
93 lines
2.2 KiB
Go
93 lines
2.2 KiB
Go
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")
|
|
}
|
|
}
|