[CONTAINER-102] S2JDBC で,AutoSelect の where() で OR を使うための ComplexWhere クラスを追加しました. Created: 2007-10-25  Updated: 2007-10-30  Resolved: 2007-10-30

Status: Resolved
Project: S2Container
Component/s: S2-Tiger
Affects Version/s: 2.4.18-rc1
Fix Version/s: 2.4.18-rc2

Type: New Feature Priority: Major
Reporter: koichik Assignee: koichik
Resolution: Fixed Votes: 0
Labels: None


 Description   

S2JDBC で,AutoSelect の where() に or を使えるようにする.



 Comments   
Comment by koichik [ 2007-10-30 ]

対応しました.
http://svn.seasar.org/browse/?view=rev&root=s2container&revision=3070

Comment by koichik [ 2007-10-30 ]

SimpleWhere はシンプルなままの方がいいという意見もあるので or() および and(Where) は SimpleWhere から削除し,新たに ComplexWhere というクラスを追加します.

Comment by koichik [ 2007-10-26 ]

コメントのように修正しました.
http://svn.seasar.org/browse/?view=rev&root=s2container&revision=3019

Comment by koichik [ 2007-10-26 ]

SimpleWhere に and(Where) メソッドを追加して,

where(new SimpleWhere()
  .eq("a", 1)
  .eq("b", 2)
  .and(new SimpleWhere().eq("c", 3).or().eq("d", 4))
  .eq("f", 5))

のようにしてみようかと.
これで

a = ? and b = ? and (c =? or d = ?) and f = ?

になるという具合.

少し流れが悪い気もするけど,あまり多用して欲しいものではないのでまぁいいのかな,と.
or が一つ入っただけで SimpleWhere が使えなくて,where(String, Object...) を使うか SQL ファイルを使わなくてはいけないと落差が激しいので,ギャップを埋めるくらいの位置づけということで.

Comment by koichik [ 2007-10-25 ]

でもでも,これだと a=? and (b=? or c=?) みたいなのが表現できない...
また再オープンするかも.
結局,構文はツリーなんだからフラットなメソッドチェーンでは限度があるので,どういう呼び出しを流れるようにするかの割り切りが必要かも.
上の修正で表現できるのは (a=? and b=?) or (c=? and d=?) みたいな形.
a=? and (b=? or c=?) は (a=? and b=?) or (a=? and c=?) と等価だから表現できないわけじゃないけど... カッコ悪い.

Comment by koichik [ 2007-10-25 ]

上のコメントのように修正しました.
http://svn.seasar.org/browse/?view=rev&root=s2container&revision=3016

Comment by higa [ 2007-10-25 ]

thx.
流れるようなインターフェースは、まだ確立されていない分野なので、
いろいろ試行錯誤しながら、最適解をさぐっていきましょ。

Comment by koichik [ 2007-10-25 ]

http://d.hatena.ne.jp/higayasuo/20071025#1193319054
を読んで

new Or(new SimpleWhere()...).or(new SimpleWhere()...)

は流れないのでインタフェースを再考.

new SimpleWhere().eq(...).or().eq(...)

にしてみます.
or() が呼び出されるとそれまでに追加された条件をひとまとめする方向で.

Comment by koichik [ 2007-10-25 ]

対応しました.
http://svn.seasar.org/browse/?view=rev&root=s2container&revision=3014

Or クラスを追加しました.以下のように使えます.

jdbcManager
  .from(Employee.class)
  .where(new Or(new SimpleWhere().eq("name", "foo")).or(new SimpleWhere().eq("name", "bar"))
  .getResultList();

クラス名が微妙かも.SimpleWhere と不揃いかも.
でもこれくらい短い方が流れを妨げなくていいかなと.

Generated at Fri Apr 26 14:46:17 JST 2024 using Jira 9.15.0#9150000-sha1:9ead8528714127d8cfabf2446010d7e62c0a195c.