X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;f=src%2Fcdata.c;h=c4f934034fcad12153546f500a649a42b69e9526;hb=ec00d193ed161a58be46f62fed81adfc5612cfde;hp=b47e3f87d169a107f63177df503192e3c6b722fb;hpb=fd01c2e8b891abe2e801e406555642284e6eef36;p=postrr.git diff --git a/src/cdata.c b/src/cdata.c index b47e3f8..c4f9340 100644 --- a/src/cdata.c +++ b/src/cdata.c @@ -79,6 +79,9 @@ PG_FUNCTION_INFO_V1(cdata_typmodout); PG_FUNCTION_INFO_V1(cdata_to_cdata); PG_FUNCTION_INFO_V1(int32_to_cdata); +PG_FUNCTION_INFO_V1(cdata_to_float8); + +PG_FUNCTION_INFO_V1(cdata_update); /* * public API @@ -186,8 +189,9 @@ cdata_out(PG_FUNCTION_ARGS) data = PG_GETARG_CDATA_P(0); - snprintf(cd_str, sizeof(cd_str), "%g (U:%i/%i)", - data->value, data->undef_num, data->val_num); + snprintf(cd_str, sizeof(cd_str), "%g (%s U:%i/%i)", + data->value, CF_TO_STR(data->cf), + data->undef_num, data->val_num); result = pstrdup(cd_str); PG_RETURN_CSTRING(result); @@ -329,5 +333,74 @@ int32_to_cdata(PG_FUNCTION_ARGS) PG_RETURN_CDATA_P(data); } /* int32_to_cdata */ +Datum +cdata_to_float8(PG_FUNCTION_ARGS) +{ + cdata_t *data; + + if (PG_NARGS() != 1) + ereport(ERROR, ( + errmsg("cdata_to_float8() expects one argument"), + errhint("Usage: cdata_to_float8(cdata)") + )); + + data = PG_GETARG_CDATA_P(0); + PG_RETURN_FLOAT8(data->value); +} /* cdata_to_float8 */ + +Datum +cdata_update(PG_FUNCTION_ARGS) +{ + cdata_t *data; + cdata_t *update; + + if (PG_NARGS() != 2) + ereport(ERROR, ( + errmsg("cdata_update() expects two arguments"), + errhint("Usage: cdata_update(cdata, cdata)") + )); + + data = PG_GETARG_CDATA_P(0); + update = PG_GETARG_CDATA_P(1); + + if (! data) + PG_RETURN_CDATA_P(update); + + if ((data->cf != update->cf) && (update->val_num > 1)) + ereport(ERROR, ( + errcode(ERRCODE_INVALID_PARAMETER_VALUE), + errmsg("invalid update value: incompatible " + "consolidation function") + )); + + switch (data->cf) { + case CF_AVG: + data->value = (data->value * (data->val_num - data->undef_num)) + + (update->value * (update->val_num - update->undef_num)); + data->value /= (data->val_num - data->undef_num) + + (update->val_num - update->undef_num); + break; + case CF_MIN: + data->value = (data->value <= update->value) + ? data->value : update->value; + break; + case CF_MAX: + data->value = (data->value >= update->value) + ? data->value : update->value; + break; + default: + ereport(ERROR, ( + errcode(ERRCODE_DATA_CORRUPTED), + errmsg("unknown consolidation function %d", + data->cf) + )); + break; + } + + data->undef_num += update->undef_num; + data->val_num += update->val_num; + PG_RETURN_CDATA_P(data); +} /* cdata_update */ + /* vim: set tw=78 sw=4 ts=4 noexpandtab : */