Riak Ruby Client における MapReduce の問題点と対応方法 - blog.holidayworking.org で挙げた下記の問題点は、黙っていても解決しない感じなので行動を起こすこととにした。
- Secondary Indexes でバケットタイプを指定することができない
- Riak Search (Yokozuna) を使うことができない
Secondary Indexes でバケットタイプを指定することができない
master ブランチで Riak::BucketTyped::Bucket クラスが実装されて、バケットタイプを指定されたバケットと指定されていないバケットの判別が簡単にできるようになったので、Riak::MapReduce#index を下記のように修正することにした。
def index(bucket, index, query) if bucket.is_a? Bucket bucket = bucket.needs_type? ? [maybe_escape(bucket.type.name), maybe_escape(bucket.name)] : maybe_escape(bucket.name) else bucket = maybe_escape(bucket) end case query when String, Fixnum @inputs = {:bucket => bucket, :index => index, :key => query} when Range raise ArgumentError, t('invalid_index_query', :value => query.inspect) unless String === query.begin || Integer === query.begin @inputs = {:bucket => bucket, :index => index, :start => query.begin, :end => query.end} else raise ArgumentError, t('invalid_index_query', :value => query.inspect) end self end
この修正を適用すると、下記のような感じになる。
bucket = client.bucket_type('yokozuna').bucket('my_bucket') map_reduce = Riak::MapReduce.new(client) map_reduce.index(bucket, 'time_int', Time.now.utc.beginning_of_day.to_i..Time.now.utc.end_of_day.to_i) => #<Riak::MapReduce:0x007f89e43246a8 @client=#<Riak::Client [#<Node 127.0.0.1:17017>]>, @inputs={:bucket=>["yokozuna", "my_bucket"], :index=>"time_int", :start=>1432425600, :end=>1432511999}, @query=[]>
プルリクを作成済みなので、あとは反応を待つのみである。
Riak Search (Yokozuna) を使うことができない
Riak::MapReduce#search で指定されている module
を riak_search
から yokozuna
に変更すればいいんだけど、後方互換性を考えると変更していいのか分からない状態である。Secondary Indexes のプルリクが解決したら考えることにする。