Matope Ono
matop****@gmail*****
2010年 9月 13日 (月) 19:34:29 JST
お世話になっております、小野マトペです。
引き続きrroongaの利用検証をさせていただいております。
先ほど、append, prependメソッドでvectorカラムに値を追加できない、Intのvectorの場合値が壊れる
という状況に遭遇しました。
これらのメソッドはvectorカラムに対するpush,unshiftを行うメソッドだという認識だったのですが、
それで間違いないでしょうか?
vectorをArrayとして受け取り=で設定すれば問題は起きませんでした。
============再現コード=================================
tweets = Groonga::PatriciaTrie.create( :name => "Tweets", :key_type =>
"UInt32", :persistent => true )
tweets.define_column( "text", "ShortText")
tweets.define_column( "vecText", "ShortText", :type => :vector)
tweets.define_column( "vecInt", "Int64", :type => :vector)
tweets.add(5, :text => "主キーは5です。")
tweets.add(6, :text => "主キーは6です。")
tweets.add(7, :text => "主キーは7です。")
tweets.add(8, :text => "主キーは8です。", :vecInt => [1,2,3,4,5])
tweets.add(20,:text => "主キーは20です。", :vecText => ["文字列","の","ベクター"])
tweets.add(21,:text => "主キーは21です。", :vecText => ["文字列","の","ベクター"])
# 成功する
tweets[5].append("vecText", "1 append on key=5")
# 失敗する
tweets[6].append("vecText", "1 append on key=6")
tweets[6].append("vecText", "2 append on key=6")
# 失敗する
tweets[7].append("vecInt", 1)
tweets[7].append("vecInt", 2)
# 成功する
tweets[8]["vecInt"]= tweets[8]["vecInt"].push 10
tweets[8]["vecInt"]= (tweets[8]["vecInt"].push 10).uniq
# 失敗する
tweets[21].prepend("vecText", "ですよ!".to_s)
p tweets.size
tweets.each{|i|
puts i.attributes
}
============実行結果=================================
:!ruby tmp_rroonga.rb
6
{"id"=>1, "key"=>5, "vecText"=>["1 append on key=5"], "vecInt"=>[],
"text"=>"主キーは5です。"}
{"id"=>2, "key"=>6, "vecText"=>["2 append on key=6"], "vecInt"=>[],
"text"=>"主キーは6です。"}
{"id"=>3, "key"=>7, "vecText"=>[], "vecInt"=>["\x02\x00\x00\x00"],
"text"=>"主キーは7です。"}
{"id"=>4, "key"=>8, "vecText"=>[], "vecInt"=>[1, 2, 3, 4, 5, 10],
"text"=>"主キーは8です。"}
{"id"=>5, "key"=>20, "vecText"=>["文字列", "の", "ベクター"], "vecInt"=>[],
"text"=>"主キーは20です。"}
{"id"=>6, "key"=>21,
"vecText"=>["\xE3\x81\xA7\xE3\x81\x99\xE3\x82\x88\xEF\xBC\x81"],
"vecInt"=>[], "text"=>"主キーは21です。"}