Rajarshi Guha wrote:
Hi, I am trying to write a PL/pgsql function that will take a CUBE variable (which will be a 1D point) and a double precision variable.

If the input CUBE is defined as

'(x,y,z)'::cube

the function would then return a CUBE value of the form

'(x+R,y+R,z+R),(x-R,y-R,z-R)'::cube

where R is the second argument.

The problem I'm having is to actually add R to the individual components of the CUBE variable. I can't cast CUBE to float[] and I don't see anyway to get at the individual components of the CUBE.

I haven't tested this, but it looks like you can use cube_subset() to do that.

From [0]:

  cube_subset(cube, int[]) returns cube

  Makes a new cube from an existing cube, using a list of dimension
  indexes from an array. Can be used to find both the LL and UR
  coordinates of a single dimension, e.g.
  cube_subset(cube('(1,3,5),(6,7,8)'), ARRAY[2]) = '(3),(7)'. Or can be
  used to drop dimensions, or reorder them as desired, e.g.
  cube_subset(cube('(1,3,5),(6,7,8)'), ARRAY[3,2,1,1]) = '(5, 3, 1,
  1),(8, 7, 6, 6)'.

For each dimension, select cube_subset(your_cube, ARRAY[dimension]) and then increment or decrement by R.

Further, it looks like you're actually trying to create a function that will do precisely what cube_enlarge() does.

Also from [0]:

  cube_enlarge(cube c, double r, int n) returns cube

  Increases the size of a cube by a specified radius in at least n
  dimensions. If the radius is negative the cube is shrunk instead. This
  is useful for creating bounding boxes around a point for searching for
  nearby points. All defined dimensions are changed by the radius r. LL
  coordinates are decreased by r and UR coordinates are increased by r.
  If a LL coordinate is increased to larger than the corresponding UR
  coordinate (this can only happen when r < 0) than both coordinates are
  set to their average. If n is greater than the number of defined
  dimensions and the cube is being increased (r >= 0) then 0 is used as
  the base for the extra coordinates.

Colin

[0] http://developer.postgresql.org/pgdocs/postgres/cube.html

---------------------------(end of broadcast)---------------------------
TIP 9: In versions below 8.0, the planner will ignore your desire to
      choose an index scan if your joining column's datatypes do not
      match

Reply via email to