github.com/whtcorpsinc/milevadb-prod@v0.0.0-20211104133533-f57f4be3b597/causetstore/milevadb-server/statistics/histogram_test.go (about)

     1  // Copyright 2020 WHTCORPS INC, Inc.
     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  // See the License for the specific language governing permissions and
    12  // limitations under the License.
    13  
    14  package statistics
    15  
    16  import (
    17  	. "github.com/whtcorpsinc/check"
    18  	"github.com/whtcorpsinc/BerolinaSQL/perceptron"
    19  	"github.com/whtcorpsinc/BerolinaSQL/allegrosql"
    20  	"github.com/whtcorpsinc/milevadb/types"
    21  	"github.com/whtcorpsinc/milevadb/soliton/chunk"
    22  	"github.com/whtcorpsinc/milevadb/soliton/codec"
    23  	"github.com/whtcorpsinc/milevadb/soliton/mock"
    24  	"github.com/whtcorpsinc/milevadb/soliton/ranger"
    25  )
    26  
    27  func (s *testStatisticsSuite) TestNewHistogramBySelectivity(c *C) {
    28  	coll := &HistDefCausl{
    29  		Count:   330,
    30  		DeferredCausets: make(map[int64]*DeferredCauset),
    31  		Indices: make(map[int64]*Index),
    32  	}
    33  	ctx := mock.NewContext()
    34  	sc := ctx.GetStochastikVars().StmtCtx
    35  	intDefCaus := &DeferredCauset{}
    36  	intDefCaus.Histogram = *NewHistogram(1, 30, 30, 0, types.NewFieldType(allegrosql.TypeLonglong), chunk.InitialCapacity, 0)
    37  	intDefCaus.IsHandle = true
    38  	for i := 0; i < 10; i++ {
    39  		intDefCaus.Bounds.AppendInt64(0, int64(i*3))
    40  		intDefCaus.Bounds.AppendInt64(0, int64(i*3+2))
    41  		intDefCaus.Buckets = append(intDefCaus.Buckets, Bucket{Repeat: 10, Count: int64(30*i + 30)})
    42  	}
    43  	coll.DeferredCausets[1] = intDefCaus
    44  	node := &StatsNode{ID: 1, Tp: PkType, Selectivity: 0.56}
    45  	node.Ranges = append(node.Ranges, &ranger.Range{LowVal: types.MakeCausets(nil), HighVal: types.MakeCausets(nil)})
    46  	node.Ranges = append(node.Ranges, &ranger.Range{LowVal: []types.Causet{types.MinNotNullCauset()}, HighVal: types.MakeCausets(2)})
    47  	node.Ranges = append(node.Ranges, &ranger.Range{LowVal: types.MakeCausets(5), HighVal: types.MakeCausets(6)})
    48  	node.Ranges = append(node.Ranges, &ranger.Range{LowVal: types.MakeCausets(8), HighVal: types.MakeCausets(10)})
    49  	node.Ranges = append(node.Ranges, &ranger.Range{LowVal: types.MakeCausets(13), HighVal: types.MakeCausets(13)})
    50  	node.Ranges = append(node.Ranges, &ranger.Range{LowVal: types.MakeCausets(25), HighVal: []types.Causet{types.MaxValueCauset()}})
    51  	intDefCausResult := `column:1 ndv:16 totDefCausSize:0
    52  num: 30 lower_bound: 0 upper_bound: 2 repeats: 10
    53  num: 11 lower_bound: 6 upper_bound: 8 repeats: 0
    54  num: 30 lower_bound: 9 upper_bound: 11 repeats: 0
    55  num: 1 lower_bound: 12 upper_bound: 14 repeats: 0
    56  num: 30 lower_bound: 27 upper_bound: 29 repeats: 0`
    57  
    58  	stringDefCaus := &DeferredCauset{}
    59  	stringDefCaus.Histogram = *NewHistogram(2, 15, 30, 0, types.NewFieldType(allegrosql.TypeString), chunk.InitialCapacity, 0)
    60  	stringDefCaus.Bounds.AppendString(0, "a")
    61  	stringDefCaus.Bounds.AppendString(0, "aaaabbbb")
    62  	stringDefCaus.Buckets = append(stringDefCaus.Buckets, Bucket{Repeat: 10, Count: 60})
    63  	stringDefCaus.Bounds.AppendString(0, "bbbb")
    64  	stringDefCaus.Bounds.AppendString(0, "fdsfdsfds")
    65  	stringDefCaus.Buckets = append(stringDefCaus.Buckets, Bucket{Repeat: 10, Count: 120})
    66  	stringDefCaus.Bounds.AppendString(0, "kkkkk")
    67  	stringDefCaus.Bounds.AppendString(0, "ooooo")
    68  	stringDefCaus.Buckets = append(stringDefCaus.Buckets, Bucket{Repeat: 10, Count: 180})
    69  	stringDefCaus.Bounds.AppendString(0, "oooooo")
    70  	stringDefCaus.Bounds.AppendString(0, "sssss")
    71  	stringDefCaus.Buckets = append(stringDefCaus.Buckets, Bucket{Repeat: 10, Count: 240})
    72  	stringDefCaus.Bounds.AppendString(0, "ssssssu")
    73  	stringDefCaus.Bounds.AppendString(0, "yyyyy")
    74  	stringDefCaus.Buckets = append(stringDefCaus.Buckets, Bucket{Repeat: 10, Count: 300})
    75  	stringDefCaus.PreCalculateScalar()
    76  	coll.DeferredCausets[2] = stringDefCaus
    77  	node2 := &StatsNode{ID: 2, Tp: DefCausType, Selectivity: 0.6}
    78  	node2.Ranges = append(node2.Ranges, &ranger.Range{LowVal: types.MakeCausets(nil), HighVal: types.MakeCausets(nil)})
    79  	node2.Ranges = append(node2.Ranges, &ranger.Range{LowVal: []types.Causet{types.MinNotNullCauset()}, HighVal: types.MakeCausets("aaa")})
    80  	node2.Ranges = append(node2.Ranges, &ranger.Range{LowVal: types.MakeCausets("aaaaaaaaaaa"), HighVal: types.MakeCausets("aaaaaaaaaaaaaa")})
    81  	node2.Ranges = append(node2.Ranges, &ranger.Range{LowVal: types.MakeCausets("bbb"), HighVal: types.MakeCausets("cccc")})
    82  	node2.Ranges = append(node2.Ranges, &ranger.Range{LowVal: types.MakeCausets("ddd"), HighVal: types.MakeCausets("fff")})
    83  	node2.Ranges = append(node2.Ranges, &ranger.Range{LowVal: types.MakeCausets("ggg"), HighVal: []types.Causet{types.MaxValueCauset()}})
    84  	stringDefCausResult := `column:2 ndv:9 totDefCausSize:0
    85  num: 60 lower_bound: a upper_bound: aaaabbbb repeats: 0
    86  num: 52 lower_bound: bbbb upper_bound: fdsfdsfds repeats: 0
    87  num: 54 lower_bound: kkkkk upper_bound: ooooo repeats: 0
    88  num: 60 lower_bound: oooooo upper_bound: sssss repeats: 0
    89  num: 60 lower_bound: ssssssu upper_bound: yyyyy repeats: 0`
    90  
    91  	newDefCausl := coll.NewHistDefCauslBySelectivity(sc, []*StatsNode{node, node2})
    92  	c.Assert(newDefCausl.DeferredCausets[1].String(), Equals, intDefCausResult)
    93  	c.Assert(newDefCausl.DeferredCausets[2].String(), Equals, stringDefCausResult)
    94  
    95  	idx := &Index{Info: &perceptron.IndexInfo{DeferredCausets: []*perceptron.IndexDeferredCauset{{Name: perceptron.NewCIStr("a"), Offset: 0}}}}
    96  	coll.Indices[0] = idx
    97  	idx.Histogram = *NewHistogram(0, 15, 0, 0, types.NewFieldType(allegrosql.TypeBlob), 0, 0)
    98  	for i := 0; i < 5; i++ {
    99  		low, err1 := codec.EncodeKey(sc, nil, types.NewIntCauset(int64(i*3)))
   100  		c.Assert(err1, IsNil, Commentf("Test failed: %v", err1))
   101  		high, err2 := codec.EncodeKey(sc, nil, types.NewIntCauset(int64(i*3+2)))
   102  		c.Assert(err2, IsNil, Commentf("Test failed: %v", err2))
   103  		idx.Bounds.AppendBytes(0, low)
   104  		idx.Bounds.AppendBytes(0, high)
   105  		idx.Buckets = append(idx.Buckets, Bucket{Repeat: 10, Count: int64(30*i + 30)})
   106  	}
   107  	idx.PreCalculateScalar()
   108  	node3 := &StatsNode{ID: 0, Tp: IndexType, Selectivity: 0.47}
   109  	node3.Ranges = append(node3.Ranges, &ranger.Range{LowVal: types.MakeCausets(2), HighVal: types.MakeCausets(3)})
   110  	node3.Ranges = append(node3.Ranges, &ranger.Range{LowVal: types.MakeCausets(10), HighVal: types.MakeCausets(13)})
   111  
   112  	idxResult := `index:0 ndv:7
   113  num: 30 lower_bound: 0 upper_bound: 2 repeats: 10
   114  num: 30 lower_bound: 3 upper_bound: 5 repeats: 10
   115  num: 30 lower_bound: 9 upper_bound: 11 repeats: 10
   116  num: 30 lower_bound: 12 upper_bound: 14 repeats: 10`
   117  
   118  	newDefCausl = coll.NewHistDefCauslBySelectivity(sc, []*StatsNode{node3})
   119  	c.Assert(newDefCausl.Indices[0].String(), Equals, idxResult)
   120  }
   121  
   122  func (s *testStatisticsSuite) TestTruncateHistogram(c *C) {
   123  	hist := NewHistogram(0, 0, 0, 0, types.NewFieldType(allegrosql.TypeLonglong), 1, 0)
   124  	low, high := types.NewIntCauset(0), types.NewIntCauset(1)
   125  	hist.AppendBucket(&low, &high, 0, 1)
   126  	newHist := hist.TruncateHistogram(1)
   127  	c.Assert(HistogramEqual(hist, newHist, true), IsTrue)
   128  	newHist = hist.TruncateHistogram(0)
   129  	c.Assert(newHist.Len(), Equals, 0)
   130  }
   131  
   132  func (s *testStatisticsSuite) TestValueToString4InvalidKey(c *C) {
   133  	bytes, err := codec.EncodeKey(nil, nil, types.NewCauset(1), types.NewCauset(0.5))
   134  	c.Assert(err, IsNil)
   135  	// Append invalid flag.
   136  	bytes = append(bytes, 20)
   137  	causet := types.NewCauset(bytes)
   138  	res, err := ValueToString(nil, &causet, 3, nil)
   139  	c.Assert(err, IsNil)
   140  	c.Assert(res, Equals, "(1, 0.5, \x14)")
   141  }