Skip to content

Commit

Permalink
deleteByQuery() implemented in Elastica\Index (+ tests)
Browse files Browse the repository at this point in the history
  • Loading branch information
rmruano committed Apr 15, 2015
1 parent 917096e commit d2cbbe4
Show file tree
Hide file tree
Showing 3 changed files with 130 additions and 0 deletions.
3 changes: 3 additions & 0 deletions changes.txt
Original file line number Diff line number Diff line change
@@ -1,5 +1,8 @@
CHANGES

2015-04-15
- deleteByQuery() implemented in Elastica\Index

2015-03-29
- Added Elastica\Suggest\Completion

Expand Down
21 changes: 21 additions & 0 deletions lib/Elastica/Index.php
Original file line number Diff line number Diff line change
Expand Up @@ -148,6 +148,27 @@ public function addDocuments(array $docs)
return $this->getClient()->addDocuments($docs);
}

/**
* Deletes entries in the db based on a query
*
* @param \Elastica\Query|string $query Query object
* @param array $options Optional params
* @return \Elastica\Response
* @link http://www.elastic.co/guide/en/elasticsearch/reference/current/docs-delete-by-query.html
*/
public function deleteByQuery($query, array $options = array())
{
if (is_string($query)) {
// query_string queries are not supported for delete by query operations
$options['q'] = $query;

return $this->request('_query', Request::DELETE, array(), $options);
}
$query = Query::create($query);

return $this->request('_query', Request::DELETE, array('query' => $query->getQuery()), $options);
}

/**
* Deletes the index
*
Expand Down
106 changes: 106 additions & 0 deletions test/lib/Elastica/Test/IndexTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
use Elastica\Index;
use Elastica\Query\HasChild;
use Elastica\Query\QueryString;
use Elastica\Query\SimpleQueryString;
use Elastica\Query\Term;
use Elastica\Status;
use Elastica\Test\Base as BaseTest;
Expand Down Expand Up @@ -320,6 +321,111 @@ public function testCount()
$this->assertEquals(1, $index->count($query));
}

public function testDeleteByQueryWithQueryString()
{
$index = $this->_createIndex();
$type1 = new Type($index, 'test1');
$type1->addDocument(new Document(1, array('name' => 'ruflin nicolas')));
$type1->addDocument(new Document(2, array('name' => 'ruflin')));
$type2 = new Type($index, 'test2');
$type2->addDocument(new Document(1, array('name' => 'ruflin nicolas')));
$type2->addDocument(new Document(2, array('name' => 'ruflin')));
$index->refresh();

$response = $index->search('ruflin*');
$this->assertEquals(4, $response->count());

$response = $index->search('nicolas');
$this->assertEquals(2, $response->count());

// Delete first document
$response = $index->deleteByQuery('nicolas');
$this->assertTrue($response->isOk());

$index->refresh();

// Makes sure, document is deleted
$response = $index->search('ruflin*');
$this->assertEquals(2, $response->count());

$response = $index->search('nicolas');
$this->assertEquals(0, $response->count());
}

public function testDeleteByQueryWithQuery()
{
$index = $this->_createIndex();
$type1 = new Type($index, 'test1');
$type1->addDocument(new Document(1, array('name' => 'ruflin nicolas')));
$type1->addDocument(new Document(2, array('name' => 'ruflin')));
$type2 = new Type($index, 'test2');
$type2->addDocument(new Document(1, array('name' => 'ruflin nicolas')));
$type2->addDocument(new Document(2, array('name' => 'ruflin')));
$index->refresh();

$response = $index->search('ruflin*');
$this->assertEquals(4, $response->count());

$response = $index->search('nicolas');
$this->assertEquals(2, $response->count());

// Delete first document
$response = $index->deleteByQuery(new SimpleQueryString('nicolas'));
$this->assertTrue($response->isOk());

$index->refresh();

// Makes sure, document is deleted
$response = $index->search('ruflin*');
$this->assertEquals(2, $response->count());

$response = $index->search('nicolas');
$this->assertEquals(0, $response->count());
}

public function testDeleteByQueryWithQueryAndOptions()
{
$index = $this->_createIndex(null, true, 2);
$type1 = new Type($index, 'test1');
$type1->addDocument(new Document(1, array('name' => 'ruflin nicolas')));
$type1->addDocument(new Document(2, array('name' => 'ruflin')));
$type2 = new Type($index, 'test2');
$type2->addDocument(new Document(1, array('name' => 'ruflin nicolas')));
$type2->addDocument(new Document(2, array('name' => 'ruflin')));
$index->refresh();

$response = $index->search('ruflin*');
$this->assertEquals(4, $response->count());

$response = $index->search('nicolas');
$this->assertEquals(2, $response->count());

// Route to the wrong document id; should not delete
$response = $index->deleteByQuery(new SimpleQueryString('nicolas'), array('routing' => '2'));
$this->assertTrue($response->isOk());

$index->refresh();

$response = $index->search('ruflin*');
$this->assertEquals(4, $response->count());

$response = $index->search('nicolas');
$this->assertEquals(2, $response->count());

// Delete first document
$response = $index->deleteByQuery(new SimpleQueryString('nicolas'), array('routing' => '1'));
$this->assertTrue($response->isOk());

$index->refresh();

// Makes sure, document is deleted
$response = $index->search('ruflin*');
$this->assertEquals(2, $response->count());

$response = $index->search('nicolas');
$this->assertEquals(0, $response->count());
}

public function testDeleteIndexDeleteAlias()
{
$indexName = 'test';
Expand Down

0 comments on commit d2cbbe4

Please sign in to comment.