github.com/matrixorigin/matrixone@v0.7.0/pkg/container/index/dict/dict_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 dict 16 17 import ( 18 "testing" 19 20 "github.com/matrixorigin/matrixone/pkg/common/mpool" 21 "github.com/matrixorigin/matrixone/pkg/container/types" 22 "github.com/matrixorigin/matrixone/pkg/container/vector" 23 "github.com/stretchr/testify/require" 24 ) 25 26 func TestCardinality(t *testing.T) { 27 dict, err := newTestDict(types.Type{Oid: types.T_int64}) 28 require.NoError(t, err) 29 defer dict.Free() 30 31 dict.unique.Col = []int64{5, 2, 3, 7} 32 require.Equal(t, uint64(4), dict.Cardinality()) 33 } 34 35 func TestInsertBatchFixedLen(t *testing.T) { 36 dict, err := newTestDict(types.Type{Oid: types.T_int64}) 37 require.NoError(t, err) 38 defer dict.Free() 39 40 v0 := vector.New(types.Type{Oid: types.T_int64}) 41 v0.Col = []int64{5, 2, 3, 7, 3, 2} 42 43 ips, err := dict.InsertBatch(v0) 44 require.NoError(t, err) 45 require.Equal(t, uint16(1), ips[0]) 46 require.Equal(t, uint16(2), ips[1]) 47 require.Equal(t, uint16(3), ips[2]) 48 require.Equal(t, uint16(4), ips[3]) 49 require.Equal(t, uint16(3), ips[4]) 50 require.Equal(t, uint16(2), ips[5]) 51 52 v1 := vector.New(types.Type{Oid: types.T_int64}) 53 v1.Col = []int64{4, 2, 1, 5} 54 55 ips, err = dict.InsertBatch(v1) 56 require.NoError(t, err) 57 require.Equal(t, uint16(5), ips[0]) 58 require.Equal(t, uint16(2), ips[1]) 59 require.Equal(t, uint16(6), ips[2]) 60 require.Equal(t, uint16(1), ips[3]) 61 } 62 63 func TestFindBatchFixedLen(t *testing.T) { 64 dict, err := newTestDict(types.Type{Oid: types.T_int32}) 65 require.NoError(t, err) 66 defer dict.Free() 67 68 v0 := vector.New(types.Type{Oid: types.T_int32}) 69 v0.Col = []int32{5, 2, 3, 7, 1, 4} 70 71 ips, err := dict.InsertBatch(v0) 72 require.NoError(t, err) 73 require.Equal(t, uint16(1), ips[0]) 74 require.Equal(t, uint16(2), ips[1]) 75 require.Equal(t, uint16(3), ips[2]) 76 require.Equal(t, uint16(4), ips[3]) 77 require.Equal(t, uint16(5), ips[4]) 78 require.Equal(t, uint16(6), ips[5]) 79 80 v1 := vector.New(types.Type{Oid: types.T_int32}) 81 v1.Col = []int32{7, 3, 8, 4, 6, 3} 82 83 poses := dict.FindBatch(v1) 84 require.Equal(t, uint16(4), poses[0]) 85 require.Equal(t, uint16(3), poses[1]) 86 require.Equal(t, uint16(0), poses[2]) 87 require.Equal(t, uint16(6), poses[3]) 88 require.Equal(t, uint16(0), poses[4]) 89 require.Equal(t, uint16(3), poses[5]) 90 } 91 92 func TestFindDataFixedLen(t *testing.T) { 93 dict, err := newTestDict(types.Type{Oid: types.T_int32}) 94 require.NoError(t, err) 95 defer dict.Free() 96 97 v0 := vector.New(types.Type{Oid: types.T_int32}) 98 v0.Col = []int32{5, 3, 1, 7, 1, 3} 99 100 ips, err := dict.InsertBatch(v0) 101 require.NoError(t, err) 102 require.Equal(t, uint16(1), ips[0]) 103 require.Equal(t, uint16(2), ips[1]) 104 require.Equal(t, uint16(3), ips[2]) 105 require.Equal(t, uint16(4), ips[3]) 106 require.Equal(t, uint16(3), ips[4]) 107 require.Equal(t, uint16(2), ips[5]) 108 109 data := dict.FindData(1) 110 require.Equal(t, int32(5), vector.MustTCols[int32](data)[0]) 111 112 data = dict.FindData(2) 113 require.Equal(t, int32(3), vector.MustTCols[int32](data)[0]) 114 115 data = dict.FindData(3) 116 require.Equal(t, int32(1), vector.MustTCols[int32](data)[0]) 117 118 data = dict.FindData(4) 119 require.Equal(t, int32(7), vector.MustTCols[int32](data)[0]) 120 } 121 122 func TestInsertLargeDataFixedLen(t *testing.T) { 123 dict, err := newTestDict(types.Type{Oid: types.T_int32}) 124 require.NoError(t, err) 125 defer dict.Free() 126 127 v0 := vector.New(types.Type{Oid: types.T_int32}) 128 v0.Col = make([]int32, 100000) 129 130 i := 0 131 for j := 1; j <= 10000; j++ { 132 for cnt := 0; cnt < 10; cnt++ { 133 vector.MustTCols[int32](v0)[i] = int32(j) 134 i++ 135 } 136 } 137 138 ips, err := dict.InsertBatch(v0) 139 require.NoError(t, err) 140 141 i = 0 142 for j := 1; j <= 10000; j++ { 143 for cnt := 0; cnt < 10; cnt++ { 144 require.Equal(t, uint16(j), ips[i]) 145 i++ 146 } 147 } 148 } 149 150 func TestInsertBatchVarLen(t *testing.T) { 151 dict, err := newTestDict(types.Type{Oid: types.T_varchar, Width: types.MaxVarcharLen}) 152 require.NoError(t, err) 153 defer dict.Free() 154 155 v0 := vector.New(types.Type{Oid: types.T_varchar, Width: types.MaxVarcharLen}) 156 require.NoError(t, vector.AppendBytes(v0, [][]byte{ 157 []byte("hello"), 158 []byte("My"), 159 []byte("name"), 160 []byte("is"), 161 []byte("Tom"), 162 }, dict.m)) 163 164 ips, err := dict.InsertBatch(v0) 165 require.NoError(t, err) 166 require.Equal(t, uint16(1), ips[0]) 167 require.Equal(t, uint16(2), ips[1]) 168 require.Equal(t, uint16(3), ips[2]) 169 require.Equal(t, uint16(4), ips[3]) 170 require.Equal(t, uint16(5), ips[4]) 171 172 v1 := vector.New(types.Type{Oid: types.T_varchar, Width: types.MaxVarcharLen}) 173 require.NoError(t, vector.AppendBytes(v1, [][]byte{ 174 []byte("Tom"), 175 []byte("is"), 176 []byte("My"), 177 []byte("friend"), 178 }, dict.m)) 179 180 ips, err = dict.InsertBatch(v1) 181 require.NoError(t, err) 182 require.Equal(t, uint16(5), ips[0]) 183 require.Equal(t, uint16(4), ips[1]) 184 require.Equal(t, uint16(2), ips[2]) 185 require.Equal(t, uint16(6), ips[3]) 186 } 187 188 func TestFindBatchVarLen(t *testing.T) { 189 dict, err := newTestDict(types.Type{Oid: types.T_varchar, Width: types.MaxVarcharLen}) 190 require.NoError(t, err) 191 defer dict.Free() 192 193 v0 := vector.New(types.Type{Oid: types.T_varchar, Width: types.MaxVarcharLen}) 194 require.NoError(t, vector.AppendBytes(v0, [][]byte{ 195 []byte("hello"), 196 []byte("My"), 197 []byte("name"), 198 []byte("is"), 199 []byte("Tom"), 200 }, dict.m)) 201 202 ips, err := dict.InsertBatch(v0) 203 require.NoError(t, err) 204 require.Equal(t, uint16(1), ips[0]) 205 require.Equal(t, uint16(2), ips[1]) 206 require.Equal(t, uint16(3), ips[2]) 207 require.Equal(t, uint16(4), ips[3]) 208 require.Equal(t, uint16(5), ips[4]) 209 210 v1 := vector.New(types.Type{Oid: types.T_varchar, Width: types.MaxVarcharLen}) 211 require.NoError(t, vector.AppendBytes(v1, [][]byte{ 212 []byte("Jack"), 213 []byte("is"), 214 []byte("My"), 215 []byte("friend"), 216 []byte("name"), 217 }, dict.m)) 218 219 poses := dict.FindBatch(v1) 220 require.Equal(t, uint16(0), poses[0]) 221 require.Equal(t, uint16(4), poses[1]) 222 require.Equal(t, uint16(2), poses[2]) 223 require.Equal(t, uint16(0), poses[3]) 224 require.Equal(t, uint16(3), poses[4]) 225 } 226 227 func TestFindDataVarLen(t *testing.T) { 228 dict, err := newTestDict(types.Type{Oid: types.T_varchar, Width: types.MaxVarcharLen}) 229 require.NoError(t, err) 230 defer dict.Free() 231 232 v0 := vector.New(types.Type{Oid: types.T_varchar, Width: types.MaxVarcharLen}) 233 require.NoError(t, vector.AppendBytes(v0, [][]byte{ 234 []byte("thisisalonglonglonglongstring"), 235 []byte("My"), 236 []byte("name"), 237 []byte("is"), 238 []byte("Tom"), 239 []byte("is"), 240 []byte("Tom"), 241 }, dict.m)) 242 243 ips, err := dict.InsertBatch(v0) 244 require.NoError(t, err) 245 require.Equal(t, uint16(1), ips[0]) 246 require.Equal(t, uint16(2), ips[1]) 247 require.Equal(t, uint16(3), ips[2]) 248 require.Equal(t, uint16(4), ips[3]) 249 require.Equal(t, uint16(5), ips[4]) 250 require.Equal(t, uint16(4), ips[5]) 251 require.Equal(t, uint16(5), ips[6]) 252 253 data := dict.FindData(1) 254 require.Equal(t, []byte("thisisalonglonglonglongstring"), data.GetBytes(0)) 255 256 data = dict.FindData(2) 257 require.Equal(t, []byte("My"), data.GetBytes(0)) 258 259 data = dict.FindData(3) 260 require.Equal(t, []byte("name"), data.GetBytes(0)) 261 262 data = dict.FindData(4) 263 require.Equal(t, []byte("is"), data.GetBytes(0)) 264 265 data = dict.FindData(5) 266 require.Equal(t, []byte("Tom"), data.GetBytes(0)) 267 } 268 269 func newTestDict(typ types.Type) (*Dict, error) { 270 return New(typ, mpool.MustNewZero()) 271 }