point_ops-0.5-rmh-incremental

application/octet-stream

Filename: point_ops-0.5-rmh-incremental
Type: application/octet-stream
Part: 1
Message: Re: point_ops for GiST
diff --git a/src/backend/access/gist/gistproc.c b/src/backend/access/gist/gistproc.c
index 1795a71..0ebec52 100644
--- a/src/backend/access/gist/gistproc.c
+++ b/src/backend/access/gist/gistproc.c
@@ -165,7 +165,8 @@ gist_box_compress(PG_FUNCTION_ARGS)
 }
 
 /*
- * GiST DeCompress method for boxes (also used for polygons and circles)
+ * GiST DeCompress method for boxes (also used for points, polygons
+ * and circles)
  *
  * do not do anything --- we just use the stored box as is.
  */
@@ -176,7 +177,7 @@ gist_box_decompress(PG_FUNCTION_ARGS)
 }
 
 /*
- * The GiST Penalty method for boxes
+ * The GiST Penalty method for boxes (also used for points)
  *
  * As in the R-tree paper, we use change in area as our penalty metric
  */
@@ -341,6 +342,8 @@ fallbackSplit(GistEntryVector *entryvec, GIST_SPLITVEC *v)
  *
  * New linear algorithm, see 'New Linear Node Splitting Algorithm for R-tree',
  * C.H.Ang and T.C.Tan
+ *
+ * This is used for both boxes and points.
  */
 Datum
 gist_box_picksplit(PG_FUNCTION_ARGS)
@@ -533,6 +536,8 @@ gist_box_picksplit(PG_FUNCTION_ARGS)
 
 /*
  * Equality method
+ *
+ * This is used for both boxes and points.
  */
 Datum
 gist_box_same(PG_FUNCTION_ARGS)
@@ -873,25 +878,25 @@ gist_circle_consistent(PG_FUNCTION_ARGS)
 	PG_RETURN_BOOL(result);
 }
 
-
-
-/*
- * Point
- */
+/**************************************************
+ * Point ops
+ **************************************************/
 
 Datum
-gist_point_compress(PG_FUNCTION_ARGS) {
+gist_point_compress(PG_FUNCTION_ARGS)
+{
 	GISTENTRY  *entry = (GISTENTRY *) PG_GETARG_POINTER(0);
 
-	if ( entry->leafkey ) { /* Point, actually */
-		BOX		 *box = palloc(sizeof(BOX));
-		Point	   *point = DatumGetPointP(entry->key);
-		GISTENTRY   *retval = palloc(sizeof(GISTENTRY));
+	if (entry->leafkey)			/* Point, actually */
+	{
+		BOX	   *box = palloc(sizeof(BOX));
+		Point  *point = DatumGetPointP(entry->key);
+		GISTENTRY  *retval = palloc(sizeof(GISTENTRY));
 
 		box->high = box->low = *point;
 
 		gistentryinit(*retval, BoxPGetDatum(box),
-					entry->rel, entry->page, entry->offset, FALSE);
+					  entry->rel, entry->page, entry->offset, FALSE);
 
 		PG_RETURN_POINTER(retval);
 	}
@@ -900,11 +905,12 @@ gist_point_compress(PG_FUNCTION_ARGS) {
 }
 
 static bool
-gist_point_consistent_internal(StrategyNumber strategy, bool isLeaf, BOX *key, Point *query)
+gist_point_consistent_internal(StrategyNumber strategy,
+										   bool isLeaf, BOX *key, Point *query)
 {
 	bool result = false;
 
-	switch( strategy )
+	switch (strategy)
 	{
 		case RTLeftStrategyNumber:
 			result = FPlt(key->low.x, query->x);
@@ -921,7 +927,8 @@ gist_point_consistent_internal(StrategyNumber strategy, bool isLeaf, BOX *key, P
 		case RTSameStrategyNumber:
 			if (isLeaf)
 			{
-				result = FPeq(key->low.x, query->x) && FPeq(key->low.y, query->y);
+				result = FPeq(key->low.x, query->x)
+					&& FPeq(key->low.y, query->y);
 			}
 			else
 			{
@@ -936,97 +943,100 @@ gist_point_consistent_internal(StrategyNumber strategy, bool isLeaf, BOX *key, P
 	return result;
 }
 
-#define	StrategyNumberOffsetRange	20
+#define GeoStrategyNumberOffset		20
 #define PointStrategyNumberGroup	0
 #define BoxStrategyNumberGroup		1
 #define PolygonStrategyNumberGroup	2
 #define CircleStrategyNumberGroup	3
 
 Datum
-gist_point_consistent(PG_FUNCTION_ARGS) {
+gist_point_consistent(PG_FUNCTION_ARGS)
+{
 	GISTENTRY  *entry = (GISTENTRY *) PG_GETARG_POINTER(0);
-	StrategyNumber strategy = (StrategyNumber) PG_GETARG_UINT16(2);
+	StrategyNumber	strategy = (StrategyNumber) PG_GETARG_UINT16(2);
 	bool		result;
 	bool	   *recheck = (bool *) PG_GETARG_POINTER(4);
-	StrategyNumber	strategyGroup = strategy / StrategyNumberOffsetRange;
+	StrategyNumber	strategyGroup = strategy / GeoStrategyNumberOffset;
 
-	switch(strategyGroup)
+	switch (strategyGroup)
 	{
-		case	PointStrategyNumberGroup:
-			result = gist_point_consistent_internal(strategy % StrategyNumberOffsetRange,
+		case PointStrategyNumberGroup:
+			result = gist_point_consistent_internal(strategy % GeoStrategyNumberOffset,
 													GIST_LEAF(entry),
 													DatumGetBoxP(entry->key),
 													PG_GETARG_POINT_P(1));
 			*recheck = false;
 			break;
-		case	BoxStrategyNumberGroup:
-			result = DatumGetBool( DirectFunctionCall5(
+		case BoxStrategyNumberGroup:
+			result = DatumGetBool(DirectFunctionCall5(
 											gist_box_consistent,
 											PointerGetDatum(entry),
 											PG_GETARG_DATUM(1),
 											Int16GetDatum(RTOverlapStrategyNumber),
 											0, PointerGetDatum(recheck)));
 			break;
-		case	PolygonStrategyNumberGroup:
-			do {
+		case PolygonStrategyNumberGroup:
+			{
 				POLYGON    *query = PG_GETARG_POLYGON_P(1);
 
-				result = DatumGetBool( DirectFunctionCall5(
+				result = DatumGetBool(DirectFunctionCall5(
 												gist_poly_consistent,
 												PointerGetDatum(entry),
 												PolygonPGetDatum(query),
 												Int16GetDatum(RTOverlapStrategyNumber),
 												0, PointerGetDatum(recheck)));
 
-				if ( GIST_LEAF(entry) && result ) {
+				if (GIST_LEAF(entry) && result)
+				{
 					/*
 					 * We are on leaf page and quick check shows overlapping
 					 * of polygon's bounding box and point
 					 */
 					BOX *box = DatumGetBoxP(entry->key);
 
-					Assert( box->high.x == box->low.x && box->high.y == box->low.y );
-
-					result = DatumGetBool( DirectFunctionCall2(
+					Assert(box->high.x == box->low.x
+						&& box->high.y == box->low.y);
+					result = DatumGetBool(DirectFunctionCall2(
 												poly_contain_pt,
 												PolygonPGetDatum(query),
 												PointPGetDatum(&box->high)));
 					*recheck = false;
 				}
-			} while (0);
+			}
 			break;
-		case	CircleStrategyNumberGroup:
-			do {
+		case CircleStrategyNumberGroup:
+			{
 				CIRCLE *query = PG_GETARG_CIRCLE_P(1);
 
-				result = DatumGetBool( DirectFunctionCall5(
+				result = DatumGetBool(DirectFunctionCall5(
 												gist_circle_consistent,
 												PointerGetDatum(entry),
 												CirclePGetDatum(query),
 												Int16GetDatum(RTOverlapStrategyNumber),
 												0, PointerGetDatum(recheck)));
 
-				if ( GIST_LEAF(entry) && result ) {
+				if (GIST_LEAF(entry) && result)
+				{
 					/*
 					 * We are on leaf page and quick check shows overlapping
 					 * of polygon's bounding box and point
 					 */
 					BOX *box = DatumGetBoxP(entry->key);
 
-					Assert( box->high.x == box->low.x && box->high.y == box->low.y );
-
-					result = DatumGetBool( DirectFunctionCall2(
+					Assert(box->high.x == box->low.x
+						&& box->high.y == box->low.y);
+					result = DatumGetBool(DirectFunctionCall2(
 												circle_contain_pt,
 												CirclePGetDatum(query),
 												PointPGetDatum(&box->high)));
 					*recheck = false;
 				}
-			} while(0);
+			}
 			break;
 		default:
+			result = false;			/* silence compiler warning */
 			elog(ERROR, "unknown strategy number: %d", strategy);
 	}
 
 	PG_RETURN_BOOL(result);
 }
-