From fb4f6571060b60cc6f1e4def8e61c33cbb9f428d Mon Sep 17 00:00:00 2001 From: Paul Ramsey Date: Wed, 8 May 2013 09:34:20 -0700 Subject: [PATCH] More more functions to slice-based access for header info --- lib/TODO.md | 2 ++ pgsql/pc_access.c | 13 ++++++------- pgsql/pc_pgsql.h | 6 ++++-- 3 files changed, 12 insertions(+), 9 deletions(-) diff --git a/lib/TODO.md b/lib/TODO.md index 514867c..71cb598 100644 --- a/lib/TODO.md +++ b/lib/TODO.md @@ -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 -------------------- diff --git a/pgsql/pc_access.c b/pgsql/pc_access.c index 52035a7..dc5e0f1 100644 --- a/pgsql/pc_access.c +++ b/pgsql/pc_access.c @@ -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)); } diff --git a/pgsql/pc_pgsql.h b/pgsql/pc_pgsql.h index d275d88..6681d9b 100644 --- a/pgsql/pc_pgsql.h +++ b/pgsql/pc_pgsql.h @@ -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