github.com/weaviate/weaviate@v1.24.6/adapters/repos/db/lsmkv/commitlogger_parser_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 "encoding/binary" 16 "fmt" 17 "io" 18 19 "github.com/pkg/errors" 20 ) 21 22 func (p *commitloggerParser) doCollection() error { 23 for { 24 var commitType CommitType 25 26 err := binary.Read(p.checksumReader, binary.LittleEndian, &commitType) 27 if errors.Is(err, io.EOF) { 28 break 29 } 30 if err != nil { 31 return errors.Wrap(err, "read commit type") 32 } 33 34 if !CommitTypeCollection.Is(commitType) { 35 return errors.Errorf("found a %s commit on a collection bucket", commitType.String()) 36 } 37 38 var version uint8 39 40 err = binary.Read(p.checksumReader, binary.LittleEndian, &version) 41 if err != nil { 42 return errors.Wrap(err, "read commit version") 43 } 44 45 switch version { 46 case 0: 47 { 48 err = p.parseCollectionNodeV0() 49 } 50 case 1: 51 { 52 err = p.parseCollectionNodeV1() 53 } 54 default: 55 { 56 return fmt.Errorf("unsupported commit version %d", version) 57 } 58 } 59 if err != nil { 60 return err 61 } 62 } 63 64 return nil 65 } 66 67 func (p *commitloggerParser) parseCollectionNodeV0() error { 68 return p.parseCollectionNode(p.reader) 69 } 70 71 func (p *commitloggerParser) parseCollectionNodeV1() error { 72 reader, err := p.doRecord() 73 if err != nil { 74 return err 75 } 76 77 return p.parseCollectionNode(reader) 78 } 79 80 func (p *commitloggerParser) parseCollectionNode(reader io.Reader) error { 81 n, err := ParseCollectionNode(reader) 82 if err != nil { 83 return err 84 } 85 86 if p.strategy == StrategyMapCollection { 87 return p.parseMapNode(n) 88 } 89 90 return p.memtable.append(n.primaryKey, n.values) 91 } 92 93 func (p *commitloggerParser) parseMapNode(n segmentCollectionNode) error { 94 for _, val := range n.values { 95 mp := MapPair{} 96 if err := mp.FromBytes(val.value, false); err != nil { 97 return err 98 } 99 mp.Tombstone = val.tombstone 100 101 if err := p.memtable.appendMapSorted(n.primaryKey, mp); err != nil { 102 return err 103 } 104 } 105 106 return nil 107 }