Completed
Push — master ( 6e3b43...934df1 )
by Peter
08:14
created

ElasticSearchCursor   A

Complexity

Total Complexity 17

Size/Duplication

Total Lines 135
Duplicated Lines 0 %

Coupling/Cohesion

Components 1
Dependencies 2

Test Coverage

Coverage 72.21%

Importance

Changes 0
Metric Value
wmc 17
lcom 1
cbo 2
dl 0
loc 135
ccs 39
cts 54
cp 0.7221
rs 10
c 0
b 0
f 0

12 Methods

Rating   Name   Duplication   Size   Complexity  
A __construct() 0 9 2
A limit() 0 5 1
A skip() 0 5 1
A sort() 0 5 1
A fields() 0 5 1
A count() 0 5 1
A current() 0 5 1
A key() 0 5 1
A next() 0 5 1
A rewind() 0 5 1
A valid() 0 6 2
A execute() 0 32 4
1
<?php
2
3
/**
4
 * This software package is licensed under `AGPL-3.0-only, proprietary` license[s].
5
 *
6
 * @package maslosoft/manganel
7
 * @license AGPL-3.0-only, proprietary
8
 *
9
 * @copyright Copyright (c) Peter Maselkowski <[email protected]>
10
 * @link https://maslosoft.com/manganel/
11
 */
12
13
namespace Maslosoft\Manganel\Adapters\Finder;
14
15
use Maslosoft\Mangan\Interfaces\Adapters\FinderCursorInterface;
16
use Maslosoft\Manganel\Decorators\IndexDecorator;
17
use Maslosoft\Manganel\Decorators\MaxScoreDecorator;
18
use Maslosoft\Manganel\Decorators\ScoreDecorator;
19
use Maslosoft\Manganel\QueryBuilder;
20
use Maslosoft\Manganel\SearchCriteria;
21
22
/**
23
 * ElasticSearchCursor
24
 *
25
 * @author Piotr Maselkowski <pmaselkowski at gmail.com>
26
 */
27
class ElasticSearchCursor implements FinderCursorInterface
28
{
29
30
	/**
31
	 * Whether query was sent to search server
32
	 * @var bool
33
	 */
34
	private $isExecuted = false;
35
36
	/**
37
	 *
38
	 * @var QueryBuilder
39
	 */
40
	private $qb = null;
41
42
	/**
43
	 *
44
	 * @var array
45
	 */
46
	private $data = [];
47
48 60
	public function __construct(QueryBuilder $qb)
49
	{
50 60
		$this->qb = $qb;
51 60
		$criteria = $qb->getCriteria();
52 60
		if (empty($criteria))
53
		{
54
			$this->qb->setCriteria(new SearchCriteria());
55
		}
56 60
	}
57
58 47
	public function limit($num)
59
	{
60 47
		$this->qb->getCriteria()->limit($num);
61 47
		return $this;
62
	}
63
64 42
	public function skip($num)
65
	{
66 42
		$this->qb->getCriteria()->offset($num);
67 42
		return $this;
68
	}
69
70 48
	public function sort(array $fields)
71
	{
72 48
		$this->qb->getCriteria()->setSort($fields);
73 48
		return $this;
74
	}
75
76 1
	public function fields(array $fields)
77
	{
78 1
		$this->qb->getCriteria()->select($fields);
79 1
		return $this;
80
	}
81
82
// <editor-fold defaultstate="collapsed" desc="Countable impl">
83
84
	/**
85
	 *
86
	 * @return int
87
	 */
88 6
	public function count()
89
	{
90 6
		$this->execute();
91 6
		return count($this->data);
92
	}
93
94
// </editor-fold>
95
// <editor-fold defaultstate="collapsed" desc="Iterator impl">
96 7
	public function current()
97
	{
98 7
		$this->execute();
99 7
		return current($this->data);
100
	}
101
102
	public function key()
103
	{
104
		$this->execute();
105
		return key($this->data);
106
	}
107
108
	public function next()
109
	{
110
		$this->execute();
111
		next($this->data);
112
	}
113
114 47
	public function rewind()
115
	{
116 47
		$this->execute();
117 47
		return reset($this->data);
118
	}
119
120 47
	public function valid()
121
	{
122 47
		$this->execute();
123 47
		$key = key($this->data);
124 47
		return ($key !== null && $key !== false);
125
	}
126
127 60
	private function execute()
128
	{
129 60
		if (!$this->isExecuted)
130
		{
131 60
			$this->isExecuted = true;
132 60
			$results = [];
133 60
			$data = $this->qb->search(null, $results);
134
135
			// Something went wrong
136 60
			if(empty($result['hits']))
0 ignored issues
show
Bug introduced by
The variable $result seems only to be defined at a later point. As such the call to empty() seems to always evaluate to true.

This check marks calls to isset(...) or empty(...) that are found before the variable itself is defined. These will always have the same result.

This is likely the result of code being shifted around. Consider removing these calls.

Loading history...
137
			{
138 60
				$this->data = [];
139 60
				return;
140
			}
141
			$maxScore = $results['hits']['max_score'];
142
			foreach ($data as $result)
143
			{
144
				$document = $result['_source'];
145
				/**
146
				 * TODO Maybe refactor it into plugable interface, with params:
147
				 * $document,
148
				 * $result,
149
				 * $results
150
				 */
151
				$document[IndexDecorator::Key] = $result['_index'];
152
				$document[ScoreDecorator::Key] = $result['_score'];
153
				$document[MaxScoreDecorator::Key] = $maxScore;
154
155
				$this->data[] = $document;
156
			}
157
		}
158 47
	}
159
160
// </editor-fold>
161
}
162