\Cake\Collection\IteratorMapReduce

Implements a simplistic version of the popular Map-Reduce algorithm. Acts like an iterator for the original passed data after each result has been processed, thus offering a transparent wrapper for results coming from any source.

Summary

Methods
Properties
Constants
__construct()
getIterator()
emitIntermediate()
emit()
No public properties found
No constants found
_execute()
$_intermediate
$_result
$_executed
$_data
$_mapper
$_reducer
$_counter
N/A
No private methods found
No private properties found
N/A

Properties

$_intermediate

$_intermediate : array

Holds the shuffled results that were emitted from the map phase

Type

array

$_result

$_result : array

Holds the results as emitted during the reduce phase

Type

array

$_executed

$_executed : boolean

Whether the Map-Reduce routine has been executed already on the data

Type

boolean

$_data

$_data : \Traversable|null

Holds the original data that needs to be processed

Type

\Traversable|null

$_mapper

$_mapper : callable

A callable that will be executed for each record in the original data

Type

callable

$_reducer

$_reducer : callable|null

A callable that will be executed for each intermediate record emitted during the Map phase

Type

callable|null

$_counter

$_counter : integer

Count of elements emitted during the Reduce phase

Type

integer

Methods

__construct()

__construct(\Traversable  $data, callable  $mapper, callable|null  $reducer = null) 

Constructor

Example:

Separate all unique odd and even numbers in an array

 $data = new \ArrayObject([1, 2, 3, 4, 5, 3]);
 $mapper = function ($value, $key, $mr) {
     $type = ($value % 2 === 0) ? 'even' : 'odd';
     $mr->emitIntermediate($value, $type);
 };

 $reducer = function ($numbers, $type, $mr) {
     $mr->emit(array_unique($numbers), $type);
 };
 $results = new MapReduce($data, $mapper, $reducer);

Previous example will generate the following result:

 ['odd' => [1, 3, 5], 'even' => [2, 4]]

Parameters

\Traversable $data

the original data to be processed

callable $mapper

the mapper callback. This function will receive 3 arguments. The first one is the current value, second the current results key and third is this class instance so you can call the result emitters.

callable|null $reducer

the reducer callback. This function will receive 3 arguments. The first one is the list of values inside a bucket, second one is the name of the bucket that was created during the mapping phase and third one is an instance of this class.

getIterator()

getIterator() : \ArrayIterator

Returns an iterator with the end result of running the Map and Reduce phases on the original data

Returns

\ArrayIterator

emitIntermediate()

emitIntermediate(mixed  $val, string  $bucket) : void

Appends a new record to the bucket labelled with $key, usually as a result of mapping a single record from the original data.

Parameters

mixed $val

The record itself to store in the bucket

string $bucket

the name of the bucket where to put the record

emit()

emit(mixed  $val, string|null  $key = null) : void

Appends a new record to the final list of results and optionally assign a key for this record.

Parameters

mixed $val

The value to be appended to the final list of results

string|null $key

and optional key to assign to the value

_execute()

_execute() : void

Runs the actual Map-Reduce algorithm. This is iterate the original data and call the mapper function for each , then for each intermediate bucket created during the Map phase call the reduce function.

Throws

\LogicException

if emitIntermediate was called but no reducer function was provided