Allow Resetter to target specific indexes and types (BC break)
The original reset() method is now resetAllIndexes(). Additionally, new resetIndex() and resetIndexType() methods were introduced.
This commit is contained in:
parent
2d2e209373
commit
89a368ae35
76
Resetter.php
76
Resetter.php
|
@ -4,30 +4,76 @@ namespace FOQ\ElasticaBundle;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Deletes and recreates indexes
|
* Deletes and recreates indexes
|
||||||
**/
|
*/
|
||||||
class Resetter
|
class Resetter
|
||||||
{
|
{
|
||||||
/**
|
protected $indexConfigsByName;
|
||||||
* Index settings and mappings
|
|
||||||
*
|
|
||||||
* @var array
|
|
||||||
*/
|
|
||||||
protected $indexConfigs;
|
|
||||||
|
|
||||||
public function __construct(array $indexConfigs)
|
/**
|
||||||
|
* Constructor.
|
||||||
|
*
|
||||||
|
* @param array $indexConfigsByName
|
||||||
|
*/
|
||||||
|
public function __construct(array $indexConfigsByName)
|
||||||
{
|
{
|
||||||
$this->indexConfigs = $indexConfigs;
|
$this->indexConfigsByName = $indexConfigsByName;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Resets all indexes
|
* Deletes and recreates all indexes
|
||||||
*
|
*/
|
||||||
* @return null
|
public function resetAllIndexes()
|
||||||
**/
|
|
||||||
public function reset()
|
|
||||||
{
|
{
|
||||||
foreach ($this->indexConfigs as $indexConfig) {
|
foreach ($this->indexConfigsByName as $indexConfig) {
|
||||||
$indexConfig['index']->create($indexConfig['config'], true);
|
$indexConfig['index']->create($indexConfig['config'], true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Deletes and recreates the named index
|
||||||
|
*
|
||||||
|
* @param string $indexName
|
||||||
|
* @throws InvalidArgumentException if no index exists for the given name
|
||||||
|
*/
|
||||||
|
public function resetIndex($indexName)
|
||||||
|
{
|
||||||
|
$indexConfig = $this->getIndexConfig($indexName);
|
||||||
|
$indexConfig['index']->create($indexConfig['config'], true);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Deletes and recreates a mapping type for the named index
|
||||||
|
*
|
||||||
|
* @param string $indexName
|
||||||
|
* @param string $typeName
|
||||||
|
* @throws InvalidArgumentException if no index or type mapping exists for the given names
|
||||||
|
*/
|
||||||
|
public function resetIndexType($indexName, $typeName)
|
||||||
|
{
|
||||||
|
$indexConfig = $this->getIndexConfig($indexName);
|
||||||
|
|
||||||
|
if (!isset($indexConfig['config']['mappings'][$typeName])) {
|
||||||
|
throw new \InvalidArgumentException(sprintf('The mapping for index "%s" and type "%s" does not exist.', $indexName, $typeName));
|
||||||
|
}
|
||||||
|
|
||||||
|
$type = $indexConfig['index']->getType($typeName);
|
||||||
|
$type->delete();
|
||||||
|
$type->setMapping($indexConfig['config']['mappings'][$typeName]);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets an index config by its name
|
||||||
|
*
|
||||||
|
* @param string $index Index name
|
||||||
|
* @return array
|
||||||
|
* @throws InvalidArgumentException if no index config exists for the given name
|
||||||
|
*/
|
||||||
|
protected function getIndexConfig($indexName)
|
||||||
|
{
|
||||||
|
if (!isset($this->indexConfigsByName[$indexName])) {
|
||||||
|
throw new \InvalidArgumentException(sprintf('The configuration for index "%s" does not exist.', $indexName));
|
||||||
|
}
|
||||||
|
|
||||||
|
return $this->indexConfigsByName[$indexName];
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -3,69 +3,136 @@
|
||||||
namespace FOQ\ElasticaBundle\Tests\Resetter;
|
namespace FOQ\ElasticaBundle\Tests\Resetter;
|
||||||
|
|
||||||
use FOQ\ElasticaBundle\Resetter;
|
use FOQ\ElasticaBundle\Resetter;
|
||||||
use FOQ\ElasticaBundle\IndexManager;
|
|
||||||
use Elastica_Exception_Response;
|
|
||||||
use Elastica_Response;
|
|
||||||
|
|
||||||
class Index
|
|
||||||
{
|
|
||||||
public $deleted = false;
|
|
||||||
public $created = false;
|
|
||||||
|
|
||||||
public function delete()
|
|
||||||
{
|
|
||||||
$this->deleted = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
public function create()
|
|
||||||
{
|
|
||||||
$this->created = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
class NewIndex
|
|
||||||
{
|
|
||||||
public $deleted = false;
|
|
||||||
public $created = false;
|
|
||||||
|
|
||||||
public function delete()
|
|
||||||
{
|
|
||||||
$jsonResponse = json_encode(array('index' => 'is_new'));
|
|
||||||
|
|
||||||
throw new Elastica_Exception_Response(new Elastica_Response($jsonResponse));
|
|
||||||
}
|
|
||||||
|
|
||||||
public function create()
|
|
||||||
{
|
|
||||||
$this->created = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
class ResetterTest extends \PHPUnit_Framework_TestCase
|
class ResetterTest extends \PHPUnit_Framework_TestCase
|
||||||
{
|
{
|
||||||
|
private $indexConfigsByName;
|
||||||
|
|
||||||
public function setUp()
|
public function setUp()
|
||||||
{
|
{
|
||||||
if (!class_exists('Elastica_Exception_Response') || !class_exists('Elastica_Response')) {
|
$this->indexConfigsByName = array(
|
||||||
$this->markTestSkipped('The Elastica library classes are not available');
|
'foo' => array(
|
||||||
}
|
'index' => $this->getMockElasticaIndex(),
|
||||||
|
'config' => array(
|
||||||
|
'mappings' => array(
|
||||||
|
'a' => $this->getMockElasticaTypeMapping(),
|
||||||
|
'b' => $this->getMockElasticaTypeMapping(),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
'bar' => array(
|
||||||
|
'index' => $this->getMockElasticaIndex(),
|
||||||
|
'config' => array(
|
||||||
|
'mappings' => array(
|
||||||
|
'a' => $this->getMockElasticaTypeMapping(),
|
||||||
|
'b' => $this->getMockElasticaTypeMapping(),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
public function testThatResetMethodRecreateAllIndexes()
|
public function testResetAllIndexes()
|
||||||
{
|
{
|
||||||
$indexConfig = array();
|
$this->indexConfigsByName['foo']['index']->expects($this->once())
|
||||||
$indexConfig['index_1'] = array();
|
->method('create')
|
||||||
$indexConfig['index_1']['index'] = new Index();
|
->with($this->indexConfigsByName['foo']['config'], true);
|
||||||
$indexConfig['index_1']['config'] = array();
|
|
||||||
$indexConfig['index_2'] = array();
|
|
||||||
$indexConfig['index_2']['index'] = new Index();
|
|
||||||
$indexConfig['index_2']['config'] = array();
|
|
||||||
|
|
||||||
|
$this->indexConfigsByName['bar']['index']->expects($this->once())
|
||||||
|
->method('create')
|
||||||
|
->with($this->indexConfigsByName['bar']['config'], true);
|
||||||
|
|
||||||
$resetter = new Resetter($indexConfig);
|
$resetter = new Resetter($this->indexConfigsByName);
|
||||||
$resetter->reset();
|
$resetter->resetAllIndexes();
|
||||||
|
|
||||||
$this->assertTrue($indexConfig['index_1']['index']->created);
|
|
||||||
$this->assertTrue($indexConfig['index_2']['index']->created);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function testResetIndex()
|
||||||
|
{
|
||||||
|
$this->indexConfigsByName['foo']['index']->expects($this->once())
|
||||||
|
->method('create')
|
||||||
|
->with($this->indexConfigsByName['foo']['config'], true);
|
||||||
|
|
||||||
|
$this->indexConfigsByName['bar']['index']->expects($this->never())
|
||||||
|
->method('create');
|
||||||
|
|
||||||
|
$resetter = new Resetter($this->indexConfigsByName);
|
||||||
|
$resetter->resetIndex('foo');
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @expectedException InvalidArgumentException
|
||||||
|
*/
|
||||||
|
public function testResetIndexShouldThrowExceptionForInvalidIndex()
|
||||||
|
{
|
||||||
|
$resetter = new Resetter($this->indexConfigsByName);
|
||||||
|
$resetter->resetIndex('baz');
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testResetIndexType()
|
||||||
|
{
|
||||||
|
$type = $this->getMockElasticaType();
|
||||||
|
|
||||||
|
$this->indexConfigsByName['foo']['index']->expects($this->once())
|
||||||
|
->method('getType')
|
||||||
|
->with('a')
|
||||||
|
->will($this->returnValue($type));
|
||||||
|
|
||||||
|
$type->expects($this->once())
|
||||||
|
->method('delete');
|
||||||
|
|
||||||
|
$type->expects($this->once())
|
||||||
|
->method('setMapping')
|
||||||
|
->with($this->indexConfigsByName['foo']['config']['mappings']['a']);
|
||||||
|
|
||||||
|
$resetter = new Resetter($this->indexConfigsByName);
|
||||||
|
$resetter->resetIndexType('foo', 'a');
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @expectedException InvalidArgumentException
|
||||||
|
*/
|
||||||
|
public function testResetIndexTypeShouldThrowExceptionForInvalidIndex()
|
||||||
|
{
|
||||||
|
$resetter = new Resetter($this->indexConfigsByName);
|
||||||
|
$resetter->resetIndexType('baz', 'a');
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @expectedException InvalidArgumentException
|
||||||
|
*/
|
||||||
|
public function testResetIndexTypeShouldThrowExceptionForInvalidType()
|
||||||
|
{
|
||||||
|
$resetter = new Resetter($this->indexConfigsByName);
|
||||||
|
$resetter->resetIndexType('foo', 'c');
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return Elastica_Index
|
||||||
|
*/
|
||||||
|
private function getMockElasticaIndex()
|
||||||
|
{
|
||||||
|
return $this->getMockBuilder('Elastica_Index')
|
||||||
|
->disableOriginalConstructor()
|
||||||
|
->getMock();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return Elastica_Type
|
||||||
|
*/
|
||||||
|
private function getMockElasticaType()
|
||||||
|
{
|
||||||
|
return $this->getMockBuilder('Elastica_Type')
|
||||||
|
->disableOriginalConstructor()
|
||||||
|
->getMock();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return Elastica_Type_Mapping
|
||||||
|
*/
|
||||||
|
private function getMockElasticaTypeMapping()
|
||||||
|
{
|
||||||
|
return $this->getMockBuilder('Elastica_Type_Mapping')
|
||||||
|
->disableOriginalConstructor()
|
||||||
|
->getMock();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue