| // Step 1 |
| method map1 (events) |
| for all x in events do |
| emit(x.EventId, x.Stream) |
| // Step 2 |
| method reduce1 ( eventId, Stream [s1, s2, ...]) |
| EventStreams <= new AssociativeArray |
| for all stream in [s1, s2, ...] do |
| EventStreams <= stream |
| emit (EventId, EventStreams) |
| // Step 3 |
| AllStreamsList <= new List(s1, s2, .., sn) |
| method map2 (EventId, EventStreams) |
| numStreams = length(AllStreamsList) |
| for i in 1 to numStreams do |
| for j in i+1 to numStreams do |
| streamI <= AllStreamsList[i] |
| streamJ <= AllStreamsList[j] |
| isInI <= true if EventStreams{streamI} exists |
| isInJ <= true if EventStreams{streamJ} exists |
| if isInI or isInJ do |
| emit (pair(streamI, streamJ), pair(isInI, isInJ)) |
| // Step 4 |
| method reduce2 (Pair(StreamI, StreamJ), Pair(isInI, isInJ) [p1, p2, ...]) |
| events_stream1_only <= 0 |
| events_stream2_only <= 0 |
| events_both_streams <= 0 |
| ratio <= 0 |
| for all p(i, j) in [p1, p2, ...] do |
| case (true, false) : events_stream1_only <= events_stream1_only + 1 |
| case (false, true) : events_stream2_only <= events_stream2_only + 1 |
| case (true, true) : events_both_streams <= events_both + 1 |
| ratio <= events_both_streams / |
| (events_stream1_only + events_stream2_only + events_both_streams) |
| emit (pair(StreamI, StreamJ), events_stream1_only, |
| events_stream2_only, events_both_streams, ratio)) |