Skip to main content

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

以前のエントリーで挙げた下記の問題点は、黙っていても解決しない感じなので行動を起こすこととにした。

  • 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 のプルリクが解決したら考えることにする。