-
Notifications
You must be signed in to change notification settings - Fork 73
/
SolariumMulticoreClient.php
97 lines (83 loc) · 2.5 KB
/
SolariumMulticoreClient.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
<?php
namespace FS\SolrBundle\Client\Solarium;
use FS\SolrBundle\Doctrine\Mapper\MetaInformationInterface;
use FS\SolrBundle\Query\DeleteDocumentQuery;
use FS\SolrBundle\Query\FindByIdentifierQuery;
use Solarium\Core\Query\QueryInterface;
use Solarium\QueryType\Update\Query\Document\DocumentInterface;
use \Solarium\Client;
/**
* Wrapper class for \Solarium\Client to perform actions on multiple cores
*/
class SolariumMulticoreClient
{
/**
* @var Client
*/
private $solariumClient;
/**
* @param Client $solariumClient
*/
public function __construct(Client $solariumClient)
{
$this->solariumClient = $solariumClient;
}
/**
* @param DocumentInterface $doc
* @param string $index
*/
public function update(DocumentInterface $doc, $index)
{
$update = $this->solariumClient->createUpdate();
$update->addDocument($doc);
$update->addCommit();
$this->applyQuery($update, $index);
}
/**
* @param DocumentInterface $document
* @param string $index
*/
public function delete(DocumentInterface $document, $index)
{
$documentFields = $document->getFields();
$documentKey = $documentFields[MetaInformationInterface::DOCUMENT_KEY_FIELD_NAME];
$deleteQuery = new DeleteDocumentQuery();
$deleteQuery->setDocument($document);
$deleteQuery->setDocumentKey($documentKey);
$delete = $this->solariumClient->createUpdate();
$delete->addDeleteQuery($deleteQuery->getQuery());
$delete->addCommit();
$this->applyQuery($delete, $index);
}
/**
* Runs a *:* delete query on all cores
*/
public function clearCores()
{
$delete = $this->solariumClient->createUpdate();
$delete->addDeleteQuery('*:*');
$delete->addCommit();
$this->applyOnAllCores($delete);
}
/**
* @param QueryInterface $query
* @param string $index
*/
private function applyQuery(QueryInterface $query, $index)
{
if ($index == '*') {
$this->applyOnAllCores($query);
} else {
$this->solariumClient->update($query, $index);
}
}
/**
* @param QueryInterface $query
*/
private function applyOnAllCores(QueryInterface $query)
{
foreach ($this->solariumClient->getEndpoints() as $endpointName => $endpoint) {
$this->solariumClient->update($query, $endpointName);
}
}
}