Objective::DBI(仮)

大分仕事の方が落ち着いてきたので、結構時間が割ける。
検索を楽に出来る・・・というのがひとまずの方針であることは前述した通りだが、その方法を考えている。検索と言っても、単なるWHERE句の中に条件をぶち込むのは簡単に出来るし、そんなものはClass::DBIでも実装されている。問題はテーブルのjoinだ。
当然のことながら、等価結合は出来なくては話にならない。外部結合(left joinやright join)も同様だ。だが、非等価結合はさすがに難しい。どう表現していいのか、非常に困るのだ。
現在の方法として考えているのが、とりあえずjoinによって仮想テーブル(imaginary table)を作ると考え、その仮想テーブルに対してクエリを発行する・・・というものだ。例としては、

__PACKAGE__->set_i_table(
        name => 'artist2',
        struct => {
                name => 'artist',
                next => [
                        {
                                name => 'label',
                                type => left,
                                join => 'label.id = artist.label_id',
                                next => [
                                        {
                                                name => 'company',
                                                type => left,
                                                join => 'company.code = label.company_code',
                                        },
                                ],
                        },
                ],
        }
);

このようにjoinの構造を表現して、その上でこのテーブルに対して検索メソッドを行えばいいようにしたい。そうすれば、より一層SQLを自分で書く必要は無くなる。
だが、まず問題となるのはそのjoinの方法、すなわち構造の表現だ。今、上のように書いてはみたが、おそらくこれでは不十分だろう。
次に、それぞれのカラムをどう表現するか。再帰結合をする場合もあるだろう。そうすると、それぞれのテーブルをどう表現していくべきかを決定しなくてはならない。
table_name1, table_name2としていくのか。しかしそうであったとしても、すでにDB上にtable_name1というテーブルがあったらどうするのか。考えることはまだまだ多い。