github.com/matrixorigin/matrixone@v0.7.0/pkg/vm/engine/tae/containers/vector_test.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 "testing" 20 "time" 21 22 "github.com/RoaringBitmap/roaring" 23 "github.com/matrixorigin/matrixone/pkg/common/mpool" 24 "github.com/matrixorigin/matrixone/pkg/compress" 25 "github.com/matrixorigin/matrixone/pkg/container/types" 26 "github.com/matrixorigin/matrixone/pkg/vm/engine/tae/testutils" 27 "github.com/pierrec/lz4/v4" 28 "github.com/stretchr/testify/assert" 29 ) 30 31 func withAllocator(opt Options) Options { 32 opt.Allocator = mpool.MustNewZero() 33 return opt 34 } 35 36 // func checkFullyEqualVector(t *testing.T, v1, v2 Vector) { 37 // checkEqualVector(t, v1, v2) 38 // assert.Equal(t, v1.Capacity(), v2.Capacity()) 39 // assert.Equal(t, v1.Allocated(), v2.Allocated()) 40 // } 41 42 // func checkEqualVector(t *testing.T, v1, v2 Vector) { 43 // assert.Equal(t, v1.GetType(), v2.GetType()) 44 // assert.Equal(t, v1.Length(), v2.Length()) 45 // assert.Equal(t, v1.HasNull(), v2.HasNull()) 46 // assert.Equal(t, v1.Nullable(), v2.Nullable()) 47 // for i := 0; i < v1.Length(); i++ { 48 // assert.Equal(t, v1.Get(i), v2.Get(i)) 49 // } 50 // } 51 52 func TestVector1(t *testing.T) { 53 defer testutils.AfterTest(t)() 54 opt := withAllocator(Options{}) 55 vec := MakeVector(types.T_int32.ToType(), false, opt) 56 vec.Append(int32(12)) 57 vec.Append(int32(32)) 58 assert.False(t, vec.Nullable()) 59 vec.AppendMany(int32(1), int32(100)) 60 assert.Equal(t, 4, vec.Length()) 61 assert.Equal(t, int32(12), vec.Get(0).(int32)) 62 assert.Equal(t, int32(32), vec.Get(1).(int32)) 63 assert.Equal(t, int32(1), vec.Get(2).(int32)) 64 assert.Equal(t, int32(100), vec.Get(3).(int32)) 65 vec2 := NewVector[int32](types.T_int32.ToType(), false) 66 vec2.Extend(vec) 67 assert.Equal(t, 4, vec2.Length()) 68 assert.Equal(t, int32(12), vec2.Get(0).(int32)) 69 assert.Equal(t, int32(32), vec2.Get(1).(int32)) 70 assert.Equal(t, int32(1), vec2.Get(2).(int32)) 71 assert.Equal(t, int32(100), vec2.Get(3).(int32)) 72 vec.Close() 73 vec2.Close() 74 // XXX MPOOL 75 // alloc := vec.GetAllocator() 76 // assert.Equal(t, 0, alloc.CurrNB()) 77 } 78 79 func TestVector2(t *testing.T) { 80 defer testutils.AfterTest(t)() 81 opt := withAllocator(Options{}) 82 vec := MakeVector(types.T_int64.ToType(), true, opt) 83 t.Log(vec.String()) 84 assert.True(t, vec.Nullable()) 85 now := time.Now() 86 for i := 10; i > 0; i-- { 87 vec.Append(int64(i)) 88 } 89 t.Log(time.Since(now)) 90 assert.Equal(t, 10, vec.Length()) 91 assert.False(t, vec.HasNull()) 92 vec.Append(types.Null{}) 93 assert.Equal(t, 11, vec.Length()) 94 assert.True(t, vec.HasNull()) 95 assert.True(t, vec.IsNull(10)) 96 97 vec.Update(2, types.Null{}) 98 assert.Equal(t, 11, vec.Length()) 99 assert.True(t, vec.HasNull()) 100 assert.True(t, vec.IsNull(10)) 101 assert.True(t, vec.IsNull(2)) 102 103 vec.Update(2, int64(22)) 104 assert.True(t, vec.HasNull()) 105 assert.True(t, vec.IsNull(10)) 106 assert.False(t, vec.IsNull(2)) 107 assert.Equal(t, any(int64(22)), vec.Get(2)) 108 109 vec.Update(10, int64(100)) 110 assert.False(t, vec.HasNull()) 111 assert.False(t, vec.IsNull(10)) 112 assert.False(t, vec.IsNull(2)) 113 assert.Equal(t, any(int64(22)), vec.Get(2)) 114 assert.Equal(t, any(int64(100)), vec.Get(10)) 115 116 t.Log(vec.String()) 117 118 vec.Close() 119 assert.Zero(t, opt.Allocator.CurrNB()) 120 121 // vec2 := compute.MockVec(vec.GetType(), 0, 0) 122 // now = time.Now() 123 // for i := 1000000; i > 0; i-- { 124 // compute.AppendValue(vec2, int64(i)) 125 // } 126 // t.Log(time.Since(now)) 127 128 // vec3 := container.NewVector[int64](opt) 129 // now = time.Now() 130 // for i := 1000000; i > 0; i-- { 131 // vec3.Append(int64(i)) 132 // } 133 // t.Log(time.Since(now)) 134 } 135 136 func TestVector3(t *testing.T) { 137 defer testutils.AfterTest(t)() 138 opts := withAllocator(Options{}) 139 vec1 := MakeVector(types.T_int32.ToType(), false, opts) 140 for i := 0; i < 100; i++ { 141 vec1.Append(int32(i)) 142 } 143 144 w := new(bytes.Buffer) 145 _, err := vec1.WriteTo(w) 146 assert.NoError(t, err) 147 148 r := bytes.NewBuffer(w.Bytes()) 149 150 vec2 := MakeVector(types.T_int32.ToType(), false, opts) 151 _, err = vec2.ReadFrom(r) 152 assert.NoError(t, err) 153 154 assert.True(t, vec1.Equals(vec2)) 155 156 // t.Log(vec1.String()) 157 // t.Log(vec2.String()) 158 vec1.Close() 159 vec2.Close() 160 assert.Zero(t, opts.Allocator.CurrNB()) 161 } 162 163 func TestVector4(t *testing.T) { 164 defer testutils.AfterTest(t)() 165 vecTypes := types.MockColTypes(17) 166 for _, vecType := range vecTypes { 167 vec := MockVector(vecType, 1000, false, true, nil) 168 assert.Equal(t, 1000, vec.Length()) 169 vec.Append(types.Null{}) 170 w := new(bytes.Buffer) 171 _, err := vec.WriteTo(w) 172 assert.NoError(t, err) 173 srcBuf := w.Bytes() 174 srcSize := len(srcBuf) 175 destBuf := make([]byte, lz4.CompressBlockBound(srcSize)) 176 destBuf, err = compress.Compress(srcBuf, destBuf, compress.Lz4) 177 assert.NoError(t, err) 178 f := MockCompressedFile(destBuf, srcSize, compress.Lz4) 179 vec2 := MakeVector(vecType, true) 180 err = vec2.ReadFromFile(f, nil) 181 assert.NoError(t, err) 182 assert.True(t, vec.Equals(vec2)) 183 vec.Close() 184 vec2.Close() 185 } 186 buffer := new(bytes.Buffer) 187 for _, vecType := range vecTypes { 188 vec := MockVector(vecType, 1000, false, true, nil) 189 assert.Equal(t, 1000, vec.Length()) 190 vec.Append(types.Null{}) 191 w := new(bytes.Buffer) 192 _, err := vec.WriteTo(w) 193 assert.NoError(t, err) 194 srcBuf := w.Bytes() 195 srcSize := len(srcBuf) 196 destBuf := make([]byte, lz4.CompressBlockBound(srcSize)) 197 destBuf, err = compress.Compress(srcBuf, destBuf, compress.Lz4) 198 assert.NoError(t, err) 199 f := MockCompressedFile(destBuf, srcSize, compress.Lz4) 200 vec2 := MakeVector(vecType, true) 201 err = vec2.ReadFromFile(f, buffer) 202 assert.NoError(t, err) 203 assert.True(t, vec.Equals(vec2)) 204 vec.Close() 205 vec2.Close() 206 } 207 } 208 209 func TestVector5(t *testing.T) { 210 defer testutils.AfterTest(t)() 211 vecTypes := types.MockColTypes(17) 212 sels := roaring.BitmapOf(2, 6) 213 for _, vecType := range vecTypes { 214 vec := MockVector(vecType, 10, false, true, nil) 215 rows := make([]int, 0) 216 op := func(v any, row int) (err error) { 217 rows = append(rows, row) 218 assert.Equal(t, vec.Get(row), v) 219 return 220 } 221 _ = vec.Foreach(op, nil) 222 assert.Equal(t, 10, len(rows)) 223 for i, e := range rows { 224 assert.Equal(t, i, e) 225 } 226 227 rows = rows[:0] 228 _ = vec.Foreach(op, sels) 229 assert.Equal(t, 2, len(rows)) 230 assert.Equal(t, 2, rows[0]) 231 assert.Equal(t, 6, rows[1]) 232 233 rows = rows[:0] 234 _ = vec.ForeachWindow(2, 6, op, nil) 235 assert.Equal(t, []int{2, 3, 4, 5, 6, 7}, rows) 236 rows = rows[:0] 237 _ = vec.ForeachWindow(2, 6, op, sels) 238 assert.Equal(t, []int{2, 6}, rows) 239 rows = rows[:0] 240 _ = vec.ForeachWindow(3, 6, op, sels) 241 assert.Equal(t, []int{6}, rows) 242 rows = rows[:0] 243 _ = vec.ForeachWindow(3, 3, op, sels) 244 assert.Equal(t, []int{}, rows) 245 246 vec.Close() 247 } 248 } 249 250 func TestVector6(t *testing.T) { 251 defer testutils.AfterTest(t)() 252 vecTypes := types.MockColTypes(17) 253 sels := roaring.BitmapOf(2, 6) 254 f := func(vecType types.Type, nullable bool) { 255 vec := MockVector(vecType, 10, false, nullable, nil) 256 if nullable { 257 vec.Update(4, types.Null{}) 258 } 259 bias := 0 260 win := vec.Window(bias, 8) 261 assert.Equal(t, 8, win.Length()) 262 assert.Equal(t, 8, win.Capacity()) 263 rows := make([]int, 0) 264 op := func(v any, row int) (err error) { 265 rows = append(rows, row) 266 assert.Equal(t, vec.Get(row+bias), v) 267 return 268 } 269 _ = win.Foreach(op, nil) 270 assert.Equal(t, 8, len(rows)) 271 assert.Equal(t, []int{0, 1, 2, 3, 4, 5, 6, 7}, rows) 272 rows = rows[:0] 273 _ = win.ForeachWindow(2, 3, op, nil) 274 assert.Equal(t, 3, len(rows)) 275 assert.Equal(t, []int{2, 3, 4}, rows) 276 277 rows = rows[:0] 278 _ = win.Foreach(op, sels) 279 assert.Equal(t, 2, len(rows)) 280 assert.Equal(t, 2, rows[0]) 281 assert.Equal(t, 6, rows[1]) 282 283 rows = rows[:0] 284 _ = win.ForeachWindow(2, 6, op, sels) 285 assert.Equal(t, []int{2, 6}, rows) 286 rows = rows[:0] 287 _ = win.ForeachWindow(3, 4, op, sels) 288 assert.Equal(t, []int{6}, rows) 289 rows = rows[:0] 290 _ = win.ForeachWindow(3, 3, op, sels) 291 assert.Equal(t, []int{}, rows) 292 293 bias = 1 294 win = vec.Window(bias, 8) 295 296 op2 := func(v any, row int) (err error) { 297 rows = append(rows, row) 298 // t.Logf("row=%d,v=%v", row, v) 299 // t.Logf("row=%d, winv=%v", row, win.Get(row)) 300 // t.Logf("row+bias=%d, rawv=%v", row+bias, vec.Get(row+bias)) 301 assert.Equal(t, vec.Get(row+bias), v) 302 assert.Equal(t, win.Get(row), v) 303 return 304 } 305 rows = rows[:0] 306 _ = win.Foreach(op2, nil) 307 assert.Equal(t, 8, len(rows)) 308 assert.Equal(t, []int{0, 1, 2, 3, 4, 5, 6, 7}, rows) 309 rows = rows[:0] 310 _ = win.ForeachWindow(2, 3, op, nil) 311 assert.Equal(t, 3, len(rows)) 312 assert.Equal(t, []int{2, 3, 4}, rows) 313 rows = rows[:0] 314 _ = win.Foreach(op, sels) 315 assert.Equal(t, 2, len(rows)) 316 assert.Equal(t, 2, rows[0]) 317 assert.Equal(t, 6, rows[1]) 318 319 rows = rows[:0] 320 _ = win.ForeachWindow(2, 6, op, sels) 321 assert.Equal(t, []int{2, 6}, rows) 322 rows = rows[:0] 323 _ = win.ForeachWindow(3, 4, op, sels) 324 assert.Equal(t, []int{6}, rows) 325 rows = rows[:0] 326 _ = win.ForeachWindow(3, 3, op, sels) 327 assert.Equal(t, []int{}, rows) 328 329 vec.Close() 330 } 331 for _, vecType := range vecTypes { 332 f(vecType, false) 333 f(vecType, true) 334 } 335 } 336 337 func TestVector7(t *testing.T) { 338 defer testutils.AfterTest(t)() 339 vecTypes := types.MockColTypes(17) 340 testF := func(typ types.Type, nullable bool) { 341 vec := MockVector(typ, 10, false, nullable, nil) 342 if nullable { 343 vec.Append(types.Null{}) 344 } 345 vec2 := MockVector(typ, 10, false, nullable, nil) 346 vec3 := MakeVector(typ, nullable) 347 vec3.Extend(vec) 348 assert.Equal(t, vec.Length(), vec3.Length()) 349 vec3.Extend(vec2) 350 assert.Equal(t, vec.Length()+vec2.Length(), vec3.Length()) 351 for i := 0; i < vec3.Length(); i++ { 352 if i >= vec.Length() { 353 assert.Equal(t, vec2.Get(i-vec.Length()), vec3.Get(i)) 354 } else { 355 assert.Equal(t, vec.Get(i), vec3.Get(i)) 356 } 357 } 358 359 vec4 := MakeVector(typ, nullable) 360 cnt := 5 361 if nullable { 362 cnt = 6 363 } 364 vec4.ExtendWithOffset(vec, 5, cnt) 365 assert.Equal(t, cnt, vec4.Length()) 366 // t.Log(vec4.String()) 367 // t.Log(vec.String()) 368 for i := 0; i < cnt; i++ { 369 assert.Equal(t, vec.Get(i+5), vec4.Get(i)) 370 } 371 372 vec.Close() 373 vec2.Close() 374 vec3.Close() 375 } 376 for _, typ := range vecTypes { 377 testF(typ, true) 378 testF(typ, false) 379 } 380 } 381 382 func TestVector8(t *testing.T) { 383 defer testutils.AfterTest(t)() 384 vec := MakeVector(types.T_int32.ToType(), true) 385 defer vec.Close() 386 vec.Append(int32(0)) 387 vec.Append(int32(1)) 388 vec.Append(int32(2)) 389 vec.Append(types.Null{}) 390 vec.Append(int32(4)) 391 vec.Append(int32(5)) 392 assert.True(t, types.IsNull(vec.Get(3))) 393 vec.Delete(1) 394 assert.True(t, types.IsNull(vec.Get(2))) 395 vec.Delete(3) 396 assert.True(t, types.IsNull(vec.Get(2))) 397 vec.Update(1, types.Null{}) 398 assert.True(t, types.IsNull(vec.Get(1))) 399 assert.True(t, types.IsNull(vec.Get(2))) 400 vec.Append(types.Null{}) 401 assert.True(t, types.IsNull(vec.Get(1))) 402 assert.True(t, types.IsNull(vec.Get(2))) 403 assert.True(t, types.IsNull(vec.Get(4))) 404 vec.Compact(roaring.BitmapOf(0, 2)) 405 assert.Equal(t, 3, vec.Length()) 406 assert.True(t, types.IsNull(vec.Get(0))) 407 assert.True(t, types.IsNull(vec.Get(2))) 408 t.Log(vec.String()) 409 } 410 411 func TestVector9(t *testing.T) { 412 defer testutils.AfterTest(t)() 413 opts := withAllocator(Options{}) 414 vec := MakeVector(types.T_varchar.ToType(), true, opts) 415 vec.Append([]byte("h1")) 416 vec.Append([]byte("h22")) 417 vec.Append([]byte("h333")) 418 vec.Append(types.Null{}) 419 vec.Append([]byte("h4444")) 420 421 cloned := vec.CloneWindow(2, 2) 422 assert.Equal(t, 2, cloned.Length()) 423 assert.Equal(t, vec.Get(2), cloned.Get(0)) 424 assert.Equal(t, vec.Get(3), cloned.Get(1)) 425 cloned.Close() 426 vec.Close() 427 assert.Zero(t, opts.Allocator.CurrNB()) 428 } 429 430 func TestCloneWithBuffer(t *testing.T) { 431 defer testutils.AfterTest(t)() 432 opts := withAllocator(Options{}) 433 vec := MakeVector(types.T_varchar.ToType(), true, opts) 434 vec.Append([]byte("h1")) 435 vec.Append([]byte("h22")) 436 vec.Append([]byte("h333")) 437 vec.Append(types.Null{}) 438 vec.Append([]byte("h4444")) 439 440 buffer := new(bytes.Buffer) 441 cloned := CloneWithBuffer(vec, buffer) 442 assert.True(t, vec.Equals(cloned)) 443 assert.Zero(t, cloned.Allocated()) 444 445 bs := vec.Bytes() 446 buf := buffer.Bytes() 447 res := bytes.Compare(bs.Storage, buf[:len(bs.Storage)]) 448 assert.Zero(t, res) 449 res = bytes.Compare(bs.HeaderBuf(), buf[len(bs.Storage):len(bs.HeaderBuf())+len(bs.Storage)]) 450 assert.Zero(t, res) 451 } 452 453 func TestCompact(t *testing.T) { 454 defer testutils.AfterTest(t)() 455 opts := withAllocator(Options{}) 456 vec := MakeVector(types.T_varchar.ToType(), true, opts) 457 458 vec.Append(types.Null{}) 459 t.Log(vec.String()) 460 deletes := roaring.BitmapOf(0) 461 //{null} 462 vec.Compact(deletes) 463 //{} 464 assert.Equal(t, 0, vec.Length()) 465 466 vec.Append(types.Null{}) 467 vec.Append(types.Null{}) 468 vec.Append(types.Null{}) 469 deletes = roaring.BitmapOf(0, 1) 470 //{n,n,n} 471 vec.Compact(deletes) 472 //{n} 473 assert.Equal(t, 1, vec.Length()) 474 assert.True(t, types.IsNull(vec.Get(0))) 475 476 vec.Append([]byte("var")) 477 vec.Append(types.Null{}) 478 vec.Append([]byte("var")) 479 vec.Append(types.Null{}) 480 //{null,var,null,var,null} 481 deletes = roaring.BitmapOf(1, 3) 482 vec.Compact(deletes) 483 //{null,null,null} 484 assert.Equal(t, 3, vec.Length()) 485 assert.True(t, types.IsNull(vec.Get(0))) 486 assert.True(t, types.IsNull(vec.Get(1))) 487 assert.True(t, types.IsNull(vec.Get(2))) 488 vec.Close() 489 } 490 491 func BenchmarkVectorExtend(t *testing.B) { 492 vec1 := MockVector(types.T_int32.ToType(), 0, true, false, nil) 493 vec2 := MockVector(types.T_int32.ToType(), 1, true, false, nil) 494 defer vec1.Close() 495 defer vec2.Close() 496 497 t.ResetTimer() 498 for i := 0; i < t.N; i++ { 499 vec1.Extend(vec2) 500 } 501 }