PostGIS 3.7.0dev-r@@SVN_REVISION@@
Loading...
Searching...
No Matches

◆ 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 (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)
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:96

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: