422{
423 spgPickSplitIn *in = (spgPickSplitIn *)PG_GETARG_POINTER(0);
424 spgPickSplitOut *out = (spgPickSplitOut *)PG_GETARG_POINTER(1);
426 int median, i;
427 double *lowXs = palloc(sizeof(double) * in->nTuples);
428 double *highXs = palloc(sizeof(double) * in->nTuples);
429 double *lowYs = palloc(sizeof(double) * in->nTuples);
430 double *highYs = palloc(sizeof(double) * in->nTuples);
431 double *lowZs = palloc(sizeof(double) * in->nTuples);
432 double *highZs = palloc(sizeof(double) * in->nTuples);
433 BOX3D *box = DatumGetBox3DP(in->datums[0]);
434 int32_t srid = box->
srid;
435
436
437 for (i = 0; i < in->nTuples; i++)
438 {
439 BOX3D *box = DatumGetBox3DP(in->datums[i]);
440
441 lowXs[i] = box->
xmin;
442 highXs[i] = box->
xmax;
443 lowYs[i] = box->
ymin;
444 highYs[i] = box->
ymax;
445 lowZs[i] = box->
zmin;
446 highZs[i] = box->
zmax;
447 }
448
455
456 median = in->nTuples / 2;
457
459
467
468
469 out->hasPrefix = true;
470 out->prefixDatum = Box3DPGetDatum(
centroid);
471
472 out->nNodes = 64;
473 out->nodeLabels = NULL;
474
475 out->mapTuplesToNodes = palloc(sizeof(int) * in->nTuples);
476 out->leafTupleDatums = palloc(sizeof(Datum) * in->nTuples);
477
478
479
480
481
482 for (i = 0; i < in->nTuples; i++)
483 {
484 BOX3D *box = DatumGetBox3DP(in->datums[i]);
486
487 out->leafTupleDatums[i] = Box3DPGetDatum(box);
488 out->mapTuplesToNodes[i] = octant;
489 }
490
491 pfree(lowXs);
492 pfree(highXs);
493 pfree(lowYs);
494 pfree(highYs);
495 pfree(lowZs);
496 pfree(highZs);
497
498 PG_RETURN_VOID();
499}
static int compareDoubles(const void *a, const void *b)
static uint8 getOctant(BOX3D *centroid, BOX3D *inBox)
Datum centroid(PG_FUNCTION_ARGS)