Browse Source

Unit test for "yii\mongo\Collection::mapReduce()" added.

tags/2.0.0-beta
Paul Klimov 11 years ago
parent
commit
c294e033b3
  1. 17
      extensions/mongo/Collection.php
  2. 27
      tests/unit/extensions/mongo/CollectionTest.php

17
extensions/mongo/Collection.php

@ -216,7 +216,9 @@ class Collection extends Object
/** /**
* Performs aggregation using Mongo Map Reduce mechanism. * Performs aggregation using Mongo Map Reduce mechanism.
* @param mixed $keys * @param mixed $keys fields to group by. If an array or non-code object is passed,
* it will be the key used to group results. If instance of [[\MongoCode]] passed,
* it will be treated as a function that returns the key to group by.
* @param array $initial Initial value of the aggregation counter object. * @param array $initial Initial value of the aggregation counter object.
* @param \MongoCode|string $reduce function that takes two arguments (the current * @param \MongoCode|string $reduce function that takes two arguments (the current
* document and the aggregation to this point) and does the aggregation. * document and the aggregation to this point) and does the aggregation.
@ -225,6 +227,7 @@ class Collection extends Object
* - condition - criteria for including a document in the aggregation. * - condition - criteria for including a document in the aggregation.
* - finalize - function called once per unique key that takes the final output of the reduce function. * - finalize - function called once per unique key that takes the final output of the reduce function.
* @return array the result of the aggregation. * @return array the result of the aggregation.
* @see http://docs.mongodb.org/manual/core/map-reduce/
*/ */
public function mapReduce($keys, $initial, $reduce, $options = []) public function mapReduce($keys, $initial, $reduce, $options = [])
{ {
@ -239,7 +242,17 @@ class Collection extends Object
$options['finalize'] = new \MongoCode((string)$options['finalize']); $options['finalize'] = new \MongoCode((string)$options['finalize']);
} }
} }
return $this->mongoCollection->group($keys, $initial, $reduce, $options); // Avoid possible E_DEPRECATED for $options:
if (empty($options)) {
$result = $this->mongoCollection->group($keys, $initial, $reduce);
} else {
$result = $this->mongoCollection->group($keys, $initial, $reduce, $options);
}
if (array_key_exists('retval', $result)) {
return $result['retval'];
} else {
return [];
}
} }
/** /**

27
tests/unit/extensions/mongo/CollectionTest.php

@ -145,4 +145,31 @@ class CollectionTest extends MongoTestCase
list($row) = $collection->findAll(); list($row) = $collection->findAll();
$this->assertEquals($newData['name'], $row['name']); $this->assertEquals($newData['name'], $row['name']);
} }
/**
* @depends testBatchInsert
*/
public function testMapReduce()
{
$collection = $this->getConnection()->getCollection('customer');
$rows = [
[
'name' => 'customer 1',
'address' => 'customer 1 address',
],
[
'name' => 'customer 2',
'address' => 'customer 2 address',
],
];
$collection->batchInsert($rows);
$keys = ['address' => 1];
$initial = ['items' => []];
$reduce = "function (obj, prev) { prev.items.push(obj.name); }";
$result = $collection->mapReduce($keys, $initial, $reduce);
$this->assertEquals(2, count($result));
$this->assertNotEmpty($result[0]['address']);
$this->assertNotEmpty($result[0]['items']);
}
} }
Loading…
Cancel
Save