// Copyright 2023 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, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package aggfuncs import ( util "github.com/pingcap/tidb/pkg/util/serialization" ) // SerializeHelper is the helper for serializing agg function meta data. type SerializeHelper struct { buf []byte } // NewSerializeHelper creates a new SerializeHelper func NewSerializeHelper() *SerializeHelper { return &SerializeHelper{ buf: make([]byte, 0, 64), } } func (s *SerializeHelper) serializePartialResult4Count(value partialResult4Count) []byte { s.buf = s.buf[:0] return util.SerializeInt64(value, s.buf) } func (s *SerializeHelper) serializePartialResult4MaxMinInt(value partialResult4MaxMinInt) []byte { s.buf = s.buf[:0] s.buf = util.SerializeBool(value.isNull, s.buf) return util.SerializeInt64(value.val, s.buf) } func (s *SerializeHelper) serializePartialResult4MaxMinUint(value partialResult4MaxMinUint) []byte { s.buf = s.buf[:0] s.buf = util.SerializeBool(value.isNull, s.buf) return util.SerializeUint64(value.val, s.buf) } func (s *SerializeHelper) serializePartialResult4MaxMinDecimal(value partialResult4MaxMinDecimal) []byte { s.buf = s.buf[:0] s.buf = util.SerializeBool(value.isNull, s.buf) return util.SerializeMyDecimal(&value.val, s.buf) } func (s *SerializeHelper) serializePartialResult4MaxMinFloat32(value partialResult4MaxMinFloat32) []byte { s.buf = s.buf[:0] s.buf = util.SerializeBool(value.isNull, s.buf) return util.SerializeFloat32(value.val, s.buf) } func (s *SerializeHelper) serializePartialResult4MaxMinFloat64(value partialResult4MaxMinFloat64) []byte { s.buf = s.buf[:0] s.buf = util.SerializeBool(value.isNull, s.buf) return util.SerializeFloat64(value.val, s.buf) } func (s *SerializeHelper) serializePartialResult4MaxMinTime(value partialResult4MaxMinTime) []byte { s.buf = s.buf[:0] s.buf = util.SerializeBool(value.isNull, s.buf) return util.SerializeTime(value.val, s.buf) } func (s *SerializeHelper) serializePartialResult4MaxMinDuration(value partialResult4MaxMinDuration) []byte { s.buf = s.buf[:0] s.buf = util.SerializeBool(value.isNull, s.buf) return util.SerializeTypesDuration(value.val, s.buf) } func (s *SerializeHelper) serializePartialResult4MaxMinString(value partialResult4MaxMinString) []byte { s.buf = s.buf[:0] s.buf = util.SerializeBool(value.isNull, s.buf) s.buf = util.SerializeString(value.val, s.buf) return s.buf } func (s *SerializeHelper) serializePartialResult4MaxMinJSON(value partialResult4MaxMinJSON) []byte { s.buf = s.buf[:0] s.buf = util.SerializeBool(value.isNull, s.buf) s.buf = util.SerializeBinaryJSON(&value.val, s.buf) return s.buf } func (s *SerializeHelper) serializePartialResult4MaxMinEnum(value partialResult4MaxMinEnum) []byte { s.buf = s.buf[:0] s.buf = util.SerializeBool(value.isNull, s.buf) s.buf = util.SerializeEnum(&value.val, s.buf) return s.buf } func (s *SerializeHelper) serializePartialResult4MaxMinSet(value partialResult4MaxMinSet) []byte { s.buf = s.buf[:0] s.buf = util.SerializeBool(value.isNull, s.buf) s.buf = util.SerializeSet(&value.val, s.buf) return s.buf } func (s *SerializeHelper) serializePartialResult4AvgDecimal(value partialResult4AvgDecimal) []byte { s.buf = s.buf[:0] s.buf = util.SerializeMyDecimal(&value.sum, s.buf) return util.SerializeInt64(value.count, s.buf) } func (s *SerializeHelper) serializePartialResult4AvgFloat64(value partialResult4AvgFloat64) []byte { s.buf = s.buf[:0] s.buf = util.SerializeFloat64(value.sum, s.buf) return util.SerializeInt64(value.count, s.buf) } func (s *SerializeHelper) serializePartialResult4SumDecimal(value partialResult4SumDecimal) []byte { s.buf = s.buf[:0] s.buf = util.SerializeMyDecimal(&value.val, s.buf) return util.SerializeInt64(value.notNullRowCount, s.buf) } func (s *SerializeHelper) serializePartialResult4SumFloat64(value partialResult4SumFloat64) []byte { s.buf = s.buf[:0] s.buf = util.SerializeFloat64(value.val, s.buf) return util.SerializeInt64(value.notNullRowCount, s.buf) } func (s *SerializeHelper) serializeBasePartialResult4GroupConcat(value basePartialResult4GroupConcat) []byte { s.buf = s.buf[:0] if value.buffer != nil { s.buf = util.SerializeBool(true, s.buf) s.buf = util.SerializeBytesBuffer(value.buffer, s.buf) } else { s.buf = util.SerializeBool(false, s.buf) } return s.buf } func (s *SerializeHelper) serializePartialResult4GroupConcat(value partialResult4GroupConcat) []byte { return s.serializeBasePartialResult4GroupConcat(basePartialResult4GroupConcat{ valsBuf: value.valsBuf, buffer: value.buffer, }) } func (s *SerializeHelper) serializePartialResult4BitFunc(value partialResult4BitFunc) []byte { return util.SerializeUint64(value, s.buf[:0]) } func (s *SerializeHelper) serializePartialResult4JsonArrayagg(value partialResult4JsonArrayagg) []byte { s.buf = s.buf[:0] for _, value := range value.entries { s.buf = util.SerializeInterface(value, s.buf) } return s.buf } func (s *SerializeHelper) serializePartialResult4JsonObjectAgg(value partialResult4JsonObjectAgg) []byte { s.buf = s.buf[:0] for key, value := range value.entries { s.buf = util.SerializeString(key, s.buf) s.buf = util.SerializeInterface(value, s.buf) } return s.buf } func (s *SerializeHelper) serializeBasePartialResult4FirstRow(value basePartialResult4FirstRow) []byte { s.buf = s.buf[:0] s.buf = util.SerializeBool(value.isNull, s.buf) return util.SerializeBool(value.gotFirstRow, s.buf) } func (s *SerializeHelper) serializePartialResult4FirstRowDecimal(value partialResult4FirstRowDecimal) []byte { s.buf = s.serializeBasePartialResult4FirstRow(value.basePartialResult4FirstRow) return util.SerializeMyDecimal(&value.val, s.buf) } func (s *SerializeHelper) serializePartialResult4FirstRowInt(value partialResult4FirstRowInt) []byte { s.buf = s.serializeBasePartialResult4FirstRow(value.basePartialResult4FirstRow) return util.SerializeInt64(value.val, s.buf) } func (s *SerializeHelper) serializePartialResult4FirstRowTime(value partialResult4FirstRowTime) []byte { s.buf = s.serializeBasePartialResult4FirstRow(value.basePartialResult4FirstRow) return util.SerializeTime(value.val, s.buf) } func (s *SerializeHelper) serializePartialResult4FirstRowString(value partialResult4FirstRowString) []byte { s.buf = s.serializeBasePartialResult4FirstRow(value.basePartialResult4FirstRow) s.buf = util.SerializeString(value.val, s.buf) return s.buf } func (s *SerializeHelper) serializePartialResult4FirstRowFloat32(value partialResult4FirstRowFloat32) []byte { s.buf = s.serializeBasePartialResult4FirstRow(value.basePartialResult4FirstRow) return util.SerializeFloat32(value.val, s.buf) } func (s *SerializeHelper) serializePartialResult4FirstRowFloat64(value partialResult4FirstRowFloat64) []byte { s.buf = s.serializeBasePartialResult4FirstRow(value.basePartialResult4FirstRow) return util.SerializeFloat64(value.val, s.buf) } func (s *SerializeHelper) serializePartialResult4FirstRowDuration(value partialResult4FirstRowDuration) []byte { s.buf = s.serializeBasePartialResult4FirstRow(value.basePartialResult4FirstRow) s.buf = util.SerializeInt64(int64(value.val.Duration), s.buf) return util.SerializeInt(value.val.Fsp, s.buf) } func (s *SerializeHelper) serializePartialResult4FirstRowJSON(value partialResult4FirstRowJSON) []byte { s.buf = s.serializeBasePartialResult4FirstRow(value.basePartialResult4FirstRow) s.buf = util.SerializeBinaryJSON(&value.val, s.buf) return s.buf } func (s *SerializeHelper) serializePartialResult4FirstRowEnum(value partialResult4FirstRowEnum) []byte { s.buf = s.serializeBasePartialResult4FirstRow(value.basePartialResult4FirstRow) s.buf = util.SerializeEnum(&value.val, s.buf) return s.buf } func (s *SerializeHelper) serializePartialResult4FirstRowSet(value partialResult4FirstRowSet) []byte { s.buf = s.serializeBasePartialResult4FirstRow(value.basePartialResult4FirstRow) s.buf = util.SerializeSet(&value.val, s.buf) return s.buf }