github.com/matrixorigin/matrixone@v0.7.0/pkg/vm/engine/tae/containers/mock.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 "fmt" 19 "math" 20 "math/rand" 21 "strconv" 22 "time" 23 24 "github.com/matrixorigin/matrixone/pkg/container/types" 25 "github.com/matrixorigin/matrixone/pkg/vm/engine/tae/common" 26 ) 27 28 type MockDataProvider struct { 29 providers map[int]Vector 30 } 31 32 func NewMockDataProvider() *MockDataProvider { 33 return &MockDataProvider{ 34 providers: make(map[int]Vector), 35 } 36 } 37 38 func (p *MockDataProvider) Reset() { 39 p.providers = make(map[int]Vector) 40 } 41 42 func (p *MockDataProvider) AddColumnProvider(colIdx int, provider Vector) { 43 p.providers[colIdx] = provider 44 } 45 46 func (p *MockDataProvider) GetColumnProvider(colIdx int) Vector { 47 if p == nil { 48 return nil 49 } 50 return p.providers[colIdx] 51 } 52 53 func MockVector(t types.Type, rows int, unique, nullable bool, provider Vector) (vec Vector) { 54 rand.Seed(time.Now().UnixNano()) 55 vec = MakeVector(t, nullable) 56 if provider != nil { 57 vec.Extend(provider) 58 return 59 } 60 61 switch t.Oid { 62 case types.T_bool: 63 for i := 0; i < rows; i++ { 64 if i%2 == 0 { 65 vec.Append(true) 66 } else { 67 vec.Append(false) 68 } 69 } 70 case types.T_int8: 71 if unique { 72 if int(rows) >= math.MaxInt8-math.MinInt8 { 73 panic("overflow") 74 } 75 for i := 0; i < rows; i++ { 76 vec.Append(math.MinInt8 + int8(i)) 77 } 78 } else { 79 for i := 0; i < rows; i++ { 80 ival := rand.Intn(math.MaxInt8) 81 vec.Append(int8(ival)) 82 } 83 } 84 case types.T_int16: 85 if unique { 86 for i := 0; i < rows; i++ { 87 vec.Append(int16(i)) 88 } 89 } else { 90 for i := 0; i < rows; i++ { 91 ival := rand.Intn(math.MaxInt16) 92 vec.Append(int16(ival)) 93 } 94 } 95 case types.T_int32: 96 if unique { 97 for i := 0; i < rows; i++ { 98 vec.Append(int32(i)) 99 } 100 } else { 101 for i := 0; i < rows; i++ { 102 ival := rand.Intn(math.MaxInt32) 103 vec.Append(int32(ival)) 104 } 105 } 106 case types.T_int64: 107 if unique { 108 for i := 0; i < rows; i++ { 109 vec.Append(int64(i)) 110 } 111 } else { 112 for i := 0; i < rows; i++ { 113 ival := rand.Intn(math.MaxInt64) 114 vec.Append(int64(ival)) 115 } 116 } 117 case types.T_uint8: 118 if unique { 119 if int(rows) >= math.MaxUint8 { 120 panic("overflow") 121 } 122 for i := 0; i < rows; i++ { 123 vec.Append(uint8(i)) 124 } 125 } else { 126 for i := 0; i < rows; i++ { 127 ival := rand.Intn(math.MaxUint8) 128 vec.Append(uint8(ival)) 129 } 130 } 131 case types.T_uint16: 132 if unique { 133 for i := 0; i < rows; i++ { 134 vec.Append(uint16(i)) 135 } 136 } else { 137 for i := 0; i < rows; i++ { 138 ival := rand.Intn(int(math.MaxInt16)) 139 vec.Append(uint16(ival)) 140 } 141 } 142 case types.T_uint32: 143 if unique { 144 for i := 0; i < rows; i++ { 145 vec.Append(uint32(i)) 146 } 147 } else { 148 for i := 0; i < rows; i++ { 149 ival := rand.Int31() 150 vec.Append(uint32(ival)) 151 } 152 } 153 case types.T_uint64: 154 if unique { 155 for i := 0; i < rows; i++ { 156 vec.Append(uint64(i)) 157 } 158 } else { 159 for i := 0; i < rows; i++ { 160 ival := rand.Int63() 161 vec.Append(uint64(ival)) 162 } 163 } 164 case types.T_float32: 165 for i := 0; i < rows; i++ { 166 v1 := rand.Intn(math.MaxInt32) 167 v2 := rand.Intn(math.MaxInt32) + 1 168 vec.Append(float32(v1) / float32(v2)) 169 } 170 case types.T_float64: 171 for i := 0; i < rows; i++ { 172 v1 := rand.Intn(math.MaxInt32) 173 v2 := rand.Intn(math.MaxInt32) + 1 174 vec.Append(float64(v1) / float64(v2)) 175 } 176 case types.T_varchar, types.T_char, types.T_blob, types.T_text: 177 if unique { 178 for i := 0; i < rows; i++ { 179 s := fmt.Sprintf("%d-%d", i, 0) 180 vec.Append([]byte(s)) 181 } 182 } else { 183 for i := 0; i < rows; i++ { 184 s := fmt.Sprintf("%d%d", i, rand.Intn(10000000)) 185 vec.Append([]byte(s)) 186 } 187 } 188 case types.T_datetime: 189 for i := 1; i <= rows; i++ { 190 vec.Append(types.DatetimeFromClock(int32(i*100), 1, 1, 1, 1, 1, 1)) 191 } 192 case types.T_date: 193 for i := 1; i <= rows; i++ { 194 vec.Append(types.DateFromCalendar(int32(i)*100, 1, 1)) 195 } 196 case types.T_time: 197 for i := 1; i <= rows; i++ { 198 vec.Append(types.TimeFromClock(false, 1, 1, 1, 1)) 199 } 200 case types.T_timestamp: 201 for i := int32(1); i <= int32(rows); i++ { 202 vec.Append(types.Timestamp(common.NextGlobalSeqNum())) 203 } 204 case types.T_decimal64: 205 for i := int32(1); i <= int32(rows); i++ { 206 d, _ := types.InitDecimal64UsingUint(common.NextGlobalSeqNum(), 64, 0) 207 vec.Append(d) 208 } 209 case types.T_decimal128: 210 for i := int32(1); i <= int32(rows); i++ { 211 d, _ := types.InitDecimal128UsingUint(common.NextGlobalSeqNum(), 64, 0) 212 vec.Append(d) 213 } 214 case types.T_TS: 215 for i := int32(1); i <= int32(rows); i++ { 216 vec.Append(types.BuildTS(int64(i+1), uint32(i%16))) 217 } 218 case types.T_Rowid: 219 for i := int32(1); i <= int32(rows); i++ { 220 vec.Append(types.BuildRowid(int64(i+1), int64(i))) 221 } 222 223 default: 224 panic("not supported") 225 } 226 return 227 } 228 229 func MockVector2(typ types.Type, rows int, offset int) Vector { 230 vec := MakeVector(typ, true) 231 switch typ.Oid { 232 case types.T_bool: 233 for i := 0; i < rows; i++ { 234 if i%2 == 0 { 235 vec.Append(true) 236 } else { 237 vec.Append(false) 238 } 239 } 240 case types.T_int8: 241 for i := 0; i < rows; i++ { 242 vec.Append(int8(i + offset)) 243 } 244 case types.T_int16: 245 for i := 0; i < rows; i++ { 246 vec.Append(int16(i + offset)) 247 } 248 case types.T_int32: 249 for i := 0; i < rows; i++ { 250 vec.Append(int32(i + offset)) 251 } 252 case types.T_int64: 253 for i := 0; i < rows; i++ { 254 vec.Append(int64(i + offset)) 255 } 256 case types.T_uint8: 257 for i := 0; i < rows; i++ { 258 vec.Append(uint8(i + offset)) 259 } 260 case types.T_uint16: 261 for i := 0; i < rows; i++ { 262 vec.Append(uint16(i + offset)) 263 } 264 case types.T_uint32: 265 for i := 0; i < rows; i++ { 266 vec.Append(uint32(i + offset)) 267 } 268 case types.T_uint64: 269 for i := 0; i < rows; i++ { 270 vec.Append(uint64(i + offset)) 271 } 272 case types.T_float32: 273 for i := 0; i < rows; i++ { 274 vec.Append(float32(i + offset)) 275 } 276 case types.T_float64: 277 for i := 0; i < rows; i++ { 278 vec.Append(float64(i + offset)) 279 } 280 case types.T_decimal64: 281 for i := 0; i < rows; i++ { 282 d, _ := types.InitDecimal64(int64(i+offset), 64, 0) 283 vec.Append(d) 284 } 285 case types.T_decimal128: 286 for i := 0; i < rows; i++ { 287 d, _ := types.InitDecimal128(int64(i+offset), 64, 0) 288 vec.Append(d) 289 } 290 case types.T_timestamp: 291 for i := 0; i < rows; i++ { 292 vec.Append(types.Timestamp(i + offset)) 293 } 294 case types.T_date: 295 for i := 0; i < rows; i++ { 296 vec.Append(types.Date(i + offset)) 297 } 298 case types.T_time: 299 for i := 0; i < rows; i++ { 300 vec.Append(types.Time(i + offset)) 301 } 302 case types.T_datetime: 303 for i := 0; i < rows; i++ { 304 vec.Append(types.Datetime(i + offset)) 305 } 306 case types.T_char, types.T_varchar, types.T_blob, types.T_text: 307 for i := 0; i < rows; i++ { 308 vec.Append([]byte(strconv.Itoa(i + offset))) 309 } 310 default: 311 panic("not support") 312 } 313 return vec 314 } 315 316 func MockVector3(typ types.Type, rows int) Vector { 317 vec := MakeVector(typ, true) 318 switch typ.Oid { 319 case types.T_int32: 320 for i := 0; i < rows; i++ { 321 vec.Append(int32(rows)) 322 } 323 case types.T_int64: 324 for i := 0; i < rows; i++ { 325 vec.Append(int64(rows)) 326 } 327 case types.T_uint32: 328 for i := 0; i < rows; i++ { 329 vec.Append(uint32(i)) 330 vec.Append(uint32(i)) 331 i++ 332 } 333 case types.T_uint64: 334 for i := 0; i < rows; i++ { 335 vec.Append(uint64(rows)) 336 } 337 default: 338 panic("not support") 339 } 340 return vec 341 } 342 343 func MockBatchWithAttrs(vecTypes []types.Type, attrs []string, nullables []bool, rows int, uniqueIdx int, provider *MockDataProvider) (bat *Batch) { 344 bat = MockNullableBatch(vecTypes, nullables, rows, uniqueIdx, provider) 345 bat.Attrs = attrs 346 return 347 } 348 349 func MockNullableBatch(vecTypes []types.Type, nullables []bool, rows int, uniqueIdx int, provider *MockDataProvider) (bat *Batch) { 350 bat = NewEmptyBatch() 351 for idx := range vecTypes { 352 attr := "mock_" + strconv.Itoa(idx) 353 unique := uniqueIdx == idx 354 vec := MockVector(vecTypes[idx], rows, unique, nullables[idx], provider.GetColumnProvider(idx)) 355 bat.AddVector(attr, vec) 356 } 357 return bat 358 } 359 360 func MockBatch(vecTypes []types.Type, rows int, uniqueIdx int, provider *MockDataProvider) (bat *Batch) { 361 bat = NewEmptyBatch() 362 for idx := range vecTypes { 363 attr := "mock_" + strconv.Itoa(idx) 364 unique := uniqueIdx == idx 365 nullable := !unique 366 vec := MockVector(vecTypes[idx], rows, unique, nullable, provider.GetColumnProvider(idx)) 367 bat.AddVector(attr, vec) 368 } 369 return bat 370 } 371 372 type compressedFileInfo struct { 373 size int64 374 osize int64 375 algo int 376 } 377 378 func (i *compressedFileInfo) Name() string { return "" } 379 func (i *compressedFileInfo) Size() int64 { return i.size } 380 func (i *compressedFileInfo) OriginSize() int64 { return i.osize } 381 func (i *compressedFileInfo) CompressAlgo() int { return i.algo } 382 383 type mockCompressedFile struct { 384 stat compressedFileInfo 385 buf []byte 386 } 387 388 func (f *mockCompressedFile) Read(p []byte) (n int, err error) { 389 copy(p, f.buf) 390 n = len(f.buf) 391 return 392 } 393 394 func (f *mockCompressedFile) Ref() {} 395 func (f *mockCompressedFile) Unref() {} 396 func (f *mockCompressedFile) RefCount() int64 { return 0 } 397 func (f *mockCompressedFile) Stat() common.FileInfo { return &f.stat } 398 func (f *mockCompressedFile) GetFileType() common.FileType { return common.MemFile } 399 400 func MockCompressedFile(buf []byte, osize int, algo int) common.IVFile { 401 return &mockCompressedFile{ 402 stat: compressedFileInfo{ 403 size: int64(len(buf)), 404 osize: int64(osize), 405 algo: algo, 406 }, 407 buf: buf, 408 } 409 }