blob: 3a46b3c0ca210845da39f76b48e06ff9e23b403f [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you 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.
*/
#ifndef DBCOMMON_SRC_DBCOMMON_FUNCTION_AGG_FUNC_H_
#define DBCOMMON_SRC_DBCOMMON_FUNCTION_AGG_FUNC_H_
#include <memory>
#include <string>
#include <vector>
#include "dbcommon/function/invoker.h"
#include "dbcommon/type/decimal.h"
#include "dbcommon/utils/flat-memory-buffer.h"
#include "dbcommon/utils/macro.h"
namespace dbcommon {
struct AccPrimitiveTransData {
Datum value;
bool isNotNull;
};
struct AvgPrimitiveTransData {
double sum;
uint64_t count;
// the order of sum and count affect the final function call
};
union AggPrimitiveGroupValue {
AccPrimitiveTransData accVal;
AvgPrimitiveTransData avgVal;
};
struct AccDecimalTransData {
DecimalVar value;
bool isNotNull;
};
struct AvgDecimalTransData {
DecimalVar sum;
uint64_t count;
};
union AggDecimalGroupValue {
AccDecimalTransData accVal;
AvgDecimalTransData avgVal;
};
struct AccTimestampTransData {
Timestamp value;
bool isNotNull;
uint64_t padding;
};
union AggTimestampGroupValue {
AccTimestampTransData accVal;
};
struct StrTransData {
uint64_t length;
char str[];
};
union AccStringTransData {
StrTransData *value;
void *isNotNull; // a dummy to keep consistent with other AccTransData
};
union AggStringGroupValue {
AccStringTransData accVal;
};
class AggGroupValues {
public:
AggGroupValues() {}
virtual ~AggGroupValues() {}
virtual bool isSmallScale() = 0;
virtual uint64_t size() = 0;
virtual void resize(uint64_t newSize) = 0;
virtual double getMemUsed() = 0;
// @return true when used as average data but not accumulate data
bool isAvgData() { return isAvgData_; }
void setisAvgData(bool isAvgData) { isAvgData_ = isAvgData; }
virtual bool isString() { return false; }
virtual bool isDecimal() { return false; }
virtual bool isTimestamp() { return false; }
virtual bool isPrimitive() { return false; }
static force_inline StrTransData *newStrTransData(
const char *__restrict__ str, uint64_t length) {
char *buf = cnmalloc(sizeof(length) + length);
StrTransData *ret = reinterpret_cast<StrTransData *>(buf);
ret->length = length;
char *__restrict__ ptr = ret->str;
char *ptrEnd = ptr + length;
while (ptr < ptrEnd) {
*ptr++ = *str++;
}
return ret;
}
private:
bool isAvgData_ = false;
};
template <typename AggGroupValue>
class AggGroupValuesTemplate : public AggGroupValues {
public:
bool isSmallScale() override {
#ifdef NDEBUG
return size() <= MaxSingleBlkGroupNum;
#else
// Here is a trick for testing in develop environment and code coverage
return size() <= 2;
#endif
}
double getMemUsed() override { return data_.getMemUsed(); }
uint64_t size() override { return data_.size(); }
// Initialize avgVal.count and avgVal.sum to zero
// Initialize accVal.isNotNull to false
void resize(uint64_t newSize) override {
uint64_t oldSize = data_.size();
data_.resize(newSize);
if (newSize > oldSize) data_.memZero(oldSize, newSize);
}
template <typename Accessor>
Accessor getAccessor() {
if (std::is_same<QuickAccessor, Accessor>::value) assert(isSmallScale());
return Accessor(data_);
}
protected:
typedef FlatMemBuf<AggGroupValue, DEFAULT_SIZE_PER_AGG_COUNTER_BLK>
AggGroupValueBuf;
typedef typename AggGroupValueBuf::NormalAccessor Accessor;
typedef typename AggGroupValueBuf::QuickAccessor QuickAccessor;
AggGroupValueBuf data_;
static const uint64_t MaxSingleBlkGroupNum = AggGroupValueBuf::BlkSize;
};
class AggPrimitiveGroupValues
: public AggGroupValuesTemplate<AggPrimitiveGroupValue> {
public:
typedef typename AggGroupValuesTemplate<AggPrimitiveGroupValue>::QuickAccessor
QuickAccessor;
typedef typename AggGroupValuesTemplate<AggPrimitiveGroupValue>::Accessor
Accessor;
virtual bool isPrimitive() { return true; }
};
class AggStringGroupValues
: public AggGroupValuesTemplate<AggStringGroupValue> {
public:
typedef
typename AggGroupValuesTemplate<AggStringGroupValue>::Accessor Accessor;
typedef typename AggGroupValuesTemplate<AggStringGroupValue>::QuickAccessor
QuickAccessor;
~AggStringGroupValues();
bool isString() override { return true; }
};
class AggTimestampGroupValues
: public AggGroupValuesTemplate<AggTimestampGroupValue> {
public:
typedef typename AggGroupValuesTemplate<AggTimestampGroupValue>::Accessor
Accessor;
typedef typename AggGroupValuesTemplate<AggTimestampGroupValue>::QuickAccessor
QuickAccessor;
bool isTimestamp() override { return true; }
};
class AggDecimalGroupValues
: public AggGroupValuesTemplate<AggDecimalGroupValue> {
public:
typedef
typename AggGroupValuesTemplate<AggDecimalGroupValue>::Accessor Accessor;
typedef typename AggGroupValuesTemplate<AggDecimalGroupValue>::QuickAccessor
QuickAccessor;
bool isDecimal() override { return true; }
};
Datum count_star(Datum *params, uint64_t size);
Datum count_inc(Datum *params, uint64_t size);
Datum count_add(Datum *params, uint64_t size);
Datum sum_int8_sum(Datum *params, uint64_t size);
Datum sum_int16_sum(Datum *params, uint64_t size);
Datum sum_int32_sum(Datum *params, uint64_t size);
Datum sum_int64_sum(Datum *params, uint64_t size);
Datum sum_float_sum(Datum *params, uint64_t size);
Datum sum_double_sum(Datum *params, uint64_t size);
Datum sum_decimal_sum(Datum *params, uint64_t size);
Datum sum_int8_add(Datum *params, uint64_t size);
Datum sum_int16_add(Datum *params, uint64_t size);
Datum sum_int32_add(Datum *params, uint64_t size);
Datum sum_int64_add(Datum *params, uint64_t size);
Datum sum_float_add(Datum *params, uint64_t size);
Datum sum_double_add(Datum *params, uint64_t size);
Datum sum_decimal_add(Datum *params, uint64_t size);
Datum avg_int8_accu(Datum *params, uint64_t size);
Datum avg_int16_accu(Datum *params, uint64_t size);
Datum avg_int32_accu(Datum *params, uint64_t size);
Datum avg_int64_accu(Datum *params, uint64_t size);
Datum avg_float_accu(Datum *params, uint64_t size);
Datum avg_double_accu(Datum *params, uint64_t size);
Datum avg_decimal_accu(Datum *params, uint64_t size);
Datum avg_int8_amalg(Datum *params, uint64_t size);
Datum avg_int16_amalg(Datum *params, uint64_t size);
Datum avg_int32_amalg(Datum *params, uint64_t size);
Datum avg_int64_amalg(Datum *params, uint64_t size);
Datum avg_float_amalg(Datum *params, uint64_t size);
Datum avg_double_amalg(Datum *params, uint64_t size);
Datum avg_decimal_amalg(Datum *params, uint64_t size);
Datum avg_double_avg(Datum *params, uint64_t size);
Datum avg_decimal_avg(Datum *params, uint64_t size);
Datum min_int8_smaller(Datum *params, uint64_t size);
Datum min_int16_smaller(Datum *params, uint64_t size);
Datum min_int32_smaller(Datum *params, uint64_t size);
Datum min_int64_smaller(Datum *params, uint64_t size);
Datum min_float_smaller(Datum *params, uint64_t size);
Datum min_double_smaller(Datum *params, uint64_t size);
Datum min_string_smaller(Datum *params, uint64_t size);
Datum min_date_smaller(Datum *params, uint64_t size);
Datum min_time_smaller(Datum *params, uint64_t size);
Datum min_timestamp_smaller(Datum *params, uint64_t size);
Datum min_decimal_smaller(Datum *params, uint64_t size);
Datum max_int8_larger(Datum *params, uint64_t size);
Datum max_int16_larger(Datum *params, uint64_t size);
Datum max_int32_larger(Datum *params, uint64_t size);
Datum max_int64_larger(Datum *params, uint64_t size);
Datum max_float_larger(Datum *params, uint64_t size);
Datum max_double_larger(Datum *params, uint64_t size);
Datum max_string_larger(Datum *params, uint64_t size);
Datum max_date_larger(Datum *params, uint64_t size);
Datum max_time_larger(Datum *params, uint64_t size);
Datum max_timestamp_larger(Datum *params, uint64_t size);
Datum max_decimal_larger(Datum *params, uint64_t size);
} // namespace dbcommon
#endif // DBCOMMON_SRC_DBCOMMON_FUNCTION_AGG_FUNC_H_