[Seasar-user:20141] Re: 【DBFlute】 (Query)DerivedReferrerについて

kubo [E-MAIL ADDRESS DELETED]
2010年 9月 10日 (金) 16:19:51 JST


久保(jflute)です。

>> coalesce って DBMS 共通かなぁ...!?
> SQL92の予約語(のはず)なので、DBMS共通と考えて、差支えないかと。

ありがとうございます。
軽く調べてみましたが大丈夫そうですね。少なくとも、
DerivedReferrer系では対応しようかと思います。
(日付型とか他の型はどうするかちょっと考えます)

ユーザインターフェースは二通りのどちらかを考えています。
まあ、この機能存在に気付いてもらいやすいのは前者ですかね。
現状、max() とか min() とかシンプル過ぎてEclipseで補完する
ときに一瞬ちょっと見づらいので(Objectクラスのメソッドに紛れる)、
オーバーロードでダブってた方が、選びやすいというのもあるかも。

//
// (Specify)DerivedReferrer
//
cb.specify().derivedPurchaseList().max(new SubQuery<PurchaseCB>() {
    ...
}, null, 0); // オーバーロード

cb.specify().derivedPurchaseList().max(new SubQuery<PurchaseCB>() {
    ...
}, null).coalesce(0); // 後付けメソッド

//
// (Query)DerivedReferrer
//
cb.query().derivedPurchaseList().max(new SubQuery<PurchaseCB>() {
    ...
}).greaterEqual(expected, 0); // オーバーロード

cb.query().derivedPurchaseList().max(new SubQuery<PurchaseCB>() {
    ...
}).greaterEqual(expected).coalesce(0); // 後付けメソッド


2010/9/10 金子 雄一 <[E-MAIL ADDRESS DELETED]>:
> 金子です。
>
>> 例えば、基点テーブルが FOO で BAR が子テーブルのとき、
>> BAR を持っていない FOO が検索結果から外れてしまうので、
>> max() の結果に対して、null の場合に 0 にする関数をラップしたい、
>> ということでよろしいでしょうか?
>
> まさに、その通りです。
>
>
>> coalesce って DBMS 共通かなぁ...!?
> SQL92の予約語(のはず)なので、DBMS共通と考えて、差支えないかと。
>
>
> 以上、よろしくお願いします。
>
>
> (2010/09/10 15:46), kubo wrote:
>>
>> 久保(jflute)です。
>>
>> ご確認ありがとうございます。
>>
>> 例えば、基点テーブルが FOO で BAR が子テーブルのとき、
>> BAR を持っていない FOO が検索結果から外れてしまうので、
>> max() の結果に対して、null の場合に 0 にする関数をラップしたい、
>> ということでよろしいでしょうか?
>>
>>  where FOO.FOO_COUNT>= (
>>          select max(BAR.BAR_COUNT)
>>            from BAR
>>           where BAR.FOO_ID = FOO.FOO_ID
>>        )
>>
>> ※売上データがFOO???参考までに当てはめて頂ければと
>>
>> 通常の (Specify)DerivedReferrer や ScalarSelect などでは、
>> それ自体が取得値なので、無い場合に null でもプログラム側で
>> なんとかすればいいのでそんなに問題にはなりませんが、
>> こうやってSQLの中で利用するときややこしい話になりますね。
>> そういう意味で、(Query)DerivedReferrer や ScalarCondition には
>> 共通するような話かもしれません。
>> もともとSQLの有名なハマりどころなので、
>> そういう意味でもしっかり対応したいとは思いますが、
>> coalesce って DBMS 共通かなぁ...!?
>> もう少々、色々と考えます。
>>
>> null のときに検索対象から外したい場合は、
>> null 演算で外れるよりも、別途(Query)DerivedReferrer などで
>> 明示的に絞り込んだ方が良いと思うので、null の場合は固定で
>> 0 でもいいかなとは思いますが、今の時点でそれはなかなか
>> できないので、オプションにする形を想像しています。
>>
>> #
>> # 例外処理を埋め込んだ DBFlute-0.9.7.4-02-SNAPSHOT を
>> # 公開しました。
>> #
>>
>> 2010/9/10 金子 雄一<[E-MAIL ADDRESS DELETED]>:
>>>
>>> 金子です。
>>>
>>> 一通り動かしてみましたが、
>>> 今のところ、予期した通りの動きです。
>>>
>>> が、肝心なことを忘れてました…。
>>> 子テーブルなので、必ずしも、レコードがあるわけでないのでした…。
>>>
>>> 業務的には、返品業務の実装をしています。
>>>
>>> で、現状、どの部分で、この機能を欲したかというと、
>>> 返品をする対象(つまり、売上データ)を検索検索する部分です。
>>>
>>> 基本的には、売上データを検索すればよいのですが、
>>> 全額返品している場合には、検索対象から外すという処理です。
>>>
>>> 返品そのものがない場合(たぶん、ほとんどが該当)は、
>>> 返品テーブルにデータがないので・・・・。
>>> という感じです。
>>>
>>> なので、CBの範疇かが、怪しいのですが、
>>> deriverの機能で、sum(),max(),min() 等ができるようになっていますが、
>>> ここに、coalesce関数をつける・つけないを選択できようには、ならないでしょ うか?
>>> ( coalesce(sum(ColB),0)とすれば、子テーブルのレコードがない場合は、0にな
>>> るので。ただし、そん座していない場合は、検索結果として取得できてはいけな
>>> い場合もあるかと思いますので、選択できればよいのかなと。coalesceの第2引
>>> 数をどう渡す?という問題もあるかと思いますので、実は、厳しいのかもしれま せんが・・・・。)
>>>
>>> CBの範疇や、DBFluteとしてのポリシーもあるかと思いますので、
>>> それを破らない範囲であれば、対応を検討していただけると、
>>> ありがたく思います。
>>>
>>>
>>> ご不明な点がありましたら、ご連絡ください。
>>> 以上、よろしくお願いいたします。
>>>
>>> (2010/09/10 6:21), kubo wrote:
>>>>
>>>> 久保(jflute)です。
>>>>
>>>> DBFlute-0.9.7.4-01-SNAPSHOTを使ってみて下さい。
>>>> (モジュール、ランタイム両方)
>>>>
>>>> まだ、各種例外処理が入っていないですが、
>>>> ColumnQueryの中で(Specify)DerivedReferrerが利用できます。
>>>> aliasName には固定で null を入れて下さい。
>>>>
>>>>> where
>>>>>  数字 = max(文字型カラム)
>>>>
>>>> これは、もともとの ColumnQuery でも、
>>>> コンパイルレベルでの抑制はできないので同じことかと。
>>>> 高度な機能に関しては、この辺は割り切りを入れています。
>>>> _______________________________________________
>>>> Seasar-user mailing list
>>>> [E-MAIL ADDRESS DELETED]
>>>> https://ml.seasar.org/mailman/listinfo/seasar-user
>>>
>>>
>>> --
>>> ◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆
>>> 金子 雄一  Yuichi Kaneko
>>> ◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆
>>> _______________________________________________
>>> Seasar-user mailing list
>>> [E-MAIL ADDRESS DELETED]
>>> https://ml.seasar.org/mailman/listinfo/seasar-user
>>>
>> _______________________________________________
>> Seasar-user mailing list
>> [E-MAIL ADDRESS DELETED]
>> https://ml.seasar.org/mailman/listinfo/seasar-user
>
>
> --
> ◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆
> 株式会社プラスサム
> 金子 雄一  Yuichi Kaneko
> 〒330-0854
> 埼玉県さいたま市大宮区桜木町2-7-4
> プラスサムビル
> Tel: 048-650-9777 Fax: 048-650-9778
> E-mail : [E-MAIL ADDRESS DELETED]
> http://www.plus-sum.co.jp/
> ◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆
> _______________________________________________
> Seasar-user mailing list
> [E-MAIL ADDRESS DELETED]
> https://ml.seasar.org/mailman/listinfo/seasar-user
>


Seasar-user メーリングリストの案内