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

◆ gserialized_spgist_inner_consistent_3d()

PGDLLEXPORT Datum gserialized_spgist_inner_consistent_3d ( PG_FUNCTION_ARGS  )

Definition at line 507 of file gserialized_spgist_3d.c.

508{
509 spgInnerConsistentIn *in = (spgInnerConsistentIn *)PG_GETARG_POINTER(0);
510 spgInnerConsistentOut *out = (spgInnerConsistentOut *)PG_GETARG_POINTER(1);
511 int i;
512 MemoryContext old_ctx;
513 CubeBox3D *cube_box;
514 uint8 octant;
516 int *nodeNumbers;
517 void **traversalValues;
518
519 if (in->allTheSame)
520 {
521 /* Report that all nodes should be visited */
522 out->nNodes = in->nNodes;
523 out->nodeNumbers = (int *)palloc(sizeof(int) * in->nNodes);
524 for (i = 0; i < in->nNodes; i++)
525 out->nodeNumbers[i] = i;
526
527 PG_RETURN_VOID();
528 }
529
530 /*
531 * We are saving the traversal value or initialize it an unbounded one, if
532 * we have just begun to walk the tree.
533 */
534 if (in->traversalValue)
535 cube_box = in->traversalValue;
536 else
537 cube_box = initCubeBox();
538
539 centroid = DatumGetBox3DP(in->prefixDatum);
540
541 /* Allocate enough memory for nodes */
542 out->nNodes = 0;
543 nodeNumbers = (int *)palloc(sizeof(int) * in->nNodes);
544 traversalValues = (void **)palloc(sizeof(void *) * in->nNodes);
545
546 /*
547 * We switch memory context, because we want to allocate memory for new
548 * traversal values (next_cube_box) and pass these pieces of memory to
549 * further call of this function.
550 */
551 old_ctx = MemoryContextSwitchTo(in->traversalMemoryContext);
552
553 for (octant = 0; octant < (uint8)in->nNodes; octant++)
554 {
555 CubeBox3D *next_cube_box = nextCubeBox3D(cube_box, centroid, octant);
556 bool flag = true;
557
558 for (i = 0; i < in->nkeys; i++)
559 {
560 StrategyNumber strategy = in->scankeys[i].sk_strategy;
561 Datum query = in->scankeys[i].sk_argument;
562 BOX3D *box = DatumGetBox3DP(DirectFunctionCall1(LWGEOM_to_BOX3D, query));
563
564 switch (strategy)
565 {
568 flag = overlap6D(next_cube_box, box);
569 break;
570
573 flag = contain6D(next_cube_box, box);
574 break;
575
577 flag = !overRight6D(next_cube_box, box);
578 break;
579
581 flag = !right6D(next_cube_box, box);
582 break;
583
585 flag = !overLeft6D(next_cube_box, box);
586 break;
587
589 flag = !left6D(next_cube_box, box);
590 break;
591
593 flag = !overBelow6D(next_cube_box, box);
594 break;
595
597 flag = !below6D(next_cube_box, box);
598 break;
599
601 flag = !overAbove6D(next_cube_box, box);
602 break;
603
605 flag = !above6D(next_cube_box, box);
606 break;
607
609 flag = !overFront6D(next_cube_box, box);
610 break;
611
613 flag = !front6D(next_cube_box, box);
614 break;
615
617 flag = !overBack6D(next_cube_box, box);
618 break;
619
621 flag = !back6D(next_cube_box, box);
622 break;
623
624 default:
625 elog(ERROR, "unrecognized strategy: %d", strategy);
626 }
627
628 /* If any check is failed, we have found our answer. */
629 if (!flag)
630 break;
631 }
632
633 if (flag)
634 {
635 traversalValues[out->nNodes] = next_cube_box;
636 nodeNumbers[out->nNodes] = octant;
637 out->nNodes++;
638 }
639 else
640 {
641 /*
642 * If this node is not selected, we don't need to keep the next
643 * traversal value in the memory context.
644 */
645 pfree(next_cube_box);
646 }
647 }
648
649 /* Pass to the next level only the values that need to be traversed */
650 out->nodeNumbers = (int *)palloc(sizeof(int) * out->nNodes);
651 out->traversalValues = (void **)palloc(sizeof(void *) * out->nNodes);
652 for (i = 0; i < out->nNodes; i++)
653 {
654 out->nodeNumbers[i] = nodeNumbers[i];
655 out->traversalValues[i] = traversalValues[i];
656 }
657 pfree(nodeNumbers);
658 pfree(traversalValues);
659
660 /* Switch after */
661 MemoryContextSwitchTo(old_ctx);
662
663 PG_RETURN_VOID();
664}
static bool front6D(CubeBox3D *cube_box, BOX3D *query)
static bool back6D(CubeBox3D *cube_box, BOX3D *query)
static bool right6D(CubeBox3D *cube_box, BOX3D *query)
static bool overBack6D(CubeBox3D *cube_box, BOX3D *query)
static bool overAbove6D(CubeBox3D *cube_box, BOX3D *query)
static bool overlap6D(CubeBox3D *cube_box, BOX3D *query)
static bool overRight6D(CubeBox3D *cube_box, BOX3D *query)
static bool overFront6D(CubeBox3D *cube_box, BOX3D *query)
static bool contain6D(CubeBox3D *cube_box, BOX3D *query)
static bool overBelow6D(CubeBox3D *cube_box, BOX3D *query)
static bool above6D(CubeBox3D *cube_box, BOX3D *query)
static CubeBox3D * nextCubeBox3D(CubeBox3D *cube_box, BOX3D *centroid, uint8 octant)
static CubeBox3D * initCubeBox(void)
static bool below6D(CubeBox3D *cube_box, BOX3D *query)
static bool overLeft6D(CubeBox3D *cube_box, BOX3D *query)
static bool left6D(CubeBox3D *cube_box, BOX3D *query)
#define SPGOverlapStrategyNumber
#define SPGOverLeftStrategyNumber
#define SPGLeftStrategyNumber
#define SPGAboveStrategyNumber
#define SPGSameStrategyNumber
#define SPGOverBackStrategyNumber
#define SPGContainedByStrategyNumber
#define SPGOverRightStrategyNumber
#define SPGFrontStrategyNumber
#define SPGBelowStrategyNumber
#define SPGRightStrategyNumber
#define SPGOverFrontStrategyNumber
#define SPGContainsStrategyNumber
#define SPGOverBelowStrategyNumber
#define SPGBackStrategyNumber
#define SPGOverAboveStrategyNumber
Datum LWGEOM_to_BOX3D(PG_FUNCTION_ARGS)
Datum centroid(PG_FUNCTION_ARGS)

References above6D(), back6D(), below6D(), centroid(), contain6D(), front6D(), initCubeBox(), left6D(), LWGEOM_to_BOX3D(), nextCubeBox3D(), overAbove6D(), overBack6D(), overBelow6D(), overFront6D(), overlap6D(), overLeft6D(), overRight6D(), right6D(), SPGAboveStrategyNumber, SPGBackStrategyNumber, SPGBelowStrategyNumber, SPGContainedByStrategyNumber, SPGContainsStrategyNumber, SPGFrontStrategyNumber, SPGLeftStrategyNumber, SPGOverAboveStrategyNumber, SPGOverBackStrategyNumber, SPGOverBelowStrategyNumber, SPGOverFrontStrategyNumber, SPGOverlapStrategyNumber, SPGOverLeftStrategyNumber, SPGOverRightStrategyNumber, SPGRightStrategyNumber, and SPGSameStrategyNumber.

Here is the call graph for this function: