github.com/matrixorigin/matrixone@v0.7.0/pkg/vm/engine/tae/stl/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  	"fmt"
    20  	"strings"
    21  	"testing"
    22  	"time"
    23  	"unsafe"
    24  
    25  	"github.com/matrixorigin/matrixone/pkg/common/mpool"
    26  	"github.com/matrixorigin/matrixone/pkg/vm/engine/tae/stl"
    27  	"github.com/matrixorigin/matrixone/pkg/vm/engine/tae/testutils"
    28  	"github.com/stretchr/testify/assert"
    29  )
    30  
    31  func withAllocator(opts Options) Options {
    32  	opts.Allocator = mpool.MustNewZero()
    33  	return opts
    34  }
    35  
    36  func TestVector1(t *testing.T) {
    37  	defer testutils.AfterTest(t)()
    38  	opts := withAllocator(Options{})
    39  	vec := NewVector[int64](opts)
    40  	now := time.Now()
    41  
    42  	for i := 0; i < 500; i++ {
    43  		vec.Append(int64(i))
    44  	}
    45  	t.Log(time.Since(now))
    46  	t.Log(vec.String())
    47  	allocator := vec.GetAllocator()
    48  	assert.True(t, allocator.CurrNB() > 0)
    49  	now = time.Now()
    50  	for i := 0; i < 500; i++ {
    51  		v := vec.Get(i)
    52  		assert.Equal(t, int64(i), v)
    53  	}
    54  	t.Log(time.Since(now))
    55  
    56  	vec.Update(100, int64(999))
    57  	v := vec.Get(100)
    58  	assert.Equal(t, int64(999), v)
    59  
    60  	assert.Equal(t, 500, vec.Length())
    61  	vec.Delete(80)
    62  	assert.Equal(t, 499, vec.Length())
    63  
    64  	vec2 := NewVector[int64]()
    65  	for i := 0; i < 100; i++ {
    66  		vec2.Append(int64(i + 1000))
    67  	}
    68  	vec.AppendMany(vec2.Slice()...)
    69  	assert.Equal(t, 100+499, vec.Length())
    70  
    71  	vec.Close()
    72  	vec2.Close()
    73  	assert.True(t, allocator.CurrNB() == 0)
    74  }
    75  
    76  func TestVector2(t *testing.T) {
    77  	defer testutils.AfterTest(t)()
    78  	vec := NewVector[[]byte]()
    79  	defer vec.Close()
    80  	vec.Append([]byte("hello"))
    81  	t.Log(vec.String())
    82  	v := vec.Get(0)
    83  	assert.Equal(t, "hello", string(v))
    84  	vec.Append([]byte("world"))
    85  	assert.Equal(t, 2, vec.Length())
    86  	vec.Delete(0)
    87  	assert.Equal(t, 1, vec.Length())
    88  	v = vec.Get(0)
    89  	assert.Equal(t, "world", string(v))
    90  }
    91  
    92  func TestVector3(t *testing.T) {
    93  	defer testutils.AfterTest(t)()
    94  	opts := withAllocator(Options{})
    95  	vec := NewVector[[]byte](opts)
    96  	vec.Append([]byte("h1"))
    97  	vec.Append([]byte("h2"))
    98  	vec.Append([]byte("h3"))
    99  	vec.Append([]byte("h4"))
   100  	assert.Equal(t, 4, vec.Length())
   101  	vec.Update(1, []byte("hello"))
   102  	t.Logf("%s", vec.Get(3))
   103  	t.Logf("%s", vec.Get(2))
   104  	t.Logf("%s", vec.Get(1))
   105  	t.Logf("%s", vec.Get(0))
   106  	assert.Equal(t, "h1", string(vec.Get(0)))
   107  	assert.Equal(t, "hello", string(vec.Get(1)))
   108  	assert.Equal(t, "h3", string(vec.Get(2)))
   109  	assert.Equal(t, "h4", string(vec.Get(3)))
   110  	t.Log(vec.String())
   111  	vec.Close()
   112  	assert.Equal(t, int64(0), opts.Allocator.CurrNB())
   113  }
   114  
   115  func TestVector4(t *testing.T) {
   116  	defer testutils.AfterTest(t)()
   117  	opts := withAllocator(Options{})
   118  	vec := NewVector[[]byte](opts)
   119  	vec.Append([]byte("h1"))
   120  	vec.Append([]byte("h2"))
   121  	vec.Append([]byte("h3"))
   122  	vec.Append([]byte("h4"))
   123  	assert.Equal(t, 4, vec.Length())
   124  	vec.Delete(1)
   125  	assert.Equal(t, 3, vec.Length())
   126  	t.Logf("%s", vec.Get(2))
   127  	t.Logf("%s", vec.Get(1))
   128  	t.Logf("%s", vec.Get(0))
   129  	assert.Equal(t, "h1", string(vec.Get(0)))
   130  	assert.Equal(t, "h3", string(vec.Get(1)))
   131  	assert.Equal(t, "h4", string(vec.Get(2)))
   132  	t.Log(vec.String())
   133  	vec.Close()
   134  	assert.Equal(t, int64(0), opts.Allocator.CurrNB())
   135  }
   136  
   137  func TestVector5(t *testing.T) {
   138  	defer testutils.AfterTest(t)()
   139  	opts := withAllocator(Options{})
   140  	vec := NewVector[[]byte](opts)
   141  	vec.Append([]byte("h1"))
   142  	vec.Append([]byte("hh2"))
   143  	vec.Append([]byte("hhh3"))
   144  	vec.Append([]byte("hhhh4"))
   145  	assert.Equal(t, 4, vec.Length())
   146  	vec2 := vec.Clone(0, 1)
   147  	assert.Equal(t, 1, vec2.Length())
   148  	assert.Equal(t, "h1", string(vec2.Get(0)))
   149  	vec2.Close()
   150  	vec2 = vec.Clone(0, 2)
   151  	assert.Equal(t, 2, vec2.Length())
   152  	assert.Equal(t, "h1", string(vec2.Get(0)))
   153  	assert.Equal(t, "hh2", string(vec2.Get(1)))
   154  	vec2.Close()
   155  	vec2 = vec.Clone(0, 3)
   156  	assert.Equal(t, 3, vec2.Length())
   157  	assert.Equal(t, "h1", string(vec2.Get(0)))
   158  	assert.Equal(t, "hh2", string(vec2.Get(1)))
   159  	assert.Equal(t, "hhh3", string(vec2.Get(2)))
   160  	vec2.Close()
   161  	vec2 = vec.Clone(0, 4)
   162  	assert.Equal(t, 4, vec2.Length())
   163  	assert.Equal(t, "h1", string(vec2.Get(0)))
   164  	assert.Equal(t, "hh2", string(vec2.Get(1)))
   165  	assert.Equal(t, "hhh3", string(vec2.Get(2)))
   166  	assert.Equal(t, "hhhh4", string(vec2.Get(3)))
   167  	vec2.Close()
   168  
   169  	vec2 = vec.Clone(1, 1)
   170  	assert.Equal(t, 1, vec2.Length())
   171  	assert.Equal(t, "hh2", string(vec2.Get(0)))
   172  	vec2.Close()
   173  	vec2 = vec.Clone(1, 2)
   174  	assert.Equal(t, 2, vec2.Length())
   175  	assert.Equal(t, "hh2", string(vec2.Get(0)))
   176  	assert.Equal(t, "hhh3", string(vec2.Get(1)))
   177  	vec2.Close()
   178  	vec2 = vec.Clone(1, 3)
   179  	assert.Equal(t, 3, vec2.Length())
   180  	assert.Equal(t, "hh2", string(vec2.Get(0)))
   181  	assert.Equal(t, "hhh3", string(vec2.Get(1)))
   182  	assert.Equal(t, "hhhh4", string(vec2.Get(2)))
   183  	vec2.Close()
   184  	vec.Close()
   185  	assert.Equal(t, int64(0), opts.Allocator.CurrNB())
   186  }
   187  
   188  func TestVector6(t *testing.T) {
   189  	defer testutils.AfterTest(t)()
   190  	w := bytes.Buffer{}
   191  	for i := 0; i < 10; i++ {
   192  		v := int64(i)
   193  		vs := unsafe.Slice((*byte)(unsafe.Pointer(&v)), 8)
   194  		w.Write(vs)
   195  	}
   196  	buf := w.Bytes()
   197  	t.Logf("cap:%d,size:%d", cap(buf), len(buf))
   198  	bs := stl.NewBytesWithTypeSize(stl.Sizeof[int64]())
   199  	bs.SetStorageBuf(buf)
   200  	opts := Options{
   201  		Data: bs,
   202  	}
   203  	vec := NewVector[int64](opts)
   204  	t.Log(vec.String())
   205  	assert.Equal(t, 0, vec.Allocated())
   206  	vec.Update(3, int64(3333))
   207  	t.Log(vec.String())
   208  	slice := unsafe.Slice((*int64)(unsafe.Pointer(&buf[0])), vec.Length())
   209  	assert.Equal(t, int64(3333), slice[3])
   210  
   211  	vec.Update(4, int64(444))
   212  	assert.Equal(t, int64(444), slice[4])
   213  
   214  	vec.Append(int64(99))
   215  	assert.True(t, vec.Allocated() > 0)
   216  	t.Log(vec.String())
   217  
   218  	vec.Update(3, int64(4444))
   219  	assert.Equal(t, int64(3333), slice[3])
   220  }
   221  
   222  func TestVector7(t *testing.T) {
   223  	defer testutils.AfterTest(t)()
   224  	opts := withAllocator(Options{})
   225  	vec := NewVector[int16](opts)
   226  	vec.Append(int16(1))
   227  	vec.Append(int16(2))
   228  	vec.Append(int16(3))
   229  	d := vec.Data()
   230  	assert.Equal(t, len(d), 3*stl.Sizeof[int16]())
   231  	s := vec.Slice()
   232  	assert.Equal(t, 3, len(s))
   233  	vec.Close()
   234  
   235  	vec3 := NewVector[byte](opts)
   236  	vec3.AppendMany([]byte("world")...)
   237  	s2 := vec3.Slice()
   238  	assert.Equal(t, 5, len(s2))
   239  	d = vec3.Data()
   240  	assert.Equal(t, 5, len(d))
   241  	vec3.Close()
   242  	assert.Equal(t, int64(0), opts.Allocator.CurrNB())
   243  
   244  	vec2 := NewVector[[]byte](opts)
   245  	vec2.Append([]byte("h1"))
   246  	vec2.Append([]byte("hh2"))
   247  	vec2.Append([]byte("hhh3"))
   248  	vec2.Append([]byte("hhhh4"))
   249  	bs := vec2.Bytes()
   250  	t.Log(vec2.String())
   251  
   252  	allocated := opts.Allocator.CurrNB()
   253  
   254  	opt2 := withAllocator(Options{})
   255  	opt2.Data = bs
   256  
   257  	vec4 := NewVector[[]byte](opt2)
   258  	assert.Equal(t, vec2.Length(), vec4.Length())
   259  	assert.Equal(t, vec2.Get(0), vec4.Get(0))
   260  	assert.Equal(t, vec2.Get(1), vec4.Get(1))
   261  	assert.Equal(t, vec2.Get(2), vec4.Get(2))
   262  	assert.Equal(t, vec2.Get(3), vec4.Get(3))
   263  	assert.Equal(t, allocated, opts.Allocator.CurrNB())
   264  
   265  	vec2.Close()
   266  	assert.Equal(t, int64(0), opts.Allocator.CurrNB())
   267  }
   268  
   269  func TestVector8(t *testing.T) {
   270  	defer testutils.AfterTest(t)()
   271  	opts := withAllocator(Options{})
   272  	vec := NewVector[int32](opts)
   273  	vec.AppendMany(int32(1), int32(3), int32(9))
   274  	t.Log(vec.String())
   275  	assert.Equal(t, 3, vec.Length())
   276  
   277  	w := new(bytes.Buffer)
   278  	_, err := vec.WriteTo(w)
   279  	assert.NoError(t, err)
   280  
   281  	buf := w.Bytes()
   282  	vec2 := NewVector[int32](opts)
   283  
   284  	r := bytes.NewBuffer(buf)
   285  	_, err = vec2.ReadFrom(r)
   286  	assert.NoError(t, err)
   287  	t.Log(vec2.String())
   288  	vec.Close()
   289  	vec2.Close()
   290  	assert.Zero(t, opts.Allocator.CurrNB())
   291  }
   292  
   293  func TestVector9(t *testing.T) {
   294  	defer testutils.AfterTest(t)()
   295  	allocator := mpool.MustNewZero()
   296  	opts := Options{}
   297  	opts.Allocator = allocator
   298  	vec := NewVector[[]byte](opts)
   299  	vec.AppendMany([]byte("h1"), []byte("hh2"),
   300  		[]byte("hhh3"), []byte("hhhh4"))
   301  	vec.Delete(1)
   302  	assert.Equal(t, 3, vec.Length())
   303  	w := new(bytes.Buffer)
   304  	_, err := vec.WriteTo(w)
   305  	assert.NoError(t, err)
   306  
   307  	buf := w.Bytes()
   308  	r := bytes.NewBuffer(buf)
   309  	vec2 := NewVector[[]byte](opts)
   310  	_, err = vec2.ReadFrom(r)
   311  	assert.NoError(t, err)
   312  	t.Log(vec2.String())
   313  	assert.Equal(t, 3, vec2.Length())
   314  	assert.Equal(t, vec.Get(0), vec2.Get(0))
   315  	assert.Equal(t, vec.Get(1), vec2.Get(1))
   316  	assert.Equal(t, vec.Get(2), vec2.Get(2))
   317  	vec.Close()
   318  	vec2.Close()
   319  	assert.Zero(t, allocator.CurrNB())
   320  }
   321  
   322  func TestVector10(t *testing.T) {
   323  	defer testutils.AfterTest(t)()
   324  	opts := withAllocator(Options{})
   325  	vec := NewVector[[]byte](opts)
   326  	h1 := "h1"
   327  	h2 := "hh2"
   328  	h3 := "hhh3"
   329  	h4 := "hhhh4"
   330  	vec.Append([]byte(h1))
   331  	vec.Append([]byte(h2))
   332  	vec.Append([]byte(h3))
   333  	vec.Append([]byte(h4))
   334  
   335  	data := vec.Bytes()
   336  
   337  	vec2 := NewVector[[]byte](opts)
   338  	vec2.ReadBytes(data, true)
   339  	t.Log(vec2.String())
   340  	assert.Equal(t, vec.Length(), vec2.Length())
   341  	assert.Equal(t, vec.Capacity(), vec2.Capacity())
   342  	assert.Equal(t, vec.Get(0), vec2.Get(0))
   343  	assert.Equal(t, vec.Get(1), vec2.Get(1))
   344  	assert.Equal(t, vec.Get(2), vec2.Get(2))
   345  	assert.Equal(t, vec.Get(3), vec2.Get(3))
   346  	assert.Zero(t, vec2.Allocated())
   347  
   348  	vec3 := NewVector[[]byte](opts)
   349  	vec3.ReadBytes(data, false)
   350  	t.Log(vec3.String())
   351  	assert.Equal(t, vec.Allocated(), vec3.Allocated())
   352  	assert.Equal(t, vec.Length(), vec3.Length())
   353  	for i := 0; i < vec.Length(); i++ {
   354  		assert.Equal(t, vec.Get(i), vec3.Get(i))
   355  	}
   356  	vec3.Append([]byte("x1"))
   357  	assert.Equal(t, vec.Length()+1, vec3.Length())
   358  
   359  	vec.Close()
   360  	vec2.Close()
   361  	vec3.Close()
   362  	assert.Zero(t, opts.Allocator.CurrNB())
   363  }
   364  
   365  func TestVector11(t *testing.T) {
   366  	defer testutils.AfterTest(t)()
   367  	opts := withAllocator(Options{})
   368  	vec := NewVector[[]byte](opts)
   369  	h1 := "h1"
   370  	h2 := "hh2"
   371  	h3 := "hhh3"
   372  	h4 := "hhhh4"
   373  	vec.Append([]byte(h1))
   374  	vec.Append([]byte(h2))
   375  	vec.Append([]byte(h3))
   376  	vec.Append([]byte(h4))
   377  	usage := opts.Allocator.CurrNB()
   378  	allocted := vec.Allocated()
   379  	assert.Equal(t, int(usage), allocted)
   380  	assert.Equal(t, 4, vec.Length())
   381  	vec.Reset()
   382  	assert.Zero(t, vec.Length())
   383  	assert.Equal(t, usage, opts.Allocator.CurrNB())
   384  	assert.Equal(t, int(usage), vec.Allocated())
   385  
   386  	vec.Append([]byte("x1"))
   387  	assert.Equal(t, 1, vec.Length())
   388  	assert.Equal(t, "x1", string(vec.Get(0)))
   389  	t.Log(vec.String())
   390  	vec.Close()
   391  	assert.Zero(t, opts.Allocator.CurrNB())
   392  }
   393  
   394  func TestVector12(t *testing.T) {
   395  	defer testutils.AfterTest(t)()
   396  	opts := withAllocator(Options{})
   397  	vec := NewVector[[]byte](opts)
   398  	h1 := "h1"
   399  	h2 := "hh2"
   400  	h3 := "hhh3"
   401  	h4 := "hhhh4"
   402  	vec.Append([]byte(h1))
   403  	vec.Append([]byte(h2))
   404  	vec.Append([]byte(h3))
   405  	vec.Append([]byte(h4))
   406  
   407  	w := new(bytes.Buffer)
   408  	_, err := vec.WriteTo(w)
   409  	assert.NoError(t, err)
   410  	buf := w.Bytes()
   411  	vec2 := NewVector[[]byte](opts)
   412  	n, err := vec2.InitFromSharedBuf(buf)
   413  	assert.Equal(t, int(n), len(buf))
   414  	assert.NoError(t, err)
   415  	assert.Zero(t, vec2.Allocated())
   416  	for i := 0; i < vec.Length(); i++ {
   417  		assert.Equal(t, vec.Get(i), vec2.Get(i))
   418  	}
   419  
   420  	vec2.Close()
   421  	vec.Close()
   422  	assert.Zero(t, opts.Allocator.CurrNB())
   423  }
   424  
   425  func TestStrVector1(t *testing.T) {
   426  	defer testutils.AfterTest(t)()
   427  	opts := withAllocator(Options{})
   428  	vec := NewStrVector[[]byte](opts)
   429  	h1 := "h1"
   430  	h2 := "hh2"
   431  	h3 := "hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh3"
   432  	h4 := "hhhh4"
   433  	h5 := "hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh5"
   434  	h6 := "hhhhhh6"
   435  	vec.Append([]byte(h1))
   436  	vec.Append([]byte(h2))
   437  	vec.Append([]byte(h3))
   438  	vec.Append([]byte(h4))
   439  
   440  	t.Log(vec.String())
   441  	assert.Equal(t, vec.area.Length(), len(h3))
   442  	assert.Equal(t, 4, vec.Length())
   443  
   444  	min, max := vec.getAreaRange(0, 2)
   445  	assert.Equal(t, 0, min)
   446  	assert.Equal(t, 0, max)
   447  
   448  	min, max = vec.getAreaRange(1, 2)
   449  	assert.Equal(t, 0, min)
   450  	assert.Equal(t, len(h3), max)
   451  	assert.Equal(t, []byte(h3), vec.area.Slice()[min:max])
   452  
   453  	min, max = vec.getAreaRange(1, 3)
   454  	assert.Equal(t, 0, min)
   455  	assert.Equal(t, len(h3), max)
   456  
   457  	vec.Append([]byte(h5))
   458  	vec.Append([]byte(h6))
   459  
   460  	assert.Equal(t, 6, vec.Length())
   461  	assert.Equal(t, vec.area.Length(), len(h3)+len(h5))
   462  
   463  	min, max = vec.getAreaRange(3, 2)
   464  	assert.Equal(t, len(h3), min)
   465  	assert.Equal(t, len(h3)+len(h5), max)
   466  	assert.Equal(t, []byte(h5), vec.area.Slice()[min:max])
   467  	t.Logf("%s", vec.area.Slice()[min:max])
   468  
   469  	w := new(bytes.Buffer)
   470  	_, err := vec.WriteTo(w)
   471  	assert.NoError(t, err)
   472  	buf := w.Bytes()
   473  	vec2 := NewStrVector[[]byte](opts)
   474  	n, err := vec2.InitFromSharedBuf(buf)
   475  	assert.Equal(t, int(n), len(buf))
   476  	assert.NoError(t, err)
   477  	assert.Zero(t, vec2.Allocated())
   478  	t.Log(vec2.String())
   479  	for i := 0; i < vec.Length(); i++ {
   480  		assert.Equal(t, vec.Get(i), vec2.Get(i))
   481  	}
   482  
   483  	vec2.Close()
   484  	vec.Close()
   485  	assert.Zero(t, opts.Allocator.CurrNB())
   486  }
   487  
   488  func TestStrVector2(t *testing.T) {
   489  	defer testutils.AfterTest(t)()
   490  	opts := withAllocator(Options{})
   491  	vec := NewStrVector[[]byte](opts)
   492  	h1 := "h1"
   493  	h2 := "hh2"
   494  	h3 := "hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh3"
   495  	h4 := "hhhh4"
   496  	vec.Append([]byte(h1))
   497  	vec.Append([]byte(h2))
   498  	vec.Append([]byte(h3))
   499  	vec.Append([]byte(h4))
   500  
   501  	data := vec.Bytes()
   502  
   503  	vec3 := NewStrVector[[]byte](opts)
   504  	vec3.ReadBytes(data, true)
   505  	assert.Zero(t, vec3.Allocated())
   506  	for i := 0; i < vec.Length(); i++ {
   507  		assert.Equal(t, vec.Get(i), vec3.Get(i))
   508  	}
   509  
   510  	vec4 := NewStrVector[[]byte](opts)
   511  	vec4.ReadBytes(data, false)
   512  	assert.NotZero(t, vec4.Allocated())
   513  	for i := 0; i < vec.Length(); i++ {
   514  		assert.Equal(t, vec.Get(i), vec4.Get(i))
   515  	}
   516  	t.Log(vec4.String())
   517  
   518  	vec4.Close()
   519  	vec3.Close()
   520  	vec.Close()
   521  	assert.Zero(t, opts.Allocator.CurrNB())
   522  }
   523  
   524  func TestStrVector3(t *testing.T) {
   525  	defer testutils.AfterTest(t)()
   526  	opts := withAllocator(Options{})
   527  	vec := NewStrVector[[]byte](opts)
   528  	h1 := "h1"
   529  	h2 := "hh2"
   530  	h3 := "hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh3"
   531  	h4 := "hhhh4"
   532  	h5 := "hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhxy5"
   533  	h6 := "hhhhhh6"
   534  	vec.Append([]byte(h1))
   535  	vec.Append([]byte(h2))
   536  	vec.Append([]byte(h3))
   537  	vec.Append([]byte(h4))
   538  	vec.Append([]byte(h5))
   539  	vec.Append([]byte(h6))
   540  
   541  	assert.Equal(t, 6, vec.Length())
   542  	vec.BatchDeleteInts(1, 2)
   543  	assert.Equal(t, 4, vec.Length())
   544  	assert.Equal(t, h1, string(vec.Get(0)))
   545  	assert.Equal(t, h4, string(vec.Get(1)))
   546  	assert.Equal(t, h5, string(vec.Get(2)))
   547  	assert.Equal(t, h6, string(vec.Get(3)))
   548  
   549  	vec.Update(1, []byte(h3))
   550  	for i := 0; i < vec.Length(); i++ {
   551  		t.Logf("%s", vec.Get(i))
   552  	}
   553  
   554  	assert.Equal(t, 4, vec.Length())
   555  	assert.Equal(t, h1, string(vec.Get(0)))
   556  	assert.Equal(t, h3, string(vec.Get(1)))
   557  	assert.Equal(t, h5, string(vec.Get(2)))
   558  	assert.Equal(t, h6, string(vec.Get(3)))
   559  
   560  	vec.Update(1, []byte(h2))
   561  	for i := 0; i < vec.Length(); i++ {
   562  		t.Logf("%s", vec.Get(i))
   563  	}
   564  	assert.Equal(t, 4, vec.Length())
   565  	assert.Equal(t, h1, string(vec.Get(0)))
   566  	assert.Equal(t, h2, string(vec.Get(1)))
   567  	assert.Equal(t, h5, string(vec.Get(2)))
   568  	assert.Equal(t, h6, string(vec.Get(3)))
   569  
   570  	vec.Update(2, []byte(h3))
   571  	for i := 0; i < vec.Length(); i++ {
   572  		t.Logf("%s", vec.Get(i))
   573  	}
   574  	assert.Equal(t, 4, vec.Length())
   575  	assert.Equal(t, h1, string(vec.Get(0)))
   576  	assert.Equal(t, h2, string(vec.Get(1)))
   577  	assert.Equal(t, h3, string(vec.Get(2)))
   578  	assert.Equal(t, h6, string(vec.Get(3)))
   579  
   580  	vec.Update(2, []byte(h5))
   581  	for i := 0; i < vec.Length(); i++ {
   582  		t.Logf("%s", vec.Get(i))
   583  	}
   584  	assert.Equal(t, 4, vec.Length())
   585  	assert.Equal(t, h1, string(vec.Get(0)))
   586  	assert.Equal(t, h2, string(vec.Get(1)))
   587  	assert.Equal(t, h5, string(vec.Get(2)))
   588  	assert.Equal(t, h6, string(vec.Get(3)))
   589  
   590  	vec.Close()
   591  	assert.Zero(t, opts.Allocator.CurrNB())
   592  }
   593  
   594  func getBytes(i int) []byte {
   595  	if i%2 == 0 {
   596  		return []byte("hhhhhhhhhhhhhhhhhxxxxxxxxxe")
   597  	}
   598  	return []byte("yyyk")
   599  }
   600  
   601  func TestStrVector4(t *testing.T) {
   602  	defer testutils.AfterTest(t)()
   603  	opts := withAllocator(Options{})
   604  	vec := NewStrVector[[]byte](opts)
   605  	for i := 0; i < 10000; i++ {
   606  		vec.Append(getBytes(i))
   607  	}
   608  	now := time.Now()
   609  
   610  	i := 0
   611  	vec.Update(i, getBytes(1))
   612  	vec.Update(i, getBytes(0))
   613  	vec.Update(i, getBytes(1))
   614  	vec.Update(i, getBytes(0))
   615  	vec.Delete(i)
   616  
   617  	t.Log(time.Since(now))
   618  	vec.Close()
   619  	assert.Zero(t, opts.Allocator.CurrNB())
   620  }
   621  
   622  func TestStrVector5(t *testing.T) {
   623  	strs := [][]byte{}
   624  	for i := 1; i < 10; i++ {
   625  		str := strings.Repeat(fmt.Sprintf("%d", i), i*4)
   626  		strs = append(strs, []byte(str))
   627  	}
   628  	opts := withAllocator(Options{})
   629  	vec := NewStrVector[[]byte](opts)
   630  	defer vec.Close()
   631  	size := 40000
   632  	for cnt := 0; cnt < size; cnt++ {
   633  		p := cnt % len(strs)
   634  		vec.Append(strs[p])
   635  	}
   636  	deleteCnt := 200
   637  	step := size / deleteCnt
   638  	deletes := []int{}
   639  	for i := 0; i < size; i += step {
   640  		deletes = append(deletes, i)
   641  	}
   642  	now := time.Now()
   643  	// for i := len(deletes) - 1; i >= 0; i-- {
   644  	// 	vec.Delete(deletes[i])
   645  	// }
   646  	vec.BatchDeleteInts(deletes...)
   647  	t.Log(time.Since(now))
   648  	// t.Log(vec.String())
   649  
   650  }