象と戯れ

 | 

2010-06-06

funcarray v0.9 Release

01:35 | funcarray v0.9 Release - 象と戯れ を含むブックマーク はてなブックマーク - funcarray v0.9 Release - 象と戯れ

GitHub - umitanuki/funcarray: A set of feature that allows PG ARRAY type to be processed in functional ways.

GitHubを使ってみるテストの一環として、funcarrayなるモジュールを作ってみました。

JavaScript1.7ではArray.prototype.mapやArray.prototype.filterが導入されてとても便利になったので、PostgreSQLの配列でも同様のことをしてみよう、という試み。

SELECT maparray(ARRAY[1,3,5], 'int4inc'::regproc);
 maparray 
----------
 {2,4,6}
(1 row)

とか、

SELECT maparray(ARRAY['test', 'McDonald']::text[], 'upper');
    maparray     
-----------------
 {TEST,MCDONALD}
(1 row)
SELECT reducearray(ARRAY[3, 5, 10], 'int4pl');
 reducearray 
-------------
          18
(1 row)

とかできます。もちろん自前関数をlambdaにもできる

CREATE FUNCTION _iseven(int) RETURNS bool AS $$
SELECT $1 % 2 = 0
$$ LANGUAGE 'SQL' IMMUTABLE;
SELECT filterarray(ARRAY[3,0,100,NULL,-1,0], '_iseven');
 filterarray 
-------------
 {0,100,0}
(1 row)

但しanyarrayとかanyelementを使うので入力の型と出力の型、さらにはlambdaの型に制約がでてきます。一応バイナリキャスト可能な型はサポートするようにしましたが・・・ あと、自分勝手なユースケースとしてint4/int8/int2のNULLなし配列の場合だけ少し高速になるように小細工を仕掛けてあります。ちなみに現在のバージョンは0.9、ベータリリースというレベルです。

実はこれだけなら先日SETOFで紹介したように

CREATE OR REPLACE FUNCTION add_each(ary int4[], val int4) RETURNS int4[] AS $$
SELECT ARRAY(SELECT $1[i] + $2 FROM generate_series(1, array_upper($1, 1)) i)
$$ LANGUAGE sql IMMUTABLE;

とやってしまえばすぐ実装できるのですが、GitHubの使い方練習と、「配列をごにょごにょする」ロードマップの一部としての位置づけがあるのでした。

それにしてもGitHub、ちょいちょい作っていくにはとても便利ですね。グラフ表示とかもサクサクだし、とても先進的なものを感じます。

 |