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  }