github.com/matrixorigin/matrixone@v0.7.0/pkg/common/hashmap/strhashmap_test.go (about)

     1  // Copyright 2021 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 hashmap
    16  
    17  import (
    18  	"math/rand"
    19  	"strconv"
    20  	"testing"
    21  
    22  	"github.com/matrixorigin/matrixone/pkg/common/moerr"
    23  	"github.com/matrixorigin/matrixone/pkg/common/mpool"
    24  	"github.com/matrixorigin/matrixone/pkg/container/nulls"
    25  	"github.com/matrixorigin/matrixone/pkg/container/types"
    26  	"github.com/matrixorigin/matrixone/pkg/container/vector"
    27  	"github.com/stretchr/testify/require"
    28  )
    29  
    30  const (
    31  	Rows = 10
    32  )
    33  
    34  func TestInsert(t *testing.T) {
    35  	m := mpool.MustNewZero()
    36  	mp, err := NewStrMap(false, 0, 0, m)
    37  	require.NoError(t, err)
    38  	ts := []types.Type{
    39  		types.New(types.T_int8, 0, 0, 0),
    40  		types.New(types.T_int16, 0, 0, 0),
    41  		types.New(types.T_int32, 0, 0, 0),
    42  		types.New(types.T_int64, 0, 0, 0),
    43  		types.New(types.T_decimal64, 0, 0, 0),
    44  		types.New(types.T_char, 0, 0, 0),
    45  	}
    46  	vecs := newVectors(ts, false, Rows, m)
    47  	for i := 0; i < Rows; i++ {
    48  		ok, err := mp.Insert(vecs, i)
    49  		require.NoError(t, err)
    50  		require.Equal(t, true, ok)
    51  	}
    52  	for _, vec := range vecs {
    53  		vec.Free(m)
    54  	}
    55  	mp.Free()
    56  	require.Equal(t, int64(0), m.Stats().NumCurrBytes.Load())
    57  }
    58  
    59  func TestInsertValue(t *testing.T) {
    60  	m := mpool.MustNewZero()
    61  	mp, err := NewStrMap(false, 0, 0, m)
    62  	require.NoError(t, err)
    63  	ok, err := mp.InsertValue(int8(0))
    64  	require.NoError(t, err)
    65  	require.Equal(t, true, ok)
    66  	ok, err = mp.InsertValue(int16(0))
    67  	require.NoError(t, err)
    68  	require.Equal(t, false, ok)
    69  	ok, err = mp.InsertValue(int32(0))
    70  	require.NoError(t, err)
    71  	require.Equal(t, false, ok)
    72  	ok, err = mp.InsertValue(int64(0))
    73  	require.NoError(t, err)
    74  	require.Equal(t, false, ok)
    75  	ok, err = mp.InsertValue(uint8(0))
    76  	require.NoError(t, err)
    77  	require.Equal(t, false, ok)
    78  	ok, err = mp.InsertValue(uint16(0))
    79  	require.NoError(t, err)
    80  	require.Equal(t, false, ok)
    81  	ok, err = mp.InsertValue(uint32(0))
    82  	require.NoError(t, err)
    83  	require.Equal(t, false, ok)
    84  	ok, err = mp.InsertValue(uint64(0))
    85  	require.NoError(t, err)
    86  	require.Equal(t, false, ok)
    87  	ok, err = mp.InsertValue([]byte{})
    88  	require.NoError(t, err)
    89  	require.Equal(t, false, ok)
    90  	ok, err = mp.InsertValue(types.Date(0))
    91  	require.NoError(t, err)
    92  	require.Equal(t, false, ok)
    93  	ok, err = mp.InsertValue(types.Datetime(0))
    94  	require.NoError(t, err)
    95  	require.Equal(t, false, ok)
    96  	ok, err = mp.InsertValue(types.Timestamp(0))
    97  	require.NoError(t, err)
    98  	require.Equal(t, false, ok)
    99  	ok, err = mp.InsertValue(types.Decimal64{})
   100  	require.NoError(t, err)
   101  	require.Equal(t, false, ok)
   102  	ok, err = mp.InsertValue(types.Decimal128{})
   103  	require.NoError(t, err)
   104  	require.Equal(t, false, ok)
   105  	mp.Free()
   106  	require.Equal(t, int64(0), m.Stats().NumCurrBytes.Load())
   107  }
   108  
   109  func TestIterator(t *testing.T) {
   110  	{
   111  		m := mpool.MustNewZero()
   112  		mp, err := NewStrMap(false, 0, 0, m)
   113  		require.NoError(t, err)
   114  		ts := []types.Type{
   115  			types.New(types.T_int8, 0, 0, 0),
   116  			types.New(types.T_int16, 0, 0, 0),
   117  			types.New(types.T_int32, 0, 0, 0),
   118  			types.New(types.T_int64, 0, 0, 0),
   119  			types.New(types.T_decimal64, 0, 0, 0),
   120  			types.New(types.T_char, 0, 0, 0),
   121  		}
   122  		vecs := newVectors(ts, false, Rows, m)
   123  		itr := mp.NewIterator()
   124  		vs, _, err := itr.Insert(0, Rows, vecs)
   125  		require.NoError(t, err)
   126  		require.Equal(t, []uint64{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}, vs[:Rows])
   127  		vs, _ = itr.Find(0, Rows, vecs, nil)
   128  		require.Equal(t, []uint64{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}, vs[:Rows])
   129  		for _, vec := range vecs {
   130  			vec.Free(m)
   131  		}
   132  		mp.Free()
   133  		require.Equal(t, int64(0), m.Stats().NumCurrBytes.Load())
   134  	}
   135  	{
   136  		m := mpool.MustNewZero()
   137  		mp, err := NewStrMap(true, 0, 0, m)
   138  		require.NoError(t, err)
   139  		ts := []types.Type{
   140  			types.New(types.T_int8, 0, 0, 0),
   141  			types.New(types.T_int16, 0, 0, 0),
   142  			types.New(types.T_int32, 0, 0, 0),
   143  			types.New(types.T_int64, 0, 0, 0),
   144  			types.New(types.T_decimal64, 0, 0, 0),
   145  			types.New(types.T_char, 0, 0, 0),
   146  		}
   147  		vecs := newVectors(ts, false, Rows, m)
   148  		itr := mp.NewIterator()
   149  		vs, _, err := itr.Insert(0, Rows, vecs)
   150  		require.NoError(t, err)
   151  		require.Equal(t, []uint64{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}, vs[:Rows])
   152  		vs, _ = itr.Find(0, Rows, vecs, nil)
   153  		require.Equal(t, []uint64{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}, vs[:Rows])
   154  		for _, vec := range vecs {
   155  			vec.Free(m)
   156  		}
   157  		mp.Free()
   158  		require.Equal(t, int64(0), m.Stats().NumCurrBytes.Load())
   159  	}
   160  	{
   161  		m := mpool.MustNewZero()
   162  		mp, err := NewStrMap(true, 0, 0, m)
   163  		require.NoError(t, err)
   164  		ts := []types.Type{
   165  			types.New(types.T_int8, 0, 0, 0),
   166  			types.New(types.T_int16, 0, 0, 0),
   167  			types.New(types.T_int32, 0, 0, 0),
   168  			types.New(types.T_int64, 0, 0, 0),
   169  			types.New(types.T_decimal64, 0, 0, 0),
   170  			types.New(types.T_char, 0, 0, 0),
   171  		}
   172  		vecs := newVectorsWithNull(ts, false, Rows, m)
   173  		itr := mp.NewIterator()
   174  		vs, _, err := itr.Insert(0, Rows, vecs)
   175  		require.NoError(t, err)
   176  		require.Equal(t, []uint64{1, 2, 1, 3, 1, 4, 1, 5, 1, 6}, vs[:Rows])
   177  		vs, _ = itr.Find(0, Rows, vecs, nil)
   178  		require.Equal(t, []uint64{1, 2, 1, 3, 1, 4, 1, 5, 1, 6}, vs[:Rows])
   179  		for _, vec := range vecs {
   180  			vec.Free(m)
   181  		}
   182  		mp.Free()
   183  		require.Equal(t, int64(0), m.Stats().NumCurrBytes.Load())
   184  	}
   185  }
   186  
   187  func newVectors(ts []types.Type, random bool, n int, m *mpool.MPool) []*vector.Vector {
   188  	vecs := make([]*vector.Vector, len(ts))
   189  	for i := range vecs {
   190  		vecs[i] = newVector(n, ts[i], m, random, nil)
   191  		nulls.New(vecs[i].Nsp, n)
   192  	}
   193  	return vecs
   194  }
   195  
   196  func newVectorsWithNull(ts []types.Type, random bool, n int, m *mpool.MPool) []*vector.Vector {
   197  	vecs := make([]*vector.Vector, len(ts))
   198  	for i := range vecs {
   199  		vecs[i] = newVector(n, ts[i], m, random, nil)
   200  		nulls.New(vecs[i].Nsp, n)
   201  		nsp := vecs[i].GetNulls()
   202  		for j := 0; j < n; j++ {
   203  			if j%2 == 0 {
   204  				nsp.Set(uint64(j))
   205  			}
   206  		}
   207  	}
   208  	return vecs
   209  }
   210  
   211  func newVector(n int, typ types.Type, m *mpool.MPool, random bool, Values interface{}) *vector.Vector {
   212  	switch typ.Oid {
   213  	case types.T_int8:
   214  		if vs, ok := Values.([]int8); ok {
   215  			return newInt8Vector(n, typ, m, random, vs)
   216  		}
   217  		return newInt8Vector(n, typ, m, random, nil)
   218  	case types.T_int16:
   219  		if vs, ok := Values.([]int16); ok {
   220  			return newInt16Vector(n, typ, m, random, vs)
   221  		}
   222  		return newInt16Vector(n, typ, m, random, nil)
   223  	case types.T_int32:
   224  		if vs, ok := Values.([]int32); ok {
   225  			return newInt32Vector(n, typ, m, random, vs)
   226  		}
   227  		return newInt32Vector(n, typ, m, random, nil)
   228  	case types.T_int64:
   229  		if vs, ok := Values.([]int64); ok {
   230  			return newInt64Vector(n, typ, m, random, vs)
   231  		}
   232  		return newInt64Vector(n, typ, m, random, nil)
   233  	case types.T_uint32:
   234  		if vs, ok := Values.([]uint32); ok {
   235  			return newUInt32Vector(n, typ, m, random, vs)
   236  		}
   237  		return newUInt32Vector(n, typ, m, random, nil)
   238  	case types.T_decimal64:
   239  		if vs, ok := Values.([]types.Decimal64); ok {
   240  			return newDecimal64Vector(n, typ, m, random, vs)
   241  		}
   242  		return newDecimal64Vector(n, typ, m, random, nil)
   243  	case types.T_decimal128:
   244  		if vs, ok := Values.([]types.Decimal128); ok {
   245  			return newDecimal128Vector(n, typ, m, random, vs)
   246  		}
   247  		return newDecimal128Vector(n, typ, m, random, nil)
   248  	case types.T_char, types.T_varchar:
   249  		if vs, ok := Values.([]string); ok {
   250  			return newStringVector(n, typ, m, random, vs)
   251  		}
   252  		return newStringVector(n, typ, m, random, nil)
   253  	default:
   254  		panic(moerr.NewInternalErrorNoCtx("unsupport vector's type '%v", typ))
   255  	}
   256  }
   257  
   258  func newInt8Vector(n int, typ types.Type, m *mpool.MPool, random bool, vs []int8) *vector.Vector {
   259  	vec := vector.New(typ)
   260  	if vs != nil {
   261  		for i := range vs {
   262  			if err := vec.Append(vs[i], false, m); err != nil {
   263  				vec.Free(m)
   264  				return nil
   265  			}
   266  		}
   267  		return vec
   268  	}
   269  	for i := 0; i < n; i++ {
   270  		v := i
   271  		if random {
   272  			v = rand.Int()
   273  		}
   274  		if err := vec.Append(int8(v), false, m); err != nil {
   275  			vec.Free(m)
   276  			return nil
   277  		}
   278  	}
   279  	return vec
   280  }
   281  
   282  func newInt16Vector(n int, typ types.Type, m *mpool.MPool, random bool, vs []int16) *vector.Vector {
   283  	vec := vector.New(typ)
   284  	if vs != nil {
   285  		for i := range vs {
   286  			if err := vec.Append(vs[i], false, m); err != nil {
   287  				vec.Free(m)
   288  				return nil
   289  			}
   290  		}
   291  		return vec
   292  	}
   293  	for i := 0; i < n; i++ {
   294  		v := i
   295  		if random {
   296  			v = rand.Int()
   297  		}
   298  		if err := vec.Append(int16(v), false, m); err != nil {
   299  			vec.Free(m)
   300  			return nil
   301  		}
   302  	}
   303  	return vec
   304  }
   305  
   306  func newInt32Vector(n int, typ types.Type, m *mpool.MPool, random bool, vs []int32) *vector.Vector {
   307  	vec := vector.New(typ)
   308  	if vs != nil {
   309  		for i := range vs {
   310  			if err := vec.Append(vs[i], false, m); err != nil {
   311  				vec.Free(m)
   312  				return nil
   313  			}
   314  		}
   315  		return vec
   316  	}
   317  	for i := 0; i < n; i++ {
   318  		v := i
   319  		if random {
   320  			v = rand.Int()
   321  		}
   322  		if err := vec.Append(int32(v), false, m); err != nil {
   323  			vec.Free(m)
   324  			return nil
   325  		}
   326  	}
   327  	return vec
   328  }
   329  
   330  func newInt64Vector(n int, typ types.Type, m *mpool.MPool, random bool, vs []int64) *vector.Vector {
   331  	vec := vector.New(typ)
   332  	if vs != nil {
   333  		for i := range vs {
   334  			if err := vec.Append(vs[i], false, m); err != nil {
   335  				vec.Free(m)
   336  				return nil
   337  			}
   338  		}
   339  		return vec
   340  	}
   341  	for i := 0; i < n; i++ {
   342  		v := i
   343  		if random {
   344  			v = rand.Int()
   345  		}
   346  		if err := vec.Append(int64(v), false, m); err != nil {
   347  			vec.Free(m)
   348  			return nil
   349  		}
   350  	}
   351  	return vec
   352  }
   353  
   354  func newUInt32Vector(n int, typ types.Type, m *mpool.MPool, random bool, vs []uint32) *vector.Vector {
   355  	vec := vector.New(typ)
   356  	if vs != nil {
   357  		for i := range vs {
   358  			if err := vec.Append(vs[i], false, m); err != nil {
   359  				vec.Free(m)
   360  				return nil
   361  			}
   362  		}
   363  		return vec
   364  	}
   365  	for i := 0; i < n; i++ {
   366  		v := i
   367  		if random {
   368  			v = rand.Int()
   369  		}
   370  		if err := vec.Append(uint32(v), false, m); err != nil {
   371  			vec.Free(m)
   372  			return nil
   373  		}
   374  	}
   375  	return vec
   376  }
   377  
   378  func newDecimal64Vector(n int, typ types.Type, m *mpool.MPool, random bool, vs []types.Decimal64) *vector.Vector {
   379  	vec := vector.New(typ)
   380  	if vs != nil {
   381  		for i := range vs {
   382  			if err := vec.Append(vs[i], false, m); err != nil {
   383  				vec.Free(m)
   384  				return nil
   385  			}
   386  		}
   387  		return vec
   388  	}
   389  	for i := 0; i < n; i++ {
   390  		v := i
   391  		if random {
   392  			v = rand.Int()
   393  		}
   394  		d, _ := types.InitDecimal64(int64(v), 64, 0)
   395  		if err := vec.Append(d, false, m); err != nil {
   396  
   397  			vec.Free(m)
   398  			return nil
   399  		}
   400  	}
   401  	return vec
   402  }
   403  
   404  func newDecimal128Vector(n int, typ types.Type, m *mpool.MPool, random bool, vs []types.Decimal128) *vector.Vector {
   405  	vec := vector.New(typ)
   406  	if vs != nil {
   407  		for i := range vs {
   408  			if err := vec.Append(vs[i], false, m); err != nil {
   409  				vec.Free(m)
   410  				return nil
   411  			}
   412  		}
   413  		return vec
   414  	}
   415  	for i := 0; i < n; i++ {
   416  		v := i
   417  		if random {
   418  			v = rand.Int()
   419  		}
   420  		d, _ := types.InitDecimal128(int64(v), 64, 0)
   421  		if err := vec.Append(d, false, m); err != nil {
   422  			vec.Free(m)
   423  			return nil
   424  		}
   425  	}
   426  	return vec
   427  }
   428  
   429  func newStringVector(n int, typ types.Type, m *mpool.MPool, random bool, vs []string) *vector.Vector {
   430  	vec := vector.New(typ)
   431  	if vs != nil {
   432  		for i := range vs {
   433  			if err := vec.Append([]byte(vs[i]), false, m); err != nil {
   434  				vec.Free(m)
   435  				return nil
   436  			}
   437  		}
   438  		return vec
   439  	}
   440  	for i := 0; i < n; i++ {
   441  		v := i
   442  		if random {
   443  			v = rand.Int()
   444  		}
   445  		if err := vec.Append([]byte(strconv.Itoa(v)), false, m); err != nil {
   446  			vec.Free(m)
   447  			return nil
   448  		}
   449  	}
   450  	return vec
   451  }