Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
71.05% covered (warning)
71.05%
27 / 38
54.55% covered (warning)
54.55%
6 / 11
CRAP
0.00% covered (danger)
0.00%
0 / 1
ReindexRequest
71.05% covered (warning)
71.05%
27 / 38
54.55% covered (warning)
54.55%
6 / 11
20.46
0.00% covered (danger)
0.00%
0 / 1
 __construct
100.00% covered (success)
100.00%
4 / 4
100.00% covered (success)
100.00%
1 / 1
1
 setRemoteInfo
0.00% covered (danger)
0.00%
0 / 2
0.00% covered (danger)
0.00%
0 / 1
2
 setScript
100.00% covered (success)
100.00%
2 / 2
100.00% covered (success)
100.00%
1 / 1
1
 setSize
0.00% covered (danger)
0.00%
0 / 2
0.00% covered (danger)
0.00%
0 / 1
2
 setRequestsPerSecond
0.00% covered (danger)
0.00%
0 / 2
0.00% covered (danger)
0.00%
0 / 1
2
 setSlices
100.00% covered (success)
100.00%
2 / 2
100.00% covered (success)
100.00%
1 / 1
1
 reindexTask
100.00% covered (success)
100.00%
4 / 4
100.00% covered (success)
100.00%
1 / 1
1
 reindex
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 request
55.56% covered (warning)
55.56%
5 / 9
0.00% covered (danger)
0.00%
0 / 1
3.79
 toArray
88.89% covered (warning)
88.89%
8 / 9
0.00% covered (danger)
0.00%
0 / 1
3.01
 asSourceDest
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
1<?php
2
3namespace CirrusSearch\Elastica;
4
5use Elastica\Client;
6use Elastica\Index;
7use Elastica\Request;
8use Elastica\Response;
9use InvalidArgumentException;
10use RuntimeException;
11
12class ReindexRequest {
13    /** @var array */
14    private $source;
15    /** @var array */
16    private $dest;
17    /** @var array|null */
18    private $script;
19    /** @var int|null */
20    private $size;
21    /** @var int */
22    private $requestsPerSecond = -1;
23    /** @var int */
24    private $slices = 1;
25    /** @var Client */
26    private $client;
27
28    /**
29     * @param Index $source
30     * @param Index $dest
31     * @param int $chunkSize
32     */
33    public function __construct( Index $source, Index $dest, $chunkSize = 100 ) {
34        $this->source = $this->asSourceDest( $source );
35        $this->source['size'] = $chunkSize;
36        $this->dest = $this->asSourceDest( $dest );
37        $this->client = $dest->getClient();
38    }
39
40    /**
41     * @param array $remote
42     * @return $this
43     */
44    public function setRemoteInfo( array $remote ) {
45        $this->source['remote'] = $remote;
46        return $this;
47    }
48
49    /**
50     * @param array $script
51     * @return $this
52     */
53    public function setScript( array $script ) {
54        $this->script = $script;
55        return $this;
56    }
57
58    /**
59     * The number of documents to reindex
60     *
61     * @param int $size
62     * @return $this
63     */
64    public function setSize( $size ) {
65        $this->size = $size;
66        return $this;
67    }
68
69    /**
70     * @param int $rps
71     * @return $this
72     */
73    public function setRequestsPerSecond( $rps ) {
74        $this->requestsPerSecond = $rps;
75        return $this;
76    }
77
78    /**
79     * @param int $slices
80     * @return $this
81     */
82    public function setSlices( $slices ) {
83        $this->slices = $slices;
84        return $this;
85    }
86
87    /**
88     * @return ReindexTask
89     */
90    public function reindexTask() {
91        $response = $this->request( [
92            'wait_for_completion' => 'false',
93        ] );
94
95        return new ReindexTask( $this->client, $response->getData()['task'] );
96    }
97
98    /**
99     * @return ReindexResponse
100     */
101    public function reindex() {
102        return new ReindexResponse( $this->request()->getData() );
103    }
104
105    /**
106     * @param array $query
107     * @return Response
108     */
109    private function request( array $query = [] ) {
110        $query['requests_per_second'] = $this->requestsPerSecond;
111        $query['slices'] = $this->slices;
112        $response = $this->client->request( '_reindex', Request::POST, $this->toArray(), $query );
113
114        if ( !$response->isOK() ) {
115            throw new RuntimeException( $response->hasError()
116                ? 'Failed reindex request: ' . $response->getErrorMessage()
117                : 'Unknown reindex failure: ' . $response->getStatus()
118            );
119        }
120
121        return $response;
122    }
123
124    /**
125     * @return array
126     */
127    public function toArray() {
128        $request = [
129            'source' => $this->source,
130            'dest' => $this->dest,
131        ];
132        if ( $this->script ) {
133            $request['script'] = $this->script;
134        }
135        if ( $this->size ) {
136            $request['size'] = $this->size;
137        }
138
139        return $request;
140    }
141
142    /**
143     * @param Index $input
144     * @return array
145     * @throws InvalidArgumentException
146     */
147    private function asSourceDest( Index $input ) {
148        return [ 'index' => $input->getName() ];
149    }
150
151}