Hi,

I use the cube datatype a fair bit, and one thing I have always wanted is the ability to do this:

pg=# select cube_from_arrays('{1,2,3}'::float[], '{3,5,6}'::float[]);
  cube_from_arrays
---------------------
 (1, 2, 3),(3, 5, 6)
(1 row)

That is - build a cube by specifying 2 arrays, one for the UR coordinate, one for LL.

I hope people find this useful, and if so, we can add it to contrib/cube.

Source is attached.

Thanks,

Joshua Reich
(jdigittl on #postgresql)

#include "postgres.h"
#include "utils/array.h"
#include "cubedata.h"                   /* contrib/cube */

/*
**      CREATE OR REPLACE FUNCTION cube_from_arrays(float[], float[]) RETURNS 
cube
**              AS 'ordermatch'
**          LANGUAGE C;
*/

NDBOX *cube_from_arrays (ArrayType *ur, ArrayType *ll);

/*
** Taken from the intarray contrib header
*/
#define ARRPTR(x)  ( (double *) ARR_DATA_PTR(x) )
#define ARRNELEMS(x)  ArrayGetNItems( ARR_NDIM(x), ARR_DIMS(x))


/*
** Allows the construction of a cube from 2 float[]'s
*/
NDBOX *cube_from_arrays (ArrayType *ur, ArrayType *ll)
{
        int             i;
        int             dim;
        int             size;
        NDBOX   *result;
        double  *dur, *dll;

        dim = ARRNELEMS(ur);
        if (ARRNELEMS(ll) < dim)
        {
                /* 
                ** If the array's are not of equal length, use the length
                ** of the shorter array.
                */
                dim = ARRNELEMS(ll);
        }

        dur = ARRPTR(ur);
        dll = ARRPTR(ll);

        size = offsetof(NDBOX, x[0]) + sizeof(double) * 2 * dim;
        result = (NDBOX *) palloc (size);
        memset (result, 0, size);
        result->size = size;
        result->dim = dim;

        for (i=0; i<dim; i++)
        {
                result->x[i] = dur[i];
                result->x[i+dim] = dll[i];
        }

        return result;
}
---------------------------(end of broadcast)---------------------------
TIP 4: Have you searched our list archives?

               http://archives.postgresql.org

Reply via email to