From 99a528fac3c7514254cce0f131768a19a60f5c8d Mon Sep 17 00:00:00 2001 From: Anton Grebnev Date: Wed, 18 Jan 2012 23:30:34 +0400 Subject: [PATCH 1/2] added butchInsert to mongo model --- model/MongoDbCommand.php | 16 ++++++++++---- model/MongoDriver.php | 5 +++-- model/MongoModel.php | 13 ++++++++---- tests/model/MongoDbCommandTest.php | 43 ++++++++++++++++++++++++++++++++++++++ tests/model/MongoDriverTest.php | 37 +++++++++++++++++++++++++------- tests/model/MongoModelTest.php | 22 ++++++++++++++++++- 6 files changed, 118 insertions(+), 18 deletions(-) diff --git a/model/MongoDbCommand.php b/model/MongoDbCommand.php index 2f2c095..8441242 100644 --- a/model/MongoDbCommand.php +++ b/model/MongoDbCommand.php @@ -121,10 +121,16 @@ class InsertMongoCommand extends MongoDbCommand protected $insertId = false; + protected $multiple = false; + protected function concreteExecute() { - $result = $this->collection->insert($this->data, array('safe' => $this->safe)); - $this->insertId = $this->data['_id']; + if (!$this->multiple) { + $result = $this->collection->insert($this->data, array('safe' => $this->safe)); + $this->insertId = $this->data['_id']; + } else { + $result = $this->collection->batchInsert($this->data, array('safe' => $this->safe)); + } return $result; } @@ -150,6 +156,8 @@ class InsertMongoCommand extends MongoDbCommand var_dump($this->data); $data = ob_get_clean(); $result .= 'Data: ' . $data . PHP_EOL; + $mult = $this->multiple ? 'TRUE' : 'FALSE'; + $result .= 'Bulk insert: ' . $mult . PHP_EOL; $safe = $this->safe ? 'TRUE' : 'FALSE'; $result .= 'Safe operation: ' . $safe . PHP_EOL; return $result; @@ -174,13 +182,13 @@ class UpdateMongoCommand extends MongoDbCommand protected function concreteExecute() { return $this->collection->update($this->condition, $this->data, - array('multiple' => $this->multiple, 'upsert' => $this->upsert, 'safe' => $this->safe)); + array('multiple' => $this->multiple, 'upsert' => $this->upsert, 'safe' => $this->safe)); } protected function checkParams() { if (isset($this->collection) && isset($this->condition) && isset($this->data) && - isset($this->upsert) && isset($this->safe) + isset($this->upsert) && isset($this->safe) ) { return true; } else { diff --git a/model/MongoDriver.php b/model/MongoDriver.php index 8efd68b..a6c4ad6 100644 --- a/model/MongoDriver.php +++ b/model/MongoDriver.php @@ -77,12 +77,13 @@ class MongoDriver extends NoSqlDbDriver return $this->query($command, $params); } - public function insert($collection, $data, $safe = true) + public function insert($collection, $data, $multiple = false, $safe = true) { $command = MongoCommandBuilder::factory(MongoCommandBuilder::INSERT, $this->getCollection($collection)); $params = array( 'data' => $data, - 'safe' => $safe + 'safe' => $safe, + 'multiple' => $multiple ); $result = $this->query($command, $params); $this->last_insert_id = $result->getInsertId(); diff --git a/model/MongoModel.php b/model/MongoModel.php index f26c582..6bf7093 100644 --- a/model/MongoModel.php +++ b/model/MongoModel.php @@ -32,18 +32,23 @@ abstract class MongoModel extends Model public function get($id) { - if($this->useMongoId) { - if(! $id instanceof MongoId) { + if ($this->useMongoId) { + if (!$id instanceof MongoId) { $id = new MongoId($id); } } return $this->db->get($this->table(), array('_id' => $id))->fetch(); } + public function batchInsert($data) + { + return $this->db->insert($this->table(), $data, true); + } + public function delete($id) { - if($this->useMongoId) { - if(! $id instanceof MongoId) { + if ($this->useMongoId) { + if (!$id instanceof MongoId) { $id = new MongoId($id); } } diff --git a/tests/model/MongoDbCommandTest.php b/tests/model/MongoDbCommandTest.php index 8302b42..6adf834 100644 --- a/tests/model/MongoDbCommandTest.php +++ b/tests/model/MongoDbCommandTest.php @@ -132,6 +132,40 @@ class MongoDbCommandTest extends PHPUnit_Framework_TestCase /** * @group Mongo */ + public function testInsertCommandMultipleObjects() + { + $cmd = MongoCommandBuilder::factory(MongoCommandBuilder::INSERT, $this->collection); + + $data = array( + array('name' => 'first object'), + array('name' => 'second object'), + array('name' => 'equal object'), + array('name' => 'equal object') + ); + $cmd + ->bindParam('data', $data) + ->bindParam('multiple', true) + ->bindParam('safe', true); + + $this->assertFalse($cmd->getInsertId()); + + $this->assertArrayHasKey('n', $cmd->execute()); + + $cmd = MongoCommandBuilder::factory(MongoCommandBuilder::FIND, $this->collection); + $cmd->bindParam('condition', array('name' => 'first object'))->bindParam('fields', array()); + $result = $cmd->execute(); + $this->assertEquals(1, $result->count()); + $cmd->bindParam('condition', array('name' => 'second object'))->bindParam('fields', array()); + $result = $cmd->execute(); + $this->assertEquals(1, $result->count()); + $cmd->bindParam('condition', array('name' => 'equal object'))->bindParam('fields', array()); + $result = $cmd->execute(); + $this->assertEquals(2, $result->count()); + } + + /** + * @group Mongo + */ public function testInsertCommandNotAllParamsBinded() { $cmd = MongoCommandBuilder::factory(MongoCommandBuilder::INSERT, $this->collection); @@ -277,6 +311,15 @@ class MongoDbCommandTest extends PHPUnit_Framework_TestCase ->bindParam('data', array('name' => 'insert')) ->bindParam('safe', true); $this->assertStringStartsWith('Collection: ', $cmd->__toString()); + $this->assertContains('Bulk insert: FALSE', $cmd->__toString()); + + $cmd = MongoCommandBuilder::factory(MongoCommandBuilder::INSERT, $this->collection); + $this->assertSame('Command properties not set', $cmd->__toString()); + $cmd + ->bindParam('data', array('name' => 'insert')) + ->bindParam('multiple', true) + ->bindParam('safe', true); + $this->assertContains('Bulk insert: TRUE', $cmd->__toString()); $cmd = MongoCommandBuilder::factory(MongoCommandBuilder::FIND, $this->collection); $this->assertSame('Command properties not set', $cmd->__toString()); diff --git a/tests/model/MongoDriverTest.php b/tests/model/MongoDriverTest.php index b673d4f..fe90534 100644 --- a/tests/model/MongoDriverTest.php +++ b/tests/model/MongoDriverTest.php @@ -67,8 +67,8 @@ class MongoDriverTest extends PHPUnit_Framework_TestCase $collection = 'items'; $db->dropCollection($collection); $collection = $db->selectCollection($collection); - foreach($data as $document) { - $collection->insert($document); + foreach ($data as $document) { + $collection->insert($document); } } @@ -117,7 +117,7 @@ class MongoDriverTest extends PHPUnit_Framework_TestCase if (!defined('DEBUG')) { define('DEBUG', false); } - + $mongo = new MongoDriver($this->conf); $this->assertEquals(1, $mongo->find('items', array('name' => 'bread'))->numRows()); $this->assertEquals(2, $mongo->find('items', array('name' => 'eggs'))->numRows()); @@ -131,7 +131,7 @@ class MongoDriverTest extends PHPUnit_Framework_TestCase $this->assertEquals(3, $mongo->find('items', array('price' => array('$lt' => 3.5)))->numRows()); $data = $mongo->find('items', array('price' => array('$lt' => 3.5))); $count = 0; - while($row = $data->fetch(Db::FETCH_ASSOC)) { + while ($row = $data->fetch(Db::FETCH_ASSOC)) { $count++; $this->assertLessThan(3.5, $row['price']); } @@ -173,7 +173,7 @@ class MongoDriverTest extends PHPUnit_Framework_TestCase $data->order(array('name' => -1)); $data->skip(3); $data->limit(1); - while($row = $data->fetch()) { + while ($row = $data->fetch()) { $this->assertEquals('fdsbssc', $row->name); } } @@ -252,12 +252,35 @@ class MongoDriverTest extends PHPUnit_Framework_TestCase * @runInSeparateProcess * @group Mongo */ + public function testBatchInsert() + { + if (!defined('DEBUG')) { + define('DEBUG', false); + } + + $data = array( + array('name' => 'first object'), + array('name' => 'second object'), + array('name' => 'equal object'), + array('name' => 'equal object') + ); + $mongo = new MongoDriver($this->conf); + $mongo->insert('items', $data, true); + $this->assertEquals(1, $mongo->find('items', array('name' => 'first object'))->numRows()); + $this->assertEquals(1, $mongo->find('items', array('name' => 'second object'))->numRows()); + $this->assertEquals(2, $mongo->find('items', array('name' => 'equal object'))->numRows()); + } + + /** + * @runInSeparateProcess + * @group Mongo + */ public function testGetInsertId() { if (!defined('DEBUG')) { define('DEBUG', false); } - + $mongo = new MongoDriver($this->conf); $this->assertEquals(0, $mongo->getInsertId()); $this->assertEquals(1, $mongo->find('items', array('name' => 'bread'))->numRows()); @@ -337,7 +360,7 @@ class MongoDriverTest extends PHPUnit_Framework_TestCase define('DEBUG', false); } $mongo = new MongoDriver($this->conf); - $result = $mongo->command('items', array('distinct' =>'items', 'key' => 'name')); + $result = $mongo->command('items', array('distinct' => 'items', 'key' => 'name')); $this->assertEquals(4, count($result->fetch(DB::FETCH_ASSOC))); } } \ No newline at end of file diff --git a/tests/model/MongoModelTest.php b/tests/model/MongoModelTest.php index 1a37774..e30cc79 100644 --- a/tests/model/MongoModelTest.php +++ b/tests/model/MongoModelTest.php @@ -112,6 +112,26 @@ class MongoModelTest extends PHPUnit_Framework_TestCase * @runInSeparateProcess * @group Mongo */ + public function testBatchInsert() + { + if (!defined('DEBUG')) { + define('DEBUG', false); + } + $data = array( + array('name' => 'first object'), + array('name' => 'second object'), + array('name' => 'equal object'), + array('name' => 'equal object') + ); + $this->model->batchInsert($data); + $this->assertEquals(1, $this->model->count(array('name' => 'first object'))); + $this->assertEquals(2, $this->model->count(array('name' => 'equal object'))); + } + + /** + * @runInSeparateProcess + * @group Mongo + */ public function testDeleteAll() { if (!defined('DEBUG')) { @@ -206,7 +226,7 @@ class MongoModelTest extends PHPUnit_Framework_TestCase $this->model->insert(array('_id' => 1, 'name' => 'testbread', 'price' => 3.2, 'quantity' => 10)); $this->model->insert(array('_id' => 2, 'name' => 'testbread', 'price' => 12, 'quantity' => 2)); $this->assertSame(2, $this->model->count(array('name' => 'testbread'))); - + $prop->setValue($this->model, false); $this->model->delete(1); $this->assertSame(1, $this->model->count(array('name' => 'testbread'))); From 0140c3f4adc60d4ee1a80b80ce9a5419e2543441 Mon Sep 17 00:00:00 2001 From: Anton Grebnev Date: Thu, 19 Jan 2012 19:16:31 +0400 Subject: [PATCH 2/2] added condition to batchInsert against empty arrays --- model/MongoDbCommand.php | 5 ++++- tests/model/MongoDbCommandTest.php | 5 +++++ tests/model/MongoModelTest.php | 1 + 3 files changed, 10 insertions(+), 1 deletion(-) diff --git a/model/MongoDbCommand.php b/model/MongoDbCommand.php index 8441242..0cc81b5 100644 --- a/model/MongoDbCommand.php +++ b/model/MongoDbCommand.php @@ -125,11 +125,14 @@ class InsertMongoCommand extends MongoDbCommand protected function concreteExecute() { + $result = null; if (!$this->multiple) { $result = $this->collection->insert($this->data, array('safe' => $this->safe)); $this->insertId = $this->data['_id']; } else { - $result = $this->collection->batchInsert($this->data, array('safe' => $this->safe)); + if (count($this->data)) { + $result = $this->collection->batchInsert($this->data, array('safe' => $this->safe)); + } } return $result; } diff --git a/tests/model/MongoDbCommandTest.php b/tests/model/MongoDbCommandTest.php index 6adf834..e3bb265 100644 --- a/tests/model/MongoDbCommandTest.php +++ b/tests/model/MongoDbCommandTest.php @@ -151,6 +151,9 @@ class MongoDbCommandTest extends PHPUnit_Framework_TestCase $this->assertArrayHasKey('n', $cmd->execute()); + $cmd->bindParam('data', array()); + $cmd->execute(); + $cmd = MongoCommandBuilder::factory(MongoCommandBuilder::FIND, $this->collection); $cmd->bindParam('condition', array('name' => 'first object'))->bindParam('fields', array()); $result = $cmd->execute(); @@ -161,6 +164,8 @@ class MongoDbCommandTest extends PHPUnit_Framework_TestCase $cmd->bindParam('condition', array('name' => 'equal object'))->bindParam('fields', array()); $result = $cmd->execute(); $this->assertEquals(2, $result->count()); + + } /** diff --git a/tests/model/MongoModelTest.php b/tests/model/MongoModelTest.php index e30cc79..af136a3 100644 --- a/tests/model/MongoModelTest.php +++ b/tests/model/MongoModelTest.php @@ -126,6 +126,7 @@ class MongoModelTest extends PHPUnit_Framework_TestCase $this->model->batchInsert($data); $this->assertEquals(1, $this->model->count(array('name' => 'first object'))); $this->assertEquals(2, $this->model->count(array('name' => 'equal object'))); + $this->model->batchInsert(array()); } /**