*/
private MapReduceResult linkWalkSecondPhase(final MapReduceResult firstPhaseResult) throws IOException {
try {
@SuppressWarnings("rawtypes") Collection<LinkedList> bkeys = firstPhaseResult.getResult(LinkedList.class);
BucketKeyMapReduce mr = new BucketKeyMapReduce(this);
int stepCnt = 0;
for (LinkedList<List<String>> step : bkeys) {
// TODO find a way to *enforce* order here (custom
// deserializer?)
stepCnt++;
for (List<String> input : step) {
// use the step count as key data so we can aggregate the
// results into the correct steps when they come back
mr.addInput(input.get(0), input.get(1), Integer.toString(stepCnt));
}
}
mr.addReducePhase(new NamedErlangFunction("riak_kv_mapreduce", "reduce_set_union"), false);
mr.addMapPhase(new JSSourceFunction("function(v, keyData) { return [{\"step\": keyData, \"v\": v}]; }"),
true);
return mr.execute();
} catch (ConversionException e) {
throw new IOException(e.getMessage());
} catch (RiakException e) {
throw (IOException) e.getCause();
}