507{
508 spgInnerConsistentIn *in = (spgInnerConsistentIn *)PG_GETARG_POINTER(0);
509 spgInnerConsistentOut *out = (spgInnerConsistentOut *)PG_GETARG_POINTER(1);
510 int i;
511 MemoryContext old_ctx;
513 uint8 octant;
515 int *nodeNumbers;
516 void **traversalValues;
517
518 if (in->allTheSame)
519 {
520
521 out->nNodes = in->nNodes;
522 out->nodeNumbers = (int *)palloc(sizeof(int) * in->nNodes);
523 for (i = 0; i < in->nNodes; i++)
524 out->nodeNumbers[i] = i;
525
526 PG_RETURN_VOID();
527 }
528
529
530
531
532
533 if (in->traversalValue)
534 cube_box = in->traversalValue;
535 else
537
538 centroid = DatumGetBox3DP(in->prefixDatum);
539
540
541 out->nNodes = 0;
542 nodeNumbers = (int *)palloc(sizeof(int) * in->nNodes);
543 traversalValues = (void **)palloc(sizeof(void *) * in->nNodes);
544
545
546
547
548
549
550 old_ctx = MemoryContextSwitchTo(in->traversalMemoryContext);
551
552 for (octant = 0; octant < in->nNodes; octant++)
553 {
555 bool flag = true;
556
557 for (i = 0; i < in->nkeys; i++)
558 {
559 StrategyNumber strategy = in->scankeys[i].sk_strategy;
560 Datum query = in->scankeys[i].sk_argument;
562
563 switch (strategy)
564 {
568 break;
569
573 break;
574
577 break;
578
580 flag = !
right6D(next_cube_box, box);
581 break;
582
585 break;
586
588 flag = !
left6D(next_cube_box, box);
589 break;
590
593 break;
594
596 flag = !
below6D(next_cube_box, box);
597 break;
598
601 break;
602
604 flag = !
above6D(next_cube_box, box);
605 break;
606
609 break;
610
612 flag = !
front6D(next_cube_box, box);
613 break;
614
617 break;
618
620 flag = !
back6D(next_cube_box, box);
621 break;
622
623 default:
624 elog(ERROR, "unrecognized strategy: %d", strategy);
625 }
626
627
628 if (!flag)
629 break;
630 }
631
632 if (flag)
633 {
634 traversalValues[out->nNodes] = next_cube_box;
635 nodeNumbers[out->nNodes] = octant;
636 out->nNodes++;
637 }
638 else
639 {
640
641
642
643
644 pfree(next_cube_box);
645 }
646 }
647
648
649 out->nodeNumbers = (int *)palloc(sizeof(int) * out->nNodes);
650 out->traversalValues = (void **)palloc(sizeof(void *) * out->nNodes);
651 for (i = 0; i < out->nNodes; i++)
652 {
653 out->nodeNumbers[i] = nodeNumbers[i];
654 out->traversalValues[i] = traversalValues[i];
655 }
656 pfree(nodeNumbers);
657 pfree(traversalValues);
658
659
660 MemoryContextSwitchTo(old_ctx);
661
662 PG_RETURN_VOID();
663}
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)