Passed
Pull Request — master (#1)
by Christopher
05:53
created

AbstractDsl::__call()   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 17
Code Lines 11

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 0
CRAP Score 6

Importance

Changes 0
Metric Value
cc 2
eloc 11
nc 2
nop 2
dl 0
loc 17
ccs 0
cts 5
cp 0
crap 6
rs 9.9
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 9
    public function append(BuilderInterface $query) : AbstractDsl
40
    {
41 9
        $this->search->addQuery($query, $this->boolState);
42 9
        return $this;
43
    }
44
    
45
    /**
46
     * Bool state: must
47
     *
48
     * @return AbstractDsl|Search|TermLevel|Compound|Fulltext|Geo|InnerHit|Joining|Specialized
49
     */
50
    public function must(): AbstractDsl
51
    {
52
        $this->boolState = BoolQuery::MUST;
53
        return $this;
54
    }
55
    
56
    /**
57
     * Bool state: must not
58
     *
59
     * @return AbstractDsl|Search|TermLevel|Compound|Fulltext|Geo|InnerHit|Joining|Specialized
60
     */
61
    public function mustNot(): AbstractDsl
62
    {
63
        $this->boolState = BoolQuery::MUST_NOT;
64
        return $this;
65
    }
66
    
67
    /**
68
     * Bool state: should
69
     *
70
     * @return AbstractDsl|Search|TermLevel|Compound|Fulltext|Geo|InnerHit|Joining|Specialized
71
     */
72
    public function should(): AbstractDsl
73
    {
74
        $this->boolState = BoolQuery::SHOULD;
75
        return $this;
76
    }
77
    
78
    /**
79
     * Bool state: filter
80
     *
81
     * @return AbstractDsl|Search|TermLevel|Compound|Fulltext|Geo|InnerHit|Joining|Specialized
82
     */
83
    public function filter(): AbstractDsl
84
    {
85
        $this->boolState = BoolQuery::FILTER;
86
        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
    public function paginate(int $page, int $limit = 25) : AbstractDsl
97
    {
98
        $this->search->setFrom($limit * ($page - 1))->setSize($limit);
99
        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
    public function sort(string $field, string $order = FieldSort::DESC, array $params = []) : AbstractDsl
123
    {
124
        $this->search->addSort(new FieldSort(
125
            $field,
126
            $order,
127
            $params
128
        ));
129
        
130
        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
    public function aggregation(\Closure $aggregation) : AbstractDsl
140
    {
141
        $aggregation(new Aggregation($this->search));
142
        return $this;
143
    }
144
    
145
    /**
146
     * Call
147
     *
148
     * @param string $name
149
     * @param array $arguments
150
     *
151
     * @return AbstractDsl|null
152
     */
153
    public function __call(string $name, array $arguments) : ?AbstractDsl
154
    {
155
        $validFunctions = [
156
            'termLevel',
157
            'fulltext',
158
            'geo',
159
            'compound',
160
            'joining',
161
            'specialized',
162
            'innerHit'
163
        ];
164
        
165
        if (in_array($name, $validFunctions)) {
166
            return ElasticDsl::search($this->search)->$name();
167
        }
168
        
169
        return null;
170
    }
171
}
172