github.com/matrixorigin/matrixone@v0.7.0/pkg/vm/engine/tae/containers/vector.go (about)

     1  // Copyright 2022 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 containers
    16  
    17  import (
    18  	"bytes"
    19  	"io"
    20  	"unsafe"
    21  
    22  	"github.com/RoaringBitmap/roaring"
    23  	"github.com/RoaringBitmap/roaring/roaring64"
    24  	"github.com/matrixorigin/matrixone/pkg/common/mpool"
    25  	"github.com/matrixorigin/matrixone/pkg/compress"
    26  	"github.com/matrixorigin/matrixone/pkg/container/types"
    27  	"github.com/matrixorigin/matrixone/pkg/vm/engine/tae/common"
    28  	"github.com/matrixorigin/matrixone/pkg/vm/engine/tae/stl"
    29  	"github.com/matrixorigin/matrixone/pkg/vm/engine/tae/stl/containers"
    30  )
    31  
    32  type internalVector interface {
    33  	Vector
    34  	forEachWindowWithBias(offset, length int, op ItOp,
    35  		sels *roaring.Bitmap, bias int) (err error)
    36  }
    37  
    38  type vector[T any] struct {
    39  	stlvec    stl.Vector[T]
    40  	impl      internalVector
    41  	typ       types.Type
    42  	nulls     *roaring64.Bitmap
    43  	roStorage []byte
    44  }
    45  
    46  func NewVector[T any](typ types.Type, nullable bool, opts ...Options) *vector[T] {
    47  	vec := &vector[T]{
    48  		stlvec: containers.NewVector[T](opts...),
    49  		typ:    typ,
    50  	}
    51  	if nullable {
    52  		vec.impl = newNullableVecImpl(vec)
    53  	} else {
    54  		vec.impl = newVecImpl(vec)
    55  	}
    56  	return vec
    57  }
    58  
    59  // func NewEmptyVector[T any](typ types.Type, opts ...*Options) *vector[T] {
    60  // 	vec := new(vector[T])
    61  // 	vec.typ = typ
    62  // 	vec.stlvec = container.NewVector[T](opts...)
    63  // 	return vec
    64  // }
    65  
    66  func (vec *vector[T]) Equals(o Vector) bool {
    67  	if vec.Length() != o.Length() {
    68  		return false
    69  	}
    70  	if vec.GetType() != o.GetType() {
    71  		return false
    72  	}
    73  	if vec.Nullable() != o.Nullable() {
    74  		return false
    75  	}
    76  	if vec.HasNull() != o.HasNull() {
    77  		return false
    78  	}
    79  	if vec.HasNull() {
    80  		if !vec.NullMask().Equals(o.NullMask()) {
    81  			return false
    82  		}
    83  	}
    84  	mask := vec.NullMask()
    85  	for i := 0; i < vec.Length(); i++ {
    86  		if mask != nil && mask.ContainsInt(i) {
    87  			continue
    88  		}
    89  		var v T
    90  		if _, ok := any(v).([]byte); ok {
    91  			if !bytes.Equal(vec.Get(i).([]byte), o.Get(i).([]byte)) {
    92  				return false
    93  			}
    94  		} else if _, ok := any(v).(types.Decimal64); ok {
    95  			d := vec.Get(i).(types.Decimal64)
    96  			od := vec.Get(i).(types.Decimal64)
    97  			if d.Ne(od) {
    98  				return false
    99  			}
   100  		} else if _, ok := any(v).(types.Decimal128); ok {
   101  			d := vec.Get(i).(types.Decimal128)
   102  			od := vec.Get(i).(types.Decimal128)
   103  			if d.Ne(od) {
   104  				return false
   105  			}
   106  		} else if _, ok := any(v).(types.TS); ok {
   107  			d := vec.Get(i).(types.TS)
   108  			od := vec.Get(i).(types.TS)
   109  			if types.CompareTSTSAligned(d, od) != 0 {
   110  				return false
   111  			}
   112  		} else if _, ok := any(v).(types.Rowid); ok {
   113  			d := vec.Get(i).(types.Rowid)
   114  			od := vec.Get(i).(types.Rowid)
   115  			if types.CompareRowidRowidAligned(d, od) != 0 {
   116  				return false
   117  			}
   118  		} else {
   119  			if vec.Get(i) != o.Get(i) {
   120  				return false
   121  			}
   122  		}
   123  	}
   124  	return true
   125  }
   126  func (vec *vector[T]) IsView() bool                { return vec.impl.IsView() }
   127  func (vec *vector[T]) Nullable() bool              { return vec.impl.Nullable() }
   128  func (vec *vector[T]) IsNull(i int) bool           { return vec.impl.IsNull(i) }
   129  func (vec *vector[T]) HasNull() bool               { return vec.impl.HasNull() }
   130  func (vec *vector[T]) NullMask() *roaring64.Bitmap { return vec.impl.NullMask() }
   131  func (vec *vector[T]) Bytes() *Bytes               { return vec.impl.Bytes() }
   132  func (vec *vector[T]) Data() []byte                { return vec.impl.Data() }
   133  func (vec *vector[T]) DataWindow(offset, length int) []byte {
   134  	return vec.impl.DataWindow(offset, length)
   135  }
   136  func (vec *vector[T]) CloneWindow(offset, length int, allocator ...*mpool.MPool) Vector {
   137  	opts := Options{}
   138  	if len(allocator) == 0 {
   139  		opts.Allocator = vec.GetAllocator()
   140  	} else {
   141  		opts.Allocator = allocator[0]
   142  	}
   143  	cloned := NewVector[T](vec.typ, vec.Nullable(), opts)
   144  	if vec.nulls != nil {
   145  		if offset == 0 || length == vec.Length() {
   146  			cloned.nulls = vec.nulls.Clone()
   147  			if length < vec.Length() {
   148  				cloned.nulls.RemoveRange(uint64(length), uint64(vec.Length()))
   149  			}
   150  		} else {
   151  			cloned.nulls = roaring64.New()
   152  			for i := offset; i < offset+length; i++ {
   153  				if vec.nulls.ContainsInt(i) {
   154  					cloned.nulls.AddInt(i - offset)
   155  				}
   156  			}
   157  		}
   158  	}
   159  	cloned.stlvec.Close()
   160  	cloned.stlvec = vec.stlvec.Clone(offset, length, allocator...)
   161  	return cloned
   162  }
   163  func (vec *vector[T]) fastSlice() []T {
   164  	return vec.stlvec.Slice()
   165  }
   166  func (vec *vector[T]) Slice() any {
   167  	return vec.stlvec.Slice()
   168  }
   169  func (vec *vector[T]) SlicePtr() unsafe.Pointer {
   170  	return vec.stlvec.SlicePtr()
   171  }
   172  
   173  func (vec *vector[T]) Get(i int) (v any)               { return vec.impl.Get(i) }
   174  func (vec *vector[T]) Update(i int, v any)             { vec.impl.Update(i, v) }
   175  func (vec *vector[T]) Delete(i int)                    { vec.impl.Delete(i) }
   176  func (vec *vector[T]) Compact(deletes *roaring.Bitmap) { vec.impl.Compact(deletes) }
   177  func (vec *vector[T]) Append(v any)                    { vec.impl.Append(v) }
   178  func (vec *vector[T]) AppendMany(vs ...any)            { vec.impl.AppendMany(vs...) }
   179  func (vec *vector[T]) AppendNoNulls(s any)             { vec.impl.AppendNoNulls(s) }
   180  func (vec *vector[T]) Extend(o Vector)                 { vec.impl.Extend(o) }
   181  func (vec *vector[T]) ExtendWithOffset(src Vector, srcOff, srcLen int) {
   182  	vec.impl.ExtendWithOffset(src, srcOff, srcLen)
   183  }
   184  
   185  // func (vec *vector[T]) ExtendView(o VectorView) { vec.impl.ExtendView(o) }
   186  func (vec *vector[T]) Length() int    { return vec.impl.Length() }
   187  func (vec *vector[T]) Capacity() int  { return vec.impl.Capacity() }
   188  func (vec *vector[T]) Allocated() int { return vec.impl.Allocated() }
   189  
   190  func (vec *vector[T]) GetAllocator() *mpool.MPool { return vec.stlvec.GetAllocator() }
   191  func (vec *vector[T]) GetType() types.Type        { return vec.typ }
   192  func (vec *vector[T]) String() string             { return vec.impl.String() }
   193  func (vec *vector[T]) PPString(num int) string    { return vec.impl.PPString(num) }
   194  func (vec *vector[T]) Close()                     { vec.impl.Close() }
   195  
   196  func (vec *vector[T]) cow() {
   197  	vec.stlvec = vec.stlvec.Clone(0, vec.stlvec.Length())
   198  	vec.releaseRoStorage()
   199  }
   200  func (vec *vector[T]) releaseRoStorage() {
   201  	if vec.roStorage != nil {
   202  		vec.GetAllocator().Free(vec.roStorage)
   203  	}
   204  	vec.roStorage = nil
   205  }
   206  
   207  func (vec *vector[T]) Window(offset, length int) Vector {
   208  	return &vectorWindow[T]{
   209  		ref: vec,
   210  		windowBase: &windowBase{
   211  			offset: offset,
   212  			length: length,
   213  		},
   214  	}
   215  }
   216  
   217  func (vec *vector[T]) WriteTo(w io.Writer) (n int64, err error) {
   218  	var nr int
   219  	var tmpn int64
   220  	// 1. Vector type
   221  	vt := vec.GetType()
   222  	if nr, err = w.Write(types.EncodeType(&vt)); err != nil {
   223  		return
   224  	}
   225  	n += int64(nr)
   226  	// 2. Nullable
   227  	if nr, err = w.Write(types.EncodeFixed(vec.Nullable())); err != nil {
   228  		return
   229  	}
   230  	n += int64(nr)
   231  	// 3. Vector data
   232  	if tmpn, err = vec.stlvec.WriteTo(w); err != nil {
   233  		return
   234  	}
   235  	n += tmpn
   236  	if !vec.Nullable() {
   237  		return
   238  	}
   239  	// 4. Nulls
   240  	var nullBuf []byte
   241  	if vec.nulls != nil {
   242  		if nullBuf, err = vec.nulls.ToBytes(); err != nil {
   243  			return
   244  		}
   245  	}
   246  	if nr, err = w.Write(types.EncodeFixed(uint32(len(nullBuf)))); err != nil {
   247  		return
   248  	}
   249  	n += int64(nr)
   250  	if len(nullBuf) == 0 {
   251  		return
   252  	}
   253  	if nr, err = w.Write(nullBuf); err != nil {
   254  		return
   255  	}
   256  	n += int64(nr)
   257  
   258  	return
   259  }
   260  
   261  func (vec *vector[T]) ReadFrom(r io.Reader) (n int64, err error) {
   262  	vec.releaseRoStorage()
   263  	var tmpn int64
   264  	// 1. Vector type
   265  	typeBuf := make([]byte, types.TSize)
   266  	if _, err = r.Read(typeBuf); err != nil {
   267  		return
   268  	}
   269  	vec.typ = types.DecodeType(typeBuf)
   270  	n += int64(len(typeBuf))
   271  
   272  	// 2. Nullable
   273  	oneBuf := make([]byte, 1)
   274  	if _, err = r.Read(oneBuf); err != nil {
   275  		return
   276  	}
   277  	nullable := types.DecodeFixed[bool](oneBuf)
   278  	n += 1
   279  
   280  	if nullable {
   281  		vec.impl = newNullableVecImpl(vec)
   282  	} else {
   283  		vec.impl = newVecImpl(vec)
   284  	}
   285  
   286  	// 3. Data
   287  	if tmpn, err = vec.stlvec.ReadFrom(r); err != nil {
   288  		return
   289  	}
   290  	n += tmpn
   291  
   292  	// 4. Null
   293  	if !nullable {
   294  		return
   295  	}
   296  	fourBuf := make([]byte, int(unsafe.Sizeof(uint32(0))))
   297  	if _, err = r.Read(fourBuf); err != nil {
   298  		return
   299  	}
   300  	n += int64(len(fourBuf))
   301  	nullSize := types.DecodeFixed[uint32](fourBuf)
   302  	if nullSize == 0 {
   303  		return
   304  	}
   305  	vec.nulls = roaring64.New()
   306  	if tmpn, err = vec.nulls.ReadFrom(r); err != nil {
   307  		return
   308  	}
   309  	n += tmpn
   310  	return
   311  }
   312  
   313  func (vec *vector[T]) ReadFromFile(f common.IVFile, buffer *bytes.Buffer) (err error) {
   314  	vec.releaseRoStorage()
   315  	stat := f.Stat()
   316  	var n []byte
   317  	var buf []byte
   318  	var tmpNode []byte
   319  	if stat.CompressAlgo() != compress.None {
   320  		osize := int(stat.OriginSize())
   321  		size := stat.Size()
   322  		tmpNode, err = vec.GetAllocator().Alloc(int(size))
   323  		if err != nil {
   324  			return
   325  		}
   326  		defer vec.GetAllocator().Free(tmpNode)
   327  		srcBuf := tmpNode[:size]
   328  		if _, err = f.Read(srcBuf); err != nil {
   329  			return
   330  		}
   331  		if buffer == nil {
   332  			n, err = vec.GetAllocator().Alloc(osize)
   333  			if err != nil {
   334  				return
   335  			}
   336  			buf = n[:osize]
   337  		} else {
   338  			buffer.Reset()
   339  			if osize > buffer.Cap() {
   340  				buffer.Grow(osize)
   341  			}
   342  			buf = buffer.Bytes()[:osize]
   343  		}
   344  		if _, err = compress.Decompress(srcBuf, buf, compress.Lz4); err != nil {
   345  			if n != nil {
   346  				vec.GetAllocator().Free(n)
   347  			}
   348  			return
   349  		}
   350  	}
   351  	vec.typ = types.DecodeType(buf[:types.TSize])
   352  	buf = buf[types.TSize:]
   353  
   354  	nullable := types.DecodeFixed[bool](buf[:1])
   355  	buf = buf[1:]
   356  
   357  	if nullable {
   358  		vec.impl = newNullableVecImpl(vec)
   359  	} else {
   360  		vec.impl = newVecImpl(vec)
   361  	}
   362  	var nr int64
   363  	if nr, err = vec.stlvec.InitFromSharedBuf(buf); err != nil {
   364  		if n != nil {
   365  			vec.GetAllocator().Free(n)
   366  		}
   367  		return
   368  	}
   369  	buf = buf[nr:]
   370  	if !nullable {
   371  		vec.roStorage = n
   372  		return
   373  	}
   374  
   375  	nullSize := types.DecodeFixed[uint32](buf[:4])
   376  	buf = buf[4:]
   377  	if nullSize > 0 {
   378  		nullBuf := buf[:nullSize]
   379  		nulls := roaring64.New()
   380  		r := bytes.NewBuffer(nullBuf)
   381  		if _, err = nulls.ReadFrom(r); err != nil {
   382  			if n != nil {
   383  				vec.GetAllocator().Free(n)
   384  			}
   385  			return
   386  		}
   387  		vec.nulls = nulls
   388  	}
   389  	vec.roStorage = n
   390  	return
   391  }
   392  
   393  func (vec *vector[T]) Foreach(op ItOp, sels *roaring.Bitmap) (err error) {
   394  	return vec.impl.ForeachWindow(0, vec.Length(), op, sels)
   395  }
   396  
   397  func (vec *vector[T]) ForeachWindow(offset, length int, op ItOp, sels *roaring.Bitmap) (err error) {
   398  	return vec.impl.ForeachWindow(offset, length, op, sels)
   399  }
   400  
   401  func (vec *vector[T]) GetView() (view VectorView) {
   402  	return newVecView(vec)
   403  }
   404  
   405  func (vec *vector[T]) ResetWithData(bs *Bytes, nulls *roaring64.Bitmap) {
   406  	vec.releaseRoStorage()
   407  	if vec.Nullable() {
   408  		vec.nulls = nulls
   409  	}
   410  	vec.stlvec.ReadBytes(bs, true)
   411  }
   412  
   413  func (vec *vector[T]) Reset() {
   414  	vec.releaseRoStorage()
   415  	vec.stlvec.Reset()
   416  	vec.nulls = nil
   417  }