PostGIS 3.0.6dev-r@@SVN_REVISION@@
Loading...
Searching...
No Matches

◆ RASTER_summaryStats_finalfn()

Datum RASTER_summaryStats_finalfn ( PG_FUNCTION_ARGS  )

Definition at line 826 of file rtpg_statistics.c.

827{
828 rtpg_summarystats_arg state = NULL;
829
830 TupleDesc tupdesc;
831 HeapTuple tuple;
832 Datum values[VALUES_LENGTH];
833 bool nulls[VALUES_LENGTH];
834 Datum result;
835
836 POSTGIS_RT_DEBUG(3, "Starting...");
837
838 /* cannot be called directly as this is exclusive aggregate function */
839 if (!AggCheckCallContext(fcinfo, NULL)) {
840 elog(ERROR, "RASTER_summaryStats_finalfn: Cannot be called in a non-aggregate context");
841 PG_RETURN_NULL();
842 }
843
844 /* NULL, return null */
845 if (PG_ARGISNULL(0))
846 PG_RETURN_NULL();
847
848 state = (rtpg_summarystats_arg) PG_GETARG_POINTER(0);
849
850 if (NULL == state) {
851 elog(ERROR, "RASTER_summaryStats_finalfn: Cannot compute coverage summary stats");
852 PG_RETURN_NULL();
853 }
854
855 /* coverage mean and deviation */
856 if (state->stats->count > 0) {
857 state->stats->mean = state->stats->sum / state->stats->count;
858 /* sample deviation */
859 if (state->stats->sample > 0 && state->stats->sample < 1)
860 state->stats->stddev = sqrt(state->cQ / (state->stats->count - 1));
861 /* standard deviation */
862 else
863 state->stats->stddev = sqrt(state->cQ / state->stats->count);
864 }
865
866 /* Build a tuple descriptor for our result type */
867 if (get_call_result_type(fcinfo, NULL, &tupdesc) != TYPEFUNC_COMPOSITE) {
869 ereport(ERROR, (
870 errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
871 errmsg(
872 "function returning record called in context "
873 "that cannot accept type record"
874 )
875 ));
876 }
877
878 BlessTupleDesc(tupdesc);
879
880 memset(nulls, FALSE, sizeof(bool) * VALUES_LENGTH);
881
882 values[0] = Int64GetDatum(state->stats->count);
883 if (state->stats->count > 0) {
884 values[1] = Float8GetDatum(state->stats->sum);
885 values[2] = Float8GetDatum(state->stats->mean);
886 values[3] = Float8GetDatum(state->stats->stddev);
887 values[4] = Float8GetDatum(state->stats->min);
888 values[5] = Float8GetDatum(state->stats->max);
889 }
890 else {
891 nulls[1] = TRUE;
892 nulls[2] = TRUE;
893 nulls[3] = TRUE;
894 nulls[4] = TRUE;
895 nulls[5] = TRUE;
896 }
897
898 /* build a tuple */
899 tuple = heap_form_tuple(tupdesc, values, nulls);
900
901 /* make the tuple into a datum */
902 result = HeapTupleGetDatum(tuple);
903
904 /* clean up */
905 /* For Windowing functions, it is important to leave */
906 /* the state intact, knowing that the aggcontext will be */
907 /* freed by PgSQL when the statement is complete. */
908 /* https://trac.osgeo.org/postgis/ticket/4770 */
909 // rtpg_summarystats_arg_destroy(state);
910
911 PG_RETURN_DATUM(result);
912}
#define TRUE
Definition dbfopen.c:169
#define FALSE
Definition dbfopen.c:168
struct rtpg_summarystats_arg_t * rtpg_summarystats_arg
static void rtpg_summarystats_arg_destroy(rtpg_summarystats_arg arg)
#define VALUES_LENGTH
#define POSTGIS_RT_DEBUG(level, msg)
Definition rtpostgis.h:61
uint32_t count
Definition librtcore.h:2361

References rt_bandstats_t::count, rtpg_summarystats_arg_t::cQ, FALSE, rt_bandstats_t::max, rt_bandstats_t::mean, rt_bandstats_t::min, POSTGIS_RT_DEBUG, rtpg_summarystats_arg_destroy(), rt_bandstats_t::sample, rtpg_summarystats_arg_t::stats, rt_bandstats_t::stddev, rt_bandstats_t::sum, TRUE, and VALUES_LENGTH.

Here is the call graph for this function: