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  }