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  }