Riak Ruby Client における MapReduce の問題点と対応方法 #2

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 で指定されている moduleriak_search から yokozuna に変更すればいいんだけど、後方互換性を考えると変更していいのか分からない状態である。Secondary Indexes のプルリクが解決したら考えることにする。