You've already forked mariadb-columnstore-engine
mirror of
https://github.com/mariadb-corporation/mariadb-columnstore-engine.git
synced 2025-07-30 19:23:07 +03:00
clang format apply
This commit is contained in:
@ -16,10 +16,10 @@
|
||||
MA 02110-1301, USA. */
|
||||
|
||||
/***********************************************************************
|
||||
* $Id$
|
||||
*
|
||||
* moda.h
|
||||
***********************************************************************/
|
||||
* $Id$
|
||||
*
|
||||
* moda.h
|
||||
***********************************************************************/
|
||||
|
||||
/**
|
||||
* Columnstore interface for the moda User Defined Aggregate
|
||||
@ -54,231 +54,230 @@
|
||||
|
||||
namespace mcsv1sdk
|
||||
{
|
||||
// A hasher that handles int128_t
|
||||
template<class T>
|
||||
// A hasher that handles int128_t
|
||||
template <class T>
|
||||
struct hasher
|
||||
{
|
||||
inline size_t operator()(T val) const
|
||||
{
|
||||
return fHasher((char*) &val, sizeof(T));
|
||||
}
|
||||
inline size_t operator()(T val) const
|
||||
{
|
||||
return fHasher((char*)&val, sizeof(T));
|
||||
}
|
||||
|
||||
private:
|
||||
utils::Hasher fHasher;
|
||||
private:
|
||||
utils::Hasher fHasher;
|
||||
};
|
||||
|
||||
template<>
|
||||
template <>
|
||||
struct hasher<long double>
|
||||
{
|
||||
inline size_t operator()(long double val) const
|
||||
inline size_t operator()(long double val) const
|
||||
{
|
||||
if (sizeof(long double) == 8) // Probably just MSC, but you never know.
|
||||
{
|
||||
if (sizeof(long double) == 8) // Probably just MSC, but you never know.
|
||||
{
|
||||
return fHasher((char*) &val, sizeof(long double));
|
||||
}
|
||||
else
|
||||
{
|
||||
// For Linux x86_64, long double is stored in 128 bits, but only 80 are significant
|
||||
return fHasher((char*) &val, 10);
|
||||
}
|
||||
return fHasher((char*)&val, sizeof(long double));
|
||||
}
|
||||
private:
|
||||
utils::Hasher fHasher;
|
||||
else
|
||||
{
|
||||
// For Linux x86_64, long double is stored in 128 bits, but only 80 are significant
|
||||
return fHasher((char*)&val, 10);
|
||||
}
|
||||
}
|
||||
|
||||
private:
|
||||
utils::Hasher fHasher;
|
||||
};
|
||||
|
||||
// Override UserData for data storage
|
||||
struct ModaData : public UserData
|
||||
{
|
||||
ModaData() : fMap(NULL),
|
||||
fReturnType((uint32_t)execplan::CalpontSystemCatalog::UNDEFINED),
|
||||
fColWidth(0),
|
||||
modaImpl(NULL)
|
||||
{};
|
||||
ModaData()
|
||||
: fMap(NULL)
|
||||
, fReturnType((uint32_t)execplan::CalpontSystemCatalog::UNDEFINED)
|
||||
, fColWidth(0)
|
||||
, modaImpl(NULL){};
|
||||
|
||||
virtual ~ModaData() {cleanup();}
|
||||
virtual ~ModaData()
|
||||
{
|
||||
cleanup();
|
||||
}
|
||||
|
||||
virtual void serialize(messageqcpp::ByteStream& bs) const;
|
||||
virtual void unserialize(messageqcpp::ByteStream& bs);
|
||||
virtual void serialize(messageqcpp::ByteStream& bs) const;
|
||||
virtual void unserialize(messageqcpp::ByteStream& bs);
|
||||
|
||||
template<class T>
|
||||
std::unordered_map<T, uint32_t, hasher<T> >* getMap()
|
||||
template <class T>
|
||||
std::unordered_map<T, uint32_t, hasher<T> >* getMap()
|
||||
{
|
||||
if (!fMap)
|
||||
{
|
||||
if (!fMap)
|
||||
{
|
||||
// Just in time creation
|
||||
fMap = new std::unordered_map<T, uint32_t, hasher<T> >;
|
||||
}
|
||||
return (std::unordered_map<T, uint32_t, hasher<T> >*) fMap;
|
||||
}
|
||||
|
||||
// The const version is only called by serialize()
|
||||
// It shouldn't (and can't) create a new map.
|
||||
template<class T>
|
||||
std::unordered_map<T, uint32_t, hasher<T> >* getMap() const
|
||||
{
|
||||
return (std::unordered_map<T, uint32_t, hasher<T> >*) fMap;
|
||||
}
|
||||
|
||||
template<class T>
|
||||
void deleteMap()
|
||||
{
|
||||
if (fMap)
|
||||
{
|
||||
delete (std::unordered_map<T, uint32_t, hasher<T> >*) fMap;
|
||||
fMap = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
template<class T>
|
||||
void clear()
|
||||
{
|
||||
fSum = 0.0;
|
||||
fCount = 0;
|
||||
if (fMap)
|
||||
getMap<T>()->clear();
|
||||
// Just in time creation
|
||||
fMap = new std::unordered_map<T, uint32_t, hasher<T> >;
|
||||
}
|
||||
return (std::unordered_map<T, uint32_t, hasher<T> >*)fMap;
|
||||
}
|
||||
|
||||
long double fSum;
|
||||
uint64_t fCount;
|
||||
void* fMap; // Will be of type unordered_map<>
|
||||
uint32_t fReturnType;
|
||||
uint32_t fColWidth;
|
||||
mcsv1_UDAF* modaImpl; // A pointer to one of the Moda_impl_T concrete classes
|
||||
|
||||
private:
|
||||
// For now, copy construction is unwanted
|
||||
ModaData(UserData&);
|
||||
|
||||
void cleanup();
|
||||
|
||||
// Templated map streamers
|
||||
template<class T>
|
||||
void serializeMap(messageqcpp::ByteStream& bs) const
|
||||
// The const version is only called by serialize()
|
||||
// It shouldn't (and can't) create a new map.
|
||||
template <class T>
|
||||
std::unordered_map<T, uint32_t, hasher<T> >* getMap() const
|
||||
{
|
||||
return (std::unordered_map<T, uint32_t, hasher<T> >*)fMap;
|
||||
}
|
||||
|
||||
template <class T>
|
||||
void deleteMap()
|
||||
{
|
||||
if (fMap)
|
||||
{
|
||||
std::unordered_map<T, uint32_t, hasher<T> >* map = getMap<T>();
|
||||
if (map)
|
||||
{
|
||||
typename std::unordered_map<T, uint32_t, hasher<T> >::const_iterator iter;
|
||||
bs << (uint64_t)map->size();
|
||||
for (iter = map->begin(); iter != map->end(); ++iter)
|
||||
{
|
||||
bs << iter->first;
|
||||
bs << iter->second;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
bs << (uint64_t)0;
|
||||
}
|
||||
delete (std::unordered_map<T, uint32_t, hasher<T> >*)fMap;
|
||||
fMap = NULL;
|
||||
}
|
||||
|
||||
template<class T>
|
||||
void unserializeMap(messageqcpp::ByteStream& bs)
|
||||
}
|
||||
|
||||
template <class T>
|
||||
void clear()
|
||||
{
|
||||
fSum = 0.0;
|
||||
fCount = 0;
|
||||
if (fMap)
|
||||
getMap<T>()->clear();
|
||||
}
|
||||
|
||||
long double fSum;
|
||||
uint64_t fCount;
|
||||
void* fMap; // Will be of type unordered_map<>
|
||||
uint32_t fReturnType;
|
||||
uint32_t fColWidth;
|
||||
mcsv1_UDAF* modaImpl; // A pointer to one of the Moda_impl_T concrete classes
|
||||
|
||||
private:
|
||||
// For now, copy construction is unwanted
|
||||
ModaData(UserData&);
|
||||
|
||||
void cleanup();
|
||||
|
||||
// Templated map streamers
|
||||
template <class T>
|
||||
void serializeMap(messageqcpp::ByteStream& bs) const
|
||||
{
|
||||
std::unordered_map<T, uint32_t, hasher<T> >* map = getMap<T>();
|
||||
if (map)
|
||||
{
|
||||
uint32_t cnt;
|
||||
T num;
|
||||
uint64_t sz;
|
||||
bs >> sz;
|
||||
std::unordered_map<T, uint32_t, hasher<T> >* map = getMap<T>();
|
||||
map->clear();
|
||||
for (uint64_t i = 0; i < sz; ++i)
|
||||
{
|
||||
bs >> num;
|
||||
bs >> cnt;
|
||||
(*map)[num] = cnt;
|
||||
}
|
||||
typename std::unordered_map<T, uint32_t, hasher<T> >::const_iterator iter;
|
||||
bs << (uint64_t)map->size();
|
||||
for (iter = map->begin(); iter != map->end(); ++iter)
|
||||
{
|
||||
bs << iter->first;
|
||||
bs << iter->second;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
bs << (uint64_t)0;
|
||||
}
|
||||
}
|
||||
|
||||
template <class T>
|
||||
void unserializeMap(messageqcpp::ByteStream& bs)
|
||||
{
|
||||
uint32_t cnt;
|
||||
T num;
|
||||
uint64_t sz;
|
||||
bs >> sz;
|
||||
std::unordered_map<T, uint32_t, hasher<T> >* map = getMap<T>();
|
||||
map->clear();
|
||||
for (uint64_t i = 0; i < sz; ++i)
|
||||
{
|
||||
bs >> num;
|
||||
bs >> cnt;
|
||||
(*map)[num] = cnt;
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
template<class T>
|
||||
template <class T>
|
||||
class Moda_impl_T : public mcsv1_UDAF
|
||||
{
|
||||
public:
|
||||
// Defaults OK
|
||||
Moda_impl_T() {};
|
||||
virtual ~Moda_impl_T() {};
|
||||
public:
|
||||
// Defaults OK
|
||||
Moda_impl_T(){};
|
||||
virtual ~Moda_impl_T(){};
|
||||
|
||||
virtual mcsv1_UDAF::ReturnCode init(mcsv1Context* context,
|
||||
ColumnDatum* colTypes);
|
||||
virtual mcsv1_UDAF::ReturnCode init(mcsv1Context* context, ColumnDatum* colTypes);
|
||||
|
||||
virtual mcsv1_UDAF::ReturnCode reset(mcsv1Context* context);
|
||||
virtual mcsv1_UDAF::ReturnCode nextValue(mcsv1Context* context, ColumnDatum* valsIn);
|
||||
virtual mcsv1_UDAF::ReturnCode subEvaluate(mcsv1Context* context, const UserData* valIn);
|
||||
virtual mcsv1_UDAF::ReturnCode evaluate(mcsv1Context* context, static_any::any& valOut);
|
||||
virtual mcsv1_UDAF::ReturnCode dropValue(mcsv1Context* context, ColumnDatum* valsDropped);
|
||||
virtual mcsv1_UDAF::ReturnCode reset(mcsv1Context* context);
|
||||
virtual mcsv1_UDAF::ReturnCode nextValue(mcsv1Context* context, ColumnDatum* valsIn);
|
||||
virtual mcsv1_UDAF::ReturnCode subEvaluate(mcsv1Context* context, const UserData* valIn);
|
||||
virtual mcsv1_UDAF::ReturnCode evaluate(mcsv1Context* context, static_any::any& valOut);
|
||||
virtual mcsv1_UDAF::ReturnCode dropValue(mcsv1Context* context, ColumnDatum* valsDropped);
|
||||
|
||||
// Dummy: not used
|
||||
virtual mcsv1_UDAF::ReturnCode createUserData(UserData*& userData, int32_t& length)
|
||||
{
|
||||
return mcsv1_UDAF::SUCCESS;
|
||||
}
|
||||
// Dummy: not used
|
||||
virtual mcsv1_UDAF::ReturnCode createUserData(UserData*& userData, int32_t& length)
|
||||
{
|
||||
return mcsv1_UDAF::SUCCESS;
|
||||
}
|
||||
};
|
||||
|
||||
// moda returns the modal value of the dataset. If more than one value
|
||||
// have the same maximum number of occurances, then the one closest to
|
||||
// AVG wins. If two are the same distance from AVG, then the smaller wins.
|
||||
class moda : public mcsv1_UDAF
|
||||
class moda : public mcsv1_UDAF
|
||||
{
|
||||
public:
|
||||
// Defaults OK
|
||||
moda() : mcsv1_UDAF() {};
|
||||
virtual ~moda() {};
|
||||
public:
|
||||
// Defaults OK
|
||||
moda() : mcsv1_UDAF(){};
|
||||
virtual ~moda(){};
|
||||
|
||||
virtual mcsv1_UDAF::ReturnCode init(mcsv1Context* context,
|
||||
ColumnDatum* colTypes);
|
||||
virtual mcsv1_UDAF::ReturnCode init(mcsv1Context* context, ColumnDatum* colTypes);
|
||||
|
||||
virtual ReturnCode reset(mcsv1Context* context)
|
||||
{
|
||||
return getImpl(context)->reset(context);
|
||||
}
|
||||
virtual ReturnCode reset(mcsv1Context* context)
|
||||
{
|
||||
return getImpl(context)->reset(context);
|
||||
}
|
||||
|
||||
virtual mcsv1_UDAF::ReturnCode nextValue(mcsv1Context* context, ColumnDatum* valsIn)
|
||||
{
|
||||
return getImpl(context)->nextValue(context, valsIn);
|
||||
}
|
||||
virtual mcsv1_UDAF::ReturnCode nextValue(mcsv1Context* context, ColumnDatum* valsIn)
|
||||
{
|
||||
return getImpl(context)->nextValue(context, valsIn);
|
||||
}
|
||||
|
||||
virtual mcsv1_UDAF::ReturnCode subEvaluate(mcsv1Context* context, const UserData* valIn)
|
||||
{
|
||||
return getImpl(context)->subEvaluate(context, valIn);
|
||||
}
|
||||
|
||||
virtual mcsv1_UDAF::ReturnCode evaluate(mcsv1Context* context, static_any::any& valOut)
|
||||
{
|
||||
return getImpl(context)->evaluate(context, valOut);
|
||||
}
|
||||
|
||||
virtual mcsv1_UDAF::ReturnCode dropValue(mcsv1Context* context, ColumnDatum* valsDropped)
|
||||
{
|
||||
return getImpl(context)->dropValue(context, valsDropped);
|
||||
}
|
||||
virtual mcsv1_UDAF::ReturnCode subEvaluate(mcsv1Context* context, const UserData* valIn)
|
||||
{
|
||||
return getImpl(context)->subEvaluate(context, valIn);
|
||||
}
|
||||
|
||||
mcsv1_UDAF::ReturnCode createUserData(UserData*& userData, int32_t& length)
|
||||
{
|
||||
userData = new ModaData;
|
||||
length = sizeof(ModaData);
|
||||
return mcsv1_UDAF::SUCCESS;
|
||||
}
|
||||
virtual mcsv1_UDAF::ReturnCode evaluate(mcsv1Context* context, static_any::any& valOut)
|
||||
{
|
||||
return getImpl(context)->evaluate(context, valOut);
|
||||
}
|
||||
|
||||
mcsv1_UDAF* getImpl(mcsv1Context* context);
|
||||
virtual mcsv1_UDAF::ReturnCode dropValue(mcsv1Context* context, ColumnDatum* valsDropped)
|
||||
{
|
||||
return getImpl(context)->dropValue(context, valsDropped);
|
||||
}
|
||||
|
||||
protected:
|
||||
Moda_impl_T<int8_t> moda_impl_int8;
|
||||
Moda_impl_T<int16_t> moda_impl_int16;
|
||||
Moda_impl_T<int32_t> moda_impl_int32;
|
||||
Moda_impl_T<int64_t> moda_impl_int64;
|
||||
Moda_impl_T<int128_t> moda_impl_int128;
|
||||
Moda_impl_T<uint8_t> moda_impl_uint8;
|
||||
Moda_impl_T<uint16_t> moda_impl_uint16;
|
||||
Moda_impl_T<uint32_t> moda_impl_uint32;
|
||||
Moda_impl_T<uint64_t> moda_impl_uint64;
|
||||
Moda_impl_T<float> moda_impl_float;
|
||||
Moda_impl_T<double> moda_impl_double;
|
||||
Moda_impl_T<long double> moda_impl_longdouble;
|
||||
mcsv1_UDAF::ReturnCode createUserData(UserData*& userData, int32_t& length)
|
||||
{
|
||||
userData = new ModaData;
|
||||
length = sizeof(ModaData);
|
||||
return mcsv1_UDAF::SUCCESS;
|
||||
}
|
||||
|
||||
mcsv1_UDAF* getImpl(mcsv1Context* context);
|
||||
|
||||
protected:
|
||||
Moda_impl_T<int8_t> moda_impl_int8;
|
||||
Moda_impl_T<int16_t> moda_impl_int16;
|
||||
Moda_impl_T<int32_t> moda_impl_int32;
|
||||
Moda_impl_T<int64_t> moda_impl_int64;
|
||||
Moda_impl_T<int128_t> moda_impl_int128;
|
||||
Moda_impl_T<uint8_t> moda_impl_uint8;
|
||||
Moda_impl_T<uint16_t> moda_impl_uint16;
|
||||
Moda_impl_T<uint32_t> moda_impl_uint32;
|
||||
Moda_impl_T<uint64_t> moda_impl_uint64;
|
||||
Moda_impl_T<float> moda_impl_float;
|
||||
Moda_impl_T<double> moda_impl_double;
|
||||
Moda_impl_T<long double> moda_impl_longdouble;
|
||||
};
|
||||
|
||||
|
||||
}; // namespace
|
||||
}; // namespace mcsv1sdk
|
||||
|
||||
#undef EXPORT
|
||||
|
||||
|
||||
|
Reference in New Issue
Block a user