Passed
Pull Request — master (#2)
by Christopher
03:09
created

AbstractDsl::getRaw()   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 12
Code Lines 6

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 6
CRAP Score 2

Importance

Changes 0
Metric Value
cc 2
eloc 6
nc 2
nop 0
dl 0
loc 12
ccs 6
cts 6
cp 1
crap 2
rs 10
c 0
b 0
f 0
1
<?php
2
namespace Triadev\Es\Dsl\Dsl;
3
4
use ONGR\ElasticsearchDSL\BuilderInterface;
5
use ONGR\ElasticsearchDSL\Query\Compound\BoolQuery;
6
use ONGR\ElasticsearchDSL\Sort\FieldSort;
7
use Triadev\Es\Dsl\Dsl\Query\Compound;
8
use Triadev\Es\Dsl\Dsl\Query\Fulltext;
9
use Triadev\Es\Dsl\Dsl\Query\Geo;
10
use Triadev\Es\Dsl\Dsl\Query\InnerHit;
11
use Triadev\Es\Dsl\Dsl\Query\Joining;
12
use Triadev\Es\Dsl\Dsl\Query\Specialized;
13
use Triadev\Es\Dsl\Dsl\Query\TermLevel;
14
use Triadev\Es\Dsl\Facade\ElasticDsl;
15
16
/**
17
 * Class AbstractDsl
18
 * @package Triadev\Es\Dsl\Dsl
19
 *
20
 * @method TermLevel termLevel()
21
 * @method Fulltext fulltext()
22
 * @method Geo geo()
23
 * @method Compound compound()
24
 * @method Joining joining()
25
 * @method Specialized specialized()
26
 * @method InnerHit innerHit()
27
 */
28
abstract class AbstractDsl extends AbstractSearch
29
{
30
    /** @var string */
31
    private $boolState = BoolQuery::MUST;
32
    
33
    /**
34
     * Append
35
     *
36
     * @param BuilderInterface $query
37
     * @return AbstractDsl|Search|TermLevel|Compound|Fulltext|Geo|InnerHit|Joining|Specialized
38
     */
39 20
    public function append(BuilderInterface $query) : AbstractDsl
40
    {
41 20
        $this->search->addQuery($query, $this->boolState);
42 20
        return $this;
43
    }
44
    
45
    /**
46
     * Bool state: must
47
     *
48
     * @return AbstractDsl|Search|TermLevel|Compound|Fulltext|Geo|InnerHit|Joining|Specialized
49
     */
50 3
    public function must(): AbstractDsl
51
    {
52 3
        $this->boolState = BoolQuery::MUST;
53 3
        return $this;
54
    }
55
    
56
    /**
57
     * Bool state: must not
58
     *
59
     * @return AbstractDsl|Search|TermLevel|Compound|Fulltext|Geo|InnerHit|Joining|Specialized
60
     */
61 1
    public function mustNot(): AbstractDsl
62
    {
63 1
        $this->boolState = BoolQuery::MUST_NOT;
64 1
        return $this;
65
    }
66
    
67
    /**
68
     * Bool state: should
69
     *
70
     * @return AbstractDsl|Search|TermLevel|Compound|Fulltext|Geo|InnerHit|Joining|Specialized
71
     */
72 1
    public function should(): AbstractDsl
73
    {
74 1
        $this->boolState = BoolQuery::SHOULD;
75 1
        return $this;
76
    }
77
    
78
    /**
79
     * Bool state: filter
80
     *
81
     * @return AbstractDsl|Search|TermLevel|Compound|Fulltext|Geo|InnerHit|Joining|Specialized
82
     */
83 6
    public function filter(): AbstractDsl
84
    {
85 6
        $this->boolState = BoolQuery::FILTER;
86 6
        return $this;
87
    }
88
    
89
    /**
90
     * Paginate
91
     *
92
     * @param int $page
93
     * @param int $limit
94
     * @return AbstractDsl|Search|TermLevel|Compound|Fulltext|Geo|InnerHit|Joining|Specialized
95
     */
96 1
    public function paginate(int $page, int $limit = 25) : AbstractDsl
97
    {
98 1
        $this->search->setFrom($limit * ($page - 1))->setSize($limit);
99 1
        return $this;
100
    }
101
    
102
    /**
103
     * Min score
104
     *
105
     * @param int $minScore
106
     * @return AbstractDsl|Search|TermLevel|Compound|Fulltext|Geo|InnerHit|Joining|Specialized
107
     */
108
    public function minScore(int $minScore) : AbstractDsl
109
    {
110
        $this->search->setMinScore($minScore);
111
        return $this;
112
    }
113
    
114
    /**
115
     * Sort
116
     *
117
     * @param string $field
118
     * @param string $order
119
     * @param array $params
120
     * @return AbstractDsl|Search|TermLevel|Compound|Fulltext|Geo|InnerHit|Joining|Specialized
121
     */
122 1
    public function sort(string $field, string $order = FieldSort::DESC, array $params = []) : AbstractDsl
123
    {
124 1
        $this->search->addSort(new FieldSort(
125 1
            $field,
126 1
            $order,
127 1
            $params
128
        ));
129
        
130 1
        return $this;
131
    }
132
    
133
    /**
134
     * Aggregation
135
     *
136
     * @param \Closure $aggregation
137
     * @return AbstractDsl|Search|TermLevel|Compound|Fulltext|Geo|InnerHit|Joining|Specialized
138
     */
139 1
    public function aggregation(\Closure $aggregation) : AbstractDsl
140
    {
141 1
        $aggregation(new Aggregation($this->search));
142 1
        return $this;
143
    }
144
    
145
    /**
146
     * Search
147
     *
148
     * @param \Closure $search
149
     * @return AbstractDsl|Search|TermLevel|Compound|Fulltext|Geo|InnerHit|Joining|Specialized
150
     */
151 1
    public function bool(\Closure $search) : AbstractDsl
152
    {
153 1
        $searchBuilder = ElasticDsl::search();
154 1
        $search($searchBuilder);
155
        
156 1
        $this->append($searchBuilder->getQuery());
157
        
158 1
        return $this;
159
    }
160
    
161
    /**
162
     * Get
163
     *
164
     * @return SearchResult
165
     */
166 1
    public function get() : SearchResult
167
    {
168 1
        return new SearchResult($this->getRaw());
169
    }
170
    
171
    /**
172
     * Get raw search result
173
     *
174
     * @return array
175
     */
176 1
    public function getRaw() : array
177
    {
178
        $params = [
179 1
            'index' => $this->getEsIndex(),
180 1
            'body' => $this->toDsl()
181
        ];
182
        
183 1
        if ($this->getEsType()) {
184 1
            $params['type'] = $this->getEsType();
185
        }
186
        
187 1
        return ElasticDsl::getEsClient()->search($params);
188
    }
189
    
190
    /**
191
     * Call
192
     *
193
     * @param string $name
194
     * @param array $arguments
195
     *
196
     * @return AbstractDsl|null
197
     */
198 1
    public function __call(string $name, array $arguments) : ?AbstractDsl
199
    {
200
        $validFunctions = [
201 1
            'termLevel',
202
            'fulltext',
203
            'geo',
204
            'compound',
205
            'joining',
206
            'specialized',
207
            'innerHit'
208
        ];
209
        
210 1
        if (in_array($name, $validFunctions)) {
211 1
            return ElasticDsl::search(
212 1
                $this->search,
213 1
                $this->getEsIndex(),
214 1
                $this->getEsType()
215 1
            )->$name();
216
        }
217
        
218
        return null;
219
    }
220
}
221