github.com/weaviate/weaviate@v1.24.6/adapters/repos/db/lsmkv/cursor_segment_collection.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/entities/lsmkv" 16 ) 17 18 type segmentCursorCollection struct { 19 segment *segment 20 nextOffset uint64 21 } 22 23 func (s *segment) newCollectionCursor() *segmentCursorCollection { 24 return &segmentCursorCollection{ 25 segment: s, 26 } 27 } 28 29 func (sg *SegmentGroup) newCollectionCursors() ([]innerCursorCollection, func()) { 30 sg.maintenanceLock.RLock() 31 out := make([]innerCursorCollection, len(sg.segments)) 32 33 for i, segment := range sg.segments { 34 out[i] = segment.newCollectionCursor() 35 } 36 37 return out, sg.maintenanceLock.RUnlock 38 } 39 40 func (s *segmentCursorCollection) seek(key []byte) ([]byte, []value, error) { 41 node, err := s.segment.index.Seek(key) 42 if err != nil { 43 return nil, nil, err 44 } 45 46 parsed, err := s.parseCollectionNode(nodeOffset{node.Start, node.End}) 47 // make sure to set the next offset before checking the error. The error 48 // could be 'entities.Deleted' which would require that the offset is still advanced 49 // for the next cycle 50 s.nextOffset = node.End 51 if err != nil { 52 return parsed.primaryKey, nil, err 53 } 54 55 return parsed.primaryKey, parsed.values, nil 56 } 57 58 func (s *segmentCursorCollection) next() ([]byte, []value, error) { 59 if s.nextOffset >= s.segment.dataEndPos { 60 return nil, nil, lsmkv.NotFound 61 } 62 63 parsed, err := s.parseCollectionNode(nodeOffset{start: s.nextOffset}) 64 // make sure to set the next offset before checking the error. The error 65 // could be 'entities.Deleted' which would require that the offset is still advanced 66 // for the next cycle 67 s.nextOffset = s.nextOffset + uint64(parsed.offset) 68 if err != nil { 69 return parsed.primaryKey, nil, err 70 } 71 72 return parsed.primaryKey, parsed.values, nil 73 } 74 75 func (s *segmentCursorCollection) first() ([]byte, []value, error) { 76 s.nextOffset = s.segment.dataStartPos 77 78 parsed, err := s.parseCollectionNode(nodeOffset{start: s.nextOffset}) 79 // make sure to set the next offset before checking the error. The error 80 // could be 'entities.Deleted' which would require that the offset is still advanced 81 // for the next cycle 82 s.nextOffset = s.nextOffset + uint64(parsed.offset) 83 if err != nil { 84 return parsed.primaryKey, nil, err 85 } 86 87 return parsed.primaryKey, parsed.values, nil 88 } 89 90 func (s *segmentCursorCollection) parseCollectionNode(offset nodeOffset) (segmentCollectionNode, error) { 91 r, err := s.segment.newNodeReader(offset) 92 if err != nil { 93 return segmentCollectionNode{}, err 94 } 95 96 return ParseCollectionNode(r) 97 }