From: Bborie Park Date: Wed, 25 May 2011 18:28:14 +0000 (+0000) Subject: Add ST_Count and ST_Sum functions that are fronts for the count and sum values of... X-Git-Tag: 2.0.0alpha1~1567 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=cfab8d13ee2f1f8fd1d40e7650504265d0f247a2;p=postgis Add ST_Count and ST_Sum functions that are fronts for the count and sum values of ST_SummaryStats Associated tickets are #985 (ST_Count) and #986 (ST_Sum) git-svn-id: http://svn.osgeo.org/postgis/trunk@7246 b70326c6-7e19-0410-871a-916f4a2858ee --- diff --git a/raster/rt_pg/rtpostgis.sql.in.c b/raster/rt_pg/rtpostgis.sql.in.c index a6a218459..9d0ca23e6 100644 --- a/raster/rt_pg/rtpostgis.sql.in.c +++ b/raster/rt_pg/rtpostgis.sql.in.c @@ -458,6 +458,192 @@ CREATE OR REPLACE FUNCTION st_approxsummarystats(rastertable text, rastercolumn AS $$ SELECT count, sum, mean, stddev, min, max FROM _st_summarystats($1, $2, 1, TRUE, 0.1) $$ LANGUAGE 'SQL' IMMUTABLE STRICT; +----------------------------------------------------------------------- +-- ST_Count and ST_ApproxCount +----------------------------------------------------------------------- +CREATE OR REPLACE FUNCTION st_count(rast raster, nband int, hasnodata boolean, OUT count integer) + RETURNS integer + AS $$ SELECT count FROM _st_summarystats($1, $2, $3, 1) $$ + LANGUAGE 'SQL' IMMUTABLE STRICT; + +CREATE OR REPLACE FUNCTION st_count(rast raster, nband int, OUT count integer) + RETURNS integer + AS $$ SELECT count FROM _st_summarystats($1, $2, TRUE, 1) $$ + LANGUAGE 'SQL' IMMUTABLE STRICT; + +CREATE OR REPLACE FUNCTION st_count(rast raster, hasnodata boolean, OUT count integer) + RETURNS integer + AS $$ SELECT count FROM _st_summarystats($1, 1, $2, 1) $$ + LANGUAGE 'SQL' IMMUTABLE STRICT; + +CREATE OR REPLACE FUNCTION st_count(rast raster, OUT count integer) + RETURNS integer + AS $$ SELECT count FROM _st_summarystats($1, 1, TRUE, 1) $$ + LANGUAGE 'SQL' IMMUTABLE STRICT; + +CREATE OR REPLACE FUNCTION st_approxcount(rast raster, nband int, hasnodata boolean, sample_percent double precision, OUT count integer) + RETURNS integer + AS $$ SELECT count FROM _st_summarystats($1, $2, $3, $4) $$ + LANGUAGE 'SQL' IMMUTABLE STRICT; + +CREATE OR REPLACE FUNCTION st_approxcount(rast raster, nband int, sample_percent double precision, OUT count integer) + RETURNS integer + AS $$ SELECT count FROM _st_summarystats($1, $2, TRUE, $3) $$ + LANGUAGE 'SQL' IMMUTABLE STRICT; + +CREATE OR REPLACE FUNCTION st_approxcount(rast raster, hasnodata boolean, sample_percent double precision, OUT count integer) + RETURNS integer + AS $$ SELECT count FROM _st_summarystats($1, 1, $2, $3) $$ + LANGUAGE 'SQL' IMMUTABLE STRICT; + +CREATE OR REPLACE FUNCTION st_approxcount(rast raster, sample_percent double precision, OUT count integer) + RETURNS integer + AS $$ SELECT count FROM _st_summarystats($1, 1, TRUE, $2) $$ + LANGUAGE 'SQL' IMMUTABLE STRICT; + +CREATE OR REPLACE FUNCTION st_approxcount(rast raster, OUT count integer) + RETURNS integer + AS $$ SELECT count FROM _st_summarystats($1, 1, TRUE, 0.1) $$ + LANGUAGE 'SQL' IMMUTABLE STRICT; + +CREATE OR REPLACE FUNCTION st_count(rastertable text, rastercolumn text, nband int, hasnodata boolean, OUT count integer) + RETURNS integer + AS $$ SELECT count FROM _st_summarystats($1, $2, $3, $4, 1) $$ + LANGUAGE 'SQL' IMMUTABLE STRICT; + +CREATE OR REPLACE FUNCTION st_count(rastertable text, rastercolumn text, nband int, OUT count integer) + RETURNS integer + AS $$ SELECT count FROM _st_summarystats($1, $2, $3, TRUE, 1) $$ + LANGUAGE 'SQL' IMMUTABLE STRICT; + +CREATE OR REPLACE FUNCTION st_count(rastertable text, rastercolumn text, hasnodata boolean, OUT count integer) + RETURNS integer + AS $$ SELECT count FROM _st_summarystats($1, $2, 1, $3, 1) $$ + LANGUAGE 'SQL' IMMUTABLE STRICT; + +CREATE OR REPLACE FUNCTION st_count(rastertable text, rastercolumn text, OUT count integer) + RETURNS integer + AS $$ SELECT count FROM _st_summarystats($1, $2, 1, TRUE, 1) $$ + LANGUAGE 'SQL' IMMUTABLE STRICT; + +CREATE OR REPLACE FUNCTION st_approxcount(rastertable text, rastercolumn text, nband int, hasnodata boolean, sample_percent double precision, OUT count integer) + RETURNS integer + AS $$ SELECT count FROM _st_summarystats($1, $2, $3, $4, $5) $$ + LANGUAGE 'SQL' IMMUTABLE STRICT; + +CREATE OR REPLACE FUNCTION st_approxcount(rastertable text, rastercolumn text, nband int, sample_percent double precision, OUT count integer) + RETURNS integer + AS $$ SELECT count FROM _st_summarystats($1, $2, $3, TRUE, $4) $$ + LANGUAGE 'SQL' IMMUTABLE STRICT; + +CREATE OR REPLACE FUNCTION st_approxcount(rastertable text, rastercolumn text, hasnodata boolean, sample_percent double precision, OUT count integer) + RETURNS integer + AS $$ SELECT count FROM _st_summarystats($1, $2, 1, $3, $4) $$ + LANGUAGE 'SQL' IMMUTABLE STRICT; + +CREATE OR REPLACE FUNCTION st_approxcount(rastertable text, rastercolumn text, sample_percent double precision, OUT count integer) + RETURNS integer + AS $$ SELECT count FROM _st_summarystats($1, $2, 1, TRUE, $3) $$ + LANGUAGE 'SQL' IMMUTABLE STRICT; + +CREATE OR REPLACE FUNCTION st_approxcount(rastertable text, rastercolumn text, OUT count integer) + RETURNS integer + AS $$ SELECT count FROM _st_summarystats($1, $2, 1, TRUE, 0.1) $$ + LANGUAGE 'SQL' IMMUTABLE STRICT; + +----------------------------------------------------------------------- +-- ST_Sum and ST_ApproxSum +----------------------------------------------------------------------- +CREATE OR REPLACE FUNCTION st_sum(rast raster, nband int, hasnodata boolean, OUT sum double precision) + RETURNS double precision + AS $$ SELECT sum FROM _st_summarystats($1, $2, $3, 1) $$ + LANGUAGE 'SQL' IMMUTABLE STRICT; + +CREATE OR REPLACE FUNCTION st_sum(rast raster, nband int, OUT sum double precision) + RETURNS double precision + AS $$ SELECT sum FROM _st_summarystats($1, $2, TRUE, 1) $$ + LANGUAGE 'SQL' IMMUTABLE STRICT; + +CREATE OR REPLACE FUNCTION st_sum(rast raster, hasnodata boolean, OUT sum double precision) + RETURNS double precision + AS $$ SELECT sum FROM _st_summarystats($1, 1, $2, 1) $$ + LANGUAGE 'SQL' IMMUTABLE STRICT; + +CREATE OR REPLACE FUNCTION st_sum(rast raster, OUT sum double precision) + RETURNS double precision + AS $$ SELECT sum FROM _st_summarystats($1, 1, TRUE, 1) $$ + LANGUAGE 'SQL' IMMUTABLE STRICT; + +CREATE OR REPLACE FUNCTION st_approxsum(rast raster, nband int, hasnodata boolean, sample_percent double precision, OUT sum double precision) + RETURNS double precision + AS $$ SELECT sum FROM _st_summarystats($1, $2, $3, $4) $$ + LANGUAGE 'SQL' IMMUTABLE STRICT; + +CREATE OR REPLACE FUNCTION st_approxsum(rast raster, nband int, sample_percent double precision, OUT sum double precision) + RETURNS double precision + AS $$ SELECT sum FROM _st_summarystats($1, $2, TRUE, $3) $$ + LANGUAGE 'SQL' IMMUTABLE STRICT; + +CREATE OR REPLACE FUNCTION st_approxsum(rast raster, hasnodata boolean, sample_percent double precision, OUT sum double precision) + RETURNS double precision + AS $$ SELECT sum FROM _st_summarystats($1, 1, $2, $3) $$ + LANGUAGE 'SQL' IMMUTABLE STRICT; + +CREATE OR REPLACE FUNCTION st_approxsum(rast raster, sample_percent double precision, OUT sum double precision) + RETURNS double precision + AS $$ SELECT sum FROM _st_summarystats($1, 1, TRUE, $2) $$ + LANGUAGE 'SQL' IMMUTABLE STRICT; + +CREATE OR REPLACE FUNCTION st_approxsum(rast raster, OUT sum double precision) + RETURNS double precision + AS $$ SELECT sum FROM _st_summarystats($1, 1, TRUE, 0.1) $$ + LANGUAGE 'SQL' IMMUTABLE STRICT; + +CREATE OR REPLACE FUNCTION st_sum(rastertable text, rastercolumn text, nband int, hasnodata boolean, OUT sum double precision) + RETURNS double precision + AS $$ SELECT sum FROM _st_summarystats($1, $2, $3, $4, 1) $$ + LANGUAGE 'SQL' IMMUTABLE STRICT; + +CREATE OR REPLACE FUNCTION st_sum(rastertable text, rastercolumn text, nband int, OUT sum double precision) + RETURNS double precision + AS $$ SELECT sum FROM _st_summarystats($1, $2, $3, TRUE, 1) $$ + LANGUAGE 'SQL' IMMUTABLE STRICT; + +CREATE OR REPLACE FUNCTION st_sum(rastertable text, rastercolumn text, hasnodata boolean, OUT sum double precision) + RETURNS double precision + AS $$ SELECT sum FROM _st_summarystats($1, $2, 1, $3, 1) $$ + LANGUAGE 'SQL' IMMUTABLE STRICT; + +CREATE OR REPLACE FUNCTION st_sum(rastertable text, rastercolumn text, OUT sum double precision) + RETURNS double precision + AS $$ SELECT sum FROM _st_summarystats($1, $2, 1, TRUE, 1) $$ + LANGUAGE 'SQL' IMMUTABLE STRICT; + +CREATE OR REPLACE FUNCTION st_approxsum(rastertable text, rastercolumn text, nband int, hasnodata boolean, sample_percent double precision, OUT sum double precision) + RETURNS double precision + AS $$ SELECT sum FROM _st_summarystats($1, $2, $3, $4, $5) $$ + LANGUAGE 'SQL' IMMUTABLE STRICT; + +CREATE OR REPLACE FUNCTION st_approxsum(rastertable text, rastercolumn text, nband int, sample_percent double precision, OUT sum double precision) + RETURNS double precision + AS $$ SELECT sum FROM _st_summarystats($1, $2, $3, TRUE, $4) $$ + LANGUAGE 'SQL' IMMUTABLE STRICT; + +CREATE OR REPLACE FUNCTION st_approxsum(rastertable text, rastercolumn text, hasnodata boolean, sample_percent double precision, OUT sum double precision) + RETURNS double precision + AS $$ SELECT sum FROM _st_summarystats($1, $2, 1, $3, $4) $$ + LANGUAGE 'SQL' IMMUTABLE STRICT; + +CREATE OR REPLACE FUNCTION st_approxsum(rastertable text, rastercolumn text, sample_percent double precision, OUT sum double precision) + RETURNS double precision + AS $$ SELECT sum FROM _st_summarystats($1, $2, 1, TRUE, $3) $$ + LANGUAGE 'SQL' IMMUTABLE STRICT; + +CREATE OR REPLACE FUNCTION st_approxsum(rastertable text, rastercolumn text, OUT sum double precision) + RETURNS double precision + AS $$ SELECT sum FROM _st_summarystats($1, $2, 1, TRUE, 0.1) $$ + LANGUAGE 'SQL' IMMUTABLE STRICT; + ----------------------------------------------------------------------- -- ST_Mean and ST_ApproxMean ----------------------------------------------------------------------- diff --git a/raster/test/regress/Makefile.in b/raster/test/regress/Makefile.in index c9de18d9d..5829db928 100644 --- a/raster/test/regress/Makefile.in +++ b/raster/test/regress/Makefile.in @@ -68,6 +68,8 @@ TEST_BANDPROPS = \ rt_band_properties.sql \ rt_set_band_properties.sql \ rt_summarystats.sql \ + rt_count.sql \ + rt_sum.sql \ rt_mean.sql \ rt_stddev.sql \ rt_minmax.sql \ diff --git a/raster/test/regress/rt_count.sql b/raster/test/regress/rt_count.sql new file mode 100644 index 000000000..e24960f87 --- /dev/null +++ b/raster/test/regress/rt_count.sql @@ -0,0 +1,78 @@ +SELECT ST_Count( + ST_SetValue( + ST_SetValue( + ST_SetValue( + ST_AddBand( + ST_MakeEmptyRaster(10, 10, 10, 10, 2, 2, 0, 0,-1) + , 1, '64BF', 0, 0 + ) + , 1, 1, 1, -10 + ) + , 1, 5, 4, 0 + ) + , 1, 5, 5, 3.14159 + ) + , TRUE +); +SELECT count FROM ST_Count( + ST_SetValue( + ST_SetValue( + ST_SetValue( + ST_AddBand( + ST_MakeEmptyRaster(10, 10, 10, 10, 2, 2, 0, 0,-1) + , 1, '64BF', 0, 0 + ) + , 1, 1, 1, -10 + ) + , 1, 5, 4, 0 + ) + , 1, 5, 5, 3.14159 + ) + , TRUE +); +SELECT count FROM ST_Count( + ST_SetValue( + ST_SetValue( + ST_SetValue( + ST_AddBand( + ST_MakeEmptyRaster(10, 10, 10, 10, 2, 2, 0, 0,-1) + , 1, '64BF', 0, 0 + ) + , 1, 1, 1, -10 + ) + , 1, 5, 4, 0 + ) + , 1, 5, 5, 3.14159 + ) + , FALSE +); +BEGIN; +CREATE TEMP TABLE test + ON COMMIT DROP AS + SELECT + rast.rast + FROM ( + SELECT ST_SetValue( + ST_SetValue( + ST_SetValue( + ST_AddBand( + ST_MakeEmptyRaster(10, 10, 10, 10, 2, 2, 0, 0,-1) + , 1, '64BF', 0, 0 + ) + , 1, 1, 1, -10 + ) + , 1, 5, 4, 0 + ) + , 1, 5, 5, 3.14159 + ) AS rast + ) AS rast + FULL JOIN ( + SELECT generate_series(1, 10) AS id + ) AS id + ON 1 = 1; +SELECT count FROM ST_Count('test', 'rast', 1, TRUE); +SELECT count FROM ST_Count('test', 'rast', 1, FALSE); +SELECT count FROM ST_Count('test', 'rast', 1); +SELECT count FROM ST_Count('test', 'rast'); +ROLLBACK; + diff --git a/raster/test/regress/rt_count_expected b/raster/test/regress/rt_count_expected new file mode 100644 index 000000000..9d2487756 --- /dev/null +++ b/raster/test/regress/rt_count_expected @@ -0,0 +1,9 @@ +2 +2 +100 +BEGIN +20 +1000 +20 +20 +COMMIT diff --git a/raster/test/regress/rt_sum.sql b/raster/test/regress/rt_sum.sql new file mode 100644 index 000000000..5a7873af5 --- /dev/null +++ b/raster/test/regress/rt_sum.sql @@ -0,0 +1,78 @@ +SELECT round(ST_Sum( + ST_SetValue( + ST_SetValue( + ST_SetValue( + ST_AddBand( + ST_MakeEmptyRaster(10, 10, 10, 10, 2, 2, 0, 0,-1) + , 1, '64BF', 0, 0 + ) + , 1, 1, 1, -10 + ) + , 1, 5, 4, 0 + ) + , 1, 5, 5, 3.14159 + ) + , TRUE +)::numeric, 3); +SELECT round(sum::numeric, 3) FROM ST_Sum( + ST_SetValue( + ST_SetValue( + ST_SetValue( + ST_AddBand( + ST_MakeEmptyRaster(10, 10, 10, 10, 2, 2, 0, 0,-1) + , 1, '64BF', 0, 0 + ) + , 1, 1, 1, -10 + ) + , 1, 5, 4, 0 + ) + , 1, 5, 5, 3.14159 + ) + , TRUE +); +SELECT round(sum::numeric, 3) FROM ST_Sum( + ST_SetValue( + ST_SetValue( + ST_SetValue( + ST_AddBand( + ST_MakeEmptyRaster(10, 10, 10, 10, 2, 2, 0, 0,-1) + , 1, '64BF', 0, 0 + ) + , 1, 1, 1, -10 + ) + , 1, 5, 4, 0 + ) + , 1, 5, 5, 3.14159 + ) + , FALSE +); +BEGIN; +CREATE TEMP TABLE test + ON COMMIT DROP AS + SELECT + rast.rast + FROM ( + SELECT ST_SetValue( + ST_SetValue( + ST_SetValue( + ST_AddBand( + ST_MakeEmptyRaster(10, 10, 10, 10, 2, 2, 0, 0,-1) + , 1, '64BF', 0, 0 + ) + , 1, 1, 1, -10 + ) + , 1, 5, 4, 0 + ) + , 1, 5, 5, 3.14159 + ) AS rast + ) AS rast + FULL JOIN ( + SELECT generate_series(1, 10) AS id + ) AS id + ON 1 = 1; +SELECT round(sum::numeric, 3) FROM ST_Sum('test', 'rast', 1, TRUE); +SELECT round(sum::numeric, 3) FROM ST_Sum('test', 'rast', 1, FALSE); +SELECT round(sum::numeric, 3) FROM ST_Sum('test', 'rast', 1); +SELECT round(sum::numeric, 3) FROM ST_Sum('test', 'rast'); +ROLLBACK; + diff --git a/raster/test/regress/rt_sum_expected b/raster/test/regress/rt_sum_expected new file mode 100644 index 000000000..cdf1219fa --- /dev/null +++ b/raster/test/regress/rt_sum_expected @@ -0,0 +1,9 @@ +-6.858 +-6.858 +-6.858 +BEGIN +-6.858 +-6.858 +-6.858 +-6.858 +COMMIT