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 }