Masaharu YOSHIOKA
yoshi****@ist*****
2013年 7月 9日 (火) 14:04:34 JST
北大の吉岡と申します。 rroongaを利用しているのですが、UInt8,Uint16を利用した場合に、予想外の 挙動を示しますので、報告いたします。 まず、利用しているソフトウェアのバージョンは以下の通りです。 > ruby -v ruby 1.9.3p429 (2013-05-15) [x86_64-linux] > groonga --version groonga 3.0.4 [linux-gnu,x86_64,utf8,match-escalation-threshold=0,nfkc,mecab,zlib,lzo,epoll] > gem list rroonga *** LOCAL GEMS *** rroonga (3.0.4, 3.0.2) ここで、以下のようなコードを実行した際に、 データの数が多くなった段階で、UInt8,UInt16などの返り値がおかしくなりま す。 具体的には、_idにひきずられているようで、UInt8の場合は、256(2^8)以上、 UInt16の場合は、65536(2^16)以上で、本来の値の範囲以外の値が出力されま す。 #groongaで直接データを見た場合には、適切な値が設定されていることが #確認できています。 IDが 65536 の場合には、Uint8でもUIt16で、共に0を設定しても、同じく、 65536という値が返ることから、一貫して、_idの上位ビットの値が追加されて いるように思われます。 データの数を増やしていないので、何とも言えませんが、もしかすると、 UInt32も2^32個のデータを登録すると、おかしな値を出すのかも知れません。 こちらのソフトウェアのバージョンなどによる問題かもしれませんが、ご確認 のほど、よろしくお願いします。 #!/usr/local/bin/ruby # encoding: utf-8 require 'rubygems' require 'groonga' dbName = ARGV.shift or exit Groonga::Context.default_options = {:encoding => :utf8} Groonga::Database.create(:path => dbName) Groonga::Schema.create_table("test", {:type => :hash} ){|table| table.unsigned_integer8("int8") table.unsigned_integer8("int82") table.unsigned_integer16("int16") table.unsigned_integer32("int32") } testTable = Groonga["test"] (0..70000).each{|i| testTable.add("ABC#{i}", :int8 => i % 256 , :int82 => 1, :int16 => i % 65536, :int32 => i) } testTable.select.each{|elem| puts [elem._key, elem.int8, elem.int8 % 256, elem.int82, elem.int82 % 256, elem.int16, elem.int16 % 65536, elem.int32].join (",") } 北海道大学大学院情報科学研究科コンピュータサイエンス専攻 准教授 〒060-0814 北海道札幌市北区北14条西9丁目 吉岡 真治 e-mail: yoshi****@ist***** URL: http://www-kb.ist.hokudai.ac.jp/~yoshioka/