Thanks for the tip Russell. I managed to get this done. I have one more question and a suggestion.
- Is the name keyData a misnomer in the mapping function -> function( value, keyData, arg) ? keyData is a String that carries the bucket name. The value object carries more information. value[0].data represents the data itself among other properties that represent user metadata; riak links; indexes; key; etc etc. - If mapValuesJson: function(value, keyData, arg) can take an input argument and use it to add a json property whose value is the riak key, a custom function would not be necessary. It would be a neat little system feature which I take would need amendments to mapred_builtins.js<https://github.com/basho/riak_kv/blob/master/priv/mapred_builtins.js> . - Is riak_kv the repo to make contributions to system built functions ? There are quite a few open pull requests on that repo, so I'm not sure where this change should go. Thanks Deepak Bala On Fri, Sep 14, 2012 at 7:16 PM, Russell Brown <[email protected]> wrote: > > On 14 Sep 2012, at 14:24, Deepak Balasubramanyam wrote: > > > Hi, > > > > I've written a map reduce query on the riak java client like so... > > > > client.mapReduce(BUCKET).addKeyFilter(keyFilter) > > .addLinkPhase(BUCKET, "_", false) > > .addMapPhase(new > NamedJSFunction("Riak.mapValuesJson"), false) > > .addReducePhase(phaseFunction).execute(); > > Collection<MyType> types = result.getResult(MyType.class); > > > > This is the class definition for MyType > > > > public class MyType > > { > > @RiakKey > > private String myKey; > > private String property1; > > private String property2; > > > > /* Getters / Setters go here */ > > } > > > > When the object mapper deserializes the results into Collection<MyType>, > none of the types have the myKey property populated in them. When I > debugged the calls made by riak I realized that the result of the /mapred > call does not contain any key information in the body. It only contains the > value that each key represents. So that explains why the keys are null in > the result. > > The Java client doesn't add the value of the @RiakKey field to the value > stored in riak. > > > > > On the contrary, a link walk in riak returns the Location header for > each multipart form entry in the response (Location: /riak/bucket/key). So > I guess there is at least some way to tweak a client to parse the location > to get the keys, but you lose out on the map-reduce goodness. > > > > Is there some way a map-reduce query can be formed to allow the > resulting type's RiakKey to be populated ? What are my options ? > > A custom Map function may do what you want. Get the Key from the Key Data > passed to the Map function and add it to the JSON value returned. Jackson > should then take care of de-serialising it into your values. > > Cheers > > Russell > > > > > Thanks > > Deepak Bala > > _______________________________________________ > > riak-users mailing list > > [email protected] > > http://lists.basho.com/mailman/listinfo/riak-users_lists.basho.com > >
_______________________________________________ riak-users mailing list [email protected] http://lists.basho.com/mailman/listinfo/riak-users_lists.basho.com
