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 }