github.com/matrixorigin/matrixone@v0.7.0/pkg/objectio/column.go (about) 1 // Copyright 2021 Matrix Origin 2 // 3 // Licensed under the Apache License, Version 2.0 (the "License"); 4 // you may not use this file except in compliance with the License. 5 // You may obtain a copy of the License at 6 // 7 // http://www.apache.org/licenses/LICENSE-2.0 8 // 9 // Unless required by applicable law or agreed to in writing, software 10 // distributed under the License is distributed on an "AS IS" BASIS, 11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 // See the License for the specific language governing permissions and 13 // limitations under the License. 14 15 package objectio 16 17 import ( 18 "bytes" 19 "context" 20 "encoding/binary" 21 "github.com/matrixorigin/matrixone/pkg/common/mpool" 22 "github.com/matrixorigin/matrixone/pkg/fileservice" 23 ) 24 25 // ColumnBlock is the organizational structure of a vector in objectio 26 // One batch can be written at a time, and a batch can contain multiple vectors. 27 // It is a child of the block 28 type ColumnBlock struct { 29 // meta is the metadata of the ColumnBlock, 30 // such as index, data location, compression algorithm... 31 meta *ColumnMeta 32 33 // object is the block.object 34 object *Object 35 } 36 37 func NewColumnBlock(idx uint16, object *Object) ColumnObject { 38 meta := &ColumnMeta{ 39 idx: idx, 40 zoneMap: ZoneMap{}, 41 bloomFilter: Extent{}, 42 } 43 col := &ColumnBlock{ 44 object: object, 45 meta: meta, 46 } 47 return col 48 } 49 50 func (cb *ColumnBlock) GetData(ctx context.Context, m *mpool.MPool) (*fileservice.IOVector, error) { 51 var err error 52 data := &fileservice.IOVector{ 53 FilePath: cb.object.name, 54 Entries: make([]fileservice.IOEntry, 1), 55 } 56 data.Entries[0] = fileservice.IOEntry{ 57 Offset: int64(cb.meta.location.Offset()), 58 Size: int64(cb.meta.location.Length()), 59 } 60 data.Entries[0].ToObject = newDecompressToObject(int64(cb.meta.location.OriginSize())) 61 err = cb.object.fs.Read(ctx, data) 62 if err != nil { 63 return nil, err 64 } 65 return data, nil 66 } 67 68 func (cb *ColumnBlock) GetIndex(ctx context.Context, dataType IndexDataType, m *mpool.MPool) (IndexData, error) { 69 if dataType == ZoneMapType { 70 return &cb.meta.zoneMap, nil 71 } else if dataType == BloomFilterType { 72 data := &fileservice.IOVector{ 73 FilePath: cb.object.name, 74 Entries: make([]fileservice.IOEntry, 1), 75 } 76 data.Entries[0] = fileservice.IOEntry{ 77 Offset: int64(cb.meta.bloomFilter.Offset()), 78 Size: int64(cb.meta.bloomFilter.Length()), 79 } 80 var err error 81 data.Entries[0].ToObject = newDecompressToObject(int64(cb.meta.bloomFilter.OriginSize())) 82 err = cb.object.fs.Read(ctx, data) 83 if err != nil { 84 return nil, err 85 } 86 return NewBloomFilter(cb.meta.idx, 0, data.Entries[0].Object.([]byte)), nil 87 } 88 return nil, nil 89 } 90 91 func (cb *ColumnBlock) GetMeta() *ColumnMeta { 92 return cb.meta 93 } 94 95 func (cb *ColumnBlock) MarshalMeta() ([]byte, error) { 96 var ( 97 err error 98 buffer bytes.Buffer 99 ) 100 if err = binary.Write(&buffer, endian, cb.meta.typ); err != nil { 101 return nil, err 102 } 103 if err = binary.Write(&buffer, endian, cb.meta.alg); err != nil { 104 return nil, err 105 } 106 if err = binary.Write(&buffer, endian, cb.meta.idx); err != nil { 107 return nil, err 108 } 109 if err = binary.Write(&buffer, endian, cb.meta.location.Offset()); err != nil { 110 return nil, err 111 } 112 if err = binary.Write(&buffer, endian, cb.meta.location.Length()); err != nil { 113 return nil, err 114 } 115 if err = binary.Write(&buffer, endian, cb.meta.location.OriginSize()); err != nil { 116 return nil, err 117 } 118 if cb.meta.zoneMap.buf == nil { 119 cb.meta.zoneMap.buf = make([]byte, ZoneMapMinSize+ZoneMapMaxSize) 120 } 121 if err = binary.Write(&buffer, endian, cb.meta.zoneMap.buf); err != nil { 122 return nil, err 123 } 124 if err = binary.Write(&buffer, endian, cb.meta.bloomFilter.Offset()); err != nil { 125 return nil, err 126 } 127 if err = binary.Write(&buffer, endian, cb.meta.bloomFilter.Length()); err != nil { 128 return nil, err 129 } 130 if err = binary.Write(&buffer, endian, cb.meta.bloomFilter.OriginSize()); err != nil { 131 return nil, err 132 } 133 if err = binary.Write(&buffer, endian, cb.meta.dummy); err != nil { 134 return nil, err 135 } 136 if err = binary.Write(&buffer, endian, uint32(0)); err != nil { 137 return nil, err 138 } 139 return buffer.Bytes(), nil 140 } 141 142 func (cb *ColumnBlock) UnMarshalMate(cache *bytes.Buffer) error { 143 var err error 144 if err = binary.Read(cache, endian, &cb.meta.typ); err != nil { 145 return err 146 } 147 if err = binary.Read(cache, endian, &cb.meta.alg); err != nil { 148 return err 149 } 150 if err = binary.Read(cache, endian, &cb.meta.idx); err != nil { 151 return err 152 } 153 cb.meta.location = Extent{} 154 if err = binary.Read(cache, endian, &cb.meta.location.offset); err != nil { 155 return err 156 } 157 if err = binary.Read(cache, endian, &cb.meta.location.length); err != nil { 158 return err 159 } 160 if err = binary.Read(cache, endian, &cb.meta.location.originSize); err != nil { 161 return err 162 } 163 cb.meta.zoneMap = ZoneMap{ 164 idx: cb.meta.idx, 165 buf: make([]byte, ZoneMapMinSize+ZoneMapMaxSize), 166 } 167 if err = binary.Read(cache, endian, &cb.meta.zoneMap.buf); err != nil { 168 return err 169 } 170 cb.meta.bloomFilter = Extent{} 171 if err = binary.Read(cache, endian, &cb.meta.bloomFilter.offset); err != nil { 172 return err 173 } 174 if err = binary.Read(cache, endian, &cb.meta.bloomFilter.length); err != nil { 175 return err 176 } 177 if err = binary.Read(cache, endian, &cb.meta.bloomFilter.originSize); err != nil { 178 return err 179 } 180 if err = binary.Read(cache, endian, &cb.meta.dummy); err != nil { 181 return err 182 } 183 if err = binary.Read(cache, endian, &cb.meta.checksum); err != nil { 184 return err 185 } 186 return err 187 }