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  }