Thanks Kevin. Makes sense.

For the record, this is how I have it now:

var reduce = function(v) {
  return v.filter(function(n) { return !n.not_found })
}

db.link({ bucket: "highlights", keep: false })
  .map({name: 'Riak.mapValuesJson'})
  .reduce({source: reduce})
  .run([["user_chapters", id]])()



2010/6/15 Kevin Smith <ksm...@basho.com>:
> Francisco -
>
> You have perfect timing. This same question came up yesterday in #riak.
>
> The core of the issue is Riak runs map functions on the node hosting the 
> relevant data. In the case of a 'not found', there is no hosting node -- the 
> data doesn't exist -- so the map function is never invoked for the missing 
> entry. The 'not found' shows up in the reduce phase because reduce phases 
> execute on the node coordinating the entire map/reduce job. Riak converts 
> link walks into map phases which is why broken links also show up as 'not 
> found' responses being passed to your reduce phase.
>
> Riak.mapValuesJson contains filtering logic since it could be used in either 
> map OR reduce phases. I'd recommend performing 'not found' filtering in your 
> reduce phases since that'll be the first opportunity you have to deal with 
> the missing data.
>
> --Kevin
> On Jun 15, 2010, at 4:30 AM, francisco treacy wrote:
>
>> Hi all,
>>
>> I have a document with some broken links (i.e. that point to a
>> non-existent key), and want to apply a map/reduce there.
>>
>> var map = function(v, k, args) { ejsLog("/tmp/mr", "hello from map");
>> return [{from: "map"}] }
>>
>>  db.link({ bucket: "highlights", keep: false })
>>    .map({source: map})
>>    .run([["user_chapters", id]])()
>>
>> (That is, apply link+map to users_chapters/id)
>>
>> Result: 
>> [{"not_found":{"bucket":"highlights","key":"f542e13e0b5cece1f637be384e685667"}}]
>>
>> Makes sense because that is true. But why don't I get [{from: "map"}],
>> and why is nothing logged?
>>
>> I presume it is just failing at the link phase, which then outputs no
>> keys for the following phases. The "not found" objects should be get
>> rid of at a node level, so I don't think they belong to a reduce
>> phase. Or is that the case?
>>
>> (FWIW i got inspiration from Riak.mapValuesJson which seems to deal
>> with not_founds, but I never actually seem to reach the map phase).
>>
>> What is the recommended approach to gracefully handle broken links? It
>> should be fairly easy to exclude not found results from the resulting
>> map/reduce array.
>>
>> Francisco
>>
>> _______________________________________________
>> riak-users mailing list
>> riak-users@lists.basho.com
>> http://lists.basho.com/mailman/listinfo/riak-users_lists.basho.com
>
>

_______________________________________________
riak-users mailing list
riak-users@lists.basho.com
http://lists.basho.com/mailman/listinfo/riak-users_lists.basho.com

Reply via email to