Riak Ruby Client の最新バージョンとなる 2.2.0 がリリースされていた。
リリースノートによると、新機能は下記の通りである。
- Object-oriented Riak Search (Yokozuna) API.
- Object-oriented Bucket Properties API.
- Bucket type properties are readable.
- Bucket-typed buckets without properties expose properties of bucket type.
- An interface to get a preflist for Riak KV objects has been added.
riak-ruby-client/RELEASE_NOTES.md at master · basho/riak-ruby-client · GitHub
個人的に注目したのは下記の点である。
- バケットタイプの指定方法が便利になった
- Riak Search (Yokozuna) API がいい感じになった
バケットタイプの指定方法が便利になった
これまではデータの保存や取得時にバケットタイプを指定する必要があった。
coffees = client.bucket('coffees') chapadao = coffees.new('chapadao') chapadao.data = 'Chapadao de Ferro' chapadao.store(type: 'beverages')
2.2.0 では Riak::BucketType
クラスと Riak::BucketTyped::Bucket
クラスが追加されたため、以下のように指定することができるようになった。
beverages = client.bucket_type('beverages') coffees = beverages.bucket('coffees') chapadao = coffees.new('chapadao') chapadao.data = 'Chapadao de Ferro' chapadao.store
データを保存や取得するたびにバケットタイプを指定するのは面倒に感じていたので、このように指定できるようになったのはうれしい。
Riak Search (Yokozuna) API がいい感じになった
Riak Search (Yokozuna) API もこれまでのバージョンと比較していい感じになっていると思う。また、検索結果からデータタイプのオブジェクトを取得したい場合は、下記のようにする必要があった。
client.search('artists', '*:*')['docs'].map { |doc| Riak::Crdt::Map.new(bucket, doc['_yz_rk']) } results.first => #<Riak::Crdt::Map bucket_type=maps, bucket=artists, key=MsKeaqM5C3AeXfKSghymB77X5VC, counters=#<Riak::Crdt::TypedCollection contains=Riak::Crdt::InnerCounter, parent=#<Riak::Crdt::Map maps/artists/MsKeaqM5C3AeXfKSghymB77X5VC>, contents={}>, flags=#<Riak::Crdt::TypedCollection contains=Riak::Crdt::InnerFlag, parent=#<Riak::Crdt::Map maps/artists/MsKeaqM5C3AeXfKSghymB77X5VC>, contents={}>, maps=#<Riak::Crdt::TypedCollection contains=Riak::Crdt::InnerMap, parent=#<Riak::Crdt::Map maps/artists/MsKeaqM5C3AeXfKSghymB77X5VC>, contents={}>, registers=#<Riak::Crdt::TypedCollection contains=Riak::Crdt::InnerRegister, parent=#<Riak::Crdt::Map maps/artists/MsKeaqM5C3AeXfKSghymB77X5VC>, contents={"description"=> "T-SQUARE\xEF\xBC\x88\xE3\x83\x86\xE3\x82\xA3\xE3\x83\xBC\xE3\x83\xBB\xE3\x82\xB9\xE3\x82\xAF\xE3\x82\xA7\xE3\x82\xA2\xEF\xBC\x89\xE3\x81\xAF\xE3\x80\x81\xE6\x97\xA5\xE6\x9C\xAC\xE3\x81\xAE\xE3\x82\xA4\xE3\x83\xB3\xE3\x82\xB9\xE3\x83\x88\xE3\x82\xA5\xE3\x83\xA1\xE3\x83\xB3\xE3\x82\xBF\xE3\x83\xAB\xE3\x83\x90\xE3\x83\xB3\xE3\x83\x89\xE3\x80\x821988\xE5\xB9\xB4\xE3\x81\xBE\xE3\x81\xA7\xE3\x81\xAF\xE3\x80\x81THE SQUARE\xEF\xBC\x88\xE3\x82\xB6\xE3\x83\xBB\xE3\x82\xB9\xE3\x82\xAF\xE3\x82\xA7\xE3\x82\xA2\xEF\xBC\x89\xE5\x90\x8D\xE7\xBE\xA9\xE3\x81\xA7\xE6\xB4\xBB\xE5\x8B\x95\xE3\x81\x97\xE3\x81\xA6\xE3\x81\x84\xE3\x81\x9F\xE3\x80\x82\xE9\x80\x9A\xE7\xA7\xB0\xE3\x81\xAF \xE3\x82\xB9\xE3\x82\xAF\xE3\x82\xA7\xE3\x82\xA2\xE3\x80\x82", "name"=>"T-SQUARE"}>, sets=#<Riak::Crdt::TypedCollection contains=Riak::Crdt::InnerSet, parent=#<Riak::Crdt::Map maps/artists/MsKeaqM5C3AeXfKSghymB77X5VC>, contents={}>>
2.2.0 ではデータタイプのオブジェクトを透過的に取得することが出来るようになっている。
query = Riak::Search::Query.new(client, index, '*:*') results = query.results results.first => #<Riak::Crdt::Map bucket_type=maps, bucket=artists, key=MsKeaqM5C3AeXfKSghymB77X5VC, counters=#<Riak::Crdt::TypedCollection contains=Riak::Crdt::InnerCounter, parent=#<Riak::Crdt::Map maps/artists/MsKeaqM5C3AeXfKSghymB77X5VC>, contents={}>, flags=#<Riak::Crdt::TypedCollection contains=Riak::Crdt::InnerFlag, parent=#<Riak::Crdt::Map maps/artists/MsKeaqM5C3AeXfKSghymB77X5VC>, contents={}>, maps=#<Riak::Crdt::TypedCollection contains=Riak::Crdt::InnerMap, parent=#<Riak::Crdt::Map maps/artists/MsKeaqM5C3AeXfKSghymB77X5VC>, contents={}>, registers=#<Riak::Crdt::TypedCollection contains=Riak::Crdt::InnerRegister, parent=#<Riak::Crdt::Map maps/artists/MsKeaqM5C3AeXfKSghymB77X5VC>, contents={"description"=> "T-SQUARE\xEF\xBC\x88\xE3\x83\x86\xE3\x82\xA3\xE3\x83\xBC\xE3\x83\xBB\xE3\x82\xB9\xE3\x82\xAF\xE3\x82\xA7\xE3\x82\xA2\xEF\xBC\x89\xE3\x81\xAF\xE3\x80\x81\xE6\x97\xA5\xE6\x9C\xAC\xE3\x81\xAE\xE3\x82\xA4\xE3\x83\xB3\xE3\x82\xB9\xE3\x83\x88\xE3\x82\xA5\xE3\x83\xA1\xE3\x83\xB3\xE3\x82\xBF\xE3\x83\xAB\xE3\x83\x90\xE3\x83\xB3\xE3\x83\x89\xE3\x80\x821988\xE5\xB9\xB4\xE3\x81\xBE\xE3\x81\xA7\xE3\x81\xAF\xE3\x80\x81THE SQUARE\xEF\xBC\x88\xE3\x82\xB6\xE3\x83\xBB\xE3\x82\xB9\xE3\x82\xAF\xE3\x82\xA7\xE3\x82\xA2\xEF\xBC\x89\xE5\x90\x8D\xE7\xBE\xA9\xE3\x81\xA7\xE6\xB4\xBB\xE5\x8B\x95\xE3\x81\x97\xE3\x81\xA6\xE3\x81\x84\xE3\x81\x9F\xE3\x80\x82\xE9\x80\x9A\xE7\xA7\xB0\xE3\x81\xAF \xE3\x82\xB9\xE3\x82\xAF\xE3\x82\xA7\xE3\x82\xA2\xE3\x80\x82", "name"=>"T-SQUARE"}>, sets=#<Riak::Crdt::TypedCollection contains=Riak::Crdt::InnerSet, parent=#<Riak::Crdt::Map maps/artists/MsKeaqM5C3AeXfKSghymB77X5VC>, contents={}>>