github.com/matrixorigin/matrixone@v0.7.0/pkg/vm/engine/tae/containers/vecbase.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  	"fmt"
    20  	"io"
    21  	"unsafe"
    22  
    23  	"github.com/RoaringBitmap/roaring"
    24  	"github.com/RoaringBitmap/roaring/roaring64"
    25  	"github.com/matrixorigin/matrixone/pkg/common/mpool"
    26  	"github.com/matrixorigin/matrixone/pkg/container/types"
    27  	"github.com/matrixorigin/matrixone/pkg/vm/engine/tae/common"
    28  )
    29  
    30  type vecBase[T any] struct {
    31  	derived *vector[T]
    32  }
    33  
    34  func newVecBase[T any](derived *vector[T]) *vecBase[T] {
    35  	return &vecBase[T]{
    36  		derived: derived,
    37  	}
    38  }
    39  
    40  func (base *vecBase[T]) Window(offset, length int) Vector               { panic("not supported") }
    41  func (base *vecBase[T]) CloneWindow(_, _ int, _ ...*mpool.MPool) Vector { panic("not supported") }
    42  func (base *vecBase[T]) ResetWithData(_ *Bytes, _ *roaring64.Bitmap)    { panic("not supported") }
    43  func (base *vecBase[T]) Reset()                                         { panic("not supported") }
    44  func (base *vecBase[T]) Equals(o Vector) bool                           { panic("not supported") }
    45  func (base *vecBase[T]) IsView() bool                                   { return false }
    46  func (base *vecBase[T]) Nullable() bool                                 { return false }
    47  func (base *vecBase[T]) IsNull(i int) bool                              { return false }
    48  func (base *vecBase[T]) HasNull() bool                                  { return false }
    49  func (base *vecBase[T]) NullMask() *roaring64.Bitmap                    { return base.derived.nulls }
    50  func (base *vecBase[T]) Slice() any                                     { panic("not supported") }
    51  func (base *vecBase[T]) SlicePtr() unsafe.Pointer                       { panic("not supported") }
    52  func (base *vecBase[T]) Data() []byte                                   { return base.derived.stlvec.Data() }
    53  func (base *vecBase[T]) DataWindow(offset, length int) []byte {
    54  	return base.derived.stlvec.DataWindow(offset, length)
    55  }
    56  func (base *vecBase[T]) Bytes() *Bytes     { return base.derived.stlvec.Bytes() }
    57  func (base *vecBase[T]) Get(i int) (v any) { return base.derived.stlvec.Get(i) }
    58  
    59  func (base *vecBase[T]) tryCOW() {
    60  	if base.derived.roStorage != nil {
    61  		base.derived.cow()
    62  	}
    63  }
    64  
    65  // Modification
    66  func (base *vecBase[T]) Update(i int, v any) { base.derived.stlvec.Update(i, v.(T)) }
    67  func (base *vecBase[T]) Delete(i int)        { base.derived.stlvec.Delete(i) }
    68  func (base *vecBase[T]) Compact(deletes *roaring.Bitmap) {
    69  	if deletes == nil || deletes.IsEmpty() {
    70  		return
    71  	}
    72  	base.derived.stlvec.BatchDelete(
    73  		deletes.Iterator(),
    74  		int(deletes.GetCardinality()))
    75  }
    76  func (base *vecBase[T]) Append(v any) {
    77  	base.tryCOW()
    78  	base.derived.stlvec.Append(v.(T))
    79  }
    80  func (base *vecBase[T]) AppendMany(vs ...any) {
    81  	base.tryCOW()
    82  	for _, v := range vs {
    83  		base.Append(v)
    84  	}
    85  }
    86  func (base *vecBase[T]) AppendNoNulls(s any) {
    87  	base.tryCOW()
    88  	slice := s.([]T)
    89  	base.derived.stlvec.AppendMany(slice...)
    90  }
    91  func (base *vecBase[T]) Extend(o Vector) {
    92  	base.ExtendWithOffset(o, 0, o.Length())
    93  }
    94  
    95  func (base *vecBase[T]) extendData(src Vector, srcOff, srcLen int) {
    96  	if srcLen < 1 {
    97  		return
    98  	}
    99  	if base.derived.typ.IsVarlen() {
   100  		bs := src.Bytes()
   101  		for i := srcOff; i < srcOff+srcLen; i++ {
   102  			base.derived.stlvec.Append(any(bs.GetVarValueAt(i)).(T))
   103  		}
   104  		return
   105  	}
   106  	slice := unsafe.Slice((*T)(src.SlicePtr()), srcOff+srcLen)
   107  	base.derived.stlvec.AppendMany(slice[srcOff : srcOff+srcLen]...)
   108  }
   109  
   110  func (base *vecBase[T]) ExtendWithOffset(src Vector, srcOff, srcLen int) {
   111  	if srcLen <= 0 {
   112  		return
   113  	}
   114  	base.tryCOW()
   115  	base.extendData(src, srcOff, srcLen)
   116  }
   117  
   118  func (base *vecBase[T]) Length() int   { return base.derived.stlvec.Length() }
   119  func (base *vecBase[T]) Capacity() int { return base.derived.stlvec.Capacity() }
   120  func (base *vecBase[T]) Allocated() int {
   121  	if base.derived.roStorage != nil {
   122  		return len(base.derived.roStorage)
   123  	}
   124  	return base.derived.stlvec.Allocated()
   125  }
   126  
   127  func (base *vecBase[T]) GetAllocator() *mpool.MPool { return base.derived.stlvec.GetAllocator() }
   128  func (base *vecBase[T]) GetType() types.Type        { return base.derived.typ }
   129  func (base *vecBase[T]) String() string {
   130  	s := base.derived.stlvec.String()
   131  	if base.derived.roStorage != nil {
   132  		s = fmt.Sprintf("%s;[RoAlloc=%d]", s, len(base.derived.roStorage))
   133  	}
   134  	return s
   135  }
   136  func (base *vecBase[T]) PPString(num int) string {
   137  	var w bytes.Buffer
   138  	_, _ = w.WriteString(fmt.Sprintf("[T=%s][Len=%d][Data=(", base.GetType().String(), base.Length()))
   139  	limit := base.Length()
   140  	if num > 0 && num < limit {
   141  		limit = num
   142  	}
   143  	size := base.Length()
   144  	long := false
   145  	if size > limit {
   146  		long = true
   147  		size = limit
   148  	}
   149  	for i := 0; i < size; i++ {
   150  		if base.IsNull(i) {
   151  			_, _ = w.WriteString("null")
   152  			continue
   153  		}
   154  		if base.GetType().IsVarlen() {
   155  			_, _ = w.WriteString(fmt.Sprintf("%s, ", base.Get(i).([]byte)))
   156  		} else {
   157  			_, _ = w.WriteString(fmt.Sprintf("%v, ", base.Get(i)))
   158  		}
   159  	}
   160  	if long {
   161  		_, _ = w.WriteString("...")
   162  	}
   163  	_, _ = w.WriteString(")]")
   164  	return w.String()
   165  }
   166  
   167  func (base *vecBase[T]) Close() {
   168  	base.derived.releaseRoStorage()
   169  	base.derived.stlvec.Close()
   170  }
   171  func (base *vecBase[T]) WriteTo(w io.Writer) (n int64, err error)  { panic("not supported") }
   172  func (base *vecBase[T]) ReadFrom(r io.Reader) (n int64, err error) { panic("not supported") }
   173  func (base *vecBase[T]) ReadFromFile(f common.IVFile, buffer *bytes.Buffer) (err error) {
   174  	panic("not supported")
   175  }
   176  
   177  func (base *vecBase[T]) Foreach(op ItOp, sels *roaring.Bitmap) (err error) {
   178  	panic("not supported")
   179  }
   180  
   181  func (base *vecBase[T]) ForeachWindow(offset, length int, op ItOp, sels *roaring.Bitmap) (err error) {
   182  	return base.forEachWindowWithBias(offset, length, op, sels, 0)
   183  }
   184  
   185  func (base *vecBase[T]) forEachWindowWithBias(offset, length int, op ItOp, sels *roaring.Bitmap, bias int) (err error) {
   186  	var v T
   187  	if _, ok := any(v).([]byte); !ok {
   188  		slice := base.derived.stlvec.Slice()
   189  		slice = slice[offset+bias : offset+length+bias]
   190  		if sels == nil || sels.IsEmpty() {
   191  			for i, elem := range slice {
   192  				if err = op(elem, i+offset); err != nil {
   193  					break
   194  				}
   195  			}
   196  		} else {
   197  			idxes := sels.ToArray()
   198  			end := offset + length
   199  			for _, idx := range idxes {
   200  				if int(idx) < offset {
   201  					continue
   202  				} else if int(idx) >= end {
   203  					break
   204  				}
   205  				if err = op(slice[int(idx)-offset], int(idx)); err != nil {
   206  					break
   207  				}
   208  			}
   209  		}
   210  		return
   211  	}
   212  	if sels == nil || sels.IsEmpty() {
   213  		for i := offset; i < offset+length; i++ {
   214  			elem := base.derived.stlvec.Get(i + bias)
   215  			if err = op(elem, i); err != nil {
   216  				break
   217  			}
   218  		}
   219  		return
   220  	}
   221  
   222  	idxes := sels.ToArray()
   223  	end := offset + length
   224  	for _, idx := range idxes {
   225  		if int(idx) < offset {
   226  			continue
   227  		} else if int(idx) >= end {
   228  			break
   229  		}
   230  		elem := base.derived.stlvec.Get(int(idx) + bias)
   231  		if err = op(elem, int(idx)); err != nil {
   232  			break
   233  		}
   234  	}
   235  	return
   236  }
   237  
   238  func (base *vecBase[T]) GetView() (view VectorView) { panic("not supported") }