Commit 3e744b73 by Paul Klimov

Mongo Collection "findAll" method removed.

Logging and profiling for Mongo Query added.
parent 1a9d5a11
...@@ -29,10 +29,7 @@ class ActiveQuery extends Query implements ActiveQueryInterface ...@@ -29,10 +29,7 @@ class ActiveQuery extends Query implements ActiveQueryInterface
public function all($db = null) public function all($db = null)
{ {
$cursor = $this->buildCursor($db); $cursor = $this->buildCursor($db);
$rows = []; $rows = $this->fetchRows($cursor);
foreach ($cursor as $row) {
$rows[] = $row;
}
if (!empty($rows)) { if (!empty($rows)) {
$models = $this->createModels($rows); $models = $this->createModels($rows);
if (!empty($this->with)) { if (!empty($this->with)) {
......
...@@ -173,9 +173,12 @@ class Collection extends Object ...@@ -173,9 +173,12 @@ class Collection extends Object
} }
/** /**
* @param array $condition * Returns a cursor for the search results.
* @param array $fields * In order to perform "find" queries use [[Query]] class.
* @return \MongoCursor * @param array $condition query condition
* @param array $fields fields to be selected
* @return \MongoCursor cursor for the search results
* @see Query
*/ */
public function find($condition = [], $fields = []) public function find($condition = [], $fields = [])
{ {
...@@ -183,21 +186,6 @@ class Collection extends Object ...@@ -183,21 +186,6 @@ class Collection extends Object
} }
/** /**
* @param array $condition
* @param array $fields
* @return array
*/
public function findAll($condition = [], $fields = [])
{
$cursor = $this->find($condition, $fields);
$result = [];
foreach ($cursor as $data) {
$result[] = $data;
}
return $result;
}
/**
* Inserts new data into collection. * Inserts new data into collection.
* @param array|object $data data to be inserted. * @param array|object $data data to be inserted.
* @param array $options list of options in format: optionName => optionValue. * @param array $options list of options in format: optionName => optionValue.
......
...@@ -10,6 +10,7 @@ namespace yii\mongo; ...@@ -10,6 +10,7 @@ namespace yii\mongo;
use yii\base\Component; use yii\base\Component;
use yii\db\QueryInterface; use yii\db\QueryInterface;
use yii\db\QueryTrait; use yii\db\QueryTrait;
use yii\helpers\Json;
use Yii; use Yii;
/** /**
...@@ -104,28 +105,57 @@ class Query extends Component implements QueryInterface ...@@ -104,28 +105,57 @@ class Query extends Component implements QueryInterface
} }
/** /**
* Executes the query and returns all results as an array. * @param \MongoCursor $cursor Mongo cursor instance to fetch data from.
* @param Connection $db the Mongo connection used to execute the query. * @param boolean $all whether to fetch all rows or only first one.
* If this parameter is not given, the `mongo` application component will be used. * @param string|callable $indexBy
* @return array the query results. If the query results in nothing, an empty array will be returned. * @throws Exception
* @return array|boolean
*/ */
public function all($db = null) protected function fetchRows(\MongoCursor $cursor, $all = true, $indexBy = null)
{ {
$cursor = $this->buildCursor($db); $token = 'Querying: ' . Json::encode($cursor->info());
Yii::info($token, __METHOD__);
try {
Yii::beginProfile($token, __METHOD__);
$result = []; $result = [];
if ($all) {
foreach ($cursor as $row) { foreach ($cursor as $row) {
if ($this->indexBy !== null) { if ($indexBy !== null) {
if (is_string($this->indexBy)) { if (is_string($indexBy)) {
$key = $row[$this->indexBy]; $key = $row[$indexBy];
} else { } else {
$key = call_user_func($this->indexBy, $row); $key = call_user_func($indexBy, $row);
} }
$result[$key] = $row; $result[$key] = $row;
} else { } else {
$result[] = $row; $result[] = $row;
} }
} }
} else {
if ($cursor->hasNext()) {
$result = $cursor->getNext();
} else {
$result = false;
}
}
Yii::endProfile($token, __METHOD__);
return $result; return $result;
} catch (\Exception $e) {
Yii::endProfile($token, __METHOD__);
throw new Exception($e->getMessage(), (int)$e->getCode(), $e);
}
}
/**
* Executes the query and returns all results as an array.
* @param Connection $db the Mongo connection used to execute the query.
* If this parameter is not given, the `mongo` application component will be used.
* @return array the query results. If the query results in nothing, an empty array will be returned.
*/
public function all($db = null)
{
$cursor = $this->buildCursor($db);
return $this->fetchRows($cursor, true, $this->indexBy);
} }
/** /**
...@@ -138,11 +168,7 @@ class Query extends Component implements QueryInterface ...@@ -138,11 +168,7 @@ class Query extends Component implements QueryInterface
public function one($db = null) public function one($db = null)
{ {
$cursor = $this->buildCursor($db); $cursor = $this->buildCursor($db);
if ($cursor->hasNext()) { return $this->fetchRows($cursor, false);
return $cursor->getNext();
} else {
return false;
}
} }
/** /**
...@@ -151,11 +177,22 @@ class Query extends Component implements QueryInterface ...@@ -151,11 +177,22 @@ class Query extends Component implements QueryInterface
* @param Connection $db the Mongo connection used to execute the query. * @param Connection $db the Mongo connection used to execute the query.
* If this parameter is not given, the `mongo` application component will be used. * If this parameter is not given, the `mongo` application component will be used.
* @return integer number of records * @return integer number of records
* @throws Exception on failure.
*/ */
public function count($q = '*', $db = null) public function count($q = '*', $db = null)
{ {
$cursor = $this->buildCursor($db); $cursor = $this->buildCursor($db);
return $cursor->count(); $token = 'Counting: ' . Json::encode($cursor->info());
Yii::info($token, __METHOD__);
try {
Yii::beginProfile($token, __METHOD__);
$result = $cursor->count();
Yii::endProfile($token, __METHOD__);
return $result;
} catch (\Exception $e) {
Yii::endProfile($token, __METHOD__);
throw new Exception($e->getMessage(), (int)$e->getCode(), $e);
}
} }
/** /**
......
...@@ -45,6 +45,7 @@ class CollectionTest extends MongoTestCase ...@@ -45,6 +45,7 @@ class CollectionTest extends MongoTestCase
/** /**
* @depends testInsert * @depends testInsert
* @depends testFind
*/ */
public function testFindAll() public function testFindAll()
{ {
...@@ -55,7 +56,11 @@ class CollectionTest extends MongoTestCase ...@@ -55,7 +56,11 @@ class CollectionTest extends MongoTestCase
]; ];
$id = $collection->insert($data); $id = $collection->insert($data);
$rows = $collection->findAll(); $cursor = $collection->find();
$rows = [];
foreach ($cursor as $row) {
$rows[] = $row;
}
$this->assertEquals(1, count($rows)); $this->assertEquals(1, count($rows));
$this->assertEquals($id, $rows[0]['_id']); $this->assertEquals($id, $rows[0]['_id']);
} }
...@@ -129,7 +134,7 @@ class CollectionTest extends MongoTestCase ...@@ -129,7 +134,7 @@ class CollectionTest extends MongoTestCase
$count = $collection->remove(['_id' => $id]); $count = $collection->remove(['_id' => $id]);
$this->assertEquals(1, $count); $this->assertEquals(1, $count);
$rows = $collection->findAll(); $rows = $this->findAll($collection);
$this->assertEquals(0, count($rows)); $this->assertEquals(0, count($rows));
} }
...@@ -151,7 +156,7 @@ class CollectionTest extends MongoTestCase ...@@ -151,7 +156,7 @@ class CollectionTest extends MongoTestCase
$count = $collection->update(['_id' => $id], $newData); $count = $collection->update(['_id' => $id], $newData);
$this->assertEquals(1, $count); $this->assertEquals(1, $count);
list($row) = $collection->findAll(); list($row) = $this->findAll($collection);
$this->assertEquals($newData['name'], $row['name']); $this->assertEquals($newData['name'], $row['name']);
} }
...@@ -221,7 +226,7 @@ class CollectionTest extends MongoTestCase ...@@ -221,7 +226,7 @@ class CollectionTest extends MongoTestCase
$this->assertEquals('mapReduceOut', $result); $this->assertEquals('mapReduceOut', $result);
$outputCollection = $this->getConnection()->getCollection($result); $outputCollection = $this->getConnection()->getCollection($result);
$rows = $outputCollection->findAll(); $rows = $this->findAll($outputCollection);
$expectedRows = [ $expectedRows = [
[ [
'_id' => 1, '_id' => 1,
......
...@@ -103,4 +103,21 @@ class MongoTestCase extends TestCase ...@@ -103,4 +103,21 @@ class MongoTestCase extends TestCase
} }
} }
} }
/**
* Finds all records in collection.
* @param \yii\mongo\Collection $collection
* @param array $condition
* @param array $fields
* @return array rows
*/
protected function findAll($collection, $condition = [], $fields = [])
{
$cursor = $collection->find($condition, $fields);
$result = [];
foreach ($cursor as $data) {
$result[] = $data;
}
return $result;
}
} }
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment