github.com/matrixorigin/matrixone@v0.7.0/pkg/container/vector/vector_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 vector 16 17 import ( 18 "testing" 19 20 "github.com/matrixorigin/matrixone/pkg/common/mpool" 21 "github.com/matrixorigin/matrixone/pkg/container/nulls" 22 "github.com/matrixorigin/matrixone/pkg/container/types" 23 "github.com/stretchr/testify/require" 24 ) 25 26 var testMp = mpool.MustNewZero() 27 28 func TestReset(t *testing.T) { 29 v0 := New(types.Type{Oid: types.T(types.T_varchar)}) 30 Reset(v0) 31 require.Equal(t, 0, len(v0.data)) 32 } 33 34 func TestClean(t *testing.T) { 35 v0 := New(types.Type{Oid: types.T(types.T_int8)}) 36 AppendFixed(v0, []int8{1, 2, 3}, testMp) 37 Clean(v0, testMp) 38 require.Equal(t, 0, len(v0.data)) 39 } 40 41 func TestSetCol(t *testing.T) { 42 v0 := New(types.Type{Oid: types.T(types.T_int8)}) 43 SetCol(v0, []int8{1, 2, 3}) 44 require.Equal(t, v0.Col, []int8{1, 2, 3}) 45 } 46 47 func TestLength(t *testing.T) { 48 v0 := New(types.Type{Oid: types.T(types.T_int8)}) 49 v0.Col = []int8{1, 2, 3, 4, 5} 50 require.Equal(t, 5, Length(v0)) 51 v1 := New(types.Type{Oid: types.T(types.T_char)}) 52 va1, _, _ := types.BuildVarlena([]byte("foo"), nil, testMp) 53 va2, _, _ := types.BuildVarlena([]byte("bar"), nil, testMp) 54 v1.Col = []types.Varlena{va1, va2} 55 require.Equal(t, 2, Length(v1)) 56 } 57 58 func setLenTest[T any](t *testing.T, tt types.T, mp *mpool.MPool, arg []T) { 59 v0 := New(types.Type{Oid: types.T(tt)}) 60 v0.Col = arg 61 FillVectorData[T](v0, mp) 62 SetLength(v0, 3) 63 require.Equal(t, 3, len(v0.Col.([]T))) 64 } 65 66 func TestSetLength(t *testing.T) { 67 mp := mpool.MustNewZero() 68 setLenTest(t, types.T_int8, mp, []int8{1, 2, 3, 4, 5, 6, 7, 8}) 69 setLenTest(t, types.T_int16, mp, []int16{1, 2, 3, 4, 5, 6, 7, 8}) 70 setLenTest(t, types.T_int32, mp, []int32{1, 2, 3, 4, 5, 6, 7, 8}) 71 setLenTest(t, types.T_int64, mp, []int64{1, 2, 3, 4, 5, 6, 7, 8}) 72 73 setLenTest(t, types.T_uint8, mp, []uint8{1, 2, 3, 4, 5, 6, 7, 8}) 74 setLenTest(t, types.T_uint16, mp, []uint16{1, 2, 3, 4, 5, 6, 7, 8}) 75 setLenTest(t, types.T_uint32, mp, []uint32{1, 2, 3, 4, 5, 6, 7, 8}) 76 setLenTest(t, types.T_uint64, mp, []uint64{1, 2, 3, 4, 5, 6, 7, 8}) 77 78 setLenTest(t, types.T_float32, mp, []float32{1, 2, 3, 4, 5, 6, 7, 8}) 79 setLenTest(t, types.T_float64, mp, []float64{1, 2, 3, 4, 5, 6, 7, 8}) 80 81 setLenTest(t, types.T_date, mp, []types.Date{1, 2, 3, 4, 5, 6, 7, 8}) 82 setLenTest(t, types.T_datetime, mp, []types.Datetime{1, 2, 3, 4, 5, 6, 7, 8}) 83 } 84 85 func mustMakeSliceArgsAsBytes[T any](mp *mpool.MPool, args ...T) []byte { 86 ret, err := mpool.MakeSliceArgs(mp, args...) 87 if err != nil { 88 panic(err) 89 } 90 return types.EncodeSlice(ret) 91 } 92 93 func dupTest[T any](t *testing.T, tt types.T, mp *mpool.MPool, args ...T) { 94 v0 := New(types.Type{Oid: types.T(tt)}) 95 v0.data = mustMakeSliceArgsAsBytes(mp, args...) 96 v0.Col = types.DecodeSlice[T](v0.data) 97 v0Duplicate, _ := Dup(v0, mp) 98 require.Equal(t, v0, v0Duplicate) 99 } 100 101 func TestDup(t *testing.T) { 102 mp := mpool.MustNewZero() 103 dupTest[int8](t, types.T_int8, mp, 1, 2, 3, 4) 104 dupTest[int16](t, types.T_int16, mp, 1, 2, 3, 4) 105 dupTest[int32](t, types.T_int32, mp, 1, 2, 3, 4) 106 dupTest[int64](t, types.T_int64, mp, 1, 2, 3, 4) 107 dupTest[uint8](t, types.T_uint8, mp, 1, 2, 3, 4) 108 dupTest[uint16](t, types.T_uint16, mp, 1, 2, 3, 4) 109 dupTest[uint32](t, types.T_uint32, mp, 1, 2, 3, 4) 110 dupTest[uint64](t, types.T_uint64, mp, 1, 2, 3, 4) 111 dupTest[types.Date](t, types.T_date, mp, 1, 2, 3, 4) 112 dupTest[types.Datetime](t, types.T_datetime, mp, 1, 2, 3, 4) 113 114 v10 := New(types.Type{Oid: types.T(types.T_char)}) 115 AppendBytes(v10, [][]byte{ 116 []byte("hello"), 117 []byte("Gut"), 118 []byte("knoichiwa"), 119 []byte("nihao"), 120 }, mp) 121 v10Duplicate, err := Dup(v10, mp) 122 require.Equal(t, err, nil) 123 require.Equal(t, v10.data, v10Duplicate.data) 124 require.Equal(t, v10.area, v10Duplicate.area) 125 require.Equal(t, MustStrCols(v10), MustStrCols(v10Duplicate)) 126 require.Equal(t, v10.GetString(0), v10Duplicate.GetString(0)) 127 require.Equal(t, v10.GetString(1), v10Duplicate.GetString(1)) 128 require.Equal(t, v10.GetString(2), v10Duplicate.GetString(2)) 129 require.Equal(t, v10.GetString(3), v10Duplicate.GetString(3)) 130 } 131 132 func TestWindow(t *testing.T) { 133 mp := mpool.MustNewZero() 134 v0 := New(types.Type{Oid: types.T(types.T_int8)}) 135 v0.data = mustMakeSliceArgsAsBytes[int8](mp, 1, 2, 3, 4, 5, 6, 7, 8) 136 v0.Col = types.DecodeSlice[int8](v0.data) 137 v0Window := New(types.Type{Oid: types.T(types.T_int8)}) 138 start, end := 1, 3 139 v0Window = Window(v0, start, end, v0Window) 140 require.Equal(t, v0.Col.([]int8)[start:end], v0Window.Col) 141 142 v1 := New(types.Type{Oid: types.T(types.T_int16)}) 143 v1.data = mustMakeSliceArgsAsBytes[int16](mp, 1, 2, 3, 4, 5, 6, 7, 8) 144 v1.Col = types.DecodeSlice[int16](v1.data) 145 v1Window := New(types.Type{Oid: types.T(types.T_int16)}) 146 v1Window = Window(v1, start, end, v1Window) 147 require.Equal(t, v1.Col.([]int16)[start:end], v1Window.Col) 148 149 v2 := New(types.Type{Oid: types.T(types.T_int32)}) 150 v2.data = mustMakeSliceArgsAsBytes[int32](mp, 1, 2, 3, 4, 5, 6, 7, 8) 151 v2.Col = types.DecodeSlice[int32](v2.data) 152 v2Window := New(types.Type{Oid: types.T(types.T_int32)}) 153 v2Window = Window(v2, start, end, v2Window) 154 require.Equal(t, v2.Col.([]int32)[start:end], v2Window.Col) 155 156 v3 := New(types.Type{Oid: types.T(types.T_int64)}) 157 v3.data = mustMakeSliceArgsAsBytes[int64](mp, 1, 2, 3, 4, 5, 6, 7, 8) 158 v3.Col = types.DecodeSlice[int64](v3.data) 159 v3Window := New(types.Type{Oid: types.T(types.T_int64)}) 160 v3Window = Window(v3, start, end, v3Window) 161 require.Equal(t, v3.Col.([]int64)[start:end], v3Window.Col) 162 163 v4 := New(types.Type{Oid: types.T(types.T_uint8)}) 164 v4.data = mustMakeSliceArgsAsBytes[uint8](mp, 1, 2, 3, 4, 5, 6, 7, 8) 165 v4.Col = types.DecodeSlice[uint8](v4.data) 166 v4Window := New(types.Type{Oid: types.T(types.T_uint8)}) 167 v4Window = Window(v4, start, end, v4Window) 168 require.Equal(t, v4.Col.([]uint8)[start:end], v4Window.Col) 169 170 v5 := New(types.Type{Oid: types.T(types.T_uint16)}) 171 v5.data = mustMakeSliceArgsAsBytes[uint16](mp, 1, 2, 3, 4, 5, 6, 7, 8) 172 v5.Col = types.DecodeSlice[uint16](v5.data) 173 v5Window := New(types.Type{Oid: types.T(types.T_uint16)}) 174 v5Window = Window(v5, start, end, v5Window) 175 require.Equal(t, v5.Col.([]uint16)[start:end], v5Window.Col) 176 177 v6 := New(types.Type{Oid: types.T(types.T_uint32)}) 178 v6.data = mustMakeSliceArgsAsBytes[uint32](mp, 1, 2, 3, 4, 5, 6, 7, 8) 179 v6.Col = types.DecodeSlice[uint32](v6.data) 180 v6Window := New(types.Type{Oid: types.T(types.T_uint32)}) 181 v6Window = Window(v6, start, end, v6Window) 182 require.Equal(t, v6.Col.([]uint32)[start:end], v6Window.Col) 183 184 v7 := New(types.Type{Oid: types.T(types.T_uint64)}) 185 v7.data = mustMakeSliceArgsAsBytes[uint64](mp, 1, 2, 3, 4, 5, 6, 7, 8) 186 v7.Col = types.DecodeSlice[uint64](v7.data) 187 v7Window := New(types.Type{Oid: types.T(types.T_uint64)}) 188 v7Window = Window(v7, start, end, v7Window) 189 require.Equal(t, v7.Col.([]uint64)[start:end], v7Window.Col) 190 191 v8 := New(types.Type{Oid: types.T(types.T_float32)}) 192 v8.data = mustMakeSliceArgsAsBytes[float32](mp, 1, 2, 3, 4, 5, 6, 7, 8) 193 v8.Col = types.DecodeSlice[float32](v8.data) 194 v8Window := New(types.Type{Oid: types.T(types.T_float32)}) 195 v8Window = Window(v8, start, end, v8Window) 196 require.Equal(t, v8.Col.([]float32)[start:end], v8Window.Col) 197 198 v9 := New(types.Type{Oid: types.T(types.T_float64)}) 199 v9.data = mustMakeSliceArgsAsBytes[float64](mp, 1, 2, 3, 4, 5, 6, 7, 8) 200 v9.Col = types.DecodeSlice[float64](v9.data) 201 v9Window := New(types.Type{Oid: types.T(types.T_float64)}) 202 v9Window = Window(v9, start, end, v9Window) 203 require.Equal(t, v9.Col.([]float64)[start:end], v9Window.Col) 204 205 v11 := New(types.Type{Oid: types.T(types.T_char)}) 206 AppendBytes(v11, [][]byte{ 207 []byte("hello"), 208 []byte("Gut"), 209 []byte("konichiwa"), 210 []byte("nihao"), 211 }, mp) 212 v11Window := New(types.Type{Oid: types.T(types.T_char)}) 213 v11Window = Window(v11, start, end, v11Window) 214 vs11 := MustStrCols(v11) 215 ws11 := MustStrCols(v11Window) 216 require.Equal(t, vs11[start:end], ws11) 217 218 v12 := New(types.Type{Oid: types.T(types.T_date)}) 219 v12.data = mustMakeSliceArgsAsBytes[types.Date](mp, 1, 2, 3, 4, 5, 6, 7, 8) 220 v12.Col = types.DecodeSlice[types.Date](v12.data) 221 v12Window := New(types.Type{Oid: types.T(types.T_date)}) 222 v12Window = Window(v12, start, end, v12Window) 223 require.Equal(t, v12.Col.([]types.Date)[start:end], v12Window.Col) 224 225 v13 := New(types.Type{Oid: types.T(types.T_datetime)}) 226 v13.data = mustMakeSliceArgsAsBytes[types.Datetime](mp, 1, 2, 3, 4, 5, 6, 7, 8) 227 v13.Col = types.DecodeSlice[types.Datetime](v13.data) 228 v13Window := New(types.Type{Oid: types.T(types.T_datetime)}) 229 v13Window = Window(v13, start, end, v13Window) 230 require.Equal(t, v13.Col.([]types.Datetime)[start:end], v13Window.Col) 231 } 232 233 func TestWindowWithNulls(t *testing.T) { 234 v0 := New(types.T_int8.ToType()) 235 mp := mpool.MustNewZero() 236 237 _ = v0.Append(int8(0), false, mp) 238 _ = v0.Append(int8(1), false, mp) 239 _ = v0.Append(int8(2), false, mp) 240 _ = v0.Append(int8(-1), true, mp) // v0[3] = null 241 _ = v0.Append(int8(6), false, mp) 242 _ = v0.Append(int8(-1), true, mp) // v0[5] = null 243 _ = v0.Append(int8(-1), true, mp) // v0[6] = null 244 _ = v0.Append(int8(6), false, mp) 245 _ = v0.Append(int8(7), false, mp) 246 _ = v0.Append(int8(8), false, mp) 247 248 require.Equal(t, []uint64{3, 5, 6}, v0.Nsp.Np.ToArray()) 249 250 start, end := 1, 7 251 v0Window := New(types.T_int8.ToType()) 252 v0Window = Window(v0, start, end, v0Window) 253 require.Equal(t, v0.Col.([]int8)[start:end], v0Window.Col) 254 require.Equal(t, []uint64{2, 4, 5}, v0Window.Nsp.Np.ToArray()) 255 256 //t.Log(v0.String()) 257 //t.Log(v0Window.String()) 258 } 259 260 func TestAppend(t *testing.T) { 261 mp := mpool.MustNewZero() 262 v0 := New(types.Type{Oid: types.T(types.T_int8)}) 263 int8Slice := []int8{1, 2, 3, 4, 5, 6, 7, 8} 264 v0.data = mustMakeSliceArgsAsBytes(mp, int8Slice...) 265 v0.Col = types.DecodeSlice[int8](v0.data) 266 appendInt8Slice := []int8{21, 22, 23} 267 err := AppendFixed(v0, appendInt8Slice, mp) 268 require.NoError(t, err) 269 require.Equal(t, append(int8Slice, appendInt8Slice...), v0.Col.([]int8)) 270 271 v1 := New(types.Type{Oid: types.T(types.T_int16)}) 272 int16Slice := []int16{1, 2, 3, 4, 5, 6, 7, 8} 273 v1.data = mustMakeSliceArgsAsBytes(mp, int16Slice...) 274 v1.Col = types.DecodeSlice[int16](v1.data) 275 appendInt16Slice := []int16{21, 22, 23} 276 err = AppendFixed(v1, appendInt16Slice, mp) 277 require.NoError(t, err) 278 require.Equal(t, append(int16Slice, appendInt16Slice...), v1.Col.([]int16)) 279 280 v2 := New(types.Type{Oid: types.T(types.T_int32)}) 281 int32Slice := []int32{1, 2, 3, 4, 5, 6, 7, 8} 282 v2.data = mustMakeSliceArgsAsBytes(mp, int32Slice...) 283 v2.Col = types.DecodeSlice[int32](v2.data) 284 appendInt32Slice := []int32{21, 22, 23} 285 err = AppendFixed(v2, appendInt32Slice, mp) 286 require.NoError(t, err) 287 require.Equal(t, append(int32Slice, appendInt32Slice...), v2.Col.([]int32)) 288 289 v3 := New(types.Type{Oid: types.T(types.T_int64)}) 290 int64Slice := []int64{1, 2, 3, 4, 5, 6, 7, 8} 291 v3.data = mustMakeSliceArgsAsBytes(mp, int64Slice...) 292 v3.Col = types.DecodeSlice[int64](v3.data) 293 appendInt64Slice := []int64{21, 22, 23} 294 err = AppendFixed(v3, appendInt64Slice, mp) 295 require.NoError(t, err) 296 require.Equal(t, append(int64Slice, appendInt64Slice...), v3.Col.([]int64)) 297 298 v4 := New(types.Type{Oid: types.T(types.T_uint8)}) 299 uint8Slice := []uint8{1, 2, 3, 4, 5, 6, 7, 8} 300 v4.data = mustMakeSliceArgsAsBytes(mp, uint8Slice...) 301 v4.Col = types.DecodeSlice[uint8](v4.data) 302 appendUint8Slice := []uint8{21, 22, 23} 303 err = AppendFixed(v4, appendUint8Slice, mp) 304 require.NoError(t, err) 305 require.Equal(t, append(uint8Slice, appendUint8Slice...), v4.Col.([]uint8)) 306 307 v5 := New(types.Type{Oid: types.T(types.T_uint16)}) 308 uint16Slice := []uint16{1, 2, 3, 4, 5, 6, 7, 8} 309 v5.data = mustMakeSliceArgsAsBytes(mp, uint16Slice...) 310 v5.Col = types.DecodeSlice[uint16](v5.data) 311 appendUint16Slice := []uint16{21, 22, 23} 312 err = AppendFixed(v5, appendUint16Slice, mp) 313 require.NoError(t, err) 314 require.Equal(t, append(uint16Slice, appendUint16Slice...), v5.Col.([]uint16)) 315 316 v6 := New(types.Type{Oid: types.T(types.T_uint32)}) 317 uint32Slice := []uint32{1, 2, 3, 4, 5, 6, 7, 8} 318 v6.data = mustMakeSliceArgsAsBytes(mp, uint32Slice...) 319 v6.Col = types.DecodeSlice[uint32](v6.data) 320 appendUint32Slice := []uint32{21, 22, 23} 321 err = AppendFixed(v6, appendUint32Slice, mp) 322 require.NoError(t, err) 323 require.Equal(t, append(uint32Slice, appendUint32Slice...), v6.Col.([]uint32)) 324 325 v7 := New(types.Type{Oid: types.T(types.T_uint64)}) 326 uint64Slice := []uint64{1, 2, 3, 4, 5, 6, 7, 8} 327 v7.data = mustMakeSliceArgsAsBytes(mp, uint64Slice...) 328 v7.Col = types.DecodeSlice[uint64](v7.data) 329 appendUint64Slice := []uint64{21, 22, 23} 330 err = AppendFixed(v7, appendUint64Slice, mp) 331 require.NoError(t, err) 332 require.Equal(t, append(uint64Slice, appendUint64Slice...), v7.Col.([]uint64)) 333 334 v8 := New(types.Type{Oid: types.T(types.T_float32)}) 335 float32Slice := []float32{1, 2, 3, 4, 5, 6, 7, 8} 336 v8.data = mustMakeSliceArgsAsBytes(mp, float32Slice...) 337 v8.Col = types.DecodeSlice[float32](v8.data) 338 appendFloat32Slice := []float32{21, 22, 23} 339 err = AppendFixed(v8, appendFloat32Slice, mp) 340 require.NoError(t, err) 341 require.Equal(t, append(float32Slice, appendFloat32Slice...), v8.Col.([]float32)) 342 343 v9 := New(types.Type{Oid: types.T(types.T_float64)}) 344 float64Slice := []float64{1, 2, 3, 4, 5, 6, 7, 8} 345 v9.data = mustMakeSliceArgsAsBytes(mp, float64Slice...) 346 v9.Col = types.DecodeSlice[float64](v9.data) 347 appendFloat64Slice := []float64{21, 22, 23} 348 err = AppendFixed(v9, appendFloat64Slice, mp) 349 require.NoError(t, err) 350 require.Equal(t, append(float64Slice, appendFloat64Slice...), v9.Col.([]float64)) 351 352 v10 := New(types.Type{Oid: types.T(types.T_date)}) 353 dateSlice := []types.Date{1, 2, 3, 4, 5, 6, 7, 8} 354 v10.data = mustMakeSliceArgsAsBytes(mp, dateSlice...) 355 v10.Col = types.DecodeSlice[types.Date](v10.data) 356 appendDateSlice := []types.Date{21, 22, 23} 357 err = AppendFixed(v10, appendDateSlice, mp) 358 require.NoError(t, err) 359 require.Equal(t, append(dateSlice, appendDateSlice...), v10.Col.([]types.Date)) 360 361 v11 := New(types.Type{Oid: types.T(types.T_datetime)}) 362 datetimeSlice := []types.Datetime{1, 2, 3, 4, 5, 6, 7, 8} 363 v11.data = mustMakeSliceArgsAsBytes(mp, datetimeSlice...) 364 v11.Col = types.DecodeSlice[types.Datetime](v11.data) 365 appendDatetimeSlice := []types.Datetime{21, 22, 23} 366 err = AppendFixed(v11, appendDatetimeSlice, mp) 367 require.NoError(t, err) 368 require.Equal(t, append(datetimeSlice, appendDatetimeSlice...), v11.Col.([]types.Datetime)) 369 } 370 371 func shrinkTest[T any](t *testing.T, tt types.T, mp *mpool.MPool, args ...T) { 372 v0 := New(types.Type{Oid: tt}) 373 v0.data = mustMakeSliceArgsAsBytes(mp, args...) 374 v0.Col = types.DecodeSlice[T](v0.data) 375 sels := []int64{1, 3, 5} 376 Shrink(v0, sels) 377 378 st := v0.Col.([]T) 379 require.Equal(t, 3, len(st)) 380 require.Equal(t, args[1], st[0]) 381 require.Equal(t, args[3], st[1]) 382 require.Equal(t, args[5], st[2]) 383 } 384 385 func TestShrink(t *testing.T) { 386 mp := mpool.MustNewZero() 387 388 shrinkTest[int8](t, types.T_int8, mp, 0, 1, 2, 3, 4, 5, 6, 7, 8) 389 shrinkTest[int16](t, types.T_int16, mp, 0, 1, 2, 3, 4, 5, 6, 7, 8) 390 shrinkTest[int32](t, types.T_int32, mp, 0, 1, 2, 3, 4, 5, 6, 7, 8) 391 shrinkTest[int64](t, types.T_int64, mp, 0, 1, 2, 3, 4, 5, 6, 7, 8) 392 393 shrinkTest[uint8](t, types.T_uint8, mp, 0, 1, 2, 3, 4, 5, 6, 7, 8) 394 shrinkTest[uint16](t, types.T_uint16, mp, 0, 1, 2, 3, 4, 5, 6, 7, 8) 395 shrinkTest[uint32](t, types.T_uint32, mp, 0, 1, 2, 3, 4, 5, 6, 7, 8) 396 shrinkTest[uint64](t, types.T_uint64, mp, 0, 1, 2, 3, 4, 5, 6, 7, 8) 397 398 shrinkTest[float32](t, types.T_float32, mp, 0, 1, 2, 3, 4, 5, 6, 7, 8) 399 shrinkTest[float64](t, types.T_float64, mp, 0, 1, 2, 3, 4, 5, 6, 7, 8) 400 401 shrinkTest[types.Date](t, types.T_date, mp, 0, 1, 2, 3, 4, 5, 6, 7, 8) 402 shrinkTest[types.Datetime](t, types.T_datetime, mp, 0, 1, 2, 3, 4, 5, 6, 7, 8) 403 } 404 405 func shuffleTest[T any](t *testing.T, tt types.T, mp *mpool.MPool, args ...T) { 406 v0 := New(types.Type{Oid: tt}) 407 v0.data = mustMakeSliceArgsAsBytes(mp, args...) 408 v0.Col = types.DecodeSlice[T](v0.data) 409 sels := []int64{1, 3, 5} 410 err := Shuffle(v0, sels, mp) 411 require.NoError(t, err) 412 st := v0.Col.([]T) 413 require.Equal(t, 3, len(st)) 414 require.Equal(t, args[1], st[0]) 415 require.Equal(t, args[3], st[1]) 416 require.Equal(t, args[5], st[2]) 417 } 418 419 func TestShuffle(t *testing.T) { 420 mp := mpool.MustNewZero() 421 422 shuffleTest[int8](t, types.T_int8, mp, 0, 1, 2, 3, 4, 5, 6, 7, 8) 423 shuffleTest[int16](t, types.T_int16, mp, 0, 1, 2, 3, 4, 5, 6, 7, 8) 424 shuffleTest[int32](t, types.T_int32, mp, 0, 1, 2, 3, 4, 5, 6, 7, 8) 425 shuffleTest[int64](t, types.T_int64, mp, 0, 1, 2, 3, 4, 5, 6, 7, 8) 426 427 shuffleTest[uint8](t, types.T_uint8, mp, 0, 1, 2, 3, 4, 5, 6, 7, 8) 428 shuffleTest[uint16](t, types.T_uint16, mp, 0, 1, 2, 3, 4, 5, 6, 7, 8) 429 shuffleTest[uint32](t, types.T_uint32, mp, 0, 1, 2, 3, 4, 5, 6, 7, 8) 430 shuffleTest[uint64](t, types.T_uint64, mp, 0, 1, 2, 3, 4, 5, 6, 7, 8) 431 432 shuffleTest[float32](t, types.T_float32, mp, 0, 1, 2, 3, 4, 5, 6, 7, 8) 433 shuffleTest[float64](t, types.T_float64, mp, 0, 1, 2, 3, 4, 5, 6, 7, 8) 434 435 shuffleTest[types.Date](t, types.T_date, mp, 0, 1, 2, 3, 4, 5, 6, 7, 8) 436 shuffleTest[types.Datetime](t, types.T_datetime, mp, 0, 1, 2, 3, 4, 5, 6, 7, 8) 437 } 438 439 func TestCopy(t *testing.T) { 440 mp := mpool.MustNewZero() 441 w0 := New(types.Type{Oid: types.T(types.T_char)}) 442 AppendBytes(w0, [][]byte{ 443 []byte("nihao"), 444 []byte("nihao"), 445 []byte("nihao"), 446 []byte("nihao"), 447 }, mp) 448 v0 := New(types.Type{Oid: types.T(types.T_char)}) 449 AppendBytes(v0, [][]byte{ 450 []byte("hello"), 451 []byte("hello"), 452 []byte("hello"), 453 []byte("hello"), 454 }, mp) 455 err := Copy(v0, w0, 2, 0, mp) 456 require.NoError(t, err) 457 458 expectvec := New(types.Type{Oid: types.T(types.T_char)}) 459 AppendBytes(expectvec, [][]byte{ 460 []byte("hello"), 461 []byte("hello"), 462 []byte("nihao"), 463 []byte("hello"), 464 }, mp) 465 require.Equal(t, GetStrVectorValues(expectvec), GetStrVectorValues(v0)) 466 } 467 468 func unionOneTest[T any](t *testing.T, tt types.T, mp *mpool.MPool, arg1 []T, arg2 []T, arg3 []T) { 469 w0 := New(types.Type{Oid: types.T(tt)}) 470 w0.data = mustMakeSliceArgsAsBytes(mp, arg1...) 471 w0.Col = types.DecodeSlice[T](w0.data) 472 v0 := New(types.Type{Oid: types.T(tt)}) 473 err := UnionOne(v0, w0, 3, mp) 474 require.NoError(t, err) 475 require.Equal(t, arg2, v0.Col.([]T)) 476 v0.data = mustMakeSliceArgsAsBytes(mp, arg1...) 477 v0.Col = types.DecodeSlice[T](v0.data) 478 err = UnionOne(v0, w0, 3, mp) 479 require.NoError(t, err) 480 require.Equal(t, arg3, v0.Col.([]T)) 481 } 482 483 func TestUnionOne(t *testing.T) { 484 mp := mpool.MustNewZero() 485 unionOneTest(t, types.T_int8, mp, []int8{0, 1, 2, 3, 4, 5, 6, 7, 8}, []int8{3}, []int8{0, 1, 2, 3, 4, 5, 6, 7, 8, 3}) 486 unionOneTest(t, types.T_int16, mp, []int16{0, 1, 2, 3, 4, 5, 6, 7, 8}, []int16{3}, []int16{0, 1, 2, 3, 4, 5, 6, 7, 8, 3}) 487 unionOneTest(t, types.T_int32, mp, []int32{0, 1, 2, 3, 4, 5, 6, 7, 8}, []int32{3}, []int32{0, 1, 2, 3, 4, 5, 6, 7, 8, 3}) 488 unionOneTest(t, types.T_int64, mp, []int64{0, 1, 2, 3, 4, 5, 6, 7, 8}, []int64{3}, []int64{0, 1, 2, 3, 4, 5, 6, 7, 8, 3}) 489 490 unionOneTest(t, types.T_uint8, mp, []uint8{0, 1, 2, 3, 4, 5, 6, 7, 8}, []uint8{3}, []uint8{0, 1, 2, 3, 4, 5, 6, 7, 8, 3}) 491 unionOneTest(t, types.T_uint16, mp, []uint16{0, 1, 2, 3, 4, 5, 6, 7, 8}, []uint16{3}, []uint16{0, 1, 2, 3, 4, 5, 6, 7, 8, 3}) 492 unionOneTest(t, types.T_uint32, mp, []uint32{0, 1, 2, 3, 4, 5, 6, 7, 8}, []uint32{3}, []uint32{0, 1, 2, 3, 4, 5, 6, 7, 8, 3}) 493 unionOneTest(t, types.T_uint64, mp, []uint64{0, 1, 2, 3, 4, 5, 6, 7, 8}, []uint64{3}, []uint64{0, 1, 2, 3, 4, 5, 6, 7, 8, 3}) 494 495 unionOneTest(t, types.T_float32, mp, []float32{0, 1, 2, 3, 4, 5, 6, 7, 8}, []float32{3}, []float32{0, 1, 2, 3, 4, 5, 6, 7, 8, 3}) 496 unionOneTest(t, types.T_float64, mp, []float64{0, 1, 2, 3, 4, 5, 6, 7, 8}, []float64{3}, []float64{0, 1, 2, 3, 4, 5, 6, 7, 8, 3}) 497 498 unionOneTest(t, types.T_date, mp, []types.Date{0, 1, 2, 3, 4, 5, 6, 7, 8}, []types.Date{3}, []types.Date{0, 1, 2, 3, 4, 5, 6, 7, 8, 3}) 499 unionOneTest(t, types.T_datetime, mp, []types.Datetime{0, 1, 2, 3, 4, 5, 6, 7, 8}, []types.Datetime{3}, []types.Datetime{0, 1, 2, 3, 4, 5, 6, 7, 8, 3}) 500 501 w10 := New(types.Type{Oid: types.T(types.T_char), Width: types.MaxCharLen}) 502 AppendString(w10, []string{"nihao", "nihao", "nihao", "nihao"}, mp) 503 v10 := New(types.Type{Oid: types.T(types.T_char), Width: types.MaxCharLen}) 504 err := UnionOne(v10, w10, 3, mp) 505 require.NoError(t, err) 506 v10vals := GetStrVectorValues(v10) 507 require.Equal(t, []string{"nihao"}, v10vals) 508 509 v10 = New(types.Type{Oid: types.T(types.T_char), Width: types.MaxCharLen}) 510 AppendString(v10, []string{"hello", "hello", "hello"}, mp) 511 err = UnionOne(v10, w10, 3, mp) 512 require.NoError(t, err) 513 v10vals = GetStrVectorValues(v10) 514 require.Equal(t, []string{"hello", "hello", "hello", "nihao"}, v10vals) 515 516 w101 := New(types.Type{Oid: types.T(types.T_char), Width: types.MaxCharLen}) 517 AppendString(w101, []string{"thanks"}, mp) 518 w101.isConst = true 519 err = UnionOne(v10, w101, 2, mp) 520 require.NoError(t, err) 521 v10vals = GetStrVectorValues(v10) 522 require.Equal(t, []string{"hello", "hello", "hello", "nihao", "thanks"}, v10vals) 523 524 // Long string test 525 astr := "a123456789012345678901234567890" 526 bstr := "b123456789012345678901234567890AKQJ1098765432" 527 528 w102 := New(types.Type{Oid: types.T(types.T_char), Width: types.MaxCharLen}) 529 AppendString(w102, []string{astr, astr, astr, astr}, mp) 530 v102 := New(types.Type{Oid: types.T(types.T_char), Width: types.MaxCharLen}) 531 err = UnionOne(v102, w102, 3, mp) 532 require.NoError(t, err) 533 v102vals := GetStrVectorValues(v102) 534 require.Equal(t, []string{astr}, v102vals) 535 536 v102 = New(types.Type{Oid: types.T(types.T_char), Width: types.MaxCharLen}) 537 AppendString(v102, []string{bstr, bstr, bstr}, mp) 538 err = UnionOne(v102, w102, 3, mp) 539 require.NoError(t, err) 540 v102vals = GetStrVectorValues(v102) 541 require.Equal(t, []string{bstr, bstr, bstr, astr}, v102vals) 542 } 543 544 func unionBatchTest[T any](t *testing.T, tt types.T, mp *mpool.MPool, arg1 []T, arg2 []T, arg3 []T) { 545 w0 := New(types.Type{Oid: types.T(tt)}) 546 w0.data = mustMakeSliceArgsAsBytes(mp, arg1...) 547 w0.Col = types.DecodeSlice[T](w0.data) 548 v0 := New(types.Type{Oid: types.T(tt)}) 549 err := UnionBatch(v0, w0, 3, 2, []uint8{1, 1}, mp) 550 require.NoError(t, err) 551 require.Equal(t, arg2, v0.Col.([]T)) 552 v0.data = mustMakeSliceArgsAsBytes(mp, arg1...) 553 v0.Col = types.DecodeSlice[T](v0.data) 554 err = UnionBatch(v0, w0, 3, 2, []uint8{1, 1}, mp) 555 require.NoError(t, err) 556 require.Equal(t, arg3, v0.Col.([]T)) 557 } 558 559 func TestUnionBatch(t *testing.T) { 560 mp := mpool.MustNewZero() 561 unionBatchTest(t, types.T_int8, mp, []int8{0, 1, 2, 3, 4, 5, 6, 7, 8}, []int8{3, 4}, []int8{0, 1, 2, 3, 4, 5, 6, 7, 8, 3, 4}) 562 unionBatchTest(t, types.T_int16, mp, []int16{0, 1, 2, 3, 4, 5, 6, 7, 8}, []int16{3, 4}, []int16{0, 1, 2, 3, 4, 5, 6, 7, 8, 3, 4}) 563 unionBatchTest(t, types.T_int32, mp, []int32{0, 1, 2, 3, 4, 5, 6, 7, 8}, []int32{3, 4}, []int32{0, 1, 2, 3, 4, 5, 6, 7, 8, 3, 4}) 564 unionBatchTest(t, types.T_int64, mp, []int64{0, 1, 2, 3, 4, 5, 6, 7, 8}, []int64{3, 4}, []int64{0, 1, 2, 3, 4, 5, 6, 7, 8, 3, 4}) 565 566 unionBatchTest(t, types.T_uint8, mp, []uint8{0, 1, 2, 3, 4, 5, 6, 7, 8}, []uint8{3, 4}, []uint8{0, 1, 2, 3, 4, 5, 6, 7, 8, 3, 4}) 567 unionBatchTest(t, types.T_uint16, mp, []uint16{0, 1, 2, 3, 4, 5, 6, 7, 8}, []uint16{3, 4}, []uint16{0, 1, 2, 3, 4, 5, 6, 7, 8, 3, 4}) 568 unionBatchTest(t, types.T_uint32, mp, []uint32{0, 1, 2, 3, 4, 5, 6, 7, 8}, []uint32{3, 4}, []uint32{0, 1, 2, 3, 4, 5, 6, 7, 8, 3, 4}) 569 unionBatchTest(t, types.T_uint64, mp, []uint64{0, 1, 2, 3, 4, 5, 6, 7, 8}, []uint64{3, 4}, []uint64{0, 1, 2, 3, 4, 5, 6, 7, 8, 3, 4}) 570 571 unionBatchTest(t, types.T_float32, mp, []float32{0, 1, 2, 3, 4, 5, 6, 7, 8}, []float32{3, 4}, []float32{0, 1, 2, 3, 4, 5, 6, 7, 8, 3, 4}) 572 unionBatchTest(t, types.T_float64, mp, []float64{0, 1, 2, 3, 4, 5, 6, 7, 8}, []float64{3, 4}, []float64{0, 1, 2, 3, 4, 5, 6, 7, 8, 3, 4}) 573 574 unionBatchTest(t, types.T_date, mp, []types.Date{0, 1, 2, 3, 4, 5, 6, 7, 8}, []types.Date{3, 4}, []types.Date{0, 1, 2, 3, 4, 5, 6, 7, 8, 3, 4}) 575 unionBatchTest(t, types.T_datetime, mp, []types.Datetime{0, 1, 2, 3, 4, 5, 6, 7, 8}, []types.Datetime{3, 4}, []types.Datetime{0, 1, 2, 3, 4, 5, 6, 7, 8, 3, 4}) 576 577 w10 := New(types.Type{Oid: types.T(types.T_char), Width: types.MaxCharLen}) 578 AppendString(w10, []string{"nihao", "nihao", "nihao", "nihao"}, mp) 579 v10 := New(types.Type{Oid: types.T(types.T_char), Width: types.MaxCharLen}) 580 err := UnionBatch(v10, w10, 1, 2, []uint8{1, 1}, mp) 581 require.NoError(t, err) 582 require.Equal(t, []string{"nihao", "nihao"}, GetStrVectorValues(v10)) 583 584 Clean(v10, mp) 585 AppendString(v10, []string{"hello", "hello", "hello", "hello"}, mp) 586 err = UnionBatch(v10, w10, 1, 2, []uint8{1, 1}, mp) 587 require.NoError(t, err) 588 require.Equal(t, []string{"hello", "hello", "hello", "hello", "nihao", "nihao"}, GetStrVectorValues(v10)) 589 } 590 591 func strTest[T any](t *testing.T, tt types.T, mp *mpool.MPool, arg1 ...T) { 592 v0 := New(types.Type{Oid: types.T(tt)}) 593 v0.data = mustMakeSliceArgsAsBytes(mp, arg1...) 594 v0.Col = types.DecodeSlice[T](v0.data) 595 result := v0.String() 596 require.Equal(t, "[0 1 2]-&{<nil>}", result) 597 } 598 599 func TestVector_String(t *testing.T) { 600 mp := mpool.MustNewZero() 601 strTest[int8](t, types.T_int8, mp, 0, 1, 2) 602 strTest[int16](t, types.T_int16, mp, 0, 1, 2) 603 strTest[int32](t, types.T_int32, mp, 0, 1, 2) 604 strTest[int64](t, types.T_int64, mp, 0, 1, 2) 605 } 606 607 func FillVectorData[T any](v *Vector, mp *mpool.MPool) { 608 v.data = mustMakeSliceArgsAsBytes(mp, v.Col.([]T)...) 609 } 610 611 func TestVector_Marshal(t *testing.T) { 612 vals := []int64{0, 1, 2, 3, 4, 5, 6, 7, 8, 9} 613 vec := NewWithFixed(types.T_int64.ToType(), vals, nil, testMp) 614 nulls.Add(vec.Nsp, 1) 615 nulls.Add(vec.Nsp, 3) 616 nulls.Add(vec.Nsp, 5) 617 nulls.Add(vec.Nsp, 7) 618 nulls.Add(vec.Nsp, 9) 619 620 bs, err := vec.MarshalBinary() 621 require.NoError(t, err) 622 623 vec2 := New(types.T_int64.ToType()) 624 err = vec2.UnmarshalBinary(bs) 625 require.NoError(t, err) 626 627 require.Equal(t, vec.Length(), vec2.Length()) 628 require.True(t, vec2.Nsp.Contains(1)) 629 require.True(t, vec2.Nsp.Contains(3)) 630 require.True(t, vec2.Nsp.Contains(5)) 631 require.True(t, vec2.Nsp.Contains(7)) 632 require.True(t, vec2.Nsp.Contains(9)) 633 634 tv1 := MustTCols[int64](vec) 635 tv2 := MustTCols[int64](vec2) 636 for i := 0; i < vec.Length(); i++ { 637 ui := uint64(i) 638 require.Equal(t, vec2.Nsp.Contains(ui), i%2 != 0) 639 require.Equal(t, vec2.Nsp.Contains(ui), vec.Nsp.Contains(ui)) 640 if !vec2.Nsp.Contains(ui) { 641 require.Equal(t, tv1[i], tv2[i]) 642 } 643 } 644 }