diff --git a/pgsql/pc_access.c b/pgsql/pc_access.c index ac7da7e..c18e974 100644 --- a/pgsql/pc_access.c +++ b/pgsql/pc_access.c @@ -21,6 +21,7 @@ Datum pcpoint_agg_final_array(PG_FUNCTION_ARGS); Datum pointcloud_agg_transfn(PG_FUNCTION_ARGS); Datum pointcloud_abs_in(PG_FUNCTION_ARGS); Datum pointcloud_abs_out(PG_FUNCTION_ARGS); +Datum pcpatch_agg_final_array(PG_FUNCTION_ARGS); /* Deaggregation functions */ Datum pcpatch_unnest(PG_FUNCTION_ARGS); @@ -235,7 +236,7 @@ Datum pointcloud_agg_transfn(PG_FUNCTION_ARGS) static Datum -pcpoint_agg_final(abs_trans *a, MemoryContext mctx, FunctionCallInfo fcinfo) +pointcloud_agg_final(abs_trans *a, MemoryContext mctx, FunctionCallInfo fcinfo) { ArrayBuildState *state; int dims[1]; @@ -257,11 +258,26 @@ Datum pcpoint_agg_final_array(PG_FUNCTION_ARGS) a = (abs_trans*) PG_GETARG_POINTER(0); - result = pcpoint_agg_final(a, CurrentMemoryContext, fcinfo); + result = pointcloud_agg_final(a, CurrentMemoryContext, fcinfo); PG_RETURN_DATUM(result); } +PG_FUNCTION_INFO_V1(pcpatch_agg_final_array); +Datum pcpatch_agg_final_array(PG_FUNCTION_ARGS) +{ + abs_trans *a; + Datum result = 0; + + if (PG_ARGISNULL(0)) + PG_RETURN_NULL(); /* returns null iff no input values */ + + a = (abs_trans*) PG_GETARG_POINTER(0); + + result = pointcloud_agg_final(a, CurrentMemoryContext, fcinfo); + PG_RETURN_DATUM(result); +} + PG_FUNCTION_INFO_V1(pcpoint_agg_final_pcpatch); Datum pcpoint_agg_final_pcpatch(PG_FUNCTION_ARGS) @@ -276,7 +292,7 @@ Datum pcpoint_agg_final_pcpatch(PG_FUNCTION_ARGS) a = (abs_trans*) PG_GETARG_POINTER(0); - array = DatumGetArrayTypeP(pcpoint_agg_final(a, CurrentMemoryContext, fcinfo)); + array = DatumGetArrayTypeP(pointcloud_agg_final(a, CurrentMemoryContext, fcinfo)); pa = pcpatch_from_point_array(array, fcinfo); if ( ! pa ) PG_RETURN_NULL(); diff --git a/pgsql/pointcloud--1.0.sql b/pgsql/pointcloud--1.0.sql index 4170409..996d83d 100644 --- a/pgsql/pointcloud--1.0.sql +++ b/pgsql/pointcloud--1.0.sql @@ -27,19 +27,18 @@ CREATE TABLE pointcloud_formats ( SELECT pg_catalog.pg_extension_config_dump('pointcloud_formats', ''); CREATE OR REPLACE FUNCTION PC_SchemaGetNDims(pcid integer) - RETURNS integer AS 'MODULE_PATHNAME','pcschema_get_ndims' + RETURNS integer + AS 'MODULE_PATHNAME','pcschema_get_ndims' LANGUAGE 'c' IMMUTABLE STRICT; -- Read typmod number from string CREATE OR REPLACE FUNCTION pc_typmod_in(cstring[]) - RETURNS integer - AS 'MODULE_PATHNAME','pc_typmod_in' + RETURNS integer AS 'MODULE_PATHNAME','pc_typmod_in' LANGUAGE 'c' IMMUTABLE STRICT; -- Write typmod number to string CREATE OR REPLACE FUNCTION pc_typmod_out(integer) - RETURNS cstring - AS 'MODULE_PATHNAME','pc_typmod_out' + RETURNS cstring AS 'MODULE_PATHNAME','pc_typmod_out' LANGUAGE 'c' IMMUTABLE STRICT; @@ -122,7 +121,7 @@ CREATE OR REPLACE FUNCTION PC_Envelope(p pcpatch) ------------------------------------------------------------------- --- AGGREGATE / EXPLODE +-- AGGREGATE GENERIC SUPPORT ------------------------------------------------------------------- CREATE OR REPLACE FUNCTION pointcloud_abs_in(cstring) @@ -140,38 +139,60 @@ CREATE TYPE pointcloud_abs ( alignment = double ); -CREATE FUNCTION PC_Patch(pcpoint[]) +------------------------------------------------------------------- +-- AGGREGATE PCPOINT +------------------------------------------------------------------- + +CREATE OR REPLACE FUNCTION PC_Patch(pcpoint[]) RETURNS pcpatch AS 'MODULE_PATHNAME', 'pcpatch_from_pcpoint_array' LANGUAGE 'c' IMMUTABLE STRICT; - -CREATE FUNCTION pointcloud_agg_transfn (pointcloud_abs, pcpoint) - RETURNS pointcloud_abs AS'MODULE_PATHNAME', 'pointcloud_agg_transfn' +CREATE OR REPLACE FUNCTION pcpoint_agg_transfn (pointcloud_abs, pcpoint) + RETURNS pointcloud_abs AS 'MODULE_PATHNAME', 'pointcloud_agg_transfn' LANGUAGE 'c'; -CREATE FUNCTION pcpoint_agg_final_array (pointcloud_abs) - RETURNS pcpoint[] AS 'MODULE_PATHNAME', 'pcpoint_agg_final_array' +CREATE OR REPLACE FUNCTION pcpoint_agg_final_array (pointcloud_abs) + RETURNS pcpoint[] AS 'MODULE_PATHNAME', 'pcpoint_agg_final_array' LANGUAGE 'c'; -CREATE FUNCTION pcpoint_agg_final_pcpatch (pointcloud_abs) +CREATE OR REPLACE FUNCTION pcpoint_agg_final_pcpatch (pointcloud_abs) RETURNS pcpatch AS 'MODULE_PATHNAME', 'pcpoint_agg_final_pcpatch' LANGUAGE 'c'; - + CREATE AGGREGATE PC_Patch ( BASETYPE = pcpoint, - SFUNC = pointcloud_agg_transfn, + SFUNC = pcpoint_agg_transfn, STYPE = pointcloud_abs, FINALFUNC = pcpoint_agg_final_pcpatch ); CREATE AGGREGATE PC_Point_Agg ( BASETYPE = pcpoint, - SFUNC = pointcloud_agg_transfn, + SFUNC = pcpoint_agg_transfn, STYPE = pointcloud_abs, FINALFUNC = pcpoint_agg_final_array ); -CREATE FUNCTION PC_Explode(pcpatch) +------------------------------------------------------------------- +-- AGGREGATE / EXPLODE PCPATCH +------------------------------------------------------------------- + +CREATE OR REPLACE FUNCTION pcpatch_agg_final_array (pointcloud_abs) + RETURNS pcpatch[] AS 'MODULE_PATHNAME', 'pcpatch_agg_final_array' + LANGUAGE 'c'; + +CREATE OR REPLACE FUNCTION pcpatch_agg_transfn (pointcloud_abs, pcpatch) + RETURNS pointcloud_abs AS 'MODULE_PATHNAME', 'pointcloud_agg_transfn' + LANGUAGE 'c'; + +CREATE AGGREGATE PC_Patch_Agg ( + BASETYPE = pcpatch, + SFUNC = pcpatch_agg_transfn, + STYPE = pointcloud_abs, + FINALFUNC = pcpatch_agg_final_array +); + +CREATE OR REPLACE FUNCTION PC_Explode(pcpatch) RETURNS setof pcpoint AS 'MODULE_PATHNAME', 'pcpatch_unnest' LANGUAGE 'c' IMMUTABLE STRICT;