THIS IS A TEST INSTANCE. ALL YOUR CHANGES WILL BE LOST!!!!
...
Here the AnyType
class works for both passing data from the DBMS to the C++ function, as well as returning values back from C++. Refer to TypeTraits_impl.hpp
for more details.
Transition function
Code Block | ||
---|---|---|
| ||
AnyType avg_var_transition::run(AnyType& args) { // get current state value AvgVarTransitionState<MutableArrayHandle<double> > state = args[0]; // get current row value double x = args[1].getAs<double>(); double d = (x - state.avg); // online update mean state.avg += d / static_cast<double>(state.numRows + 1); double new_d = (x - state.avg); double a = static_cast<double>(state.numRows) / static_cast<double>(state.numRows + 1); // online update variance state.var = state.var * a + d * new_d / static_cast<double>(state.numRows + 1); state.numRows ++; return state; } |
...
- Again: the arguments contained in
AnyType& args
are defined inavg_var.sql_in
. - The details are hidden in the method of class
AvgVarTransitionState
which overloads the operator+=
Final function
Code Block | ||
---|---|---|
| ||
AnyType avg_var_final::run(AnyType& args) { AvgVarTransitionState<MutableArrayHandle<double> > state = args[0]; // If we haven't seen any data, just return Null. This is the standard // behavior of aggregate function on empty data sets (compare, e.g., // how PostgreSQL handles sum or avg on empty inputs) if (state.numRows == 0) return Null(); return state; } |
...