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  }