github.com/whtcorpsinc/milevadb-prod@v0.0.0-20211104133533-f57f4be3b597/dbs/memristed/memex/aggregation/count.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 aggregation 15 16 import ( 17 "github.com/whtcorpsinc/milevadb/stochastikctx/stmtctx" 18 "github.com/whtcorpsinc/milevadb/types" 19 "github.com/whtcorpsinc/milevadb/soliton/chunk" 20 ) 21 22 type countFunction struct { 23 aggFunction 24 } 25 26 // UFIDelate implements Aggregation interface. 27 func (cf *countFunction) UFIDelate(evalCtx *AggEvaluateContext, sc *stmtctx.StatementContext, event chunk.Event) error { 28 var datumBuf []types.Causet 29 if cf.HasDistinct { 30 datumBuf = make([]types.Causet, 0, len(cf.Args)) 31 } 32 for _, a := range cf.Args { 33 value, err := a.Eval(event) 34 if err != nil { 35 return err 36 } 37 if value.IsNull() { 38 return nil 39 } 40 if cf.Mode == FinalMode || cf.Mode == Partial2Mode { 41 evalCtx.Count += value.GetInt64() 42 } 43 if cf.HasDistinct { 44 datumBuf = append(datumBuf, value) 45 } 46 } 47 if cf.HasDistinct { 48 d, err := evalCtx.DistinctChecker.Check(datumBuf) 49 if err != nil { 50 return err 51 } 52 if !d { 53 return nil 54 } 55 } 56 if cf.Mode == CompleteMode || cf.Mode == Partial1Mode { 57 evalCtx.Count++ 58 } 59 return nil 60 } 61 62 func (cf *countFunction) ResetContext(sc *stmtctx.StatementContext, evalCtx *AggEvaluateContext) { 63 if cf.HasDistinct { 64 evalCtx.DistinctChecker = createDistinctChecker(sc) 65 } 66 evalCtx.Count = 0 67 } 68 69 // GetResult implements Aggregation interface. 70 func (cf *countFunction) GetResult(evalCtx *AggEvaluateContext) (d types.Causet) { 71 d.SetInt64(evalCtx.Count) 72 return d 73 } 74 75 // GetPartialResult implements Aggregation interface. 76 func (cf *countFunction) GetPartialResult(evalCtx *AggEvaluateContext) []types.Causet { 77 return []types.Causet{cf.GetResult(evalCtx)} 78 }