Spaces:
Running
Running
// _ _ | |
// __ _____ __ ___ ___ __ _| |_ ___ | |
// \ \ /\ / / _ \/ _` \ \ / / |/ _` | __/ _ \ | |
// \ V V / __/ (_| |\ V /| | (_| | || __/ | |
// \_/\_/ \___|\__,_| \_/ |_|\__,_|\__\___| | |
// | |
// Copyright © 2016 - 2024 Weaviate B.V. All rights reserved. | |
// | |
// CONTACT: [email protected] | |
// | |
package lsmkv | |
import ( | |
"github.com/weaviate/weaviate/adapters/repos/db/lsmkv/roaringset" | |
"github.com/weaviate/weaviate/adapters/repos/db/lsmkv/segmentindex" | |
) | |
func (s *segment) newRoaringSetCursor() *roaringset.SegmentCursor { | |
return roaringset.NewSegmentCursor(s.contents[s.dataStartPos:s.dataEndPos], | |
&roaringSetSeeker{s.index}) | |
} | |
func (sg *SegmentGroup) newRoaringSetCursors() ([]roaringset.InnerCursor, func()) { | |
sg.maintenanceLock.RLock() | |
out := make([]roaringset.InnerCursor, len(sg.segments)) | |
for i, segment := range sg.segments { | |
out[i] = segment.newRoaringSetCursor() | |
} | |
return out, sg.maintenanceLock.RUnlock | |
} | |
// diskIndex returns node's Start and End offsets | |
// taking into account HeaderSize. SegmentCursor of RoaringSet | |
// accepts only payload part of underlying segment content, therefore | |
// offsets should be adjusted and reduced by HeaderSize | |
type roaringSetSeeker struct { | |
diskIndex diskIndex | |
} | |
func (s *roaringSetSeeker) Seek(key []byte) (segmentindex.Node, error) { | |
node, err := s.diskIndex.Seek(key) | |
if err != nil { | |
return segmentindex.Node{}, err | |
} | |
return segmentindex.Node{ | |
Key: node.Key, | |
Start: node.Start - segmentindex.HeaderSize, | |
End: node.End - segmentindex.HeaderSize, | |
}, nil | |
} | |