<div>I'm experimenting with Riak by trying to port a simple a/b testing framework that's currently SQL backed. Since I'm using Ripple/riak-client my code below are in Ruby/JS.</div><div><br></div><div>The domain model is fairly simple. I have visitors, which get created for any user who hits the site, visitors see alternatives (currently these are ActiveRecord objects) and are tracked by creating experiences (the joining of a alternative ID and a visitor). Finally, as visitors do things we track events, which are distinguished from one another by their classes.</div>

<div><br></div><div>Here is a simplified version of the model code:</div><div><br></div><div><div>class Riak::Visitor</div><div>  include Ripple::Document</div><div>  many :events,      :class_name => "Riak::Event"</div>

<div>end</div></div><div><br></div><div><div>class Riak::Event</div><div>  include Ripple::Document</div><div>end</div></div><div><br></div><div><div>class Riak::ShareEvent < Riak::Event</div><div>  include Ripple::Document</div>

<div>end</div></div><div><br></div><div><div>class Riak::Experience</div><div>  include Ripple::Document</div><div>  one :visitor, :class_name => "Riak::Visitor"</div><div>  property :alternative_id, Integer, :presence => true</div>

<div>end</div></div><div><br></div><div>My problem is that I'd like to collect the set of visitors who have shared, or more generally I'd like to return a set of visitors after narrowing down the list by linking in specific kind of events. Well, my real problem is that I still don't quite grok MapReduce, but this is what I'm trying to accomplish.</div>

<div><br></div><div>The riak-client code is included below (see visitors_who_shared). It returns a list of all visitors found in the map phase where keep is true. This isn't surprising, but I'm not sure how to get the visitors if I don't “keep” them in that phase.</div>

<meta charset="utf-8"><div><br></div><div>Thanks in advance for any help. I'm also happy RTFM and would appreciate specific suggestions for doing nontrivial MR jobs in JavaScript.</div><div><br></div><div><div>class Riak::Alternative #not a riak doc</div>

<div>  attr_accessor :ar_id</div><div><br></div><div>  def initialize(ar_id)</div><div>    self.ar_id = ar_id</div><div>  end</div><div><br></div><div>  def visitors_who_shared</div><div>    Riak::MapReduce.new(Ripple.client).</div>

<div><meta charset="utf-8">            add("riak_experiences").</div><meta charset="utf-8"><div>            map(map_filter_by_alternative).</div><div>            link(:bucket => 'riak_visitors', :keep => true).</div>

<div>            link(:bucket => 'riak_events').</div><div>            map(<meta charset="utf-8">"function(v){ return [[v.bucket, v.key]]; }").</div><div>            map(map_share_events).</div><div>
            run</div>
<div>  end</div><div><br></div><div>  def map_share_events</div><div>    f = <<FUNCTION</div><div>function(v){</div><div>  var data = JSON.parse(v.values[0].data);</div><div>  if(data._type != "Riak::ShareEvent" ){</div>

<div>    return [];</div><div>  }else{</div><div>    return [[v.bucket, v.key]];</div><div>  }</div><div>}</div><div>FUNCTION</div><div>  end</div><div><br></div><div>  def map_filter_by_alternative</div><div>    f = <<FUNCTION</div>

<div>function(v){</div><div>  var data = JSON.parse(v.values[0].data);</div><div>  if(data.alternative_id !=  #{self.ar_id} ){</div><div>    return [];</div><div>  }else{</div><div>    return [[v.bucket, v.key]];</div><div>

  }</div><div>}</div><div>FUNCTION</div><div>  end</div><div>end</div></div><div><br></div><div>Riak::Alternative.new(1).visitors_who_shared</div><meta charset="utf-8"><div><br></div><div><br></div>