Piece-ORMのPostGISでの利用につきまして

17 views
Skip to first unread message

katarou

unread,
Aug 22, 2007, 11:38:07 AM8/22/07
to Piece Framework Users (ja)
はじめまして、田川と申します。

Piece-frameworkを利用して、現在業務アプリを構築中です。
シンプルかつ、明確な設計が気に入って積極的に利用しています。

現在,PostGISとの連携をPiece-ORMを利用して行おうとしているのですが、PostGISのgeometry型という型をMDB2が
認識できないようで、geometry型カラムを含むテーブルのmapper読み込み時にエラーになってしまいます。

今はとりあえずMDB2をそのまま利用して構築を行っているのですが、回避方法はないかと思案中です。
お知恵を拝借したく投稿させていただきました。

よろしくお願いいたします。

KUBO Atsuhiro

unread,
Aug 22, 2007, 11:36:53 PM8/22/07
to piece-framew...@googlegroups.com
田川さん

はじめまして。久保と申します。

MDB2 では DBMS ネイティブのデータ型と MDB2 のデータ型のマッピングを行
っていますが、デフォルトではドライバに記述のないネイティブデータ型が現
れると、MDB2 はエラーを発生します。記述のないものは、MDB2 のオプション
nativetype_map_callback にコールバックを設定することで対応できますが、
Piece_ORM 0.6.0 では、timestamptz しかサポートしていません。
PostGIS が扱うような幾何データ型に対しては、pgsql ドライバに一切記述が
ありませんので、該当テーブルの初回のメタデータ読み込み時に例外が発生す
ることになります。

添付のパッチは、幾何データ型を decimal へマッピングするアドホックなも
のですが、これを適用して試して頂けないでしょうか。

また、Subversion trunk には Piece_ORM がサポートする全 DBMS に対して任
意のマッピングを追加できるように拡張を施してあります。

サンプルスキーマ:

CREATE TABLE geometric_types (
id serial,
point_field point NOT NULL,
lseg_field lseg NOT NULL,
box_field box NOT NULL,
open_path_field path NOT NULL,
closed_path_field path NOT NULL,
polygon_field polygon NOT NULL,
circle_field circle NOT NULL,
version int4 NOT NULL DEFAULT '0',
rdate timestamp with time zone NOT NULL DEFAULT current_timestamp,
mdate timestamp with time zone NOT NULL DEFAULT current_timestamp,
PRIMARY KEY(id)
);

GeometricTypes.yaml:

- name: findByBoxField
query: SELECT * FROM geometric_types WHERE box_field && box $boxField

サンプルコード:

$geometricTypes = &Piece_ORM::createObject('GeometricTypes');
$geometricTypes->pointField = '(1,1)';
$geometricTypes->lsegField = '[(1,1),(2,2)]';
$geometricTypes->boxField = '(2,2),(1,1)';
$geometricTypes->openPathField = '[(1,1),(2,2),(3,1)]';
$geometricTypes->closedPathField = '((1,1),(2,2),(3,1),(1,1))';
$geometricTypes->polygonField = '((1,1),(2,2),(3,1),(1,1))';
$geometricTypes->circleField = '<(1,1),1>';
$mapper = &Piece_ORM::getMapper('GeometricTypes');
$id = $mapper->insert($geometricTypes);

$mapper->findById($id));
$mapper->findByBoxField('(3,3),(1,1)');

以上、よろしくお願いいたします。

--
KUBO Atsuhiro e-mail: ku...@iteman.jp

katarou さんは書きました:

piece-orm-0.6.0-geometric-types.patch

katarou

unread,
Aug 23, 2007, 4:58:37 AM8/23/07
to Piece Framework Users (ja)
久保さん

田川です。早々のご対応大変感謝いたします。
明日、早々試して結果をご連絡いたします。

ありがとうございます。

On 8月23日, 午後12:36, KUBO Atsuhiro <k...@iteman.jp> wrote:
> 田川さん
>
> [piece-orm-0.6.0-geometric-types.patch]Index: Context.php
> ===================================================================
> --- Context.php (revision 274)
> +++ Context.php (working copy)
> @@ -213,7 +213,16 @@
>
> if (strtolower(substr(strrchr(get_class($dbh), '_'), 1)) == 'pgsql') {
> include_once 'Piece/ORM/MDB2/Helper/Pgsql.php';
> - $dbh->setOption('nativetype_map_callback', array('timestamptz' => array('Piece_ORM_MDB2_Helper_Pgsql', 'mapTimestamptz')));
> + $callback = create_function('&$dbh,$field', "return array(array('decimal'), null, null, null);");
> + $dbh->setOption('nativetype_map_callback',
> + array('timestamptz' => array('Piece_ORM_MDB2_Helper_Pgsql', 'mapTimestamptz'),
> + 'point' => $callback,
> + 'lseg' => $callback,
> + 'box' => $callback,
> + 'path' => $callback,
> + 'polygon' => $callback,
> + 'circle' => $callback)
> + );
> }
>
> return $dbh;

> KUBO Atsuhiro e-mail: k...@iteman.jp


>
> katarou さんは書きました:
>
>
>
> > はじめまして、田川と申します。
>
> > Piece-frameworkを利用して、現在業務アプリを構築中です。
> > シンプルかつ、明確な設計が気に入って積極的に利用しています。
>
> > 現在,PostGISとの連携をPiece-ORMを利用して行おうとしているのですが、PostGISのgeometry型という型をMDB2が
> > 認識できないようで、geometry型カラムを含むテーブルのmapper読み込み時にエラーになってしまいます。
>
> > 今はとりあえずMDB2をそのまま利用して構築を行っているのですが、回避方法はないかと思案中です。
> > お知恵を拝借したく投稿させていただきました。
>

> > よろしくお願いいたします。- 引用テキストを表示しない -
>
> - 引用テキストを表示 -

katarou

unread,
Aug 24, 2007, 1:03:47 AM8/24/07
to Piece Framework Users (ja)
田川です。

頂いたパッチを利用?して動作することが出来ました。
Postgisでは、geometry型で座標を記憶している為、
callbackの配列に
'geometry' => $callback
と記載して動作させることが出来ました。
ありがとうございました。

※subversion_trunkにある、任意のデータ型へのマッピングの対応のリリースも期待してます。都度本体にパッチを当てて利用するのもなん
なので^^;

On 8月23日, 午後12:36, KUBO Atsuhiro <k...@iteman.jp> wrote:
> 田川さん
>
> [piece-orm-0.6.0-geometric-types.patch]Index: Context.php
> ===================================================================
> --- Context.php (revision 274)
> +++ Context.php (working copy)
> @@ -213,7 +213,16 @@
>
> if (strtolower(substr(strrchr(get_class($dbh), '_'), 1)) == 'pgsql') {
> include_once 'Piece/ORM/MDB2/Helper/Pgsql.php';
> - $dbh->setOption('nativetype_map_callback', array('timestamptz' => array('Piece_ORM_MDB2_Helper_Pgsql', 'mapTimestamptz')));
> + $callback = create_function('&$dbh,$field', "return array(array('decimal'), null, null, null);");
> + $dbh->setOption('nativetype_map_callback',
> + array('timestamptz' => array('Piece_ORM_MDB2_Helper_Pgsql', 'mapTimestamptz'),
> + 'point' => $callback,
> + 'lseg' => $callback,
> + 'box' => $callback,
> + 'path' => $callback,
> + 'polygon' => $callback,
> + 'circle' => $callback)
> + );
> }
>
> return $dbh;
>

> KUBO Atsuhiro e-mail: k...@iteman.jp


>
> katarou さんは書きました:
>
>
>
> > はじめまして、田川と申します。
>
> > Piece-frameworkを利用して、現在業務アプリを構築中です。
> > シンプルかつ、明確な設計が気に入って積極的に利用しています。
>
> > 現在,PostGISとの連携をPiece-ORMを利用して行おうとしているのですが、PostGISのgeometry型という型をMDB2が
> > 認識できないようで、geometry型カラムを含むテーブルのmapper読み込み時にエラーになってしまいます。
>
> > 今はとりあえずMDB2をそのまま利用して構築を行っているのですが、回避方法はないかと思案中です。
> > お知恵を拝借したく投稿させていただきました。
>

KUBO Atsuhiro

unread,
Aug 24, 2007, 6:37:47 AM8/24/07
to piece-framew...@googlegroups.com
田川さん

久保です。

フィードバックありがとうございます。無事動作したということで、PostgreS
QL ネイティブの幾何データ型に対しては、decimal へマッピングすることに
します。
なお、geometry 型は PostGIS の拡張データ型のため、Piece_ORM のデフォル
トマッピングには加えないでおこうと考えています。その代わり、次回リリー
スからは下記のメソッドを実行することで対応できるようになります。

Piece_ORM_MDB2_NativeTypeMapper_Pgsql::addMap('geometry', 'decimal');

以上、よろしくお願いいたします。

--
KUBO Atsuhiro e-mail: ku...@iteman.jp

katarou さんは書きました:

Reply all
Reply to author
Forward
0 new messages