More more functions to slice-based access for header info

This commit is contained in:
Paul Ramsey 2013-05-08 09:34:20 -07:00
parent 0a8ab4dc0a
commit fb4f657106
3 changed files with 12 additions and 9 deletions

View File

@ -16,6 +16,8 @@ To Do
- Before doing dimensional compression, sort by geohash (actually by a localized geohash based on the patch bounds). This will enhance the autocorrelation of values and improve run-length encoding in particular
- Add Min/Max values to front of GHT serialization
- Improve extent reading to only pull a slice of patch out of the datum
Use Cases to Support
--------------------

View File

@ -530,26 +530,25 @@ Datum pcpatch_uncompress(PG_FUNCTION_ARGS)
PG_FUNCTION_INFO_V1(pcpatch_numpoints);
Datum pcpatch_numpoints(PG_FUNCTION_ARGS)
{
Datum d = PG_GETARG_DATUM(0);
SERIALIZED_PATCH *serpa = PG_DETOAST_DATUM_SLICE(d, 0, sizeof(SERIALIZED_PATCH));
SERIALIZED_PATCH *serpa = PG_GETHEADER_SERPATCH_P(0);
PG_RETURN_INT32(serpa->npoints);
}
PG_FUNCTION_INFO_V1(pcpatch_compression);
Datum pcpatch_compression(PG_FUNCTION_ARGS)
{
SERIALIZED_PATCH *serpa = PG_GETARG_SERPATCH_P(0);
SERIALIZED_PATCH *serpa = PG_GETHEADER_SERPATCH_P(0);
PG_RETURN_INT32(serpa->compression);
}
PG_FUNCTION_INFO_V1(pcpatch_intersects);
Datum pcpatch_intersects(PG_FUNCTION_ARGS)
{
SERIALIZED_PATCH *serpa1 = PG_GETARG_SERPATCH_P(0);
SERIALIZED_PATCH *serpa2 = PG_GETARG_SERPATCH_P(1);
SERIALIZED_PATCH *serpa1 = PG_GETHEADER_SERPATCH_P(0);
SERIALIZED_PATCH *serpa2 = PG_GETHEADER_SERPATCH_P(1);
if ( serpa1->pcid != serpa2->pcid )
elog(ERROR, "pcpatch_intersects: pcid mismatch (%d != %d)", serpa1->pcid, serpa2->pcid);
elog(ERROR, "%s: pcid mismatch (%d != %d)", __func__, serpa1->pcid, serpa2->pcid);
if ( serpa1->xmin > serpa2->xmax ||
serpa1->xmax < serpa2->xmin ||
@ -565,7 +564,7 @@ Datum pcpatch_intersects(PG_FUNCTION_ARGS)
PG_FUNCTION_INFO_V1(pcpatch_size);
Datum pcpatch_size(PG_FUNCTION_ARGS)
{
SERIALIZED_PATCH *serpa = PG_GETARG_SERPATCH_P(0);
SERIALIZED_PATCH *serpa = PG_GETHEADER_SERPATCH_P(0);
PG_RETURN_INT32(VARSIZE(serpa));
}

View File

@ -24,8 +24,10 @@
#define POINTCLOUD_FORMATS_XML "schema"
#define POINTCLOUD_FORMATS_SRID "srid"
#define PG_GETARG_SERPOINT_P(datum) (SERIALIZED_POINT*)PG_DETOAST_DATUM(PG_GETARG_DATUM(datum))
#define PG_GETARG_SERPATCH_P(datum) (SERIALIZED_PATCH*)PG_DETOAST_DATUM(PG_GETARG_DATUM(datum))
#define PG_GETARG_SERPOINT_P(argnum) (SERIALIZED_POINT*)PG_DETOAST_DATUM(PG_GETARG_DATUM(argnum))
#define PG_GETARG_SERPATCH_P(argnum) (SERIALIZED_PATCH*)PG_DETOAST_DATUM(PG_GETARG_DATUM(argnum))
#define PG_GETHEADER_SERPATCH_P(argnum) (SERIALIZED_PATCH*)PG_DETOAST_DATUM_SLICE(PG_GETARG_DATUM(argnum), 0, sizeof(SERIALIZED_PATCH))
#define AUTOCOMPRESS_NO 0
#define AUTOCOMPRESS_YES 1