MongoCommand hierarchy created
This commit is contained in:
120
model/MongoDbCommand.php
Normal file
120
model/MongoDbCommand.php
Normal file
@ -0,0 +1,120 @@
|
|||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* @copyright NetMonsters <team@netmonsters.ru>
|
||||||
|
* @link http://netmonsters.ru
|
||||||
|
* @package Majestic
|
||||||
|
* @subpackage db
|
||||||
|
* @since 2011-11-15
|
||||||
|
*/
|
||||||
|
|
||||||
|
class MongoCommandBuilder
|
||||||
|
{
|
||||||
|
|
||||||
|
const FIND = 'Find';
|
||||||
|
|
||||||
|
const INSERT = 'Insert';
|
||||||
|
|
||||||
|
const UPDATE = 'Update';
|
||||||
|
|
||||||
|
const REMOVE = 'Remove';
|
||||||
|
|
||||||
|
static public function factory($type)
|
||||||
|
{
|
||||||
|
$class = ucfirst($type) . 'MongoCommand';
|
||||||
|
return new $class();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
abstract class MongoDbCommand
|
||||||
|
{
|
||||||
|
public function execute()
|
||||||
|
{
|
||||||
|
if ($this->checkParams()) {
|
||||||
|
return $this->concreteExecute();
|
||||||
|
} else {
|
||||||
|
throw new Exception(get_called_class() . ' error. Bind all required params first.');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public function bindParam($name, $value)
|
||||||
|
{
|
||||||
|
$this->$name = $value;
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
|
||||||
|
abstract protected function concreteExecute();
|
||||||
|
|
||||||
|
abstract protected function checkParams();
|
||||||
|
}
|
||||||
|
|
||||||
|
class FindMongoCommand extends MongoDbCommand
|
||||||
|
{
|
||||||
|
protected function concreteExecute()
|
||||||
|
{
|
||||||
|
return $this->collection->find($this->condition, $this->fields);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected function checkParams()
|
||||||
|
{
|
||||||
|
if (isset($this->collection) && isset($this->condition) && isset($this->fields)) {
|
||||||
|
return true;
|
||||||
|
} else {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class InsertMongoCommand extends MongoDbCommand
|
||||||
|
{
|
||||||
|
protected function concreteExecute()
|
||||||
|
{
|
||||||
|
return $this->collection->insert($this->data, array('safe' => $this->safe));
|
||||||
|
}
|
||||||
|
|
||||||
|
protected function checkParams()
|
||||||
|
{
|
||||||
|
if (isset($this->collection) && isset($this->data) && isset($this->safe)) {
|
||||||
|
return true;
|
||||||
|
} else {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class UpdateMongoCommand extends MongoDbCommand
|
||||||
|
{
|
||||||
|
protected function concreteExecute()
|
||||||
|
{
|
||||||
|
return $this->collection->update($this->condition, $this->data, array('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)
|
||||||
|
) {
|
||||||
|
return true;
|
||||||
|
} else {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class RemoveMongoCommand extends MongoDbCommand
|
||||||
|
{
|
||||||
|
protected function concreteExecute()
|
||||||
|
{
|
||||||
|
return $this->collection->remove($this->condition, array('safe' => $this->safe));
|
||||||
|
}
|
||||||
|
|
||||||
|
protected function checkParams()
|
||||||
|
{
|
||||||
|
if (isset($this->collection) && isset($this->condition) && isset($this->safe)) {
|
||||||
|
return true;
|
||||||
|
} else {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
183
tests/model/MongoDbCommandTest.php
Normal file
183
tests/model/MongoDbCommandTest.php
Normal file
@ -0,0 +1,183 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/*
|
||||||
|
* @copyright NetMonsters <team@netmonsters.ru>
|
||||||
|
* @link http://netmonsters.ru
|
||||||
|
* @package Majestic
|
||||||
|
* @subpackage UnitTests
|
||||||
|
* @since 2011-11-10
|
||||||
|
*
|
||||||
|
* Unit tests for MongoDriver class
|
||||||
|
*/
|
||||||
|
|
||||||
|
require_once dirname(__FILE__) . '/../../model/DbDriver.php';
|
||||||
|
require_once dirname(__FILE__) . '/../../model/NoSqlDbDriver.php';
|
||||||
|
require_once dirname(__FILE__) . '/../../model/MongoDriver.php';
|
||||||
|
require_once dirname(__FILE__) . '/../../model/MongoDbCommand.php';
|
||||||
|
|
||||||
|
class MongoDbCommandTest extends PHPUnit_Framework_TestCase
|
||||||
|
{
|
||||||
|
|
||||||
|
private $conf = array();
|
||||||
|
|
||||||
|
private $driver;
|
||||||
|
|
||||||
|
public function setUp()
|
||||||
|
{
|
||||||
|
$this->conf = array(
|
||||||
|
'hostname' => 'localhost',
|
||||||
|
'database' => 'test',
|
||||||
|
'username' => 'test',
|
||||||
|
'password' => '1234',
|
||||||
|
'port' => 27017
|
||||||
|
);
|
||||||
|
$this->driver = new MongoDriver($this->conf);
|
||||||
|
$connection = $this->driver->getConnection();
|
||||||
|
|
||||||
|
$db = $connection->selectDB($this->conf['database']);
|
||||||
|
$db->authenticate($this->conf['username'], $this->conf['password']);
|
||||||
|
$collection = 'items';
|
||||||
|
$db->dropCollection($collection);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testCommandFactory()
|
||||||
|
{
|
||||||
|
$cmd = MongoCommandBuilder::factory(MongoCommandBuilder::FIND);
|
||||||
|
$this->assertInstanceOf('MongoDbCommand', $cmd);
|
||||||
|
$this->assertInstanceOf('FindMongoCommand', $cmd);
|
||||||
|
$cmd = MongoCommandBuilder::factory(MongoCommandBuilder::INSERT);
|
||||||
|
$this->assertInstanceOf('MongoDbCommand', $cmd);
|
||||||
|
$this->assertInstanceOf('InsertMongoCommand', $cmd);
|
||||||
|
$cmd = MongoCommandBuilder::factory(MongoCommandBuilder::UPDATE);
|
||||||
|
$this->assertInstanceOf('MongoDbCommand', $cmd);
|
||||||
|
$this->assertInstanceOf('UpdateMongoCommand', $cmd);
|
||||||
|
$cmd = MongoCommandBuilder::factory(MongoCommandBuilder::REMOVE);
|
||||||
|
$this->assertInstanceOf('MongoDbCommand', $cmd);
|
||||||
|
$this->assertInstanceOf('RemoveMongoCommand', $cmd);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testFindCommand()
|
||||||
|
{
|
||||||
|
$collection = $this->driver->getCollection('items');
|
||||||
|
$cmd = MongoCommandBuilder::factory(MongoCommandBuilder::FIND);
|
||||||
|
$cmd->bindParam('collection', $collection)->bindParam('condition', array('name' => 'bread'))->bindParam('fields', array());
|
||||||
|
$result = $cmd->execute();
|
||||||
|
$this->assertEquals(0, $result->count());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @expectedException Exception
|
||||||
|
* @expectedExceptionMessage FindMongoCommand error. Bind all required params first.
|
||||||
|
*/
|
||||||
|
public function testFindCommandNotAllParamsBinded()
|
||||||
|
{
|
||||||
|
$collection = $this->driver->getCollection('items');
|
||||||
|
$cmd = MongoCommandBuilder::factory(MongoCommandBuilder::FIND);
|
||||||
|
$cmd->bindParam('collection', $collection)->bindParam('condition', array('name' => 'bread'));
|
||||||
|
$cmd->execute();
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testInsertCommand()
|
||||||
|
{
|
||||||
|
$collection = $this->driver->getCollection('items');
|
||||||
|
$cmd = MongoCommandBuilder::factory(MongoCommandBuilder::INSERT);
|
||||||
|
$cmd->bindParam('collection', $collection)
|
||||||
|
->bindParam('data', array('name' => 'insert'))
|
||||||
|
->bindParam('safe', true);
|
||||||
|
$this->assertArrayHasKey('n', $cmd->execute());
|
||||||
|
|
||||||
|
$cmd = MongoCommandBuilder::factory(MongoCommandBuilder::FIND);
|
||||||
|
$cmd->bindParam('collection', $collection)->bindParam('condition', array('name' => 'insert'))->bindParam('fields', array());
|
||||||
|
$result = $cmd->execute();
|
||||||
|
$this->assertEquals(1, $result->count());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @expectedException Exception
|
||||||
|
* @expectedExceptionMessage InsertMongoCommand error. Bind all required params first.
|
||||||
|
*/
|
||||||
|
public function testInsertCommandNotAllParamsBinded()
|
||||||
|
{
|
||||||
|
$collection = $this->driver->getCollection('items');
|
||||||
|
$cmd = MongoCommandBuilder::factory(MongoCommandBuilder::INSERT);
|
||||||
|
$cmd->bindParam('collection', $collection)->bindParam('data', array('name' => 'bread'));
|
||||||
|
$cmd->execute();
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testUpdateCommand()
|
||||||
|
{
|
||||||
|
$collection = $this->driver->getCollection('items');
|
||||||
|
$cmd = MongoCommandBuilder::factory(MongoCommandBuilder::INSERT);
|
||||||
|
$cmd->bindParam('collection', $collection)
|
||||||
|
->bindParam('data', array('name' => 'insert'))
|
||||||
|
->bindParam('safe', true);
|
||||||
|
$this->assertArrayHasKey('n', $cmd->execute());
|
||||||
|
|
||||||
|
$cmd = MongoCommandBuilder::factory(MongoCommandBuilder::UPDATE);
|
||||||
|
$cmd->bindParam('collection', $collection)
|
||||||
|
->bindParam('condition', array('name' => 'insert'))
|
||||||
|
->bindParam('data', array('$set' => array('name' => 'update')))
|
||||||
|
->bindParam('upsert', false)
|
||||||
|
->bindParam('safe', true);
|
||||||
|
$this->assertArrayHasKey('n', $cmd->execute());
|
||||||
|
|
||||||
|
$cmd = MongoCommandBuilder::factory(MongoCommandBuilder::FIND);
|
||||||
|
$cmd->bindParam('collection', $collection)->bindParam('condition', array('name' => 'insert'))->bindParam('fields', array());
|
||||||
|
$result = $cmd->execute();
|
||||||
|
$this->assertEquals(0, $result->count());
|
||||||
|
$cmd->bindParam('collection', $collection)->bindParam('condition', array('name' => 'update'))->bindParam('fields', array());
|
||||||
|
$result = $cmd->execute();
|
||||||
|
$this->assertEquals(1, $result->count());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @expectedException Exception
|
||||||
|
* @expectedExceptionMessage UpdateMongoCommand error. Bind all required params first.
|
||||||
|
*/
|
||||||
|
public function testUpdateCommandNotAllParamsBinded()
|
||||||
|
{
|
||||||
|
$collection = $this->driver->getCollection('items');
|
||||||
|
$cmd = MongoCommandBuilder::factory(MongoCommandBuilder::UPDATE);
|
||||||
|
$cmd->bindParam('collection', $collection)->bindParam('data', array('name' => 'bread'));
|
||||||
|
$cmd->execute();
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testRemoveCommand()
|
||||||
|
{
|
||||||
|
$collection = $this->driver->getCollection('items');
|
||||||
|
$cmd = MongoCommandBuilder::factory(MongoCommandBuilder::INSERT);
|
||||||
|
$cmd->bindParam('collection', $collection)
|
||||||
|
->bindParam('data', array('name' => 'insert'))
|
||||||
|
->bindParam('safe', true);
|
||||||
|
$this->assertArrayHasKey('n', $cmd->execute());
|
||||||
|
|
||||||
|
$cmd = MongoCommandBuilder::factory(MongoCommandBuilder::FIND);
|
||||||
|
$cmd->bindParam('collection', $collection)->bindParam('condition', array('name' => 'insert'))->bindParam('fields', array());
|
||||||
|
$result = $cmd->execute();
|
||||||
|
$this->assertEquals(1, $result->count());
|
||||||
|
|
||||||
|
$cmd = MongoCommandBuilder::factory(MongoCommandBuilder::REMOVE);
|
||||||
|
$cmd->bindParam('collection', $collection)
|
||||||
|
->bindParam('condition', array('name' => 'insert'))
|
||||||
|
->bindParam('safe', true);
|
||||||
|
$this->assertArrayHasKey('n', $cmd->execute());
|
||||||
|
|
||||||
|
$cmd = MongoCommandBuilder::factory(MongoCommandBuilder::FIND);
|
||||||
|
$cmd->bindParam('collection', $collection)->bindParam('condition', array('name' => 'insert'))->bindParam('fields', array());
|
||||||
|
$result = $cmd->execute();
|
||||||
|
$this->assertEquals(0, $result->count());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @expectedException Exception
|
||||||
|
* @expectedExceptionMessage RemoveMongoCommand error. Bind all required params first.
|
||||||
|
*/
|
||||||
|
public function testRemoveCommandNotAllParamsBinded()
|
||||||
|
{
|
||||||
|
$collection = $this->driver->getCollection('items');
|
||||||
|
$cmd = MongoCommandBuilder::factory(MongoCommandBuilder::REMOVE);
|
||||||
|
$cmd->bindParam('collection', $collection);
|
||||||
|
$cmd->execute();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
Reference in New Issue
Block a user