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/entities/lsmkv" | |
) | |
type segmentCursorCollectionReusable struct { | |
segment *segment | |
nextOffset uint64 | |
nodeBuf segmentCollectionNode | |
} | |
func (s *segment) newCollectionCursorReusable() *segmentCursorCollectionReusable { | |
return &segmentCursorCollectionReusable{ | |
segment: s, | |
} | |
} | |
func (s *segmentCursorCollectionReusable) seek(key []byte) ([]byte, []value, error) { | |
node, err := s.segment.index.Seek(key) | |
if err != nil { | |
return nil, nil, err | |
} | |
err = s.parseCollectionNodeInto(nodeOffset{node.Start, node.End}) | |
if err != nil { | |
return s.nodeBuf.primaryKey, nil, err | |
} | |
s.nextOffset = node.End | |
return s.nodeBuf.primaryKey, s.nodeBuf.values, nil | |
} | |
func (s *segmentCursorCollectionReusable) next() ([]byte, []value, error) { | |
if s.nextOffset >= s.segment.dataEndPos { | |
return nil, nil, lsmkv.NotFound | |
} | |
err := s.parseCollectionNodeInto(nodeOffset{start: s.nextOffset}) | |
// make sure to set the next offset before checking the error. The error | |
// could be 'entities.Deleted' which would require that the offset is still advanced | |
// for the next cycle | |
s.nextOffset = s.nextOffset + uint64(s.nodeBuf.offset) | |
if err != nil { | |
return s.nodeBuf.primaryKey, nil, err | |
} | |
return s.nodeBuf.primaryKey, s.nodeBuf.values, nil | |
} | |
func (s *segmentCursorCollectionReusable) first() ([]byte, []value, error) { | |
s.nextOffset = s.segment.dataStartPos | |
err := s.parseCollectionNodeInto(nodeOffset{start: s.nextOffset}) | |
if err != nil { | |
return s.nodeBuf.primaryKey, nil, err | |
} | |
s.nextOffset = s.nextOffset + uint64(s.nodeBuf.offset) | |
return s.nodeBuf.primaryKey, s.nodeBuf.values, nil | |
} | |
func (s *segmentCursorCollectionReusable) parseCollectionNodeInto(offset nodeOffset) error { | |
r, err := s.segment.newNodeReader(offset) | |
if err != nil { | |
return err | |
} | |
return ParseCollectionNodeInto(r, &s.nodeBuf) | |
} | |