PostGIS  3.0.6dev-r@@SVN_REVISION@@

◆ gserialized_spgist_leaf_consistent_2d()

PGDLLEXPORT Datum gserialized_spgist_leaf_consistent_2d ( PG_FUNCTION_ARGS  )

Definition at line 558 of file gserialized_spgist_2d.c.

559 {
560  spgLeafConsistentIn *in = (spgLeafConsistentIn *)PG_GETARG_POINTER(0);
561  spgLeafConsistentOut *out = (spgLeafConsistentOut *)PG_GETARG_POINTER(1);
562  BOX2DF *key = (BOX2DF *)DatumGetPointer(in->leafDatum);
563  bool flag = true;
564  int i;
565 
566  /* Quick sanity check on entry key. */
567  if (DatumGetPointer(key) == NULL)
568  {
569  POSTGIS_DEBUG(4, "[SPGIST] null index entry, returning false");
570  PG_RETURN_BOOL(false); /* NULL entry! */
571  }
572 
573  /* All tests are exact. */
574  out->recheck = false;
575 
576  /* leafDatum is what it is... */
577  out->leafValue = in->leafDatum;
578 
579  /* Perform the required comparison(s) */
580  for (i = 0; i < in->nkeys; i++)
581  {
582  StrategyNumber strategy = in->scankeys[i].sk_strategy;
583  Datum query = in->scankeys[i].sk_argument;
584  BOX2DF query_gbox_index;
585 
586  /* Quick sanity check on query argument. */
587  if (DatumGetPointer(query) == NULL)
588  {
589  POSTGIS_DEBUG(4, "[SPGIST] null query pointer (!?!), returning false");
590  PG_RETURN_BOOL(false); /* NULL query! This is screwy! */
591  }
592 
593  if (gserialized_datum_get_box2df_p(query, &query_gbox_index) == LW_FAILURE)
594  {
595  POSTGIS_DEBUG(4, "[SPGIST] null query_gbox_index!");
596  PG_RETURN_BOOL(false);
597  }
598 
599  switch (strategy)
600  {
601  case RTOverlapStrategyNumber:
602  flag = box2df_overlaps(key, &query_gbox_index);
603  break;
604 
605  case RTContainsStrategyNumber:
606  case RTOldContainsStrategyNumber:
607  flag = box2df_contains(key, &query_gbox_index);
608  break;
609 
610  case RTContainedByStrategyNumber:
611  case RTOldContainedByStrategyNumber:
612  flag = box2df_contains(&query_gbox_index, key);
613  break;
614 
615  case RTSameStrategyNumber:
616  flag = box2df_equals(key, &query_gbox_index);
617  break;
618 
619  case RTLeftStrategyNumber:
620  flag = box2df_left(key, &query_gbox_index);
621  break;
622 
623  case RTOverLeftStrategyNumber:
624  flag = box2df_overleft(key, &query_gbox_index);
625  break;
626 
627  case RTRightStrategyNumber:
628  flag = box2df_right(key, &query_gbox_index);
629  break;
630 
631  case RTOverRightStrategyNumber:
632  flag = box2df_overright(key, &query_gbox_index);
633  break;
634 
635  case RTAboveStrategyNumber:
636  flag = box2df_above(key, &query_gbox_index);
637  break;
638 
639  case RTOverAboveStrategyNumber:
640  flag = box2df_overabove(key, &query_gbox_index);
641  break;
642 
643  case RTBelowStrategyNumber:
644  flag = box2df_below(key, &query_gbox_index);
645  break;
646 
647  case RTOverBelowStrategyNumber:
648  flag = box2df_overbelow(key, &query_gbox_index);
649  break;
650 
651  default:
652  elog(ERROR, "unrecognized strategy: %d", strategy);
653  }
654 
655  /* If any check is failed, we have found our answer. */
656  if (!flag)
657  break;
658  }
659 
660  PG_RETURN_BOOL(flag);
661 }
bool box2df_left(const BOX2DF *a, const BOX2DF *b)
bool box2df_equals(const BOX2DF *a, const BOX2DF *b)
bool box2df_contains(const BOX2DF *a, const BOX2DF *b)
bool box2df_right(const BOX2DF *a, const BOX2DF *b)
bool box2df_overlaps(const BOX2DF *a, const BOX2DF *b)
bool box2df_above(const BOX2DF *a, const BOX2DF *b)
bool box2df_overbelow(const BOX2DF *a, const BOX2DF *b)
bool box2df_overright(const BOX2DF *a, const BOX2DF *b)
int gserialized_datum_get_box2df_p(Datum gsdatum, BOX2DF *box2df)
Peak into a GSERIALIZED datum to find the bounding box.
bool box2df_overabove(const BOX2DF *a, const BOX2DF *b)
bool box2df_below(const BOX2DF *a, const BOX2DF *b)
bool box2df_overleft(const BOX2DF *a, const BOX2DF *b)
#define LW_FAILURE
Definition: liblwgeom.h:110

References box2df_above(), box2df_below(), box2df_contains(), box2df_equals(), box2df_left(), box2df_overabove(), box2df_overbelow(), box2df_overlaps(), box2df_overleft(), box2df_overright(), box2df_right(), gserialized_datum_get_box2df_p(), and LW_FAILURE.

Here is the call graph for this function: