Files
tidb/executor/aggfuncs/func_count_test.go

67 lines
2.5 KiB
Go

// Copyright 2018 PingCAP, Inc.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// See the License for the specific language governing permissions and
// limitations under the License.
package aggfuncs_test
import (
. "github.com/pingcap/check"
"github.com/pingcap/parser/ast"
"github.com/pingcap/parser/mysql"
"github.com/pingcap/tidb/executor/aggfuncs"
"github.com/pingcap/tidb/expression"
"github.com/pingcap/tidb/expression/aggregation"
"github.com/pingcap/tidb/types"
"github.com/pingcap/tidb/util/chunk"
)
func (s *testSuite) TestMergePartialResult4Count(c *C) {
srcChk := chunk.NewChunkWithCapacity([]*types.FieldType{types.NewFieldType(mysql.TypeLonglong)}, 5)
for i := int64(0); i < 5; i++ {
srcChk.AppendInt64(0, i)
}
iter := chunk.NewIterator4Chunk(srcChk)
args := []expression.Expression{&expression.Column{RetType: types.NewFieldType(mysql.TypeLong), Index: 0}}
desc := aggregation.NewAggFuncDesc(s.ctx, ast.AggFuncCount, args, false)
partialDesc, finalDesc := desc.Split([]int{0})
// build count func for partial phase.
partialCountFunc := aggfuncs.Build(s.ctx, partialDesc, 0)
partialPr1 := partialCountFunc.AllocPartialResult()
// build final func for final phase.
finalCountFunc := aggfuncs.Build(s.ctx, finalDesc, 0)
finalPr := finalCountFunc.AllocPartialResult()
resultChk := chunk.NewChunkWithCapacity([]*types.FieldType{types.NewFieldType(mysql.TypeLonglong)}, 1)
// update partial result.
for row := iter.Begin(); row != iter.End(); row = iter.Next() {
partialCountFunc.UpdatePartialResult(s.ctx, []chunk.Row{row}, partialPr1)
}
partialCountFunc.AppendFinalResult2Chunk(s.ctx, partialPr1, resultChk)
c.Assert(resultChk.GetRow(0).GetInt64(0), Equals, int64(5))
// suppose there are two partial workers.
partialPr2 := partialPr1
// merge two partial results.
err := finalCountFunc.MergePartialResult(s.ctx, partialPr1, finalPr)
c.Assert(err, IsNil)
err = finalCountFunc.MergePartialResult(s.ctx, partialPr2, finalPr)
c.Assert(err, IsNil)
resultChk.Reset()
err = finalCountFunc.AppendFinalResult2Chunk(s.ctx, finalPr, resultChk)
c.Assert(err, IsNil)
c.Assert(resultChk.GetRow(0).GetInt64(0), Equals, int64(10))
}