postgrespro / pgsphere

PgSphere provides spherical data types, functions, operators, and indexing for PostgreSQL.
https://pgsphere.org
BSD 3-Clause "New" or "Revised" License
16 stars 15 forks source link

Additional spoly constructors? #95

Closed esabol closed 7 months ago

esabol commented 8 months ago

The spoly_deg() function can construct a spoly from an array of float8:

CREATE FUNCTION spoly_deg(float8[])
   RETURNS spoly
   AS 'MODULE_PATHNAME', 'spherepoly_deg'
   LANGUAGE 'c'
   IMMUTABLE STRICT;

(Aside: Why is this function not PARALLEL SAFE? Should it be?)

But there's no corresponding spoly constructor that takes an array of float8 in radians:

testdb=> SELECT spoly(ARRAY[1.0, 2.0, 3.0, 4.0, 5.0, 6.0]);
ERROR:  function spoly(numeric[]) does not exist
LINE 1: SELECT spoly(ARRAY[1.0, 2.0, 3.0, 4.0, 5.0, 6.0]);
               ^
HINT:  No function matches the given name and argument types. You might need to add explicit type casts.

I don't want to use a temporary table to construct a spoly in my PLpgsql functions. It's horribly inefficient and doesn't scale when operating over very large tables. So that means I have to either convert my coordinates to degrees (only for spherepoly_deg() to convert them back to radians) in order to avoid that or construct a string to contain the array of coordinates and use the spoly constructor on the string.

Also, I think it would be nice if there was a constructor that takes an array of spoint as well, so that you can do this:

SELECT spoly([spoint(1.0, 2.0), spoint(3.0, 4.0), spoint(5.0, 6.0)]);

Should that be possible? What do you think?

vitcpp commented 8 months ago

@esabol I think, it is possible what you proposes. Postgresql supports function overloading.

I propose to complete your PR and then try to implement spoly(spoint[]) as another PR.

esabol commented 8 months ago

How would you advise implementing the spoly(spoint[]) constructor function?

Would the spoint array need to be duplicated in memory (using the equivalent of a copy constructor)? Or can you reuse the same array and/or the same array members passed in as arguments?

esabol commented 8 months ago

It feels like there should be some trick to creating an spoly from an array of spoints since you can sort of already do the following in PLpgsql:

select spoly(t.pnt)
  into thepoly 
  from (select pnt from xxxpnts order by ord) as t;
vitcpp commented 8 months ago

How would you advise implementing the spoly(spoint[]) constructor function?

I will propose an implementation. May be tomorrow.

vitcpp commented 7 months ago

@esabol I think, this issue is completed with the following PRs: