Add array agg function for pcpatch

This commit is contained in:
Paul Ramsey 2013-03-04 09:51:23 -08:00
parent 5329ee0051
commit 4e2ffe5bab
2 changed files with 57 additions and 20 deletions

View File

@ -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();

View File

@ -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;