PostGIS  2.4.9dev-r@@SVN_REVISION@@

◆ nd_box_overlap()

static int nd_box_overlap ( const ND_STATS nd_stats,
const ND_BOX nd_box,
ND_IBOX nd_ibox 
)
inlinestatic

What stats cells overlap with this ND_BOX? Put the lowest cell addresses in ND_IBOX->min and the highest in ND_IBOX->max.

Definition at line 631 of file gserialized_estimate.c.

References ND_STATS_T::extent, ND_BOX_T::max, ND_IBOX_T::max, ND_BOX_T::min, ND_IBOX_T::min, MIN_DIMENSION_WIDTH, nd_box_to_json(), ND_STATS_T::ndims, ND_STATS_T::size, and TRUE.

Referenced by compute_gserialized_stats_mode(), estimate_join_selectivity(), and estimate_selectivity().

632 {
633  int d;
634 
635  POSTGIS_DEBUGF(4, " nd_box: %s", nd_box_to_json(nd_box, nd_stats->ndims));
636 
637  /* Initialize ibox */
638  memset(nd_ibox, 0, sizeof(ND_IBOX));
639 
640  /* In each dimension... */
641  for ( d = 0; d < nd_stats->ndims; d++ )
642  {
643  double smin = nd_stats->extent.min[d];
644  double smax = nd_stats->extent.max[d];
645  double width = smax - smin;
646 
647  if (width < MIN_DIMENSION_WIDTH)
648  {
649  nd_ibox->min[d] = nd_ibox->max[d] = nd_stats->extent.min[d];
650  }
651  else
652  {
653  int size = (int)roundf(nd_stats->size[d]);
654 
655  /* ... find cells the box overlaps with in this dimension */
656  nd_ibox->min[d] = floor(size * (nd_box->min[d] - smin) / width);
657  nd_ibox->max[d] = floor(size * (nd_box->max[d] - smin) / width);
658 
659  POSTGIS_DEBUGF(5, " stats: dim %d: min %g: max %g: width %g", d, smin, smax, width);
660  POSTGIS_DEBUGF(5, " overlap: dim %d: (%d, %d)", d, nd_ibox->min[d], nd_ibox->max[d]);
661 
662  /* Push any out-of range values into range */
663  nd_ibox->min[d] = Max(nd_ibox->min[d], 0);
664  nd_ibox->max[d] = Min(nd_ibox->max[d], size - 1);
665  }
666  }
667  return TRUE;
668 }
#define MIN_DIMENSION_WIDTH
Minimum width of a dimension that we&#39;ll bother trying to compute statistics on.
float4 size[ND_DIMS]
int min[ND_DIMS]
N-dimensional box index type.
static char * nd_box_to_json(const ND_BOX *nd_box, int ndims)
Convert an ND_BOX to a JSON string for printing.
float4 max[ND_DIMS]
int max[ND_DIMS]
float4 min[ND_DIMS]
#define TRUE
Definition: dbfopen.c:169
Here is the call graph for this function:
Here is the caller graph for this function: