You've already forked mariadb-columnstore-engine
mirror of
https://github.com/mariadb-corporation/mariadb-columnstore-engine.git
synced 2025-07-29 08:21:15 +03:00
MCOL-4171
This commit is contained in:
committed by
Roman Nozdrin
parent
5287e6860b
commit
638202417f
@ -103,9 +103,12 @@ mcsv1_UDAF* moda::getImpl(mcsv1Context* context)
|
||||
case 4:
|
||||
data->modaImpl = &moda_impl_int32;
|
||||
break;
|
||||
default:
|
||||
case 8:
|
||||
data->modaImpl = &moda_impl_int64;
|
||||
break;
|
||||
case 16:
|
||||
data->modaImpl = &moda_impl_int128;
|
||||
break;
|
||||
}
|
||||
break;
|
||||
case execplan::CalpontSystemCatalog::UTINYINT:
|
||||
@ -179,11 +182,18 @@ mcsv1_UDAF::ReturnCode moda::init(mcsv1Context* context,
|
||||
{
|
||||
context->setColWidth(4);
|
||||
}
|
||||
else
|
||||
else if (colTypes[0].precision < 19)
|
||||
{
|
||||
context->setColWidth(8);
|
||||
}
|
||||
else
|
||||
{
|
||||
context->setColWidth(16);
|
||||
}
|
||||
|
||||
context->setScale(colTypes[0].scale);
|
||||
}
|
||||
context->setPrecision(colTypes[0].precision);
|
||||
|
||||
mcsv1_UDAF* impl = getImpl(context);
|
||||
|
||||
@ -203,10 +213,7 @@ template<class T>
|
||||
mcsv1_UDAF::ReturnCode Moda_impl_T<T>::init(mcsv1Context* context,
|
||||
ColumnDatum* colTypes)
|
||||
{
|
||||
context->setScale(context->getScale());
|
||||
context->setPrecision(19);
|
||||
return mcsv1_UDAF::SUCCESS;
|
||||
|
||||
}
|
||||
|
||||
template<class T>
|
||||
@ -224,7 +231,7 @@ mcsv1_UDAF::ReturnCode Moda_impl_T<T>::nextValue(mcsv1Context* context, ColumnDa
|
||||
{
|
||||
static_any::any& valIn = valsIn[0].columnData;
|
||||
ModaData* data = static_cast<ModaData*>(context->getUserData());
|
||||
std::unordered_map<T, uint32_t>* map = data->getMap<T>();
|
||||
std::unordered_map<T, uint32_t, hasher<T> >* map = data->getMap<T>();
|
||||
|
||||
if (valIn.empty())
|
||||
{
|
||||
@ -261,9 +268,9 @@ mcsv1_UDAF::ReturnCode Moda_impl_T<T>::subEvaluate(mcsv1Context* context, const
|
||||
|
||||
ModaData* outData = static_cast<ModaData*>(context->getUserData());
|
||||
const ModaData* inData = static_cast<const ModaData*>(userDataIn);
|
||||
std::unordered_map<T, uint32_t>* outMap = outData->getMap<T>();
|
||||
std::unordered_map<T, uint32_t>* inMap = inData->getMap<T>();
|
||||
typename std::unordered_map<T, uint32_t>::const_iterator iter;
|
||||
std::unordered_map<T, uint32_t, hasher<T> >* outMap = outData->getMap<T>();
|
||||
std::unordered_map<T, uint32_t, hasher<T> >* inMap = inData->getMap<T>();
|
||||
typename std::unordered_map<T, uint32_t, hasher<T> >::const_iterator iter;
|
||||
|
||||
for (iter = inMap->begin(); iter != inMap->end(); ++iter)
|
||||
{
|
||||
@ -283,7 +290,7 @@ mcsv1_UDAF::ReturnCode Moda_impl_T<T>::evaluate(mcsv1Context* context, static_an
|
||||
long double avg = 0;
|
||||
T val = 0;
|
||||
ModaData* data = static_cast<ModaData*>(context->getUserData());
|
||||
std::unordered_map<T, uint32_t>* map = data->getMap<T>();
|
||||
std::unordered_map<T, uint32_t, hasher<T> >* map = data->getMap<T>();
|
||||
|
||||
if (map->size() == 0)
|
||||
{
|
||||
@ -292,7 +299,7 @@ mcsv1_UDAF::ReturnCode Moda_impl_T<T>::evaluate(mcsv1Context* context, static_an
|
||||
}
|
||||
|
||||
avg = data->fCount ? data->fSum / data->fCount : 0;
|
||||
typename std::unordered_map<T, uint32_t>::iterator iter;
|
||||
typename std::unordered_map<T, uint32_t, hasher<T> >::iterator iter;
|
||||
|
||||
for (iter = map->begin(); iter != map->end(); ++iter)
|
||||
{
|
||||
@ -303,11 +310,13 @@ mcsv1_UDAF::ReturnCode Moda_impl_T<T>::evaluate(mcsv1Context* context, static_an
|
||||
}
|
||||
else if (iter->second == maxCnt)
|
||||
{
|
||||
T absval = val >= 0 ? val : -val;
|
||||
T absfirst = iter->first >= 0 ? iter->first : -iter->first;
|
||||
// Tie breaker: choose the closest to avg. If still tie, choose smallest
|
||||
long double dist1 = val > avg ? (long double)val-avg : avg-(long double)val;
|
||||
long double dist2 = iter->first > avg ? (long double)iter->first-avg : avg-(long double)iter->first;
|
||||
if ((dist1 > dist2)
|
||||
|| ((dist1 == dist2) && (std::fabs(val) > std::fabs(iter->first))))
|
||||
|| ((dist1 == dist2) && (absval > absfirst)))
|
||||
{
|
||||
val = iter->first;
|
||||
}
|
||||
@ -328,7 +337,7 @@ mcsv1_UDAF::ReturnCode Moda_impl_T<T>::dropValue(mcsv1Context* context, ColumnDa
|
||||
{
|
||||
static_any::any& valDropped = valsDropped[0].columnData;
|
||||
ModaData* data = static_cast<ModaData*>(context->getUserData());
|
||||
std::unordered_map<T, uint32_t>* map = data->getMap<T>();
|
||||
std::unordered_map<T, uint32_t, hasher<T> >* map = data->getMap<T>();
|
||||
|
||||
if (valDropped.empty())
|
||||
{
|
||||
@ -379,9 +388,12 @@ void ModaData::serialize(messageqcpp::ByteStream& bs) const
|
||||
case 4:
|
||||
serializeMap<int32_t>(bs);
|
||||
break;
|
||||
default:
|
||||
case 8:
|
||||
serializeMap<int64_t>(bs);
|
||||
break;
|
||||
case 16:
|
||||
serializeMap<int128_t>(bs);
|
||||
break;
|
||||
}
|
||||
break;
|
||||
case execplan::CalpontSystemCatalog::UTINYINT:
|
||||
@ -447,9 +459,12 @@ void ModaData::unserialize(messageqcpp::ByteStream& bs)
|
||||
case 4:
|
||||
unserializeMap<int32_t>(bs);
|
||||
break;
|
||||
default:
|
||||
case 8:
|
||||
unserializeMap<int64_t>(bs);
|
||||
break;
|
||||
case 16:
|
||||
unserializeMap<int128_t>(bs);
|
||||
break;
|
||||
}
|
||||
break;
|
||||
case execplan::CalpontSystemCatalog::UTINYINT:
|
||||
@ -519,10 +534,14 @@ void ModaData::cleanup()
|
||||
clear<int32_t>();
|
||||
deleteMap<int32_t>();
|
||||
break;
|
||||
default:
|
||||
case 8:
|
||||
clear<int64_t>();
|
||||
deleteMap<int64_t>();
|
||||
break;
|
||||
case 16:
|
||||
clear<int128_t>();
|
||||
deleteMap<int128_t>();
|
||||
break;
|
||||
}
|
||||
break;
|
||||
case execplan::CalpontSystemCatalog::UTINYINT:
|
||||
|
Reference in New Issue
Block a user