カスタム検索

2008年10月20日月曜日

どう書く?

どう書くネタで盛り上がったので、更にのってみました。

ものすごいハイウエスト日記

短くするのは得意じゃないんで、Groovyっぽい感じで


// 各行を処理するクロージャー
def changeLine1={ line,val ->
return line[2]
}
def changeLine2={ line,val ->
return line[1]
}
def add={line,val ->
return val.isNumber() ? val.toInteger()+1 : val
}

// CSV読み込み&変換
def convClo=["",changeLine1,changeLine2,add]
def ret=[]
def headers
new File("test.csv").splitEachLine("\t"){ line ->
if(!headers) headers = line
def lineData=[]
line.eachWithIndex { val,idx ->
lineData << (convClo[idx] ? convClo[idx].call(line,val) : val)
}
ret << lineData
}

// ソート関係
def sort="ID" // SortField
def order="ASC" // ASC | DESC
def headerIdx=0
headers.eachWithIndex{ val,idx ->
if(val==sort) headerIdx=idx
}

// 出力
println ret.remove(0).join("\t")
ret=ret.sort{it[headerIdx].isNumber() ? it[headerIdx].toInteger() : it[headerIdx]}
if(order.equalsIgnoreCase("DESC")) ret=ret.reverse()
ret.each{ println it.join("\t") }


後で増やしたり差し替えたり出来るように、クロージャーでデータの処理をわけてます。
(でもchangeLine1とchangeLine2は統合されるべきだよなぁ・・・)
ソートもフィールド名と ASC | DESC 与えて結果が変えられるようになってます。

と、思ったらもう答えが出ているわけで。

2008年10月19日日曜日

オデッセイ納車!



はい、嘘です。

試乗にいってまいりました。
正直雑誌で初めて見た時は「微妙?」と思ったんですが、実際に見たら以外に良いですね。
内装に関してはちょっと物足りない感がありましたが、走りはさすがHONDAといった感じです。
1-2速が低速重視になったらしくて、5ATなのにもの凄くスムーズに力強い加速でした、もうCVTいらないんじゃないかと・・・

と、久しぶりのブログが車だけではあれなんで、Grailsネタ

・2つのデータソースを使う

旧システムや、他システムとの連携で2つのDBへ接続したい時があると思います。
大規模なものであれば、連携用のGrailsアプリを用意して、Webサービスで連携といったほうが確実なのですが、
ちょっと使いたいだけの場合には以下の方法もありかと思います。

GrailsはSpringFrameworkを使っているので、SpringのbeanとしてDatasourceを注入してやればOKです。

grails-app/conf/spring/resources.groovy に以下のような記述をします。


beans = {
def properties = {
def driver = "jdbc.driver.url"
driverClassName = driver
url = "jdbc.url"
username = "user"
password = "pass"
}

def otherDataSource= otherDataSource(BasicDataSource, properties)
otherDataSource.destroyMethod = "close"
}


これで otherDataSource として別のBasicDataSourceがbeanとして注入されました。

これをControllerやServiceなどに注入して使います。


class OtherDataSourceService {
boolean transactional = true
def otherDataSource // これで注入されます。

def test() {
def conn = otherDataSource.getConnection()
def stmt = conn.prepareStatement("SELECT * FROM Book")
def result = stmt.executeQuery()

}
}


これで ResultSet が返ってくるので、これを煮るなり焼くなりしちゃいましょう。
もちろん UPDATE や INSERT も使えます。
これだけではGORMには参加出来ませんので、ドメインと連携したりしたいのであればもっと深い所までいかないといけませんが、
そこまでいくのであれば前述したように、連携アプリを用意してしまったほうが良いと思います :)