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

金子 雄一 [E-MAIL ADDRESS DELETED]
2010年 9月 10日 (金) 17:26:19 JST


金子です。

 > まあ、この機能存在に気付いてもらいやすいのは前者ですかね。
確かに、そうですね。
ただ、個人的には、後者のほうが、実装後に何をやっているかは、
見てすぐわかるかなと思います。(1か月前の自分は自分じゃないんで…。)
(でも、自分が作ったら、前者のI/F作っちゃうんだろうな、きっと。)

Eclipseの補完と、このメソッドがコールバックが多いことまで考慮すると、
前者のほうが、若干、よいのかもしれませんね。
なので、作りやすいほうでよいかと思います。


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

(2010/09/10 16:19), kubo wrote:
> 久保(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 mailing list
> [E-MAIL ADDRESS DELETED]
> https://ml.seasar.org/mailman/listinfo/seasar-user


-- 
◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆
金子 雄一  Yuichi Kaneko
◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆


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