Cycling user-defined aggregate team_average
Creates a Java user-defined aggregate function that calculates the average of a target column.
Creates a Java user-defined aggregate function that calculates the average of a target column.
SOURCE '0_create_keyspace.cql';
// START-dropagg
DROP AGGREGATE IF EXISTS cycling.avgState;
// END-dropagg
DROP TABLE IF EXISTS cycling.test_avg;
// START-state
CREATE OR REPLACE FUNCTION cycling.avgState (
state tuple<int, bigint>,
val int
)
CALLED ON NULL INPUT
RETURNS tuple<int, bigint>
LANGUAGE java AS
$$
if (val != null) {
state.setInt(0, state.getInt(0) + 1);
state.setLong(1, state.getLong(1) + val.intValue());
}
return state;
$$
;
// END-state
// START-test
CREATE TABLE IF NOT EXISTS cycling.test_avg (
id int PRIMARY KEY,
state frozen<tuple<int, bigint>>,
val int
);
INSERT INTO cycling.test_avg (
id, state, val
) VALUES (
1, (6, 9949), 51
);
INSERT INTO cycling.test_avg (
id, state, val
) VALUES (
2, (79, 10000), 9999
);
SELECT state, avgstate(state, val), val
FROM cycling.test_avg;
// END-test
// START-final
CREATE OR REPLACE FUNCTION cycling.avgFinal (
state tuple<int,bigint>
)
CALLED ON NULL INPUT
RETURNS double
LANGUAGE java AS
$$
double r = 0;
if (state.getInt(0) == 0) return null;
r = state.getLong(1);
r /= state.getInt(0);
return Double.valueOf(r);
$$
;
// END-final
// START-agg
CREATE OR REPLACE AGGREGATE cycling.average (
int
)
SFUNC avgState
STYPE tuple<int,bigint>
FINALFUNC avgFinal
INITCOND (0, 0)
;
// END-agg