fix: Metastore timerange filter (#19171)

pull/19175/head
benclive 4 months ago committed by GitHub
parent 3148a77966
commit dfb60dcaf0
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
  1. 4
      pkg/dataobj/metastore/object.go
  2. 4
      pkg/dataobj/sections/pointers/row_reader.go
  3. 60
      pkg/dataobj/sections/pointers/row_reader_test.go

@ -649,10 +649,6 @@ func (m *ObjectMetastore) estimateSectionsForPredicates(ctx context.Context, ind
return sectionDescriptors, nil
}
func fetchObject(ctx context.Context, bucket objstore.Bucket, path string) (*dataobj.Object, error) {
return dataobj.FromBucket(ctx, bucket, path)
}
func addLabels(mtx *sync.Mutex, streams map[uint64][]*labels.Labels, newLabels *labels.Labels) {
mtx.Lock()
defer mtx.Unlock()

@ -270,11 +270,11 @@ func convertBloomExistenceRowPredicate(p BloomExistenceRowPredicate, nameColumn,
func convertTimeRangeRowPredicate(p TimeRangeRowPredicate, startColumn, endColumn dataset.Column) dataset.Predicate {
return dataset.AndPredicate{
Left: dataset.GreaterThanPredicate{
Column: startColumn,
Column: endColumn,
Value: dataset.Int64Value(p.Start.UnixNano() - 1),
},
Right: dataset.LessThanPredicate{
Column: endColumn,
Column: startColumn,
Value: dataset.Int64Value(p.End.UnixNano() + 1),
},
}

@ -28,6 +28,66 @@ func TestRowReader(t *testing.T) {
require.Equal(t, pointerTestData, actual)
}
func TestRowReaderTimeRange(t *testing.T) {
var streamTestData []SectionPointer
for _, d := range pointerTestData {
if d.PointerKind == PointerKindStreamIndex {
streamTestData = append(streamTestData, d)
}
}
tests := []struct {
name string
predicate TimeRangeRowPredicate
want []SectionPointer
}{
{
name: "no match",
predicate: TimeRangeRowPredicate{Start: unixTime(100), End: unixTime(200)},
want: nil,
},
{
name: "all match",
predicate: TimeRangeRowPredicate{Start: unixTime(0), End: unixTime(20)},
want: streamTestData,
},
{
name: "partial match",
predicate: TimeRangeRowPredicate{Start: unixTime(16), End: unixTime(18)},
want: []SectionPointer{
streamTestData[1],
streamTestData[2],
},
},
{
name: "end predicate equal start of stream",
predicate: TimeRangeRowPredicate{Start: unixTime(0), End: unixTime(10)},
want: []SectionPointer{
streamTestData[0],
},
},
{
name: "start predicate equal end of stream",
predicate: TimeRangeRowPredicate{Start: unixTime(18), End: unixTime(100)},
want: []SectionPointer{
streamTestData[1],
},
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
dec := buildPointersDecoder(t, 0, 2)
r := NewRowReader(dec)
err := r.SetPredicate(tt.predicate)
require.NoError(t, err)
actual, err := readAllPointers(context.Background(), r)
require.NoError(t, err)
require.Equal(t, tt.want, actual)
})
}
}
func unixTime(sec int64) time.Time { return time.Unix(sec, 0) }
func buildPointersDecoder(t *testing.T, pageSize, pageRows int) *Section {

Loading…
Cancel
Save