PostGIS  3.4.0dev-r@@SVN_REVISION@@

◆ 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;
515  BOX3D *centroid;
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 < 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 CubeBox3D * nextCubeBox3D(CubeBox3D *cube_box, BOX3D *centroid, uint8 octant)
static bool overRight6D(CubeBox3D *cube_box, BOX3D *query)
static bool overFront6D(CubeBox3D *cube_box, BOX3D *query)
static CubeBox3D * initCubeBox(void)
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 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)
Definition: lwgeom_box3d.c:398
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: