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