github.com/matrixorigin/matrixone@v0.7.0/pkg/vm/engine/tae/containers/utils.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  	"strconv"
    20  
    21  	"github.com/matrixorigin/matrixone/pkg/common/moerr"
    22  	"github.com/matrixorigin/matrixone/pkg/common/mpool"
    23  	"github.com/matrixorigin/matrixone/pkg/container/batch"
    24  	"github.com/matrixorigin/matrixone/pkg/container/nulls"
    25  	"github.com/matrixorigin/matrixone/pkg/pb/api"
    26  	"github.com/matrixorigin/matrixone/pkg/vm/engine/tae/common"
    27  	"github.com/matrixorigin/matrixone/pkg/vm/engine/tae/stl"
    28  
    29  	"github.com/RoaringBitmap/roaring"
    30  	"github.com/RoaringBitmap/roaring/roaring64"
    31  	"github.com/matrixorigin/matrixone/pkg/common/bitmap"
    32  	"github.com/matrixorigin/matrixone/pkg/container/types"
    33  	movec "github.com/matrixorigin/matrixone/pkg/container/vector"
    34  )
    35  
    36  func ApplyUpdates(vec Vector, mask *roaring.Bitmap, vals map[uint32]any) {
    37  	it := mask.Iterator()
    38  	for it.HasNext() {
    39  		row := it.Next()
    40  		vec.Update(int(row), vals[row])
    41  	}
    42  }
    43  
    44  func FillBufferWithBytes(bs *Bytes, buffer *bytes.Buffer) *Bytes {
    45  	buffer.Reset()
    46  	size := bs.Size()
    47  	if buffer.Cap() < size {
    48  		buffer.Grow(size)
    49  	}
    50  	nbs := stl.NewBytesWithTypeSize(bs.TypeSize)
    51  	buf := buffer.Bytes()[:size]
    52  	copy(buf, bs.StorageBuf())
    53  	copy(buf[bs.StorageSize():], bs.HeaderBuf())
    54  
    55  	nbs.SetStorageBuf(buf[:bs.StorageSize()])
    56  	nbs.SetHeaderBuf(buf[bs.StorageSize():bs.Size()])
    57  	return nbs
    58  }
    59  
    60  func CloneWithBuffer(src Vector, buffer *bytes.Buffer, allocator ...*mpool.MPool) (cloned Vector) {
    61  	opts := Options{}
    62  	// XXX what does the following test mean?
    63  	if len(allocator) > 0 {
    64  		opts.Allocator = common.DefaultAllocator
    65  	} else {
    66  		opts.Allocator = src.GetAllocator()
    67  	}
    68  	cloned = MakeVector(src.GetType(), src.Nullable(), opts)
    69  	bs := src.Bytes()
    70  	var nulls *roaring64.Bitmap
    71  	if src.HasNull() {
    72  		nulls = src.NullMask().Clone()
    73  	}
    74  	nbs := FillBufferWithBytes(bs, buffer)
    75  	cloned.ResetWithData(nbs, nulls)
    76  	return
    77  }
    78  
    79  func UnmarshalToMoVec(vec Vector) (mov *movec.Vector) {
    80  	bs := vec.Bytes()
    81  
    82  	if vec.GetType().IsVarlen() {
    83  		mov, _ = movec.BuildVarlenaVector(vec.GetType(), bs.Header, bs.Storage)
    84  	} else {
    85  		mov = movec.NewOriginalWithData(vec.GetType(), bs.StorageBuf(), &nulls.Nulls{})
    86  	}
    87  	if vec.HasNull() {
    88  		mov.Nsp.Np = bitmap.New(vec.Length())
    89  		mov.Nsp.Np.AddMany(vec.NullMask().ToArray())
    90  	}
    91  	mov.SetOriginal(true)
    92  
    93  	return
    94  }
    95  
    96  func CopyToMoVec(vec Vector) (mov *movec.Vector) {
    97  	bs := vec.Bytes()
    98  	typ := vec.GetType()
    99  
   100  	if vec.GetType().IsVarlen() {
   101  		var header []types.Varlena
   102  		if bs.AsWindow {
   103  			header = make([]types.Varlena, bs.WinLength)
   104  			copy(header, bs.Header[bs.WinOffset:bs.WinOffset+bs.WinLength])
   105  		} else {
   106  			header = make([]types.Varlena, len(bs.Header))
   107  			copy(header, bs.Header)
   108  		}
   109  		storage := make([]byte, len(bs.Storage))
   110  		if len(storage) > 0 {
   111  			copy(storage, bs.Storage)
   112  		}
   113  		mov, _ = movec.BuildVarlenaVector(typ, header, storage)
   114  	} else if vec.GetType().IsTuple() {
   115  		mov = movec.NewOriginal(vec.GetType())
   116  		cnt := types.DecodeInt32(bs.Storage)
   117  		if cnt != 0 {
   118  			if err := types.Decode(bs.Storage, &mov.Col); err != nil {
   119  				panic(any(err))
   120  			}
   121  		}
   122  	} else {
   123  		data := make([]byte, len(bs.Storage))
   124  		if len(data) > 0 {
   125  			copy(data, bs.Storage)
   126  		}
   127  		mov = movec.NewOriginalWithData(vec.GetType(), data, new(nulls.Nulls))
   128  	}
   129  
   130  	if vec.HasNull() {
   131  		mov.Nsp.Np = bitmap.New(vec.Length())
   132  		mov.Nsp.Np.AddMany(vec.NullMask().ToArray())
   133  		//mov.Nsp.Np = vec.NullMask()
   134  	}
   135  
   136  	return mov
   137  }
   138  
   139  // No copy
   140  func UnmarshalToMoVecs(vecs []Vector) []*movec.Vector {
   141  	movecs := make([]*movec.Vector, len(vecs))
   142  	for i := range movecs {
   143  		movecs[i] = UnmarshalToMoVec(vecs[i])
   144  	}
   145  	return movecs
   146  }
   147  
   148  // Deep copy
   149  func CopyToMoVecs(vecs []Vector) []*movec.Vector {
   150  	movecs := make([]*movec.Vector, len(vecs))
   151  	for i := range movecs {
   152  		movecs[i] = CopyToMoVec(vecs[i])
   153  	}
   154  	return movecs
   155  }
   156  
   157  func CopyToMoBatch(bat *Batch) *batch.Batch {
   158  	ret := batch.New(true, bat.Attrs)
   159  	for i := range bat.Vecs {
   160  		ret.Vecs[i] = CopyToMoVec(bat.Vecs[i])
   161  	}
   162  	return ret
   163  }
   164  
   165  func movecToBytes[T types.FixedSizeT](v *movec.Vector) *Bytes {
   166  	bs := stl.NewFixedTypeBytes[T]()
   167  	if v.Col == nil || len(movec.MustTCols[T](v)) == 0 {
   168  		bs.Storage = make([]byte, v.Length()*v.GetType().TypeSize())
   169  	} else {
   170  		bs.Storage = types.EncodeSlice(movec.MustTCols[T](v))
   171  	}
   172  	return bs
   173  }
   174  
   175  func NewNonNullBatchWithSharedMemory(b *batch.Batch) *Batch {
   176  	bat := NewBatch()
   177  	for i, attr := range b.Attrs {
   178  		v := NewVectorWithSharedMemory(b.Vecs[i], false)
   179  		bat.AddVector(attr, v)
   180  	}
   181  	return bat
   182  }
   183  
   184  func NewVectorWithSharedMemory(v *movec.Vector, nullable bool) Vector {
   185  	vec := MakeVector(v.Typ, nullable)
   186  	var bs *Bytes
   187  
   188  	switch v.Typ.Oid {
   189  	case types.T_bool:
   190  		bs = movecToBytes[bool](v)
   191  	case types.T_int8:
   192  		bs = movecToBytes[int8](v)
   193  	case types.T_int16:
   194  		bs = movecToBytes[int16](v)
   195  	case types.T_int32:
   196  		bs = movecToBytes[int32](v)
   197  	case types.T_int64:
   198  		bs = movecToBytes[int64](v)
   199  	case types.T_uint8:
   200  		bs = movecToBytes[uint8](v)
   201  	case types.T_uint16:
   202  		bs = movecToBytes[uint16](v)
   203  	case types.T_uint32:
   204  		bs = movecToBytes[uint32](v)
   205  	case types.T_uint64:
   206  		bs = movecToBytes[uint64](v)
   207  	case types.T_float32:
   208  		bs = movecToBytes[float32](v)
   209  	case types.T_float64:
   210  		bs = movecToBytes[float64](v)
   211  	case types.T_date:
   212  		bs = movecToBytes[types.Date](v)
   213  	case types.T_time:
   214  		bs = movecToBytes[types.Time](v)
   215  	case types.T_datetime:
   216  		bs = movecToBytes[types.Datetime](v)
   217  	case types.T_timestamp:
   218  		bs = movecToBytes[types.Timestamp](v)
   219  	case types.T_decimal64:
   220  		bs = movecToBytes[types.Decimal64](v)
   221  	case types.T_decimal128:
   222  		bs = movecToBytes[types.Decimal128](v)
   223  	case types.T_uuid:
   224  		bs = movecToBytes[types.Uuid](v)
   225  	case types.T_TS:
   226  		bs = movecToBytes[types.TS](v)
   227  	case types.T_Rowid:
   228  		bs = movecToBytes[types.Rowid](v)
   229  	case types.T_char, types.T_varchar, types.T_json, types.T_blob, types.T_text:
   230  		bs = stl.NewBytesWithTypeSize(-types.VarlenaSize)
   231  		if v.Col != nil {
   232  			bs.Header, bs.Storage = movec.MustVarlenaRawData(v)
   233  		}
   234  	default:
   235  		panic(any(moerr.NewInternalErrorNoCtx("%s not supported", v.Typ.String())))
   236  	}
   237  	var np *roaring64.Bitmap
   238  	if v.Nsp.Np != nil {
   239  		np = roaring64.New()
   240  		np.AddMany(v.Nsp.Np.ToArray())
   241  	}
   242  	vec.ResetWithData(bs, np)
   243  	return vec
   244  }
   245  
   246  func SplitBatch(bat *batch.Batch, cnt int) []*batch.Batch {
   247  	if cnt == 1 {
   248  		return []*batch.Batch{bat}
   249  	}
   250  	length := movec.Length(bat.Vecs[0])
   251  	rows := length / cnt
   252  	if length%cnt == 0 {
   253  		bats := make([]*batch.Batch, 0, cnt)
   254  		for i := 0; i < cnt; i++ {
   255  			newBat := batch.New(true, bat.Attrs)
   256  			for j := 0; j < len(bat.Vecs); j++ {
   257  				window := movec.New(bat.Vecs[j].Typ)
   258  				movec.Window(bat.Vecs[j], i*rows, (i+1)*rows, window)
   259  				newBat.Vecs[j] = window
   260  			}
   261  			bats = append(bats, newBat)
   262  		}
   263  		return bats
   264  	}
   265  	rowArray := make([]int, 0)
   266  	if length/cnt == 0 {
   267  		for i := 0; i < length; i++ {
   268  			rowArray = append(rowArray, 1)
   269  		}
   270  	} else {
   271  		left := length
   272  		for i := 0; i < cnt; i++ {
   273  			if left >= rows && i < cnt-1 {
   274  				rowArray = append(rowArray, rows)
   275  			} else {
   276  				rowArray = append(rowArray, left)
   277  			}
   278  			left -= rows
   279  		}
   280  	}
   281  	start := 0
   282  	bats := make([]*batch.Batch, 0, cnt)
   283  	for _, row := range rowArray {
   284  		newBat := batch.New(true, bat.Attrs)
   285  		for j := 0; j < len(bat.Vecs); j++ {
   286  			window := movec.New(bat.Vecs[j].Typ)
   287  			movec.Window(bat.Vecs[j], start, start+row, window)
   288  			newBat.Vecs[j] = window
   289  		}
   290  		start += row
   291  		bats = append(bats, newBat)
   292  	}
   293  	return bats
   294  }
   295  
   296  var mockMp = common.DefaultAllocator
   297  
   298  func MockVec(typ types.Type, rows int, offset int) *movec.Vector {
   299  	vec := movec.New(typ)
   300  	switch typ.Oid {
   301  	case types.T_bool:
   302  		data := make([]bool, 0)
   303  		for i := 0; i < rows; i++ {
   304  			if i%2 == 0 {
   305  				data = append(data, true)
   306  			} else {
   307  				data = append(data, false)
   308  			}
   309  		}
   310  		_ = movec.AppendFixed(vec, data, mockMp)
   311  	case types.T_int8:
   312  		data := make([]int8, 0)
   313  		for i := 0; i < rows; i++ {
   314  			data = append(data, int8(i+offset))
   315  		}
   316  		_ = movec.AppendFixed(vec, data, mockMp)
   317  	case types.T_int16:
   318  		data := make([]int16, 0)
   319  		for i := 0; i < rows; i++ {
   320  			data = append(data, int16(i+offset))
   321  		}
   322  		_ = movec.AppendFixed(vec, data, mockMp)
   323  	case types.T_int32:
   324  		data := make([]int32, 0)
   325  		for i := 0; i < rows; i++ {
   326  			data = append(data, int32(i+offset))
   327  		}
   328  		_ = movec.AppendFixed(vec, data, mockMp)
   329  	case types.T_int64:
   330  		data := make([]int64, 0)
   331  		for i := 0; i < rows; i++ {
   332  			data = append(data, int64(i+offset))
   333  		}
   334  		_ = movec.AppendFixed(vec, data, mockMp)
   335  	case types.T_uint8:
   336  		data := make([]uint8, 0)
   337  		for i := 0; i < rows; i++ {
   338  			data = append(data, uint8(i+offset))
   339  		}
   340  		_ = movec.AppendFixed(vec, data, mockMp)
   341  	case types.T_uint16:
   342  		data := make([]uint16, 0)
   343  		for i := 0; i < rows; i++ {
   344  			data = append(data, uint16(i+offset))
   345  		}
   346  		_ = movec.AppendFixed(vec, data, mockMp)
   347  	case types.T_uint32:
   348  		data := make([]uint32, 0)
   349  		for i := 0; i < rows; i++ {
   350  			data = append(data, uint32(i+offset))
   351  		}
   352  		_ = movec.AppendFixed(vec, data, mockMp)
   353  	case types.T_uint64:
   354  		data := make([]uint64, 0)
   355  		for i := 0; i < rows; i++ {
   356  			data = append(data, uint64(i+offset))
   357  		}
   358  		_ = movec.AppendFixed(vec, data, mockMp)
   359  	case types.T_float32:
   360  		data := make([]float32, 0)
   361  		for i := 0; i < rows; i++ {
   362  			data = append(data, float32(i+offset))
   363  		}
   364  		_ = movec.AppendFixed(vec, data, mockMp)
   365  	case types.T_float64:
   366  		data := make([]float64, 0)
   367  		for i := 0; i < rows; i++ {
   368  			data = append(data, float64(i+offset))
   369  		}
   370  		_ = movec.AppendFixed(vec, data, mockMp)
   371  	case types.T_decimal64:
   372  		data := make([]types.Decimal64, 0)
   373  		for i := 0; i < rows; i++ {
   374  			d, _ := types.InitDecimal64(int64(i+offset), 64, 0)
   375  			data = append(data, d)
   376  		}
   377  		_ = movec.AppendFixed(vec, data, mockMp)
   378  	case types.T_decimal128:
   379  		data := make([]types.Decimal128, 0)
   380  		for i := 0; i < rows; i++ {
   381  			d, _ := types.InitDecimal128(int64(i+offset), 64, 0)
   382  			data = append(data, d)
   383  		}
   384  		_ = movec.AppendFixed(vec, data, mockMp)
   385  	case types.T_timestamp:
   386  		data := make([]types.Timestamp, 0)
   387  		for i := 0; i < rows; i++ {
   388  			data = append(data, types.Timestamp(i+offset))
   389  		}
   390  		_ = movec.AppendFixed(vec, data, mockMp)
   391  	case types.T_date:
   392  		data := make([]types.Date, 0)
   393  		for i := 0; i < rows; i++ {
   394  			data = append(data, types.Date(i+offset))
   395  		}
   396  		_ = movec.AppendFixed(vec, data, mockMp)
   397  	case types.T_time:
   398  		data := make([]types.Time, 0)
   399  		for i := 0; i < rows; i++ {
   400  			data = append(data, types.Time(i+offset))
   401  		}
   402  		_ = movec.AppendFixed(vec, data, mockMp)
   403  	case types.T_datetime:
   404  		data := make([]types.Datetime, 0)
   405  		for i := 0; i < rows; i++ {
   406  			data = append(data, types.Datetime(i+offset))
   407  		}
   408  		_ = movec.AppendFixed(vec, data, mockMp)
   409  	case types.T_char, types.T_varchar, types.T_blob, types.T_text:
   410  		data := make([][]byte, 0)
   411  		for i := 0; i < rows; i++ {
   412  			data = append(data, []byte(strconv.Itoa(i+offset)))
   413  		}
   414  		_ = movec.AppendBytes(vec, data, mockMp)
   415  	case types.T_TS:
   416  		data := make([]types.TS, 0)
   417  		for i := 0; i < rows; i++ {
   418  			data = append(data, types.BuildTS(int64(i+1), uint32(i%16)))
   419  		}
   420  		_ = movec.AppendFixed(vec, data, mockMp)
   421  
   422  	case types.T_Rowid:
   423  		data := make([]types.Rowid, 0)
   424  		for i := 0; i < rows; i++ {
   425  			data = append(data, types.BuildRowid(int64(i+1), int64(i%16)))
   426  		}
   427  		_ = movec.AppendFixed(vec, data, mockMp)
   428  
   429  	default:
   430  		panic("not support")
   431  	}
   432  	return vec
   433  }
   434  
   435  func GenericUpdateFixedValue[T types.FixedSizeT](vec *movec.Vector, row uint32, v any) {
   436  	_, isNull := v.(types.Null)
   437  	if isNull {
   438  		nulls.Add(vec.Nsp, uint64(row))
   439  	} else {
   440  		movec.SetTAt(vec, int(row), v.(T))
   441  		if vec.Nsp.Np != nil && vec.Nsp.Np.Contains(uint64(row)) {
   442  			vec.Nsp.Np.Remove(uint64(row))
   443  		}
   444  	}
   445  }
   446  
   447  func GenericUpdateBytes(vec *movec.Vector, row uint32, v any) {
   448  	_, isNull := v.(types.Null)
   449  	if isNull {
   450  		nulls.Add(vec.Nsp, uint64(row))
   451  	} else {
   452  		movec.SetBytesAt(vec, int(row), v.([]byte), mockMp)
   453  		if vec.Nsp.Np != nil && vec.Nsp.Np.Contains(uint64(row)) {
   454  			vec.Nsp.Np.Remove(uint64(row))
   455  		}
   456  	}
   457  }
   458  
   459  func AppendFixedValue[T types.FixedSizeT](vec *movec.Vector, v any) {
   460  	_, isNull := v.(types.Null)
   461  	if isNull {
   462  		zt := types.DefaultVal[T]()
   463  		vec.Append(zt, isNull, mockMp)
   464  	} else {
   465  		vec.Append(v.(T), false, mockMp)
   466  	}
   467  }
   468  
   469  func AppendBytes(vec *movec.Vector, v any) {
   470  	_, isNull := v.(types.Null)
   471  	if isNull {
   472  		vec.Append(nil, true, mockMp)
   473  	} else {
   474  		vec.Append(v.([]byte), false, mockMp)
   475  	}
   476  }
   477  
   478  func AppendValue(vec *movec.Vector, v any) {
   479  	switch vec.Typ.Oid {
   480  	case types.T_bool:
   481  		AppendFixedValue[bool](vec, v)
   482  	case types.T_int8:
   483  		AppendFixedValue[int8](vec, v)
   484  	case types.T_int16:
   485  		AppendFixedValue[int16](vec, v)
   486  	case types.T_int32:
   487  		AppendFixedValue[int32](vec, v)
   488  	case types.T_int64:
   489  		AppendFixedValue[int64](vec, v)
   490  	case types.T_uint8:
   491  		AppendFixedValue[uint8](vec, v)
   492  	case types.T_uint16:
   493  		AppendFixedValue[uint16](vec, v)
   494  	case types.T_uint32:
   495  		AppendFixedValue[uint32](vec, v)
   496  	case types.T_uint64:
   497  		AppendFixedValue[uint64](vec, v)
   498  	case types.T_decimal64:
   499  		AppendFixedValue[types.Decimal64](vec, v)
   500  	case types.T_decimal128:
   501  		AppendFixedValue[types.Decimal128](vec, v)
   502  	case types.T_float32:
   503  		AppendFixedValue[float32](vec, v)
   504  	case types.T_float64:
   505  		AppendFixedValue[float64](vec, v)
   506  	case types.T_date:
   507  		AppendFixedValue[types.Date](vec, v)
   508  	case types.T_time:
   509  		AppendFixedValue[types.Time](vec, v)
   510  	case types.T_timestamp:
   511  		AppendFixedValue[types.Timestamp](vec, v)
   512  	case types.T_datetime:
   513  		AppendFixedValue[types.Datetime](vec, v)
   514  	case types.T_uuid:
   515  		AppendFixedValue[types.Uuid](vec, v)
   516  	case types.T_TS:
   517  		AppendFixedValue[types.TS](vec, v)
   518  	case types.T_Rowid:
   519  		AppendFixedValue[types.Rowid](vec, v)
   520  	case types.T_char, types.T_varchar, types.T_json, types.T_blob, types.T_text:
   521  		AppendBytes(vec, v)
   522  	default:
   523  		panic(any("not expected"))
   524  	}
   525  }
   526  
   527  func GetValue(col *movec.Vector, row uint32) any {
   528  	if col.Nsp.Np != nil && col.Nsp.Np.Contains(uint64(row)) {
   529  		return types.Null{}
   530  	}
   531  	switch col.Typ.Oid {
   532  	case types.T_bool:
   533  		return movec.GetValueAt[bool](col, int64(row))
   534  	case types.T_int8:
   535  		return movec.GetValueAt[int8](col, int64(row))
   536  	case types.T_int16:
   537  		return movec.GetValueAt[int16](col, int64(row))
   538  	case types.T_int32:
   539  		return movec.GetValueAt[int32](col, int64(row))
   540  	case types.T_int64:
   541  		return movec.GetValueAt[int64](col, int64(row))
   542  	case types.T_uint8:
   543  		return movec.GetValueAt[uint8](col, int64(row))
   544  	case types.T_uint16:
   545  		return movec.GetValueAt[uint16](col, int64(row))
   546  	case types.T_uint32:
   547  		return movec.GetValueAt[uint32](col, int64(row))
   548  	case types.T_uint64:
   549  		return movec.GetValueAt[uint64](col, int64(row))
   550  	case types.T_decimal64:
   551  		return movec.GetValueAt[types.Decimal64](col, int64(row))
   552  	case types.T_decimal128:
   553  		return movec.GetValueAt[types.Decimal128](col, int64(row))
   554  	case types.T_uuid:
   555  		return movec.GetValueAt[types.Uuid](col, int64(row))
   556  	case types.T_float32:
   557  		return movec.GetValueAt[float32](col, int64(row))
   558  	case types.T_float64:
   559  		return movec.GetValueAt[float64](col, int64(row))
   560  	case types.T_date:
   561  		return movec.GetValueAt[types.Date](col, int64(row))
   562  	case types.T_time:
   563  		return movec.GetValueAt[types.Time](col, int64(row))
   564  	case types.T_datetime:
   565  		return movec.GetValueAt[types.Datetime](col, int64(row))
   566  	case types.T_timestamp:
   567  		return movec.GetValueAt[types.Timestamp](col, int64(row))
   568  	case types.T_TS:
   569  		return movec.GetValueAt[types.TS](col, int64(row))
   570  	case types.T_Rowid:
   571  		return movec.GetValueAt[types.Rowid](col, int64(row))
   572  	case types.T_char, types.T_varchar, types.T_json, types.T_blob, types.T_text:
   573  		return col.GetBytes(int64(row))
   574  	default:
   575  		//return vector.ErrVecTypeNotSupport
   576  		panic(any("No Support"))
   577  	}
   578  }
   579  
   580  func UpdateValue(col *movec.Vector, row uint32, val any) {
   581  	switch col.Typ.Oid {
   582  	case types.T_bool:
   583  		GenericUpdateFixedValue[bool](col, row, val)
   584  	case types.T_int8:
   585  		GenericUpdateFixedValue[int8](col, row, val)
   586  	case types.T_int16:
   587  		GenericUpdateFixedValue[int16](col, row, val)
   588  	case types.T_int32:
   589  		GenericUpdateFixedValue[int32](col, row, val)
   590  	case types.T_int64:
   591  		GenericUpdateFixedValue[int64](col, row, val)
   592  	case types.T_uint8:
   593  		GenericUpdateFixedValue[uint8](col, row, val)
   594  	case types.T_uint16:
   595  		GenericUpdateFixedValue[uint16](col, row, val)
   596  	case types.T_uint32:
   597  		GenericUpdateFixedValue[uint32](col, row, val)
   598  	case types.T_uint64:
   599  		GenericUpdateFixedValue[uint64](col, row, val)
   600  	case types.T_decimal64:
   601  		GenericUpdateFixedValue[types.Decimal64](col, row, val)
   602  	case types.T_decimal128:
   603  		GenericUpdateFixedValue[types.Decimal128](col, row, val)
   604  	case types.T_float32:
   605  		GenericUpdateFixedValue[float32](col, row, val)
   606  	case types.T_float64:
   607  		GenericUpdateFixedValue[float64](col, row, val)
   608  	case types.T_date:
   609  		GenericUpdateFixedValue[types.Date](col, row, val)
   610  	case types.T_time:
   611  		GenericUpdateFixedValue[types.Time](col, row, val)
   612  	case types.T_datetime:
   613  		GenericUpdateFixedValue[types.Datetime](col, row, val)
   614  	case types.T_timestamp:
   615  		GenericUpdateFixedValue[types.Timestamp](col, row, val)
   616  	case types.T_uuid:
   617  		GenericUpdateFixedValue[types.Uuid](col, row, val)
   618  	case types.T_TS:
   619  		GenericUpdateFixedValue[types.TS](col, row, val)
   620  	case types.T_Rowid:
   621  		GenericUpdateFixedValue[types.Rowid](col, row, val)
   622  
   623  	case types.T_varchar, types.T_char, types.T_json, types.T_blob, types.T_text:
   624  		GenericUpdateBytes(col, row, val)
   625  	default:
   626  		panic(moerr.NewInternalErrorNoCtx("%v not supported", col.Typ))
   627  	}
   628  }
   629  
   630  func ForEachValue(col *movec.Vector, reversed bool, op func(v any, row uint32) error) (err error) {
   631  	if reversed {
   632  		for i := movec.Length(col) - 1; i >= 0; i-- {
   633  			v := GetValue(col, uint32(i))
   634  			if err = op(v, uint32(i)); err != nil {
   635  				return
   636  			}
   637  		}
   638  		return
   639  	}
   640  	for i := 0; i < movec.Length(col); i++ {
   641  		v := GetValue(col, uint32(i))
   642  		if err = op(v, uint32(i)); err != nil {
   643  			return
   644  		}
   645  	}
   646  	return
   647  }
   648  
   649  func BatchWindow(bat *batch.Batch, start, end int) *batch.Batch {
   650  	window := batch.New(true, bat.Attrs)
   651  	window.Vecs = make([]*movec.Vector, len(bat.Vecs))
   652  	for i := range window.Vecs {
   653  		vec := movec.New(bat.Vecs[i].Typ)
   654  		movec.Window(bat.Vecs[i], start, end, vec)
   655  		window.Vecs[i] = vec
   656  	}
   657  	return window
   658  }
   659  
   660  /*func ApplyDeleteToVector(vec *movec.Vector, deletes *roaring.Bitmap) *movec.Vector {
   661  	if deletes == nil || deletes.IsEmpty() {
   662  		return vec
   663  	}
   664  	deletesIterator := deletes.Iterator()
   665  
   666  	np := bitmap.New(0)
   667  	var nspIterator bitmap.Iterator
   668  	if vec.Nsp != nil && vec.Nsp.Np != nil {
   669  		nspIterator = vec.Nsp.Np.Iterator()
   670  	}
   671  	deleted := 0
   672  	vec.Col = compute.InplaceDeleteRows(vec.Col, deletesIterator)
   673  	deletesIterator = deletes.Iterator()
   674  	for deletesIterator.HasNext() {
   675  		row := deletesIterator.Next()
   676  		if nspIterator != nil {
   677  			var n uint64
   678  			if nspIterator.HasNext() {
   679  				for nspIterator.HasNext() {
   680  					n = nspIterator.PeekNext()
   681  					if uint32(n) < row {
   682  						nspIterator.Next()
   683  					} else {
   684  						if uint32(n) == row {
   685  							nspIterator.Next()
   686  						}
   687  						break
   688  					}
   689  					np.Add(n - uint64(deleted))
   690  				}
   691  			}
   692  		}
   693  		deleted++
   694  	}
   695  	if nspIterator != nil {
   696  		for nspIterator.HasNext() {
   697  			n := nspIterator.Next()
   698  			np.Add(n - uint64(deleted))
   699  		}
   700  	}
   701  	vec.Nsp.Np = np
   702  	return vec
   703  }*/
   704  
   705  func ApplyUpdateToVector(vec *movec.Vector, mask *roaring.Bitmap, vals map[uint32]any) *movec.Vector {
   706  	if mask == nil || mask.IsEmpty() {
   707  		return vec
   708  	}
   709  	iterator := mask.Iterator()
   710  	for iterator.HasNext() {
   711  		row := iterator.Next()
   712  		UpdateValue(vec, row, vals[row])
   713  	}
   714  	return vec
   715  }
   716  
   717  func CopyToProtoBatch(bat *Batch) (*api.Batch, error) {
   718  	rbat := new(api.Batch)
   719  	rbat.Attrs = bat.Attrs
   720  	for _, vec := range bat.Vecs {
   721  		apiVec, err := CopyToProtoVector(vec)
   722  		if err != nil {
   723  			return nil, err
   724  		}
   725  		rbat.Vecs = append(rbat.Vecs, apiVec)
   726  	}
   727  	return rbat, nil
   728  }
   729  
   730  func CopyToProtoVector(vec Vector) (*api.Vector, error) {
   731  	vecNsp := new(nulls.Nulls)
   732  	if vec.HasNull() {
   733  		vecNsp.Np = bitmap.New(vec.Length())
   734  		vecNsp.Np.AddMany(vec.NullMask().ToArray())
   735  	}
   736  	nsp, err := vecNsp.Show()
   737  	if err != nil {
   738  		return nil, err
   739  	}
   740  	bs := vec.Bytes()
   741  	data := make([]byte, bs.StorageSize())
   742  	copy(data, bs.StorageBuf())
   743  	area := make([]byte, bs.HeaderSize())
   744  	copy(area, bs.HeaderBuf())
   745  	return &api.Vector{
   746  		Nsp:      nsp,
   747  		Nullable: true,
   748  		Area:     area,
   749  		Data:     data,
   750  		IsConst:  false,
   751  		Len:      uint32(vec.Length()),
   752  		Type:     movec.TypeToProtoType(vec.GetType()),
   753  	}, nil
   754  }