-- Function: num_to_text_ce(integer, integer, text[])
/*
Copyright (c) 2011, Laimis <wiela@centras.lt>
All rights reserved.
Licensed under the BSD license.
*/
-- DROP FUNCTION num_to_text_ce(integer, integer, text[]);
CREATE OR REPLACE FUNCTION num_to_text_ce(cv integer, df integer, ce text[])
RETURNS character varying AS
$BODY$
DECLARE
d INTEGER := df % 10;
k INTEGER := 1;
/*
XXX: PG/PLSQL (as of v.8.4) multi dimensional array slicing, subarray
(de)referencing mess...
[{*]{x, y, z, ...}[}*] -> {x, y, z, ...};
*/
-- re TEXT[]:= ARRAY(SELECT unnest(ce));
BEGIN
/*
Two numeral case variants:
k = 1 (cv|tn = 1,3,4,5,6,7,...):
šimt(-as,-ai,-ų), milijon(-as,-ai,-ų), milijard(-as,-ai,-ų), ...;
k = 2 (cv|tn = 2):
tūkstan(-tis,-čiai,-čių).
*/
IF cv = 2 THEN
k := cv;
END IF;
CASE
-- [0-9][0], [11-19]: pl. genitive (lt: dgs. kilmininkas; -ų, -čių)
WHEN d = 0 OR df BETWEEN 11 AND 19 THEN
return ce[k][3];
-- [0-9][1]: sg. nominative (lt: vns. vardininkas; -as, -tis)
WHEN d = 1 THEN
return ce[k][1];
-- [0,2-9][2-9]: pl. nominative (lt: dgs. vardininkas; -ai, -čiai)
ELSE
return ce[k][2];
END CASE;
END;
$BODY$
LANGUAGE 'plpgsql' IMMUTABLE
COST 100;
ALTER FUNCTION num_to_text_ce(integer, integer, text[]) OWNER TO postgres;
COMMENT ON FUNCTION num_to_text_ce(integer, integer, text[]) IS 'Used by num_to_text().
Returns ending for the particular case according to numeral (case variant -- cv; triad number),
double-figure (df) number value and case endings (ce).
/*
Copyright (c) 2011, Laimis <wiela@centras.lt>
All rights reserved.
Licensed under the BSD license.
*/
';