vendor/friendsofsymfony/elastica-bundle/src/Elastica/Client.php line 52

Open in your IDE?
  1. <?php
  2. /*
  3.  * This file is part of the FOSElasticaBundle package.
  4.  *
  5.  * (c) FriendsOfSymfony <http://friendsofsymfony.github.com/>
  6.  *
  7.  * For the full copyright and license information, please view the LICENSE
  8.  * file that was distributed with this source code.
  9.  */
  10. namespace FOS\ElasticaBundle\Elastica;
  11. use Elastica\Client as BaseClient;
  12. use Elastica\Exception\ClientException;
  13. use Elastica\Request;
  14. use FOS\ElasticaBundle\Logger\ElasticaLogger;
  15. use Symfony\Component\Stopwatch\Stopwatch;
  16. /**
  17.  * Extends the default Elastica client to provide logging for errors that occur
  18.  * during communication with ElasticSearch.
  19.  *
  20.  * @author Gordon Franke <info@nevalon.de>
  21.  */
  22. class Client extends BaseClient
  23. {
  24.     /**
  25.      * Stores created indexes to avoid recreation.
  26.      *
  27.      * @var array
  28.      */
  29.     private $indexCache = [];
  30.     /**
  31.      * Stores created index template to avoid recreation.
  32.      *
  33.      * @var array
  34.      */
  35.     private $indexTemplateCache = array();
  36.     /**
  37.      * Symfony's debugging Stopwatch.
  38.      *
  39.      * @var Stopwatch|null
  40.      */
  41.     private $stopwatch;
  42.     /**
  43.      * {@inheritdoc}
  44.      */
  45.     public function request($path$method Request::GET$data = [], array $query = [], $contentType Request::DEFAULT_CONTENT_TYPE)
  46.     {
  47.         if ($this->stopwatch) {
  48.             $this->stopwatch->start('es_request''fos_elastica');
  49.         }
  50.         $response parent::request($path$method$data$query$contentType);
  51.         $responseData $response->getData();
  52.         $transportInfo $response->getTransferInfo();
  53.         $connection $this->getLastRequest()->getConnection();
  54.         $forbiddenHttpCodes $connection->hasConfig('http_error_codes') ? $connection->getConfig('http_error_codes') : [];
  55.         if (isset($transportInfo['http_code']) && in_array($transportInfo['http_code'], $forbiddenHttpCodestrue)) {
  56.             $body is_array($responseData) ? json_encode($responseData) : $responseData;
  57.             $message sprintf('Error in transportInfo: response code is %s, response body is %s'$transportInfo['http_code'], $body);
  58.             throw new ClientException($message);
  59.         }
  60.         if (isset($responseData['took']) && isset($responseData['hits'])) {
  61.             $this->logQuery($path$method$data$query$response->getQueryTime(), $response->getEngineTime(), $responseData['hits']['total']);
  62.         } else {
  63.             $this->logQuery($path$method$data$query$response->getQueryTime(), 00);
  64.         }
  65.         if ($this->stopwatch) {
  66.             $this->stopwatch->stop('es_request');
  67.         }
  68.         return $response;
  69.     }
  70.     /**
  71.      * @param string $name
  72.      *
  73.      * @return Index|mixed
  74.      */
  75.     public function getIndex($name)
  76.     {
  77.         if (isset($this->indexCache[$name])) {
  78.             return $this->indexCache[$name];
  79.         }
  80.         return $this->indexCache[$name] = new Index($this$name);
  81.     }
  82.     public function getIndexTemplate($name)
  83.     {
  84.         if (isset($this->indexTemplateCache[$name])) {
  85.             return $this->indexTemplateCache[$name];
  86.         }
  87.         return $this->indexTemplateCache[$name] = new IndexTemplate($this$name);
  88.     }
  89.     /**
  90.      * Sets a stopwatch instance for debugging purposes.
  91.      *
  92.      * @param Stopwatch $stopwatch
  93.      */
  94.     public function setStopwatch(Stopwatch $stopwatch null)
  95.     {
  96.         $this->stopwatch $stopwatch;
  97.     }
  98.     /**
  99.      * Log the query if we have an instance of ElasticaLogger.
  100.      *
  101.      * @param string $path
  102.      * @param string $method
  103.      * @param array|string $data
  104.      * @param array  $query
  105.      * @param int    $queryTime
  106.      * @param int    $engineMS
  107.      * @param int    $itemCount
  108.      */
  109.     private function logQuery($path$method$data, array $query$queryTime$engineMS 0$itemCount 0)
  110.     {
  111.         if (!$this->_logger or !$this->_logger instanceof ElasticaLogger) {
  112.             return;
  113.         }
  114.         $connection $this->getLastRequest()->getConnection();
  115.         $connectionArray = [
  116.             'host' => $connection->getHost(),
  117.             'port' => $connection->getPort(),
  118.             'transport' => $connection->getTransport(),
  119.             'headers' => $connection->hasConfig('headers') ? $connection->getConfig('headers') : [],
  120.         ];
  121.         /** @var ElasticaLogger $logger */
  122.         $logger $this->_logger;
  123.         $logger->logQuery($path$method$data$queryTime$connectionArray$query$engineMS$itemCount);
  124.     }
  125. }