[postgis-tickets] r16641 - SP-GiST implementation polishing
Darafei
komzpa at gmail.com
Fri Jul 13 01:06:44 PDT 2018
Author: komzpa
Date: 2018-07-13 13:06:43 -0700 (Fri, 13 Jul 2018)
New Revision: 16641
Added:
trunk/postgis/lwgeom_box3d.h
Modified:
trunk/postgis/gserialized_spgist_2d.c
trunk/postgis/gserialized_spgist_3d.c
trunk/postgis/gserialized_spgist_3d.h
trunk/postgis/lwgeom_box3d.c
Log:
SP-GiST implementation polishing
Added copyrights to headers, moved BOX3D function declarations from SP-GiST to box3d headers to suppress warnings.
References #1847
Closes https://github.com/postgis/postgis/pull/269
Modified: trunk/postgis/gserialized_spgist_2d.c
===================================================================
--- trunk/postgis/gserialized_spgist_2d.c 2018-07-10 14:25:07 UTC (rev 16640)
+++ trunk/postgis/gserialized_spgist_2d.c 2018-07-13 20:06:43 UTC (rev 16641)
@@ -64,7 +64,7 @@
* that we don't yet have as infinity.
*
* Portions Copyright (c) 2018, Esteban Zimanyi, Arthur Lesuisse,
- * Université Libre de Bruxelles
+ * Université Libre de Bruxelles
* Portions Copyright (c) 1996-2016, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California
*
@@ -71,17 +71,17 @@
*****************************************************************************/
#include <postgres.h>
-#include <utils/builtins.h> /* For float manipulation */
-#include "access/spgist.h" /* For SP-GiST */
-#include "catalog/namespace.h" /* For TypenameGetTypid */
-#include "catalog/pg_type_d.h" /* For VOIDOID */
+#include <utils/builtins.h> /* For float manipulation */
+#include "access/spgist.h" /* For SP-GiST */
+#include "catalog/namespace.h" /* For TypenameGetTypid */
+#include "catalog/pg_type_d.h" /* For VOIDOID */
#include "../postgis_config.h"
-#include "liblwgeom.h" /* For standard geometry types. */
-#include "lwgeom_pg.h" /* For debugging macros. */
-#include <gserialized_gist.h> /* For utility functions. */
-#include <lwgeom_pg.h> /* For debugging macros. */
+#include "liblwgeom.h" /* For standard geometry types. */
+#include "lwgeom_pg.h" /* For debugging macros. */
+#include <gserialized_gist.h> /* For utility functions. */
+#include <lwgeom_pg.h> /* For debugging macros. */
/*
** SP-GiST 2D index function prototypes
@@ -104,8 +104,8 @@
static int
compareDoubles(const void *a, const void *b)
{
- double x = *(double *) a;
- double y = *(double *) b;
+ double x = *(double *)a;
+ double y = *(double *)b;
if (x == y)
return 0;
@@ -114,8 +114,8 @@
typedef struct
{
- BOX2DF left;
- BOX2DF right;
+ BOX2DF left;
+ BOX2DF right;
} RectBox;
/*
@@ -128,7 +128,7 @@
static uint8
getQuadrant4D(BOX2DF *centroid, BOX2DF *inBox)
{
- uint8 quadrant = 0;
+ uint8 quadrant = 0;
if (inBox->xmin > centroid->xmin)
quadrant |= 0x8;
@@ -154,8 +154,8 @@
static RectBox *
initRectBox(void)
{
- RectBox *rect_box = (RectBox *) palloc(sizeof(RectBox));
- float infinity = get_float4_infinity();
+ RectBox *rect_box = (RectBox *)palloc(sizeof(RectBox));
+ float infinity = get_float4_infinity();
rect_box->left.xmin = -infinity;
rect_box->left.xmax = infinity;
@@ -182,7 +182,7 @@
static RectBox *
nextRectBox(RectBox *rect_box, BOX2DF *centroid, uint8 quadrant)
{
- RectBox *next_rect_box = (RectBox *) palloc(sizeof(RectBox));
+ RectBox *next_rect_box = (RectBox *)palloc(sizeof(RectBox));
memcpy(next_rect_box, rect_box, sizeof(RectBox));
@@ -213,10 +213,8 @@
static bool
overlap4D(RectBox *rect_box, BOX2DF *query)
{
- return (rect_box->left.xmin <= query->xmax &&
- rect_box->right.xmax >= query->xmin &&
- rect_box->left.ymin <= query->ymax &&
- rect_box->right.ymax >= query->ymin);
+ return (rect_box->left.xmin <= query->xmax && rect_box->right.xmax >= query->xmin) &&
+ (rect_box->left.ymin <= query->ymax && rect_box->right.ymax >= query->ymin);
}
/* Can any cube from rect_box contain query? */
@@ -223,10 +221,8 @@
static bool
contain4D(RectBox *rect_box, BOX2DF *query)
{
- return (rect_box->right.xmax >= query->xmax &&
- rect_box->left.xmin <= query->xmin &&
- rect_box->right.ymax >= query->ymax &&
- rect_box->left.ymin <= query->ymin);
+ return (rect_box->right.xmax >= query->xmax && rect_box->left.xmin <= query->xmin) &&
+ (rect_box->right.ymax >= query->ymax && rect_box->left.ymin <= query->ymin);
}
/* Can any cube from rect_box be left of query? */
@@ -291,14 +287,13 @@
PG_FUNCTION_INFO_V1(gserialized_spgist_config_2d);
-PGDLLEXPORT Datum
-gserialized_spgist_config_2d(PG_FUNCTION_ARGS)
+PGDLLEXPORT Datum gserialized_spgist_config_2d(PG_FUNCTION_ARGS)
{
- spgConfigOut *cfg = (spgConfigOut *) PG_GETARG_POINTER(1);
+ spgConfigOut *cfg = (spgConfigOut *)PG_GETARG_POINTER(1);
Oid boxoid = TypenameGetTypid("box2df");
cfg->prefixType = boxoid;
- cfg->labelType = VOIDOID; /* We don't need node labels. */
+ cfg->labelType = VOIDOID; /* We don't need node labels. */
cfg->leafType = boxoid;
cfg->canReturnData = false;
cfg->longValuesOK = false;
@@ -312,13 +307,11 @@
PG_FUNCTION_INFO_V1(gserialized_spgist_choose_2d);
-PGDLLEXPORT Datum
-gserialized_spgist_choose_2d(PG_FUNCTION_ARGS)
+PGDLLEXPORT Datum gserialized_spgist_choose_2d(PG_FUNCTION_ARGS)
{
- spgChooseIn *in = (spgChooseIn *) PG_GETARG_POINTER(0);
- spgChooseOut *out = (spgChooseOut *) PG_GETARG_POINTER(1);
- BOX2DF *centroid = (BOX2DF *) DatumGetPointer(in->prefixDatum),
- *box = (BOX2DF *) DatumGetPointer(in->leafDatum);
+ spgChooseIn *in = (spgChooseIn *)PG_GETARG_POINTER(0);
+ spgChooseOut *out = (spgChooseOut *)PG_GETARG_POINTER(1);
+ BOX2DF *centroid = (BOX2DF *)DatumGetPointer(in->prefixDatum), *box = (BOX2DF *)DatumGetPointer(in->leafDatum);
out->resultType = spgMatchNode;
out->result.matchNode.restDatum = PointerGetDatum(box);
@@ -338,28 +331,26 @@
*/
PG_FUNCTION_INFO_V1(gserialized_spgist_picksplit_2d);
-PGDLLEXPORT Datum
-gserialized_spgist_picksplit_2d(PG_FUNCTION_ARGS)
+PGDLLEXPORT Datum gserialized_spgist_picksplit_2d(PG_FUNCTION_ARGS)
{
- spgPickSplitIn *in = (spgPickSplitIn *) PG_GETARG_POINTER(0);
- spgPickSplitOut *out = (spgPickSplitOut *) PG_GETARG_POINTER(1);
- BOX2DF *centroid;
- int median,
- i;
- double *lowXs = palloc(sizeof(double) * in->nTuples);
- double *highXs = palloc(sizeof(double) * in->nTuples);
- double *lowYs = palloc(sizeof(double) * in->nTuples);
- double *highYs = palloc(sizeof(double) * in->nTuples);
+ spgPickSplitIn *in = (spgPickSplitIn *)PG_GETARG_POINTER(0);
+ spgPickSplitOut *out = (spgPickSplitOut *)PG_GETARG_POINTER(1);
+ BOX2DF *centroid;
+ int median, i;
+ double *lowXs = palloc(sizeof(double) * in->nTuples);
+ double *highXs = palloc(sizeof(double) * in->nTuples);
+ double *lowYs = palloc(sizeof(double) * in->nTuples);
+ double *highYs = palloc(sizeof(double) * in->nTuples);
/* Calculate median of all 4D coordinates */
for (i = 0; i < in->nTuples; i++)
{
- BOX2DF *box = (BOX2DF *) DatumGetPointer(in->datums[i]);
+ BOX2DF *box = (BOX2DF *)DatumGetPointer(in->datums[i]);
- lowXs[i] = (double) box->xmin;
- highXs[i] = (double) box->xmax;
- lowYs[i] = (double) box->ymin;
- highYs[i] = (double) box->ymax;
+ lowXs[i] = (double)box->xmin;
+ highXs[i] = (double)box->xmax;
+ lowYs[i] = (double)box->ymin;
+ highYs[i] = (double)box->ymax;
}
qsort(lowXs, in->nTuples, sizeof(double), compareDoubles);
@@ -371,10 +362,10 @@
centroid = palloc(sizeof(BOX2DF));
- centroid->xmin = (float) lowXs[median];
- centroid->xmax = (float) highXs[median];
- centroid->ymin = (float) lowYs[median];
- centroid->ymax = (float) highYs[median];
+ centroid->xmin = (float)lowXs[median];
+ centroid->xmax = (float)highXs[median];
+ centroid->ymin = (float)lowYs[median];
+ centroid->ymax = (float)highYs[median];
/* Fill the output */
out->hasPrefix = true;
@@ -381,19 +372,18 @@
out->prefixDatum = BoxPGetDatum(centroid);
out->nNodes = 16;
- out->nodeLabels = NULL; /* We don't need node labels. */
+ out->nodeLabels = NULL; /* We don't need node labels. */
out->mapTuplesToNodes = palloc(sizeof(int) * in->nTuples);
out->leafTupleDatums = palloc(sizeof(Datum) * in->nTuples);
/*
- * Assign ranges to corresponding nodes according to quadrants relative to
- * the "centroid" range
+ * Assign ranges to corresponding nodes according to quadrants relative to the "centroid" range
*/
for (i = 0; i < in->nTuples; i++)
{
- BOX2DF *box = (BOX2DF *) DatumGetPointer(in->datums[i]);
- uint8 quadrant = getQuadrant4D(centroid, box);
+ BOX2DF *box = (BOX2DF *)DatumGetPointer(in->datums[i]);
+ uint8 quadrant = getQuadrant4D(centroid, box);
out->leafTupleDatums[i] = PointerGetDatum(box);
out->mapTuplesToNodes[i] = quadrant;
@@ -412,22 +402,21 @@
*/
PG_FUNCTION_INFO_V1(gserialized_spgist_inner_consistent_2d);
-PGDLLEXPORT Datum
-gserialized_spgist_inner_consistent_2d(PG_FUNCTION_ARGS)
+PGDLLEXPORT Datum gserialized_spgist_inner_consistent_2d(PG_FUNCTION_ARGS)
{
- spgInnerConsistentIn *in = (spgInnerConsistentIn *) PG_GETARG_POINTER(0);
- spgInnerConsistentOut *out = (spgInnerConsistentOut *) PG_GETARG_POINTER(1);
- int i;
+ spgInnerConsistentIn *in = (spgInnerConsistentIn *)PG_GETARG_POINTER(0);
+ spgInnerConsistentOut *out = (spgInnerConsistentOut *)PG_GETARG_POINTER(1);
+ int i;
MemoryContext old_ctx;
- RectBox *rect_box;
- uint8 quadrant;
- BOX2DF *centroid;
+ RectBox *rect_box;
+ uint8 quadrant;
+ BOX2DF *centroid;
if (in->allTheSame)
{
/* Report that all nodes should be visited */
out->nNodes = in->nNodes;
- out->nodeNumbers = (int *) palloc(sizeof(int) * in->nNodes);
+ out->nodeNumbers = (int *)palloc(sizeof(int) * in->nNodes);
for (i = 0; i < in->nNodes; i++)
out->nodeNumbers[i] = i;
@@ -443,12 +432,12 @@
else
rect_box = initRectBox();
- centroid = (BOX2DF *) DatumGetPointer(in->prefixDatum);
+ centroid = (BOX2DF *)DatumGetPointer(in->prefixDatum);
/* Allocate enough memory for nodes */
out->nNodes = 0;
- out->nodeNumbers = (int *) palloc(sizeof(int) * in->nNodes);
- out->traversalValues = (void **) palloc(sizeof(void *) * in->nNodes);
+ out->nodeNumbers = (int *)palloc(sizeof(int) * in->nNodes);
+ out->traversalValues = (void **)palloc(sizeof(void *) * in->nNodes);
/*
* We switch memory context, because we want to allocate memory for new
@@ -459,24 +448,24 @@
for (quadrant = 0; quadrant < in->nNodes; quadrant++)
{
- RectBox *next_rect_box = nextRectBox(rect_box, centroid, quadrant);
- bool flag = true;
+ RectBox *next_rect_box = nextRectBox(rect_box, centroid, quadrant);
+ bool flag = true;
for (i = 0; i < in->nkeys; i++)
{
StrategyNumber strategy = in->scankeys[i].sk_strategy;
- Datum query = in->scankeys[i].sk_argument;
- BOX2DF query_gbox_index;
+ Datum query = in->scankeys[i].sk_argument;
+ BOX2DF query_gbox_index;
/* Quick sanity check on query argument. */
- if ( DatumGetPointer(query) == NULL )
+ if (DatumGetPointer(query) == NULL)
{
POSTGIS_DEBUG(4, "[SPGIST] null query pointer (!?!), returning false");
PG_RETURN_BOOL(false); /* NULL query! This is screwy! */
}
- if ( gserialized_datum_get_box2df_p(query, &query_gbox_index) == LW_FAILURE )
+ if (gserialized_datum_get_box2df_p(query, &query_gbox_index) == LW_FAILURE)
{
POSTGIS_DEBUG(4, "[SPGIST] null query_gbox_index!");
PG_RETURN_BOOL(false);
@@ -484,51 +473,51 @@
switch (strategy)
{
- case RTOverlapStrategyNumber:
- case RTContainedByStrategyNumber:
- case RTOldContainedByStrategyNumber:
- flag = overlap4D(next_rect_box, &query_gbox_index);
- break;
+ case RTOverlapStrategyNumber:
+ case RTContainedByStrategyNumber:
+ case RTOldContainedByStrategyNumber:
+ flag = overlap4D(next_rect_box, &query_gbox_index);
+ break;
- case RTContainsStrategyNumber:
- case RTSameStrategyNumber:
- flag = contain4D(next_rect_box, &query_gbox_index);
- break;
+ case RTContainsStrategyNumber:
+ case RTSameStrategyNumber:
+ flag = contain4D(next_rect_box, &query_gbox_index);
+ break;
- case RTLeftStrategyNumber:
- flag = !overRight4D(next_rect_box, &query_gbox_index);
- break;
+ case RTLeftStrategyNumber:
+ flag = !overRight4D(next_rect_box, &query_gbox_index);
+ break;
- case RTOverLeftStrategyNumber:
- flag = !right4D(next_rect_box, &query_gbox_index);
- break;
+ case RTOverLeftStrategyNumber:
+ flag = !right4D(next_rect_box, &query_gbox_index);
+ break;
- case RTRightStrategyNumber:
- flag = !overLeft4D(next_rect_box, &query_gbox_index);
- break;
+ case RTRightStrategyNumber:
+ flag = !overLeft4D(next_rect_box, &query_gbox_index);
+ break;
- case RTOverRightStrategyNumber:
- flag = !left4D(next_rect_box, &query_gbox_index);
- break;
+ case RTOverRightStrategyNumber:
+ flag = !left4D(next_rect_box, &query_gbox_index);
+ break;
- case RTAboveStrategyNumber:
- flag = !overBelow4D(next_rect_box, &query_gbox_index);
- break;
+ case RTAboveStrategyNumber:
+ flag = !overBelow4D(next_rect_box, &query_gbox_index);
+ break;
- case RTOverAboveStrategyNumber:
- flag = !below4D(next_rect_box, &query_gbox_index);
- break;
+ case RTOverAboveStrategyNumber:
+ flag = !below4D(next_rect_box, &query_gbox_index);
+ break;
- case RTBelowStrategyNumber:
- flag = !overAbove4D(next_rect_box, &query_gbox_index);
- break;
+ case RTBelowStrategyNumber:
+ flag = !overAbove4D(next_rect_box, &query_gbox_index);
+ break;
- case RTOverBelowStrategyNumber:
- flag = !above4D(next_rect_box, &query_gbox_index);
- break;
+ case RTOverBelowStrategyNumber:
+ flag = !above4D(next_rect_box, &query_gbox_index);
+ break;
- default:
- elog(ERROR, "unrecognized strategy: %d", strategy);
+ default:
+ elog(ERROR, "unrecognized strategy: %d", strategy);
}
/* If any check is failed, we have found our answer. */
@@ -563,17 +552,16 @@
*/
PG_FUNCTION_INFO_V1(gserialized_spgist_leaf_consistent_2d);
-PGDLLEXPORT Datum
-gserialized_spgist_leaf_consistent_2d(PG_FUNCTION_ARGS)
+PGDLLEXPORT Datum gserialized_spgist_leaf_consistent_2d(PG_FUNCTION_ARGS)
{
- spgLeafConsistentIn *in = (spgLeafConsistentIn *) PG_GETARG_POINTER(0);
- spgLeafConsistentOut *out = (spgLeafConsistentOut *) PG_GETARG_POINTER(1);
- BOX2DF *key = (BOX2DF *) DatumGetPointer(in->leafDatum);
- bool flag = true;
- int i;
+ spgLeafConsistentIn *in = (spgLeafConsistentIn *)PG_GETARG_POINTER(0);
+ spgLeafConsistentOut *out = (spgLeafConsistentOut *)PG_GETARG_POINTER(1);
+ BOX2DF *key = (BOX2DF *)DatumGetPointer(in->leafDatum);
+ bool flag = true;
+ int i;
/* Quick sanity check on entry key. */
- if ( DatumGetPointer(key) == NULL )
+ if (DatumGetPointer(key) == NULL)
{
POSTGIS_DEBUG(4, "[SPGIST] null index entry, returning false");
PG_RETURN_BOOL(false); /* NULL entry! */
@@ -589,17 +577,17 @@
for (i = 0; i < in->nkeys; i++)
{
StrategyNumber strategy = in->scankeys[i].sk_strategy;
- Datum query = in->scankeys[i].sk_argument;
- BOX2DF query_gbox_index;
+ Datum query = in->scankeys[i].sk_argument;
+ BOX2DF query_gbox_index;
/* Quick sanity check on query argument. */
- if ( DatumGetPointer(query) == NULL )
+ if (DatumGetPointer(query) == NULL)
{
POSTGIS_DEBUG(4, "[SPGIST] null query pointer (!?!), returning false");
PG_RETURN_BOOL(false); /* NULL query! This is screwy! */
}
- if ( gserialized_datum_get_box2df_p(query, &query_gbox_index) == LW_FAILURE )
+ if (gserialized_datum_get_box2df_p(query, &query_gbox_index) == LW_FAILURE)
{
POSTGIS_DEBUG(4, "[SPGIST] null query_gbox_index!");
PG_RETURN_BOOL(false);
@@ -607,58 +595,58 @@
switch (strategy)
{
- case RTOverlapStrategyNumber:
- flag = box2df_overlaps(key, &query_gbox_index);
- break;
+ case RTOverlapStrategyNumber:
+ flag = box2df_overlaps(key, &query_gbox_index);
+ break;
- case RTContainsStrategyNumber:
- case RTOldContainsStrategyNumber:
- flag = box2df_contains(key, &query_gbox_index);
- break;
+ case RTContainsStrategyNumber:
+ case RTOldContainsStrategyNumber:
+ flag = box2df_contains(key, &query_gbox_index);
+ break;
- case RTContainedByStrategyNumber:
- case RTOldContainedByStrategyNumber:
- flag = box2df_contains(&query_gbox_index, key);
- break;
+ case RTContainedByStrategyNumber:
+ case RTOldContainedByStrategyNumber:
+ flag = box2df_contains(&query_gbox_index, key);
+ break;
- case RTSameStrategyNumber:
- flag = box2df_equals(key, &query_gbox_index);
- break;
+ case RTSameStrategyNumber:
+ flag = box2df_equals(key, &query_gbox_index);
+ break;
- case RTLeftStrategyNumber:
- flag = box2df_left(key, &query_gbox_index);
- break;
+ case RTLeftStrategyNumber:
+ flag = box2df_left(key, &query_gbox_index);
+ break;
- case RTOverLeftStrategyNumber:
- flag = box2df_overleft(key, &query_gbox_index);
- break;
+ case RTOverLeftStrategyNumber:
+ flag = box2df_overleft(key, &query_gbox_index);
+ break;
- case RTRightStrategyNumber:
- flag = box2df_right(key, &query_gbox_index);
- break;
+ case RTRightStrategyNumber:
+ flag = box2df_right(key, &query_gbox_index);
+ break;
- case RTOverRightStrategyNumber:
- flag = box2df_overright(key, &query_gbox_index);
- break;
+ case RTOverRightStrategyNumber:
+ flag = box2df_overright(key, &query_gbox_index);
+ break;
- case RTAboveStrategyNumber:
- flag = box2df_above(key, &query_gbox_index);
- break;
+ case RTAboveStrategyNumber:
+ flag = box2df_above(key, &query_gbox_index);
+ break;
- case RTOverAboveStrategyNumber:
- flag = box2df_overabove(key, &query_gbox_index);
- break;
+ case RTOverAboveStrategyNumber:
+ flag = box2df_overabove(key, &query_gbox_index);
+ break;
- case RTBelowStrategyNumber:
- flag = box2df_below(key, &query_gbox_index);
- break;
+ case RTBelowStrategyNumber:
+ flag = box2df_below(key, &query_gbox_index);
+ break;
- case RTOverBelowStrategyNumber:
- flag = box2df_overbelow(key, &query_gbox_index);
- break;
+ case RTOverBelowStrategyNumber:
+ flag = box2df_overbelow(key, &query_gbox_index);
+ break;
- default:
- elog(ERROR, "unrecognized strategy: %d", strategy);
+ default:
+ elog(ERROR, "unrecognized strategy: %d", strategy);
}
/* If any check is failed, we have found our answer. */
@@ -669,20 +657,12 @@
PG_RETURN_BOOL(flag);
}
-/*
-** RTiST support function. Given a geography, return a "compressed"
-** version. In this case, we convert the geography into a geocentric
-** bounding box. If the geography already has the box embedded in it
-** we pull that out and hand it back.
-*/
-
PG_FUNCTION_INFO_V1(gserialized_spgist_compress_2d);
-PGDLLEXPORT Datum
-gserialized_spgist_compress_2d(PG_FUNCTION_ARGS)
+PGDLLEXPORT Datum gserialized_spgist_compress_2d(PG_FUNCTION_ARGS)
{
- Datum gsdatum = PG_GETARG_DATUM(0);
- BOX2DF *bbox_out = palloc(sizeof(BOX2DF));
+ Datum gsdatum = PG_GETARG_DATUM(0);
+ BOX2DF *bbox_out = palloc(sizeof(BOX2DF));
int result = LW_SUCCESS;
POSTGIS_DEBUG(4, "[SPGIST] 'compress' function called");
@@ -691,7 +671,7 @@
result = gserialized_datum_get_box2df_p(gsdatum, bbox_out);
/* Is the bounding box valid (non-empty, non-infinite)? If not, return input uncompressed. */
- if ( result == LW_FAILURE )
+ if (result == LW_FAILURE)
{
box2df_set_empty(bbox_out);
@@ -702,8 +682,8 @@
POSTGIS_DEBUGF(4, "[SPGIST] got box: %s", box2df_to_string(bbox_out));
/* Check all the dimensions for finite values */
- if ( ! isfinite(bbox_out->xmax) || ! isfinite(bbox_out->xmin) ||
- ! isfinite(bbox_out->ymax) || ! isfinite(bbox_out->ymin) )
+ if ((!isfinite(bbox_out->xmax) || !isfinite(bbox_out->xmin)) ||
+ (!isfinite(bbox_out->ymax) || !isfinite(bbox_out->ymin)))
{
box2df_set_finite(bbox_out);
Modified: trunk/postgis/gserialized_spgist_3d.c
===================================================================
--- trunk/postgis/gserialized_spgist_3d.c 2018-07-10 14:25:07 UTC (rev 16640)
+++ trunk/postgis/gserialized_spgist_3d.c 2018-07-13 20:06:43 UTC (rev 16641)
@@ -71,6 +71,7 @@
*****************************************************************************/
#include "gserialized_spgist_3d.h"
+#include "lwgeom_box3d.h"
#include "lwgeom_pg.h"
PG_FUNCTION_INFO_V1(gserialized_overlaps_3d);
@@ -79,7 +80,8 @@
BOX3D *box1 = DatumGetBox3DP(DirectFunctionCall1(LWGEOM_to_BOX3D, PG_GETARG_DATUM(0)));
BOX3D *box2 = DatumGetBox3DP(DirectFunctionCall1(LWGEOM_to_BOX3D, PG_GETARG_DATUM(1)));
bool resut = BOX3D_overlaps_internal(box1, box2);
- pfree(box1); pfree(box2);
+ pfree(box1);
+ pfree(box2);
PG_RETURN_BOOL(resut);
}
@@ -90,7 +92,8 @@
BOX3D *box1 = DatumGetBox3DP(DirectFunctionCall1(LWGEOM_to_BOX3D, PG_GETARG_DATUM(0)));
BOX3D *box2 = DatumGetBox3DP(DirectFunctionCall1(LWGEOM_to_BOX3D, PG_GETARG_DATUM(1)));
bool resut = BOX3D_contains_internal(box1, box2);
- pfree(box1); pfree(box2);
+ pfree(box1);
+ pfree(box2);
PG_RETURN_BOOL(resut);
}
@@ -101,7 +104,8 @@
BOX3D *box1 = DatumGetBox3DP(DirectFunctionCall1(LWGEOM_to_BOX3D, PG_GETARG_DATUM(0)));
BOX3D *box2 = DatumGetBox3DP(DirectFunctionCall1(LWGEOM_to_BOX3D, PG_GETARG_DATUM(1)));
bool resut = BOX3D_contained_internal(box1, box2);
- pfree(box1); pfree(box2);
+ pfree(box1);
+ pfree(box2);
PG_RETURN_BOOL(resut);
}
@@ -112,7 +116,8 @@
BOX3D *box1 = DatumGetBox3DP(DirectFunctionCall1(LWGEOM_to_BOX3D, PG_GETARG_DATUM(0)));
BOX3D *box2 = DatumGetBox3DP(DirectFunctionCall1(LWGEOM_to_BOX3D, PG_GETARG_DATUM(1)));
bool resut = BOX3D_same_internal(box1, box2);
- pfree(box1); pfree(box2);
+ pfree(box1);
+ pfree(box2);
PG_RETURN_BOOL(resut);
}
@@ -127,8 +132,8 @@
static int
compareDoubles(const void *a, const void *b)
{
- double x = *(double *) a;
- double y = *(double *) b;
+ double x = *(double *)a;
+ double y = *(double *)b;
if (x == y)
return 0;
@@ -137,8 +142,8 @@
typedef struct
{
- BOX3D left;
- BOX3D right;
+ BOX3D left;
+ BOX3D right;
} CubeBox3D;
/*
@@ -151,7 +156,7 @@
static uint8
getOctant(BOX3D *centroid, BOX3D *inBox)
{
- uint8 octant = 0;
+ uint8 octant = 0;
if (inBox->xmin > centroid->xmin)
octant |= 0x20;
@@ -183,8 +188,8 @@
static CubeBox3D *
initCubeBox(void)
{
- CubeBox3D *cube_box = (CubeBox3D *) palloc(sizeof(CubeBox3D));
- double infinity = get_float8_infinity();
+ CubeBox3D *cube_box = (CubeBox3D *)palloc(sizeof(CubeBox3D));
+ double infinity = get_float8_infinity();
cube_box->left.xmin = -infinity;
cube_box->left.xmax = infinity;
@@ -210,14 +215,14 @@
/*
* Calculate the next traversal value
*
- * All centroids are bounded by CubeBox3D, but SP-GiST only keeps
- * boxes. When we are traversing the tree, we must calculate CubeBox3D,
+ * All centroids are bounded by CubeBox3D, but SP-GiST only keeps boxes.
+ * When we are traversing the tree, we must calculate CubeBox3D,
* using centroid and octant.
*/
static CubeBox3D *
nextCubeBox3D(CubeBox3D *cube_box, BOX3D *centroid, uint8 octant)
{
- CubeBox3D *next_cube_box = (CubeBox3D *) palloc(sizeof(CubeBox3D));
+ CubeBox3D *next_cube_box = (CubeBox3D *)palloc(sizeof(CubeBox3D));
memcpy(next_cube_box, cube_box, sizeof(CubeBox3D));
@@ -258,12 +263,9 @@
static bool
overlap6D(CubeBox3D *cube_box, BOX3D *query)
{
- return (cube_box->left.xmin <= query->xmax) &&
- (cube_box->right.xmax >= query->xmin) &&
- (cube_box->left.ymin <= query->ymax) &&
- (cube_box->right.ymax >= query->ymin) &&
- (cube_box->left.zmin <= query->zmax) &&
- (cube_box->right.zmax >= query->zmin);
+ return (cube_box->left.xmin <= query->xmax) && (cube_box->right.xmax >= query->xmin) &&
+ (cube_box->left.ymin <= query->ymax) && (cube_box->right.ymax >= query->ymin) &&
+ (cube_box->left.zmin <= query->zmax) && (cube_box->right.zmax >= query->zmin);
}
/* Can any cube from cube_box contain query? */
@@ -270,12 +272,9 @@
static bool
contain6D(CubeBox3D *cube_box, BOX3D *query)
{
- return (cube_box->right.xmax >= query->xmax) &&
- (cube_box->left.xmin <= query->xmin) &&
- (cube_box->right.ymax >= query->ymax) &&
- (cube_box->left.ymin <= query->ymin) &&
- (cube_box->right.zmax >= query->zmax) &&
- (cube_box->left.zmin <= query->zmin);
+ return (cube_box->right.xmax >= query->xmax) && (cube_box->left.xmin <= query->xmin) &&
+ (cube_box->right.ymax >= query->ymax) && (cube_box->left.ymin <= query->ymin) &&
+ (cube_box->right.zmax >= query->zmax) && (cube_box->left.zmin <= query->zmin);
}
/* Can any cube from cube_box be left of query? */
@@ -368,14 +367,13 @@
PG_FUNCTION_INFO_V1(gserialized_spgist_config_3d);
-PGDLLEXPORT Datum
-gserialized_spgist_config_3d(PG_FUNCTION_ARGS)
+PGDLLEXPORT Datum gserialized_spgist_config_3d(PG_FUNCTION_ARGS)
{
- spgConfigOut *cfg = (spgConfigOut *) PG_GETARG_POINTER(1);
+ spgConfigOut *cfg = (spgConfigOut *)PG_GETARG_POINTER(1);
Oid boxoid = TypenameGetTypid("box3d");
cfg->prefixType = boxoid;
- cfg->labelType = VOIDOID; /* We don't need node labels. */
+ cfg->labelType = VOIDOID; /* We don't need node labels. */
cfg->leafType = boxoid;
cfg->canReturnData = false;
cfg->longValuesOK = false;
@@ -389,13 +387,12 @@
PG_FUNCTION_INFO_V1(gserialized_spgist_choose_3d);
-PGDLLEXPORT Datum
-gserialized_spgist_choose_3d(PG_FUNCTION_ARGS)
+PGDLLEXPORT Datum gserialized_spgist_choose_3d(PG_FUNCTION_ARGS)
{
- spgChooseIn *in = (spgChooseIn *) PG_GETARG_POINTER(0);
- spgChooseOut *out = (spgChooseOut *) PG_GETARG_POINTER(1);
- BOX3D *centroid = DatumGetBox3DP(in->prefixDatum),
- *box = DatumGetBox3DP(in->leafDatum);
+ spgChooseIn *in = (spgChooseIn *)PG_GETARG_POINTER(0);
+ spgChooseOut *out = (spgChooseOut *)PG_GETARG_POINTER(1);
+ BOX3D *centroid = DatumGetBox3DP(in->prefixDatum);
+ BOX3D *box = DatumGetBox3DP(in->leafDatum);
out->resultType = spgMatchNode;
out->result.matchNode.restDatum = Box3DPGetDatum(box);
@@ -415,27 +412,25 @@
*/
PG_FUNCTION_INFO_V1(gserialized_spgist_picksplit_3d);
-PGDLLEXPORT Datum
-gserialized_spgist_picksplit_3d(PG_FUNCTION_ARGS)
+PGDLLEXPORT Datum gserialized_spgist_picksplit_3d(PG_FUNCTION_ARGS)
{
- spgPickSplitIn *in = (spgPickSplitIn *) PG_GETARG_POINTER(0);
- spgPickSplitOut *out = (spgPickSplitOut *) PG_GETARG_POINTER(1);
- BOX3D *centroid;
- int median,
- i;
- double *lowXs = palloc(sizeof(double) * in->nTuples);
- double *highXs = palloc(sizeof(double) * in->nTuples);
- double *lowYs = palloc(sizeof(double) * in->nTuples);
- double *highYs = palloc(sizeof(double) * in->nTuples);
- double *lowZs = palloc(sizeof(double) * in->nTuples);
- double *highZs = palloc(sizeof(double) * in->nTuples);
- BOX3D *box = DatumGetBox3DP(in->datums[0]);
- int32_t srid = box->srid;
+ spgPickSplitIn *in = (spgPickSplitIn *)PG_GETARG_POINTER(0);
+ spgPickSplitOut *out = (spgPickSplitOut *)PG_GETARG_POINTER(1);
+ BOX3D *centroid;
+ int median, i;
+ double *lowXs = palloc(sizeof(double) * in->nTuples);
+ double *highXs = palloc(sizeof(double) * in->nTuples);
+ double *lowYs = palloc(sizeof(double) * in->nTuples);
+ double *highYs = palloc(sizeof(double) * in->nTuples);
+ double *lowZs = palloc(sizeof(double) * in->nTuples);
+ double *highZs = palloc(sizeof(double) * in->nTuples);
+ BOX3D *box = DatumGetBox3DP(in->datums[0]);
+ int32_t srid = box->srid;
/* Calculate median of all 6D coordinates */
for (i = 0; i < in->nTuples; i++)
{
- BOX3D *box = DatumGetBox3DP(in->datums[i]);
+ BOX3D *box = DatumGetBox3DP(in->datums[i]);
lowXs[i] = box->xmin;
highXs[i] = box->xmax;
@@ -469,7 +464,7 @@
out->prefixDatum = Box3DPGetDatum(centroid);
out->nNodes = 64;
- out->nodeLabels = NULL; /* We don't need node labels. */
+ out->nodeLabels = NULL; /* We don't need node labels. */
out->mapTuplesToNodes = palloc(sizeof(int) * in->nTuples);
out->leafTupleDatums = palloc(sizeof(Datum) * in->nTuples);
@@ -480,8 +475,8 @@
*/
for (i = 0; i < in->nTuples; i++)
{
- BOX3D *box = DatumGetBox3DP(in->datums[i]);
- uint8 octant = getOctant(centroid, box);
+ BOX3D *box = DatumGetBox3DP(in->datums[i]);
+ uint8 octant = getOctant(centroid, box);
out->leafTupleDatums[i] = Box3DPGetDatum(box);
out->mapTuplesToNodes[i] = octant;
@@ -502,24 +497,23 @@
*/
PG_FUNCTION_INFO_V1(gserialized_spgist_inner_consistent_3d);
-PGDLLEXPORT Datum
-gserialized_spgist_inner_consistent_3d(PG_FUNCTION_ARGS)
+PGDLLEXPORT Datum gserialized_spgist_inner_consistent_3d(PG_FUNCTION_ARGS)
{
- spgInnerConsistentIn *in = (spgInnerConsistentIn *) PG_GETARG_POINTER(0);
- spgInnerConsistentOut *out = (spgInnerConsistentOut *) PG_GETARG_POINTER(1);
- int i;
+ spgInnerConsistentIn *in = (spgInnerConsistentIn *)PG_GETARG_POINTER(0);
+ spgInnerConsistentOut *out = (spgInnerConsistentOut *)PG_GETARG_POINTER(1);
+ int i;
MemoryContext old_ctx;
- CubeBox3D *cube_box;
- uint8 octant;
- BOX3D *centroid;
- int *nodeNumbers;
- void **traversalValues;
+ CubeBox3D *cube_box;
+ uint8 octant;
+ BOX3D *centroid;
+ int *nodeNumbers;
+ void **traversalValues;
if (in->allTheSame)
{
/* Report that all nodes should be visited */
out->nNodes = in->nNodes;
- out->nodeNumbers = (int *) palloc(sizeof(int) * in->nNodes);
+ out->nodeNumbers = (int *)palloc(sizeof(int) * in->nNodes);
for (i = 0; i < in->nNodes; i++)
out->nodeNumbers[i] = i;
@@ -539,8 +533,8 @@
/* Allocate enough memory for nodes */
out->nNodes = 0;
- nodeNumbers = (int *) palloc(sizeof(int) * in->nNodes);
- traversalValues = (void **) palloc(sizeof(void *) * in->nNodes);
+ nodeNumbers = (int *)palloc(sizeof(int) * in->nNodes);
+ traversalValues = (void **)palloc(sizeof(void *) * in->nNodes);
/*
* We switch memory context, because we want to allocate memory for new
@@ -551,77 +545,77 @@
for (octant = 0; octant < in->nNodes; octant++)
{
- CubeBox3D *next_cube_box = nextCubeBox3D(cube_box, centroid, octant);
- bool flag = true;
+ CubeBox3D *next_cube_box = nextCubeBox3D(cube_box, centroid, octant);
+ bool flag = true;
for (i = 0; i < in->nkeys; i++)
{
StrategyNumber strategy = in->scankeys[i].sk_strategy;
- Datum query = in->scankeys[i].sk_argument;
- BOX3D *box = DatumGetBox3DP(DirectFunctionCall1(LWGEOM_to_BOX3D, query));
+ Datum query = in->scankeys[i].sk_argument;
+ BOX3D *box = DatumGetBox3DP(DirectFunctionCall1(LWGEOM_to_BOX3D, query));
switch (strategy)
{
- case SPGOverlapStrategyNumber:
- case SPGContainedByStrategyNumber:
- flag = overlap6D(next_cube_box, box);
- break;
+ case SPGOverlapStrategyNumber:
+ case SPGContainedByStrategyNumber:
+ flag = overlap6D(next_cube_box, box);
+ break;
- case SPGContainsStrategyNumber:
- case SPGSameStrategyNumber:
- flag = contain6D(next_cube_box, box);
- break;
+ case SPGContainsStrategyNumber:
+ case SPGSameStrategyNumber:
+ flag = contain6D(next_cube_box, box);
+ break;
- case SPGLeftStrategyNumber:
- flag = !overRight6D(next_cube_box, box);
- break;
+ case SPGLeftStrategyNumber:
+ flag = !overRight6D(next_cube_box, box);
+ break;
- case SPGOverLeftStrategyNumber:
- flag = !right6D(next_cube_box, box);
- break;
+ case SPGOverLeftStrategyNumber:
+ flag = !right6D(next_cube_box, box);
+ break;
- case SPGRightStrategyNumber:
- flag = !overLeft6D(next_cube_box, box);
- break;
+ case SPGRightStrategyNumber:
+ flag = !overLeft6D(next_cube_box, box);
+ break;
- case SPGOverRightStrategyNumber:
- flag = !left6D(next_cube_box, box);
- break;
+ case SPGOverRightStrategyNumber:
+ flag = !left6D(next_cube_box, box);
+ break;
- case SPGAboveStrategyNumber:
- flag = !overBelow6D(next_cube_box, box);
- break;
+ case SPGAboveStrategyNumber:
+ flag = !overBelow6D(next_cube_box, box);
+ break;
- case SPGOverAboveStrategyNumber:
- flag = !below6D(next_cube_box, box);
- break;
+ case SPGOverAboveStrategyNumber:
+ flag = !below6D(next_cube_box, box);
+ break;
- case SPGBelowStrategyNumber:
- flag = !overAbove6D(next_cube_box, box);
- break;
+ case SPGBelowStrategyNumber:
+ flag = !overAbove6D(next_cube_box, box);
+ break;
- case SPGOverBelowStrategyNumber:
- flag = !above6D(next_cube_box, box);
- break;
+ case SPGOverBelowStrategyNumber:
+ flag = !above6D(next_cube_box, box);
+ break;
- case SPGBackStrategyNumber:
- flag = !overFront6D(next_cube_box, box);
- break;
+ case SPGBackStrategyNumber:
+ flag = !overFront6D(next_cube_box, box);
+ break;
- case SPGOverBackStrategyNumber:
- flag = !front6D(next_cube_box, box);
- break;
+ case SPGOverBackStrategyNumber:
+ flag = !front6D(next_cube_box, box);
+ break;
- case SPGFrontStrategyNumber:
- flag = !overBack6D(next_cube_box, box);
- break;
+ case SPGFrontStrategyNumber:
+ flag = !overBack6D(next_cube_box, box);
+ break;
- case SPGOverFrontStrategyNumber:
- flag = !back6D(next_cube_box, box);
- break;
+ case SPGOverFrontStrategyNumber:
+ flag = !back6D(next_cube_box, box);
+ break;
- default:
- elog(ERROR, "unrecognized strategy: %d", strategy);
+ default:
+ elog(ERROR, "unrecognized strategy: %d", strategy);
}
/* If any check is failed, we have found our answer. */
@@ -646,8 +640,8 @@
}
/* Pass to the next level only the values that need to be traversed */
- out->nodeNumbers = (int *) palloc(sizeof(int) * out->nNodes);
- out->traversalValues = (void **) palloc(sizeof(void *) * out->nNodes);
+ out->nodeNumbers = (int *)palloc(sizeof(int) * out->nNodes);
+ out->traversalValues = (void **)palloc(sizeof(void *) * out->nNodes);
for (i = 0; i < out->nNodes; i++)
{
out->nodeNumbers[i] = nodeNumbers[i];
@@ -667,14 +661,13 @@
*/
PG_FUNCTION_INFO_V1(gserialized_spgist_leaf_consistent_3d);
-PGDLLEXPORT Datum
-gserialized_spgist_leaf_consistent_3d(PG_FUNCTION_ARGS)
+PGDLLEXPORT Datum gserialized_spgist_leaf_consistent_3d(PG_FUNCTION_ARGS)
{
- spgLeafConsistentIn *in = (spgLeafConsistentIn *) PG_GETARG_POINTER(0);
- spgLeafConsistentOut *out = (spgLeafConsistentOut *) PG_GETARG_POINTER(1);
- BOX3D *leaf = DatumGetBox3DP(in->leafDatum);
- bool flag = true;
- int i;
+ spgLeafConsistentIn *in = (spgLeafConsistentIn *)PG_GETARG_POINTER(0);
+ spgLeafConsistentOut *out = (spgLeafConsistentOut *)PG_GETARG_POINTER(1);
+ BOX3D *leaf = DatumGetBox3DP(in->leafDatum);
+ bool flag = true;
+ int i;
/* All tests are exact. */
out->recheck = false;
@@ -686,77 +679,77 @@
for (i = 0; i < in->nkeys; i++)
{
StrategyNumber strategy = in->scankeys[i].sk_strategy;
- Datum query = in->scankeys[i].sk_argument;
- BOX3D *box = DatumGetBox3DP(DirectFunctionCall1(LWGEOM_to_BOX3D, query));
+ Datum query = in->scankeys[i].sk_argument;
+ BOX3D *box = DatumGetBox3DP(DirectFunctionCall1(LWGEOM_to_BOX3D, query));
switch (strategy)
{
- case SPGOverlapStrategyNumber:
- flag = BOX3D_overlaps_internal(leaf, box);
- break;
+ case SPGOverlapStrategyNumber:
+ flag = BOX3D_overlaps_internal(leaf, box);
+ break;
- case SPGContainsStrategyNumber:
- flag = BOX3D_contains_internal(leaf, box);
- break;
+ case SPGContainsStrategyNumber:
+ flag = BOX3D_contains_internal(leaf, box);
+ break;
- case SPGContainedByStrategyNumber:
- flag = BOX3D_contained_internal(leaf, box);
- break;
+ case SPGContainedByStrategyNumber:
+ flag = BOX3D_contained_internal(leaf, box);
+ break;
- case SPGSameStrategyNumber:
- flag = BOX3D_same_internal(leaf, box);
- break;
+ case SPGSameStrategyNumber:
+ flag = BOX3D_same_internal(leaf, box);
+ break;
- case SPGLeftStrategyNumber:
- flag = BOX3D_left_internal(leaf, box);
- break;
+ case SPGLeftStrategyNumber:
+ flag = BOX3D_left_internal(leaf, box);
+ break;
- case SPGOverLeftStrategyNumber:
- flag = BOX3D_overleft_internal(leaf, box);
- break;
+ case SPGOverLeftStrategyNumber:
+ flag = BOX3D_overleft_internal(leaf, box);
+ break;
- case SPGRightStrategyNumber:
- flag = BOX3D_right_internal(leaf, box);
- break;
+ case SPGRightStrategyNumber:
+ flag = BOX3D_right_internal(leaf, box);
+ break;
- case SPGOverRightStrategyNumber:
- flag = BOX3D_overright_internal(leaf, box);
- break;
+ case SPGOverRightStrategyNumber:
+ flag = BOX3D_overright_internal(leaf, box);
+ break;
- case SPGAboveStrategyNumber:
- flag = BOX3D_above_internal(leaf, box);
- break;
+ case SPGAboveStrategyNumber:
+ flag = BOX3D_above_internal(leaf, box);
+ break;
- case SPGOverAboveStrategyNumber:
- flag = BOX3D_overabove_internal(leaf, box);
- break;
+ case SPGOverAboveStrategyNumber:
+ flag = BOX3D_overabove_internal(leaf, box);
+ break;
- case SPGBelowStrategyNumber:
- flag = BOX3D_below_internal(leaf, box);
- break;
+ case SPGBelowStrategyNumber:
+ flag = BOX3D_below_internal(leaf, box);
+ break;
- case SPGOverBelowStrategyNumber:
- flag = BOX3D_overbelow_internal(leaf, box);
- break;
+ case SPGOverBelowStrategyNumber:
+ flag = BOX3D_overbelow_internal(leaf, box);
+ break;
- case SPGBackStrategyNumber:
- flag = BOX3D_back_internal(leaf, box);
- break;
+ case SPGBackStrategyNumber:
+ flag = BOX3D_back_internal(leaf, box);
+ break;
- case SPGOverBackStrategyNumber:
- flag = BOX3D_overback_internal(leaf, box);
- break;
+ case SPGOverBackStrategyNumber:
+ flag = BOX3D_overback_internal(leaf, box);
+ break;
- case SPGFrontStrategyNumber:
- flag = BOX3D_front_internal(leaf, box);
- break;
+ case SPGFrontStrategyNumber:
+ flag = BOX3D_front_internal(leaf, box);
+ break;
- case SPGOverFrontStrategyNumber:
- flag = BOX3D_overfront_internal(leaf, box);
- break;
+ case SPGOverFrontStrategyNumber:
+ flag = BOX3D_overfront_internal(leaf, box);
+ break;
- default:
- elog(ERROR, "unrecognized strategy: %d", strategy);
+ default:
+ elog(ERROR, "unrecognized strategy: %d", strategy);
}
/* If any check is failed, we have found our answer. */
@@ -769,13 +762,12 @@
PG_FUNCTION_INFO_V1(gserialized_spgist_compress_3d);
-PGDLLEXPORT Datum
-gserialized_spgist_compress_3d(PG_FUNCTION_ARGS)
+PGDLLEXPORT Datum gserialized_spgist_compress_3d(PG_FUNCTION_ARGS)
{
- BOX3D *result = DatumGetBox3DP(DirectFunctionCall1(LWGEOM_to_BOX3D, PG_GETARG_DATUM(0)));
+ BOX3D *result = DatumGetBox3DP(DirectFunctionCall1(LWGEOM_to_BOX3D, PG_GETARG_DATUM(0)));
/* Is the bounding box is null */
- if ( result == LW_FAILURE )
+ if (result == LW_FAILURE)
{
PG_RETURN_NULL();
}
Modified: trunk/postgis/gserialized_spgist_3d.h
===================================================================
--- trunk/postgis/gserialized_spgist_3d.h 2018-07-10 14:25:07 UTC (rev 16640)
+++ trunk/postgis/gserialized_spgist_3d.h 2018-07-13 20:06:43 UTC (rev 16641)
@@ -41,30 +41,7 @@
#define SPGSubEqualStrategyNumber 25 /* for inet <<= */
#define SPGSuperStrategyNumber 26 /* for inet << */
#define SPGSuperEqualStrategyNumber 27 /* for inet >>= */
-#define SPGOverFrontStrategyNumber 28 /* for &</ */
-#define SPGFrontStrategyNumber 29 /* for <</ */
-#define SPGBackStrategyNumber 30 /* for />> */
-#define SPGOverBackStrategyNumber 31 /* for /&> */
-
-/*****************************************************************************
- * BOX3D operators
- *****************************************************************************/
-
-
-bool BOX3D_contains_internal(BOX3D *box1, BOX3D *box2);
-bool BOX3D_contained_internal(BOX3D *box1, BOX3D *box2);
-bool BOX3D_overlaps_internal(BOX3D *box1, BOX3D *box2);
-bool BOX3D_same_internal(BOX3D *box1, BOX3D *box2);
-bool BOX3D_left_internal(BOX3D *box1, BOX3D *box2);
-bool BOX3D_overleft_internal(BOX3D *box1, BOX3D *box2);
-bool BOX3D_right_internal(BOX3D *box1, BOX3D *box2);
-bool BOX3D_overright_internal(BOX3D *box1, BOX3D *box2);
-bool BOX3D_below_internal(BOX3D *box1, BOX3D *box2);
-bool BOX3D_overbelow_internal(BOX3D *box1, BOX3D *box2);
-bool BOX3D_above_internal(BOX3D *box1, BOX3D *box2);
-bool BOX3D_overabove_internal(BOX3D *box1, BOX3D *box2);
-bool BOX3D_front_internal(BOX3D *box1, BOX3D *box2);
-bool BOX3D_overfront_internal(BOX3D *box1, BOX3D *box2);
-bool BOX3D_back_internal(BOX3D *box1, BOX3D *box2);
-bool BOX3D_overback_internal(BOX3D *box1, BOX3D *box2);
-double BOX3D_distance_internal(BOX3D *box1, BOX3D *box2);
+#define SPGOverFrontStrategyNumber 28 /* for &</ */
+#define SPGFrontStrategyNumber 29 /* for <</ */
+#define SPGBackStrategyNumber 30 /* for />> */
+#define SPGOverBackStrategyNumber 31 /* for /&> */
Modified: trunk/postgis/lwgeom_box3d.c
===================================================================
--- trunk/postgis/lwgeom_box3d.c 2018-07-10 14:25:07 UTC (rev 16640)
+++ trunk/postgis/lwgeom_box3d.c 2018-07-13 20:06:43 UTC (rev 16641)
@@ -18,24 +18,21 @@
*
**********************************************************************
*
- * ^copyright^
+ * Copyright 2009 Mark Cave-Ayland <mark.cave-ayland at siriusit.co.uk>
+ * Copyright 2009-2017 Paul Ramsey <pramsey at cleverelephant.ca>
+ * Copyright 2018 Darafei Praliaskouski <me at komzpa.net>
*
**********************************************************************/
-
#include "postgres.h"
#include "fmgr.h"
#include "utils/elog.h"
#include "utils/geo_decls.h"
-/** needed for sp-gist support PostgreSQL 11+ **/
-#if POSTGIS_PGSQL_VERSION > 100
-#include "gserialized_spgist_3d.h"
-#endif
-
#include "../postgis_config.h"
#include "lwgeom_pg.h"
#include "liblwgeom.h"
+#include "lwgeom_box3d.h"
#include <math.h>
#include <float.h>
@@ -44,46 +41,8 @@
#include <errno.h>
#define SHOW_DIGS_DOUBLE 15
-#define MAX_DIGS_DOUBLE (SHOW_DIGS_DOUBLE + 6 + 1 + 3 +1)
+#define MAX_DIGS_DOUBLE (SHOW_DIGS_DOUBLE + 6 + 1 + 3 + 1)
-/* forward defs */
-Datum BOX3D_in(PG_FUNCTION_ARGS);
-Datum BOX3D_out(PG_FUNCTION_ARGS);
-Datum LWGEOM_to_BOX3D(PG_FUNCTION_ARGS);
-Datum BOX3D_to_LWGEOM(PG_FUNCTION_ARGS);
-Datum BOX3D_expand(PG_FUNCTION_ARGS);
-Datum BOX3D_to_BOX2D(PG_FUNCTION_ARGS);
-Datum BOX3D_to_BOX(PG_FUNCTION_ARGS);
-Datum BOX3D_xmin(PG_FUNCTION_ARGS);
-Datum BOX3D_ymin(PG_FUNCTION_ARGS);
-Datum BOX3D_zmin(PG_FUNCTION_ARGS);
-Datum BOX3D_xmax(PG_FUNCTION_ARGS);
-Datum BOX3D_ymax(PG_FUNCTION_ARGS);
-Datum BOX3D_zmax(PG_FUNCTION_ARGS);
-Datum BOX3D_combine(PG_FUNCTION_ARGS);
-Datum BOX3D_combine_BOX3D(PG_FUNCTION_ARGS);
-
-/** needed for sp-gist support PostgreSQL 11+ **/
-#if POSTGIS_PGSQL_VERSION > 100
-Datum BOX3D_contains(PG_FUNCTION_ARGS);
-Datum BOX3D_contained(PG_FUNCTION_ARGS);
-Datum BOX3D_overlaps(PG_FUNCTION_ARGS);
-Datum BOX3D_same(PG_FUNCTION_ARGS);
-Datum BOX3D_left(PG_FUNCTION_ARGS);
-Datum BOX3D_overleft(PG_FUNCTION_ARGS);
-Datum BOX3D_right(PG_FUNCTION_ARGS) ;
-Datum BOX3D_overright(PG_FUNCTION_ARGS);
-Datum BOX3D_below(PG_FUNCTION_ARGS);
-Datum BOX3D_overbelow(PG_FUNCTION_ARGS);
-Datum BOX3D_above(PG_FUNCTION_ARGS);
-Datum BOX3D_overabove(PG_FUNCTION_ARGS);
-Datum BOX3D_front(PG_FUNCTION_ARGS);
-Datum BOX3D_overfront(PG_FUNCTION_ARGS);
-Datum BOX3D_back(PG_FUNCTION_ARGS);
-Datum BOX3D_overback(PG_FUNCTION_ARGS);
-Datum BOX3D_distance(PG_FUNCTION_ARGS);
-#endif
-
/**
* BOX3D_in - takes a string rep of BOX3D and returns internal rep
*
@@ -91,7 +50,6 @@
* "BOX3D(x1 y1 z1,x2 y2 z2)"
* or "BOX3D(x1 y1,x2 y2)" z1 and z2 = 0.0
*
- *
*/
PG_FUNCTION_INFO_V1(BOX3D_in);
@@ -99,31 +57,34 @@
{
char *str = PG_GETARG_CSTRING(0);
int nitems;
- BOX3D *box = (BOX3D *) palloc(sizeof(BOX3D));
+ BOX3D *box = (BOX3D *)palloc(sizeof(BOX3D));
box->zmin = 0;
box->zmax = 0;
-
- /*printf( "box3d_in gets '%s'\n",str); */
-
- if (strstr(str,"BOX3D(") != str )
+ if (strstr(str, "BOX3D(") != str)
{
pfree(box);
- elog(ERROR,"BOX3D parser - doesn't start with BOX3D(");
+ elog(ERROR, "BOX3D parser - doesn't start with BOX3D(");
PG_RETURN_NULL();
}
- nitems = sscanf(str,"BOX3D(%le %le %le ,%le %le %le)",
- &box->xmin, &box->ymin, &box->zmin,
- &box->xmax, &box->ymax, &box->zmax);
- if (nitems != 6 )
+ nitems = sscanf(str,
+ "BOX3D(%le %le %le ,%le %le %le)",
+ &box->xmin,
+ &box->ymin,
+ &box->zmin,
+ &box->xmax,
+ &box->ymax,
+ &box->zmax);
+ if (nitems != 6)
{
- nitems = sscanf(str,"BOX3D(%le %le ,%le %le)",
- &box->xmin, &box->ymin, &box->xmax, &box->ymax);
+ nitems = sscanf(str, "BOX3D(%le %le ,%le %le)", &box->xmin, &box->ymin, &box->xmax, &box->ymax);
if (nitems != 4)
{
pfree(box);
- elog(ERROR,"BOX3D parser - couldn't parse. It should look like: BOX3D(xmin ymin zmin,xmax ymax zmax) or BOX3D(xmin ymin,xmax ymax)");
+ elog(
+ ERROR,
+ "BOX3D parser - couldn't parse. It should look like: BOX3D(xmin ymin zmin,xmax ymax zmax) or BOX3D(xmin ymin,xmax ymax)");
PG_RETURN_NULL();
}
}
@@ -150,7 +111,6 @@
PG_RETURN_POINTER(box);
}
-
/**
* Takes an internal rep of a BOX3D and returns a string rep.
*
@@ -160,7 +120,7 @@
PG_FUNCTION_INFO_V1(BOX3D_out);
Datum BOX3D_out(PG_FUNCTION_ARGS)
{
- BOX3D *bbox = (BOX3D *) PG_GETARG_POINTER(0);
+ BOX3D *bbox = (BOX3D *)PG_GETARG_POINTER(0);
int size;
char *result;
@@ -167,24 +127,27 @@
if (bbox == NULL)
{
result = palloc(5);
- strcat(result,"NULL");
+ strcat(result, "NULL");
PG_RETURN_CSTRING(result);
}
+ /* double digits + "BOX3D"+ "()" + commas + null */
+ size = MAX_DIGS_DOUBLE * 6 + 5 + 2 + 4 + 5 + 1;
- /*double digits+ "BOX3D"+ "()" + commas +null */
- size = MAX_DIGS_DOUBLE*6+5+2+4+5+1;
+ result = (char *)palloc(size);
- result = (char *) palloc(size);
+ sprintf(result,
+ "BOX3D(%.15g %.15g %.15g,%.15g %.15g %.15g)",
+ bbox->xmin,
+ bbox->ymin,
+ bbox->zmin,
+ bbox->xmax,
+ bbox->ymax,
+ bbox->zmax);
- sprintf(result, "BOX3D(%.15g %.15g %.15g,%.15g %.15g %.15g)",
- bbox->xmin, bbox->ymin, bbox->zmin,
- bbox->xmax,bbox->ymax,bbox->zmax);
-
PG_RETURN_CSTRING(result);
}
-
PG_FUNCTION_INFO_V1(BOX3D_to_BOX2D);
Datum BOX3D_to_BOX2D(PG_FUNCTION_ARGS)
{
@@ -196,7 +159,8 @@
static void
box3d_to_box_p(BOX3D *box, BOX *out)
{
- if ( ! box ) return;
+ if (!box)
+ return;
out->low.x = box->xmin;
out->low.y = box->ymin;
@@ -215,7 +179,6 @@
PG_RETURN_POINTER(box);
}
-
PG_FUNCTION_INFO_V1(BOX3D_to_LWGEOM);
Datum BOX3D_to_LWGEOM(PG_FUNCTION_ARGS)
{
@@ -228,12 +191,11 @@
* Alter BOX3D cast so that a valid geometry is always
* returned depending upon the size of the BOX3D. The
* code makes the following assumptions:
- * - If the BOX3D is a single point then return a
- * POINT geometry
- * - If the BOX3D represents a line in any of X, Y
- * or Z dimension, return a LINESTRING geometry
- * - If the BOX3D represents a plane in the X, Y,
- * or Z dimension, return a POLYGON geometry
+ * - If the BOX3D is a single point then return a POINT geometry
+ * - If the BOX3D represents a line in any of X, Y or Z dimension,
+ * return a LINESTRING geometry
+ * - If the BOX3D represents a plane in the X, Y, or Z dimension,
+ * return a POLYGON geometry
* - Otherwise return a POLYHEDRALSURFACE geometry
*/
@@ -240,8 +202,7 @@
pa = ptarray_construct_empty(LW_TRUE, LW_FALSE, 5);
/* BOX3D is a point */
- if ( (box->xmin == box->xmax) && (box->ymin == box->ymax) &&
- (box->zmin == box->zmax) )
+ if ((box->xmin == box->xmax) && (box->ymin == box->ymax) && (box->zmin == box->zmax))
{
LWPOINT *lwpt = lwpoint_construct(SRID_UNKNOWN, NULL, pa);
@@ -254,15 +215,9 @@
lwpoint_free(lwpt);
}
/* BOX3D is a line */
- else if (((box->xmin == box->xmax ||
- box->ymin == box->ymax) &&
- box->zmin == box->zmax) ||
- ((box->xmin == box->xmax ||
- box->zmin == box->zmax) &&
- box->ymin == box->ymax) ||
- ((box->ymin == box->ymax ||
- box->zmin == box->zmax) &&
- box->xmin == box->xmax))
+ else if (((box->xmin == box->xmax || box->ymin == box->ymax) && box->zmin == box->zmax) ||
+ ((box->xmin == box->xmax || box->zmin == box->zmax) && box->ymin == box->ymax) ||
+ ((box->ymin == box->ymax || box->zmin == box->zmax) && box->xmin == box->xmax))
{
LWLINE *lwline = lwline_construct(SRID_UNKNOWN, NULL, pa);
@@ -285,13 +240,12 @@
LWPOLY *lwpoly;
/* Initialize the 4 vertices of the polygon */
- points[0] = (POINT4D) { box->xmin, box->ymin, box->zmin, 0.0 };
- points[1] = (POINT4D) { box->xmin, box->ymax, box->zmin, 0.0 };
- points[2] = (POINT4D) { box->xmin, box->ymax, box->zmax, 0.0 };
- points[3] = (POINT4D) { box->xmin, box->ymin, box->zmax, 0.0 };
+ points[0] = (POINT4D){box->xmin, box->ymin, box->zmin, 0.0};
+ points[1] = (POINT4D){box->xmin, box->ymax, box->zmin, 0.0};
+ points[2] = (POINT4D){box->xmin, box->ymax, box->zmax, 0.0};
+ points[3] = (POINT4D){box->xmin, box->ymin, box->zmax, 0.0};
- lwpoly = lwpoly_construct_rectangle(LW_TRUE, LW_FALSE,
- &points[0], &points[1], &points[2], &points[3]);
+ lwpoly = lwpoly_construct_rectangle(LW_TRUE, LW_FALSE, &points[0], &points[1], &points[2], &points[3]);
result = geometry_serialize(lwpoly_as_lwgeom(lwpoly));
lwpoly_free(lwpoly);
}
@@ -302,13 +256,12 @@
LWPOLY *lwpoly;
/* Initialize the 4 vertices of the polygon */
- points[0] = (POINT4D) { box->xmin, box->ymin, box->zmin, 0.0 };
- points[1] = (POINT4D) { box->xmax, box->ymin, box->zmin, 0.0 };
- points[2] = (POINT4D) { box->xmax, box->ymin, box->zmax, 0.0 };
- points[3] = (POINT4D) { box->xmin, box->ymin, box->zmax, 0.0 };
+ points[0] = (POINT4D){box->xmin, box->ymin, box->zmin, 0.0};
+ points[1] = (POINT4D){box->xmax, box->ymin, box->zmin, 0.0};
+ points[2] = (POINT4D){box->xmax, box->ymin, box->zmax, 0.0};
+ points[3] = (POINT4D){box->xmin, box->ymin, box->zmax, 0.0};
- lwpoly = lwpoly_construct_rectangle(LW_TRUE, LW_FALSE,
- &points[0], &points[1], &points[2], &points[3]);
+ lwpoly = lwpoly_construct_rectangle(LW_TRUE, LW_FALSE, &points[0], &points[1], &points[2], &points[3]);
result = geometry_serialize(lwpoly_as_lwgeom(lwpoly));
lwpoly_free(lwpoly);
}
@@ -319,13 +272,12 @@
LWPOLY *lwpoly;
/* Initialize the 4 vertices of the polygon */
- points[0] = (POINT4D) { box->xmin, box->ymin, box->zmin, 0.0 };
- points[1] = (POINT4D) { box->xmin, box->ymax, box->zmin, 0.0 };
- points[2] = (POINT4D) { box->xmax, box->ymax, box->zmin, 0.0 };
- points[3] = (POINT4D) { box->xmax, box->ymin, box->zmin, 0.0 };
+ points[0] = (POINT4D){box->xmin, box->ymin, box->zmin, 0.0};
+ points[1] = (POINT4D){box->xmin, box->ymax, box->zmin, 0.0};
+ points[2] = (POINT4D){box->xmax, box->ymax, box->zmin, 0.0};
+ points[3] = (POINT4D){box->xmax, box->ymin, box->zmin, 0.0};
- lwpoly = lwpoly_construct_rectangle(LW_TRUE, LW_FALSE,
- &points[0], &points[1], &points[2], &points[3]);
+ lwpoly = lwpoly_construct_rectangle(LW_TRUE, LW_FALSE, &points[0], &points[1], &points[2], &points[3]);
result = geometry_serialize(lwpoly_as_lwgeom(lwpoly));
lwpoly_free(lwpoly);
}
@@ -334,45 +286,44 @@
{
POINT4D points[8];
static const int ngeoms = 6;
- LWGEOM **geoms = (LWGEOM **) lwalloc(sizeof(LWGEOM *) * ngeoms);
+ LWGEOM **geoms = (LWGEOM **)lwalloc(sizeof(LWGEOM *) * ngeoms);
LWGEOM *geom = NULL;
/* Initialize the 8 vertices of the box */
- points[0] = (POINT4D) { box->xmin, box->ymin, box->zmin, 0.0 };
- points[1] = (POINT4D) { box->xmin, box->ymax, box->zmin, 0.0 };
- points[2] = (POINT4D) { box->xmax, box->ymax, box->zmin, 0.0 };
- points[3] = (POINT4D) { box->xmax, box->ymin, box->zmin, 0.0 };
- points[4] = (POINT4D) { box->xmin, box->ymin, box->zmax, 0.0 };
- points[5] = (POINT4D) { box->xmin, box->ymax, box->zmax, 0.0 };
- points[6] = (POINT4D) { box->xmax, box->ymax, box->zmax, 0.0 };
- points[7] = (POINT4D) { box->xmax, box->ymin, box->zmax, 0.0 };
+ points[0] = (POINT4D){box->xmin, box->ymin, box->zmin, 0.0};
+ points[1] = (POINT4D){box->xmin, box->ymax, box->zmin, 0.0};
+ points[2] = (POINT4D){box->xmax, box->ymax, box->zmin, 0.0};
+ points[3] = (POINT4D){box->xmax, box->ymin, box->zmin, 0.0};
+ points[4] = (POINT4D){box->xmin, box->ymin, box->zmax, 0.0};
+ points[5] = (POINT4D){box->xmin, box->ymax, box->zmax, 0.0};
+ points[6] = (POINT4D){box->xmax, box->ymax, box->zmax, 0.0};
+ points[7] = (POINT4D){box->xmax, box->ymin, box->zmax, 0.0};
/* add bottom polygon */
- geoms[0] = lwpoly_as_lwgeom(lwpoly_construct_rectangle(LW_TRUE, LW_FALSE,
- &points[0], &points[1], &points[2], &points[3]));
+ geoms[0] = lwpoly_as_lwgeom(
+ lwpoly_construct_rectangle(LW_TRUE, LW_FALSE, &points[0], &points[1], &points[2], &points[3]));
/* add top polygon */
- geoms[1] = lwpoly_as_lwgeom(lwpoly_construct_rectangle(LW_TRUE, LW_FALSE,
- &points[4], &points[7], &points[6], &points[5]));
+ geoms[1] = lwpoly_as_lwgeom(
+ lwpoly_construct_rectangle(LW_TRUE, LW_FALSE, &points[4], &points[7], &points[6], &points[5]));
/* add left polygon */
- geoms[2] = lwpoly_as_lwgeom(lwpoly_construct_rectangle(LW_TRUE, LW_FALSE,
- &points[0], &points[4], &points[5], &points[1]));
+ geoms[2] = lwpoly_as_lwgeom(
+ lwpoly_construct_rectangle(LW_TRUE, LW_FALSE, &points[0], &points[4], &points[5], &points[1]));
/* add right polygon */
- geoms[3] = lwpoly_as_lwgeom(lwpoly_construct_rectangle(LW_TRUE, LW_FALSE,
- &points[3], &points[2], &points[6], &points[7]));
+ geoms[3] = lwpoly_as_lwgeom(
+ lwpoly_construct_rectangle(LW_TRUE, LW_FALSE, &points[3], &points[2], &points[6], &points[7]));
/* add front polygon */
- geoms[4] = lwpoly_as_lwgeom(lwpoly_construct_rectangle(LW_TRUE, LW_FALSE,
- &points[0], &points[3], &points[7], &points[4]));
+ geoms[4] = lwpoly_as_lwgeom(
+ lwpoly_construct_rectangle(LW_TRUE, LW_FALSE, &points[0], &points[3], &points[7], &points[4]));
/* add back polygon */
- geoms[5] = lwpoly_as_lwgeom(lwpoly_construct_rectangle(LW_TRUE, LW_FALSE,
- &points[1], &points[5], &points[6], &points[2]));
+ geoms[5] = lwpoly_as_lwgeom(
+ lwpoly_construct_rectangle(LW_TRUE, LW_FALSE, &points[1], &points[5], &points[6], &points[2]));
- geom = (LWGEOM *) lwcollection_construct(POLYHEDRALSURFACETYPE,
- SRID_UNKNOWN, NULL, ngeoms, geoms);
+ geom = (LWGEOM *)lwcollection_construct(POLYHEDRALSURFACETYPE, SRID_UNKNOWN, NULL, ngeoms, geoms);
FLAGS_SET_SOLID(geom->flags, 1);
result = geometry_serialize(geom);
- lwcollection_free((LWCOLLECTION *) geom);
+ lwcollection_free((LWCOLLECTION *)geom);
}
gserialized_set_srid(result, box->srid);
@@ -411,7 +362,8 @@
BOX3D *result = (BOX3D *)palloc(sizeof(BOX3D));
memcpy(result, box, sizeof(BOX3D));
- if (PG_NARGS() == 2) {
+ if (PG_NARGS() == 2)
+ {
/* Expand the box the same amount in all directions */
double d = PG_GETARG_FLOAT8(1);
expand_box3d(result, d);
@@ -431,8 +383,7 @@
/**
* convert a GSERIALIZED to BOX3D
*
- * NOTE: the bounding box is *always* recomputed as the cache
- * is a box2d, not a box3d...
+ * NOTE: the bounding box is always recomputed as the cache is a BOX2D, not a BOX3D.
*
*/
PG_FUNCTION_INFO_V1(LWGEOM_to_BOX3D);
@@ -444,7 +395,7 @@
BOX3D *result;
int rv = lwgeom_calculate_gbox(lwgeom, &gbox);
- if ( rv == LW_FAILURE )
+ if (rv == LW_FAILURE)
PG_RETURN_NULL();
result = box3d_from_gbox(&gbox);
@@ -497,15 +448,15 @@
}
/**
-* Used in the ST_Extent and ST_Extent3D aggregates, does not read the
-* serialized cached bounding box (since that is floating point)
-* but calculates the box in full from the underlying geometry.
-*/
+ * Used in the ST_Extent and ST_Extent3D aggregates, does not read the
+ * serialized cached bounding box (since that is floating point)
+ * but calculates the box in full from the underlying geometry.
+ */
PG_FUNCTION_INFO_V1(BOX3D_combine);
Datum BOX3D_combine(PG_FUNCTION_ARGS)
{
- BOX3D *box = (BOX3D*)PG_GETARG_POINTER(0);
- GSERIALIZED *geom = PG_ARGISNULL(1) ? NULL : (GSERIALIZED*)PG_DETOAST_DATUM(PG_GETARG_POINTER(1));
+ BOX3D *box = (BOX3D *)PG_GETARG_POINTER(0);
+ GSERIALIZED *geom = PG_ARGISNULL(1) ? NULL : (GSERIALIZED *)PG_DETOAST_DATUM(PG_GETARG_POINTER(1));
LWGEOM *lwgeom = NULL;
BOX3D *result = NULL;
GBOX gbox;
@@ -513,9 +464,12 @@
int rv;
/* Can't do anything with null inputs */
- if ((box == NULL) && (geom == NULL)) { PG_RETURN_NULL(); }
+ if (!box && !geom)
+ {
+ PG_RETURN_NULL();
+ }
/* Null geometry but non-null box, return the box */
- else if (geom == NULL)
+ else if (!geom)
{
result = palloc(sizeof(BOX3D));
memcpy(result, box, sizeof(BOX3D));
@@ -522,8 +476,10 @@
PG_RETURN_POINTER(result);
}
- /* Deserialize geometry and *calculate* the box */
- /* We can't use the cached box because it's float, we *must* calculate */
+ /*
+ * Deserialize geometry and *calculate* the box
+ * We can't use the cached box because it's float, we *must* calculate
+ */
lwgeom = lwgeom_from_gserialized(geom);
srid = lwgeom->srid;
rv = lwgeom_calculate_gbox(lwgeom, &gbox);
@@ -530,11 +486,11 @@
lwgeom_free(lwgeom);
/* If we couldn't calculate the box, return what we know */
- if ( rv == LW_FAILURE )
+ if (rv == LW_FAILURE)
{
PG_FREE_IF_COPY(geom, 1);
/* No geom box, no input box, so null return */
- if ( box == NULL )
+ if (!box)
PG_RETURN_NULL();
result = palloc(sizeof(BOX3D));
memcpy(result, box, sizeof(BOX3D));
@@ -542,7 +498,7 @@
}
/* Null box and non-null geometry, just return the geometry box */
- if ( box == NULL )
+ if (!box)
{
PG_FREE_IF_COPY(geom, 1);
result = box3d_from_gbox(&gbox);
@@ -566,8 +522,8 @@
PG_FUNCTION_INFO_V1(BOX3D_combine_BOX3D);
Datum BOX3D_combine_BOX3D(PG_FUNCTION_ARGS)
{
- BOX3D *box0 = (BOX3D*)(PG_ARGISNULL(0) ? NULL : PG_GETARG_POINTER(0));
- BOX3D *box1 = (BOX3D*)(PG_ARGISNULL(1) ? NULL : PG_GETARG_POINTER(1));
+ BOX3D *box0 = (BOX3D *)(PG_ARGISNULL(0) ? NULL : PG_GETARG_POINTER(0));
+ BOX3D *box1 = (BOX3D *)(PG_ARGISNULL(1) ? NULL : PG_GETARG_POINTER(1));
BOX3D *result;
if (box0 && !box1)
@@ -603,8 +559,7 @@
minpoint = lwgeom_from_gserialized(min);
maxpoint = lwgeom_from_gserialized(max);
- if ( minpoint->type != POINTTYPE ||
- maxpoint->type != POINTTYPE )
+ if (minpoint->type != POINTTYPE || maxpoint->type != POINTTYPE)
{
elog(ERROR, "BOX3D_construct: args must be points");
PG_RETURN_NULL();
@@ -635,22 +590,17 @@
*****************************************************************************/
/* contains? */
-
bool
BOX3D_contains_internal(BOX3D *box1, BOX3D *box2)
{
- return (box1->xmax >= box2->xmax &&
- box1->xmin <= box2->xmin &&
- box1->ymax >= box2->ymax &&
- box1->ymin <= box2->ymin &&
- box1->zmax >= box2->zmax &&
- box1->zmin <= box2->zmin);
+ return (box1->xmax >= box2->xmax && box1->xmin <= box2->xmin) &&
+ (box1->ymax >= box2->ymax && box1->ymin <= box2->ymin) &&
+ (box1->zmax >= box2->zmax && box1->zmin <= box2->zmin);
}
PG_FUNCTION_INFO_V1(BOX3D_contains);
-PGDLLEXPORT Datum
-BOX3D_contains(PG_FUNCTION_ARGS)
+PGDLLEXPORT Datum BOX3D_contains(PG_FUNCTION_ARGS)
{
BOX3D *box1 = PG_GETARG_BOX3D_P(0);
BOX3D *box2 = PG_GETARG_BOX3D_P(1);
@@ -659,7 +609,6 @@
}
/* contained by? */
-
bool
BOX3D_contained_internal(BOX3D *box1, BOX3D *box2)
{
@@ -668,8 +617,7 @@
PG_FUNCTION_INFO_V1(BOX3D_contained);
-PGDLLEXPORT Datum
-BOX3D_contained(PG_FUNCTION_ARGS)
+PGDLLEXPORT Datum BOX3D_contained(PG_FUNCTION_ARGS)
{
BOX3D *box1 = PG_GETARG_BOX3D_P(0);
BOX3D *box2 = PG_GETARG_BOX3D_P(1);
@@ -678,22 +626,17 @@
}
/* overlaps? */
-
bool
BOX3D_overlaps_internal(BOX3D *box1, BOX3D *box2)
{
- return (box1->xmin <= box2->xmax &&
- box2->xmin <= box1->xmax &&
- box1->ymin <= box2->ymax &&
- box2->ymin <= box1->ymax &&
- box1->zmin <= box2->zmax &&
- box2->zmin <= box1->zmax);
+ return (box1->xmin <= box2->xmax && box2->xmin <= box1->xmax) &&
+ (box1->ymin <= box2->ymax && box2->ymin <= box1->ymax) &&
+ (box1->zmin <= box2->zmax && box2->zmin <= box1->zmax);
}
PG_FUNCTION_INFO_V1(BOX3D_overlaps);
-PGDLLEXPORT Datum
-BOX3D_overlaps(PG_FUNCTION_ARGS)
+PGDLLEXPORT Datum BOX3D_overlaps(PG_FUNCTION_ARGS)
{
BOX3D *box1 = PG_GETARG_BOX3D_P(0);
BOX3D *box2 = PG_GETARG_BOX3D_P(1);
@@ -702,22 +645,17 @@
}
/* same? */
-
bool
BOX3D_same_internal(BOX3D *box1, BOX3D *box2)
{
- return (FPeq(box1->xmax, box2->xmax) &&
- FPeq(box1->xmin, box2->xmin) &&
- FPeq(box1->ymax, box2->ymax) &&
- FPeq(box1->ymin, box2->ymin) &&
- FPeq(box1->zmax, box2->zmax) &&
- FPeq(box1->zmin, box2->zmin));
+ return (FPeq(box1->xmax, box2->xmax) && FPeq(box1->xmin, box2->xmin)) &&
+ (FPeq(box1->ymax, box2->ymax) && FPeq(box1->ymin, box2->ymin)) &&
+ (FPeq(box1->zmax, box2->zmax) && FPeq(box1->zmin, box2->zmin));
}
PG_FUNCTION_INFO_V1(BOX3D_same);
-PGDLLEXPORT Datum
-BOX3D_same(PG_FUNCTION_ARGS)
+PGDLLEXPORT Datum BOX3D_same(PG_FUNCTION_ARGS)
{
BOX3D *box1 = PG_GETARG_BOX3D_P(0);
BOX3D *box2 = PG_GETARG_BOX3D_P(1);
@@ -726,7 +664,6 @@
}
/* strictly left of? */
-
bool
BOX3D_left_internal(BOX3D *box1, BOX3D *box2)
{
@@ -735,8 +672,7 @@
PG_FUNCTION_INFO_V1(BOX3D_left);
-PGDLLEXPORT Datum
-BOX3D_left(PG_FUNCTION_ARGS)
+PGDLLEXPORT Datum BOX3D_left(PG_FUNCTION_ARGS)
{
BOX3D *box1 = PG_GETARG_BOX3D_P(0);
BOX3D *box2 = PG_GETARG_BOX3D_P(1);
@@ -745,7 +681,6 @@
}
/* does not extend to right of? */
-
bool
BOX3D_overleft_internal(BOX3D *box1, BOX3D *box2)
{
@@ -754,8 +689,7 @@
PG_FUNCTION_INFO_V1(BOX3D_overleft);
-PGDLLEXPORT Datum
-BOX3D_overleft(PG_FUNCTION_ARGS)
+PGDLLEXPORT Datum BOX3D_overleft(PG_FUNCTION_ARGS)
{
BOX3D *box1 = PG_GETARG_BOX3D_P(0);
BOX3D *box2 = PG_GETARG_BOX3D_P(1);
@@ -764,7 +698,6 @@
}
/* strictly right of? */
-
bool
BOX3D_right_internal(BOX3D *box1, BOX3D *box2)
{
@@ -773,8 +706,7 @@
PG_FUNCTION_INFO_V1(BOX3D_right);
-PGDLLEXPORT Datum
-BOX3D_right(PG_FUNCTION_ARGS)
+PGDLLEXPORT Datum BOX3D_right(PG_FUNCTION_ARGS)
{
BOX3D *box1 = PG_GETARG_BOX3D_P(0);
BOX3D *box2 = PG_GETARG_BOX3D_P(1);
@@ -783,7 +715,6 @@
}
/* does not extend to left of? */
-
bool
BOX3D_overright_internal(BOX3D *box1, BOX3D *box2)
{
@@ -792,8 +723,7 @@
PG_FUNCTION_INFO_V1(BOX3D_overright);
-PGDLLEXPORT Datum
-BOX3D_overright(PG_FUNCTION_ARGS)
+PGDLLEXPORT Datum BOX3D_overright(PG_FUNCTION_ARGS)
{
BOX3D *box1 = PG_GETARG_BOX3D_P(0);
BOX3D *box2 = PG_GETARG_BOX3D_P(1);
@@ -802,7 +732,6 @@
}
/* strictly below of? */
-
bool
BOX3D_below_internal(BOX3D *box1, BOX3D *box2)
{
@@ -811,8 +740,7 @@
PG_FUNCTION_INFO_V1(BOX3D_below);
-PGDLLEXPORT Datum
-BOX3D_below(PG_FUNCTION_ARGS)
+PGDLLEXPORT Datum BOX3D_below(PG_FUNCTION_ARGS)
{
BOX3D *box1 = PG_GETARG_BOX3D_P(0);
BOX3D *box2 = PG_GETARG_BOX3D_P(1);
@@ -821,7 +749,6 @@
}
/* does not extend above of? */
-
bool
BOX3D_overbelow_internal(BOX3D *box1, BOX3D *box2)
{
@@ -830,8 +757,7 @@
PG_FUNCTION_INFO_V1(BOX3D_overbelow);
-PGDLLEXPORT Datum
-BOX3D_overbelow(PG_FUNCTION_ARGS)
+PGDLLEXPORT Datum BOX3D_overbelow(PG_FUNCTION_ARGS)
{
BOX3D *box1 = PG_GETARG_BOX3D_P(0);
BOX3D *box2 = PG_GETARG_BOX3D_P(1);
@@ -840,7 +766,6 @@
}
/* strictly above of? */
-
bool
BOX3D_above_internal(BOX3D *box1, BOX3D *box2)
{
@@ -849,8 +774,7 @@
PG_FUNCTION_INFO_V1(BOX3D_above);
-PGDLLEXPORT Datum
-BOX3D_above(PG_FUNCTION_ARGS)
+PGDLLEXPORT Datum BOX3D_above(PG_FUNCTION_ARGS)
{
BOX3D *box1 = PG_GETARG_BOX3D_P(0);
BOX3D *box2 = PG_GETARG_BOX3D_P(1);
@@ -859,7 +783,6 @@
}
/* does not extend below of? */
-
bool
BOX3D_overabove_internal(BOX3D *box1, BOX3D *box2)
{
@@ -868,8 +791,7 @@
PG_FUNCTION_INFO_V1(BOX3D_overabove);
-PGDLLEXPORT Datum
-BOX3D_overabove(PG_FUNCTION_ARGS)
+PGDLLEXPORT Datum BOX3D_overabove(PG_FUNCTION_ARGS)
{
BOX3D *box1 = PG_GETARG_BOX3D_P(0);
BOX3D *box2 = PG_GETARG_BOX3D_P(1);
@@ -878,7 +800,6 @@
}
/* strictly in before of? */
-
bool
BOX3D_front_internal(BOX3D *box1, BOX3D *box2)
{
@@ -887,8 +808,7 @@
PG_FUNCTION_INFO_V1(BOX3D_front);
-PGDLLEXPORT Datum
-BOX3D_front(PG_FUNCTION_ARGS)
+PGDLLEXPORT Datum BOX3D_front(PG_FUNCTION_ARGS)
{
BOX3D *box1 = PG_GETARG_BOX3D_P(0);
BOX3D *box2 = PG_GETARG_BOX3D_P(1);
@@ -897,7 +817,6 @@
}
/* does not extend to the after of? */
-
bool
BOX3D_overfront_internal(BOX3D *box1, BOX3D *box2)
{
@@ -906,8 +825,7 @@
PG_FUNCTION_INFO_V1(BOX3D_overfront);
-PGDLLEXPORT Datum
-BOX3D_overfront(PG_FUNCTION_ARGS)
+PGDLLEXPORT Datum BOX3D_overfront(PG_FUNCTION_ARGS)
{
BOX3D *box1 = PG_GETARG_BOX3D_P(0);
BOX3D *box2 = PG_GETARG_BOX3D_P(1);
@@ -916,7 +834,6 @@
}
/* strictly after of? */
-
bool
BOX3D_back_internal(BOX3D *box1, BOX3D *box2)
{
@@ -925,8 +842,7 @@
PG_FUNCTION_INFO_V1(BOX3D_back);
-PGDLLEXPORT Datum
-BOX3D_back(PG_FUNCTION_ARGS)
+PGDLLEXPORT Datum BOX3D_back(PG_FUNCTION_ARGS)
{
BOX3D *box1 = PG_GETARG_BOX3D_P(0);
BOX3D *box2 = PG_GETARG_BOX3D_P(1);
@@ -935,7 +851,6 @@
}
/* does not extend to the before of? */
-
bool
BOX3D_overback_internal(BOX3D *box1, BOX3D *box2)
{
@@ -944,8 +859,7 @@
PG_FUNCTION_INFO_V1(BOX3D_overback);
-PGDLLEXPORT Datum
-BOX3D_overback(PG_FUNCTION_ARGS)
+PGDLLEXPORT Datum BOX3D_overback(PG_FUNCTION_ARGS)
{
BOX3D *box1 = PG_GETARG_BOX3D_P(0);
BOX3D *box2 = PG_GETARG_BOX3D_P(1);
@@ -954,60 +868,58 @@
}
/* Minimum distance between 2 bounding boxes */
-
double
BOX3D_distance_internal(BOX3D *box1, BOX3D *box2)
{
- double sqrDist = 0;
- double d;
+ double sqrDist = 0;
+ double d;
- if (BOX3D_overlaps_internal(box1, box2))
- return 0.0;
+ if (BOX3D_overlaps_internal(box1, box2))
+ return 0.0;
- /* X axis */
- if (box1->xmax < box2->xmin)
- {
- d = box1->xmax - box2->xmin;
- sqrDist += d * d;
- }
- else if (box1->xmin > box2->xmax)
- {
- d = box1->xmin - box2->xmax;
- sqrDist += d * d;
- }
- /* Y axis */
- if (box1->ymax < box2->ymin)
- {
- d = box1->ymax - box2->ymin;
- sqrDist += d * d;
- }
- else if (box1->ymin > box2->ymax)
- {
- d = box1->ymin - box2->ymax;
- sqrDist += d * d;
- }
- /* Z axis */
- if (box1->zmax < box2->zmin)
- {
- d = box1->zmax - box2->zmin;
- sqrDist += d * d;
- }
- else if (box1->zmin > box2->zmax)
- {
- d = box1->zmin - box2->zmax;
- sqrDist += d * d;
- }
+ /* X axis */
+ if (box1->xmax < box2->xmin)
+ {
+ d = box1->xmax - box2->xmin;
+ sqrDist += d * d;
+ }
+ else if (box1->xmin > box2->xmax)
+ {
+ d = box1->xmin - box2->xmax;
+ sqrDist += d * d;
+ }
+ /* Y axis */
+ if (box1->ymax < box2->ymin)
+ {
+ d = box1->ymax - box2->ymin;
+ sqrDist += d * d;
+ }
+ else if (box1->ymin > box2->ymax)
+ {
+ d = box1->ymin - box2->ymax;
+ sqrDist += d * d;
+ }
+ /* Z axis */
+ if (box1->zmax < box2->zmin)
+ {
+ d = box1->zmax - box2->zmin;
+ sqrDist += d * d;
+ }
+ else if (box1->zmin > box2->zmax)
+ {
+ d = box1->zmin - box2->zmax;
+ sqrDist += d * d;
+ }
- return sqrt(sqrDist);
+ return sqrt(sqrDist);
}
PG_FUNCTION_INFO_V1(BOX3D_distance);
-PGDLLEXPORT Datum
-BOX3D_distance(PG_FUNCTION_ARGS)
+PGDLLEXPORT Datum BOX3D_distance(PG_FUNCTION_ARGS)
{
- BOX3D *box1 = PG_GETARG_BOX3D_P(0);
- BOX3D *box2 = PG_GETARG_BOX3D_P(1);
- PG_RETURN_FLOAT8(BOX3D_distance_internal(box1, box2));
+ BOX3D *box1 = PG_GETARG_BOX3D_P(0);
+ BOX3D *box2 = PG_GETARG_BOX3D_P(1);
+ PG_RETURN_FLOAT8(BOX3D_distance_internal(box1, box2));
}
#endif
Added: trunk/postgis/lwgeom_box3d.h
===================================================================
--- trunk/postgis/lwgeom_box3d.h (rev 0)
+++ trunk/postgis/lwgeom_box3d.h 2018-07-13 20:06:43 UTC (rev 16641)
@@ -0,0 +1,85 @@
+/**********************************************************************
+ *
+ * PostGIS - Spatial Types for PostgreSQL
+ * http://postgis.net
+ *
+ * PostGIS is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * PostGIS is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with PostGIS. If not, see <http://www.gnu.org/licenses/>.
+ *
+ **********************************************************************
+ *
+ * Copyright 2009 Mark Cave-Ayland <mark.cave-ayland at siriusit.co.uk>
+ * Copyright 2009-2017 Paul Ramsey <pramsey at cleverelephant.ca>
+ * Copyright 2018 Darafei Praliaskouski <me at komzpa.net>
+ *
+ **********************************************************************/
+
+/* forward defs */
+Datum BOX3D_in(PG_FUNCTION_ARGS);
+Datum BOX3D_out(PG_FUNCTION_ARGS);
+Datum LWGEOM_to_BOX3D(PG_FUNCTION_ARGS);
+Datum BOX3D_to_LWGEOM(PG_FUNCTION_ARGS);
+Datum BOX3D_expand(PG_FUNCTION_ARGS);
+Datum BOX3D_to_BOX2D(PG_FUNCTION_ARGS);
+Datum BOX3D_to_BOX(PG_FUNCTION_ARGS);
+Datum BOX3D_xmin(PG_FUNCTION_ARGS);
+Datum BOX3D_ymin(PG_FUNCTION_ARGS);
+Datum BOX3D_zmin(PG_FUNCTION_ARGS);
+Datum BOX3D_xmax(PG_FUNCTION_ARGS);
+Datum BOX3D_ymax(PG_FUNCTION_ARGS);
+Datum BOX3D_zmax(PG_FUNCTION_ARGS);
+Datum BOX3D_combine(PG_FUNCTION_ARGS);
+Datum BOX3D_combine_BOX3D(PG_FUNCTION_ARGS);
+
+/*****************************************************************************
+ * BOX3D operators
+ *****************************************************************************/
+
+bool BOX3D_contains_internal(BOX3D *box1, BOX3D *box2);
+bool BOX3D_contained_internal(BOX3D *box1, BOX3D *box2);
+bool BOX3D_overlaps_internal(BOX3D *box1, BOX3D *box2);
+bool BOX3D_same_internal(BOX3D *box1, BOX3D *box2);
+bool BOX3D_left_internal(BOX3D *box1, BOX3D *box2);
+bool BOX3D_overleft_internal(BOX3D *box1, BOX3D *box2);
+bool BOX3D_right_internal(BOX3D *box1, BOX3D *box2);
+bool BOX3D_overright_internal(BOX3D *box1, BOX3D *box2);
+bool BOX3D_below_internal(BOX3D *box1, BOX3D *box2);
+bool BOX3D_overbelow_internal(BOX3D *box1, BOX3D *box2);
+bool BOX3D_above_internal(BOX3D *box1, BOX3D *box2);
+bool BOX3D_overabove_internal(BOX3D *box1, BOX3D *box2);
+bool BOX3D_front_internal(BOX3D *box1, BOX3D *box2);
+bool BOX3D_overfront_internal(BOX3D *box1, BOX3D *box2);
+bool BOX3D_back_internal(BOX3D *box1, BOX3D *box2);
+bool BOX3D_overback_internal(BOX3D *box1, BOX3D *box2);
+double BOX3D_distance_internal(BOX3D *box1, BOX3D *box2);
+
+/** needed for sp-gist support PostgreSQL 11+ **/
+#if POSTGIS_PGSQL_VERSION > 100
+Datum BOX3D_contains(PG_FUNCTION_ARGS);
+Datum BOX3D_contained(PG_FUNCTION_ARGS);
+Datum BOX3D_overlaps(PG_FUNCTION_ARGS);
+Datum BOX3D_same(PG_FUNCTION_ARGS);
+Datum BOX3D_left(PG_FUNCTION_ARGS);
+Datum BOX3D_overleft(PG_FUNCTION_ARGS);
+Datum BOX3D_right(PG_FUNCTION_ARGS);
+Datum BOX3D_overright(PG_FUNCTION_ARGS);
+Datum BOX3D_below(PG_FUNCTION_ARGS);
+Datum BOX3D_overbelow(PG_FUNCTION_ARGS);
+Datum BOX3D_above(PG_FUNCTION_ARGS);
+Datum BOX3D_overabove(PG_FUNCTION_ARGS);
+Datum BOX3D_front(PG_FUNCTION_ARGS);
+Datum BOX3D_overfront(PG_FUNCTION_ARGS);
+Datum BOX3D_back(PG_FUNCTION_ARGS);
+Datum BOX3D_overback(PG_FUNCTION_ARGS);
+Datum BOX3D_distance(PG_FUNCTION_ARGS);
+#endif
More information about the postgis-tickets
mailing list