SearchHandler::__construct()   A
last analyzed

Complexity

Conditions 1
Paths 1

Size

Total Lines 5

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 5
rs 10
c 0
b 0
f 0
cc 1
nc 1
nop 2
1
<?php
2
/**
3
 *
4
 * @author Mihkel Viilveer <[email protected]>
5
 * @date 2.09.2014
6
 */
7
8
namespace opus\elastic\search;
9
10
use opus\elastic\components\Query;
11
use yii\base\ErrorException;
12
use yii\base\BaseObject;
13
14
/**
15
 * Class SearchHandler
16
 *
17
 * This class operates with single|multiple query providers
18
 * to send multiple search queries in one request
19
 * After the request it wraps all results to AbstractHit
20
 *
21
 * @author Mihkel Viilveer <[email protected]>
22
 * @package opus\elastic\search
23
 */
24
class SearchHandler extends BaseObject
25
{
26
    /**
27
     * @var AbstractQueryProvider[]
28
     */
29
    public $queryProviders = [];
30
31
    /**
32
     * @param array $queries
33
     * @param array $config
34
     */
35
    public function __construct(array $queries, $config = [])
36
    {
37
        parent::__construct($config);
38
        $this->queryProviders = $queries;
39
    }
40
41
    /**
42
     * Prepares query provider data, makes search and formats results into AbstractHit objects
43
     *
44
     * @throws ErrorException
45
     * @return mixed[]
46
     */
47
    public function search()
48
    {
49
        $preparedQueries = $this->prepareQueryProviders();
50
        $result = (new Query())->multiSearch($preparedQueries);
51
        return $result;
52
    }
53
54
    /**
55
     * Returns total count of results (all query responses total)
56
     * @return int
57
     */
58
    public function getCount()
59
    {
60
        $preparedQueries = $this->prepareQueryProviders();
61
        $result = (new Query())->multiSearch($preparedQueries);
62
        $count = 0;
63
        foreach ($result['responses'] as $response) {
64
65
            $count += $response['hits']['total'];
66
        }
67
        return $count;
68
    }
69
70
    /**
71
     * Returns formatted requests for elasticSearch multi query method
72
     *
73
     * @return array
74
     */
75
    private function prepareQueryProviders()
76
    {
77
        $requests = [];
78
        foreach ($this->queryProviders as $provider) {
79
            $requests[] = [
80
                'index' => $provider->getModel()->index(),
81
                'type' => $provider->getModel()->type(),
82
                'query' => $provider->getQuery(),
83
            ];
84
        }
85
        return $requests;
86
    }
87
}
88