github.com/weaviate/weaviate@v1.24.6/adapters/repos/db/lsmkv/cursor_segment_roaring_set.go (about) 1 // _ _ 2 // __ _____ __ ___ ___ __ _| |_ ___ 3 // \ \ /\ / / _ \/ _` \ \ / / |/ _` | __/ _ \ 4 // \ V V / __/ (_| |\ V /| | (_| | || __/ 5 // \_/\_/ \___|\__,_| \_/ |_|\__,_|\__\___| 6 // 7 // Copyright © 2016 - 2024 Weaviate B.V. All rights reserved. 8 // 9 // CONTACT: hello@weaviate.io 10 // 11 12 package lsmkv 13 14 import ( 15 "github.com/weaviate/weaviate/adapters/repos/db/lsmkv/segmentindex" 16 roaringset2 "github.com/weaviate/weaviate/adapters/repos/db/roaringset" 17 ) 18 19 func (s *segment) newRoaringSetCursor() *roaringset2.SegmentCursor { 20 return roaringset2.NewSegmentCursor(s.contents[s.dataStartPos:s.dataEndPos], 21 &roaringSetSeeker{s.index}) 22 } 23 24 func (sg *SegmentGroup) newRoaringSetCursors() ([]roaringset2.InnerCursor, func()) { 25 sg.maintenanceLock.RLock() 26 out := make([]roaringset2.InnerCursor, len(sg.segments)) 27 28 for i, segment := range sg.segments { 29 out[i] = segment.newRoaringSetCursor() 30 } 31 32 return out, sg.maintenanceLock.RUnlock 33 } 34 35 // diskIndex returns node's Start and End offsets 36 // taking into account HeaderSize. SegmentCursor of RoaringSet 37 // accepts only payload part of underlying segment content, therefore 38 // offsets should be adjusted and reduced by HeaderSize 39 type roaringSetSeeker struct { 40 diskIndex diskIndex 41 } 42 43 func (s *roaringSetSeeker) Seek(key []byte) (segmentindex.Node, error) { 44 node, err := s.diskIndex.Seek(key) 45 if err != nil { 46 return segmentindex.Node{}, err 47 } 48 return segmentindex.Node{ 49 Key: node.Key, 50 Start: node.Start - segmentindex.HeaderSize, 51 End: node.End - segmentindex.HeaderSize, 52 }, nil 53 }