agora inbox for pgsql-sql@postgresql.org  
help / color / mirror / Atom feed
From: David Johnston <polobo@yahoo.com>
To: pgsql-sql@postgresql.org
Subject: Re: creating a new aggregate function
Date: Mon, 3 Mar 2014 09:35:59 -0800 (PST)
Message-ID: <1393868159887-5794419.post@n5.nabble.com> (raw)
In-Reply-To: <87iorvurrd.fsf@net82.ceos.umanitoba.ca>
References: <87iorvurrd.fsf@net82.ceos.umanitoba.ca>
List-Unsubscribe: <mailto:majordomo@postgresql.org?body=unsub%20pgsql-sql>

Sebastian P. Luque wrote
> Hi,
> 
> I'm trying to implement an aggregate function to calculate the average
> angle from one or more angles and corresponding magnitudes.  So my first
> step is to design a function that decomposes the angles and magnitudes
> and returns the corresponding x and y vectors, and the following works
> does this:
> 
> ---<--------------------cut
> here---------------start------------------->---
> CREATE OR REPLACE FUNCTION decompose_angle(IN angle numeric, IN magnitude
> numeric,
>   OUT x numeric, OUT y numeric) RETURNS record AS
> $BODY$
> BEGIN
> 	x := sin(radians(angle)) * magnitude;
> 	y := cos(radians(angle)) * magnitude;
> END;
> $BODY$
>   LANGUAGE plpgsql STABLE
>   COST 100;
> ALTER FUNCTION decompose_angle(numeric, numeric)
>   OWNER TO sluque;
> COMMENT ON FUNCTION decompose_angle(numeric, numeric) IS
>   'Decompose an angle and magnitude into x and y vectors.';
> ---<--------------------cut
> here---------------end--------------------->---
> 
> Before moving on to writing the full aggregate, I'd appreciate any
> suggestions to understand how to go about writing an aggregate for the
> above, that would return the average x and y vectors.

I would suggest you design custom types that incorporate the
angle,magnitude-pair and the x,y-pair and write your functions to operate
using those types.

The documentation for CREATE AGGREGATE is fairly detailed and can be
summarized as:
1) Do something for each input row - you maintain state internally
2) Do something after the last row has been processed - using the state from
#1

http://www.postgresql.org/docs/9.3/interactive/sql-createaggregate.html

What you do in those two steps depends fully on the algorithm you need which
is beyond my immediate knowledge.

Note the use of plpgsql in your function is probably undesirable since you
are not actually using any procedural logic; an SQL language function is
better since it gives the system more optimization options.

David J.





--
View this message in context: http://postgresql.1045698.n5.nabble.com/creating-a-new-aggregate-function-tp5794414p5794419.html
Sent from the PostgreSQL - sql mailing list archive at Nabble.com.


-- 
Sent via pgsql-sql mailing list (pgsql-sql@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-sql



view thread (7+ messages)  latest in thread

Message-ID: <1393868159887-5794419.post@n5.nabble.com>
Permalink:  ../1393868159887-5794419.post@n5.nabble.com/
Also on:    postgresql.org/message-id/1393868159887-5794419.post@n5.nabble.com

reply

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Reply to all the recipients using the --to and --cc options:
  reply via email

  To: pgsql-sql@postgresql.org
  Cc: polobo@yahoo.com
  Subject: Re: creating a new aggregate function
  In-Reply-To: <1393868159887-5794419.post@n5.nabble.com>

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

This inbox is served by agora; see mirroring instructions
for how to clone and mirror all data and code used for this inbox