Skip to content

Commit 53f721c

Browse files
committed
Old reference and data assignments replaced with cursor object
1 parent 696a0a1 commit 53f721c

File tree

10 files changed

+114
-179
lines changed

10 files changed

+114
-179
lines changed

src/Pointer/Evaluate/Advancer.php

Lines changed: 33 additions & 62 deletions
Original file line numberDiff line numberDiff line change
@@ -7,19 +7,10 @@
77
abstract class Advancer
88
{
99

10-
11-
protected $dataCursor;
12-
13-
protected $isDataCursorSet = false;
14-
15-
protected $newDataCursor;
16-
17-
protected $isNewDataCursorSet = false;
18-
1910
/**
20-
* @var Reference|null
11+
* @var Cursor|null
2112
*/
22-
protected $reference;
13+
protected $cursor;
2314

2415

2516
protected function __construct()
@@ -45,23 +36,20 @@ abstract public function advance();
4536
abstract public function write($data);
4637

4738

48-
public function canWrite()
49-
{
50-
return $this
51-
->getReference()
52-
->isLast();
53-
}
54-
5539
/**
5640
* @return $this
5741
* @throws EvaluateException
5842
*/
5943
abstract public function fail();
6044

6145

62-
public static function factory()
46+
protected static function factory(Cursor $cursor = null)
6347
{
64-
return new static();
48+
$advancer = new static();
49+
if (null !== $cursor) {
50+
$advancer->setCursor($cursor);
51+
}
52+
return $advancer;
6553
}
6654

6755

@@ -72,86 +60,69 @@ public static function factory()
7260
final public static function byCursorFactory(Cursor $cursor)
7361
{
7462
if (is_object($cursor->getData())) {
75-
return AdvancerProperty::factory();
63+
return AdvancerProperty::factory($cursor);
7664
}
7765
if (is_array($cursor->getData())) {
7866
$reference = $cursor->getReference();
7967
switch ($reference->getType()) {
8068
case $reference::TYPE_NEXT_INDEX:
81-
return AdvancerNextIndex::factory();
69+
return AdvancerNextIndex::factory($cursor);
8270

8371
case $reference::TYPE_INDEX:
84-
return AdvancerNumericIndex::factory();
72+
return AdvancerNumericIndex::factory($cursor);
8573

8674
case $reference::TYPE_PROPERTY:
87-
return AdvancerNonNumericIndex::factory();
75+
return AdvancerNonNumericIndex::factory($cursor);
8876
}
8977
$reference = $cursor->getReference();
9078
throw new DomainException(
91-
"Failed to create array index advancer for reference of type {$reference->getType()}"
79+
"Failed to create array index advancer for reference '{$reference->getText()}' " .
80+
"of type {$reference->getType()}"
9281
);
9382
}
9483
$reference = $cursor->getReference();
9584
throw new EvaluateException(
9685
"Cannot advance through non-structured data by reference '{$reference->getText()}'"
9786
);
98-
99-
}
100-
101-
102-
public function setDataCursor(&$dataCursor)
103-
{
104-
$this->dataCursor = &$dataCursor;
105-
$this->isDataCursorSet = true;
106-
return $this;
107-
}
108-
109-
110-
protected function &getDataCursor()
111-
{
112-
if (!$this->isDataCursorSet) {
113-
throw new LogicException("Data cursor is not set in advancer object");
114-
}
115-
return $this->dataCursor;
11687
}
11788

11889

119-
protected function setNewDataCursor(&$dataCursor)
90+
/**
91+
* @param Cursor $cursor
92+
* @return $this
93+
*/
94+
public function setCursor(Cursor $cursor)
12095
{
121-
$this->newDataCursor = &$dataCursor;
122-
$this->isNewDataCursorSet = true;
96+
$this->cursor = $cursor;
12397
return $this;
12498
}
12599

126100

127-
public function &getNewDataCursor()
101+
/**
102+
* @return Cursor
103+
*/
104+
public function getCursor()
128105
{
129-
if (!$this->isNewDataCursorSet) {
130-
throw new LogicException("Data cursor is not set in advancer object");
106+
if (null === $this->cursor) {
107+
throw new LogicException("Cursor is not set in advancer");
131108
}
132-
return $this->newDataCursor;
109+
return $this->cursor;
133110
}
134111

135112

136-
public function setReference(Reference $reference)
137-
{
138-
$this->reference = $reference;
139-
return $this;
140-
}
141-
142-
143-
protected function getReference()
113+
public function canWrite()
144114
{
145-
if (null === $this->reference) {
146-
throw new LogicException("Reference is not set in advancer object");
147-
}
148-
return $this->reference;
115+
return $this
116+
->getCursor()
117+
->getReference()
118+
->isLast();
149119
}
150120

151121

152122
public function getValue()
153123
{
154124
return $this
125+
->getCursor()
155126
->getReference()
156127
->getValue();
157128
}

src/Pointer/Evaluate/AdvancerIndex.php

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,19 +8,25 @@ abstract class AdvancerIndex extends Advancer
88

99
public function canAdvance()
1010
{
11-
return array_key_exists($this->getValue(), $this->getDataCursor());
11+
return array_key_exists($this->getValue(), $this->getCursor()->getData());
1212
}
1313

1414

1515
public function advance()
1616
{
17-
return $this->setNewDataCursor($this->dataCursor[$this->getValue()]);
17+
$data = &$this
18+
->getCursor()
19+
->getData()[$this->getValue()];
20+
$this
21+
->getCursor()
22+
->setData($data);
23+
return $this;
1824
}
1925

2026

2127
public function write($data)
2228
{
23-
$this->dataCursor[$this->getValue()] = $data;
29+
$this->getCursor()->getData()[$this->getValue()] = $data;
2430
return $this;
2531
}
2632

src/Pointer/Evaluate/AdvancerNextIndex.php

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,9 @@ public function advance()
2020

2121
public function write($data)
2222
{
23-
$this->dataCursor[] = $data;
23+
$this
24+
->getCursor()
25+
->getData()[] = $data;
2426
return $this;
2527
}
2628

src/Pointer/Evaluate/AdvancerNumericIndex.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ public function canWrite()
4343
return true;
4444
}
4545
return
46-
0 == $this->getValue() && empty($this->getDataCursor()) ||
47-
array_key_exists($this->getValue() - 1, $this->getDataCursor());
46+
0 == $this->getValue() && empty($this->getCursor()->getData()) ||
47+
array_key_exists($this->getValue() - 1, $this->getCursor()->getData());
4848
}
4949
}

src/Pointer/Evaluate/AdvancerProperty.php

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,19 +8,29 @@ class AdvancerProperty extends Advancer
88

99
public function canAdvance()
1010
{
11-
return property_exists($this->getDataCursor(), $this->getValue());
11+
return property_exists($this->getCursor()->getData(), $this->getValue());
1212
}
1313

1414

1515
public function advance()
1616
{
17-
return $this->setNewDataCursor($this->dataCursor->{$this->getValue()});
17+
$data = &$this
18+
->getCursor()
19+
->getData()
20+
->{$this->getValue()};
21+
$this
22+
->getCursor()
23+
->setData($data);
24+
return $this;
1825
}
1926

2027

2128
public function write($data)
2229
{
23-
$this->dataCursor->{$this->getValue()} = $data;
30+
$this
31+
->getCursor()
32+
->getData()
33+
->{$this->getValue()} = $data;
2434
return $this;
2535
}
2636

src/Pointer/Evaluate/LocatorEvaluate.php

Lines changed: 47 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ abstract class LocatorEvaluate
4646
*
4747
* @var Cursor|null
4848
*/
49-
protected $dataCursor;
49+
protected $cursor;
5050

5151
/**
5252
* Evaluation result.
@@ -56,7 +56,7 @@ abstract class LocatorEvaluate
5656
protected $result;
5757

5858
/**
59-
* @var ReferenceEvaluate|null
59+
* @var ReferenceAdvanceable|null
6060
*/
6161
protected $referenceEvaluate;
6262

@@ -184,6 +184,30 @@ public function &getResult()
184184
}
185185

186186

187+
protected function setCursor(Cursor $cursor)
188+
{
189+
$this->cursor = $cursor;
190+
return $this;
191+
}
192+
193+
194+
protected function getCursor()
195+
{
196+
if (null === $this->cursor) {
197+
throw new LogicException("Cursor is not set in reference evaluator");
198+
}
199+
return $this->cursor;
200+
}
201+
202+
203+
protected function resetCursor()
204+
{
205+
$cursor = Cursor::factory()
206+
->setData($this->getData());
207+
return $this->setCursor($cursor);
208+
}
209+
210+
187211
public function allowNonNumericIndices()
188212
{
189213
$this->nonNumericIndices = true;
@@ -206,15 +230,13 @@ public function forbidNonNumericIndices()
206230
*/
207231
public function perform()
208232
{
209-
//$this->dataCursor = &$this->getData();
210-
$this->dataCursor = Cursor::factory()
211-
->setData($this->getData());
212-
$this->resetResult();
213-
foreach ($this->getLocator()->getReferenceList() as $reference) {
214-
$this
215-
->dataCursor
216-
->setReference($reference);
217-
$this->processReference();
233+
$referenceList = $this
234+
->resetCursor()
235+
->resetResult()
236+
->getLocator()
237+
->getReferenceList();
238+
foreach ($referenceList as $reference) {
239+
$this->processReference($reference);
218240
if ($this->isResultSet) {
219241
break;
220242
}
@@ -229,23 +251,21 @@ public function perform()
229251
}
230252

231253

232-
protected function setEvaluateForReference()
254+
protected function setupReferenceEvaluate()
233255
{
234-
$reference = $this
235-
->dataCursor
236-
->getReference();
237256
$this->referenceEvaluate = $this
238257
->createReferenceEvaluate()
239-
->setAdvancer($this->createAdvancerForReference())
240-
->setReference($reference)
241-
->setDataCursor($this->dataCursor->getData());
258+
->setAdvancer($this->createAdvancerForCursor())
259+
//->setReference($this->getCursor()->getReference())
260+
//->setDataCursor($this->getCursor()->getData())
261+
;
242262
return $this;
243263
}
244264

245265

246-
protected function createAdvancerForReference()
266+
protected function createAdvancerForCursor()
247267
{
248-
$advancer = Advancer::byCursorFactory($this->dataCursor);
268+
$advancer = Advancer::byCursorFactory($this->getCursor());
249269
if ($advancer instanceof AdvancerNonNumericIndex && $this->nonNumericIndices) {
250270
$advancer->allow();
251271
}
@@ -260,7 +280,7 @@ abstract protected function createReferenceEvaluate();
260280

261281

262282
/**
263-
* @return ReferenceEvaluate
283+
* @return ReferenceAdvanceable
264284
* @throws LogicException
265285
*/
266286
protected function getReferenceEvaluate()
@@ -273,17 +293,18 @@ protected function getReferenceEvaluate()
273293

274294

275295
/**
296+
* @param Reference $reference
276297
* @return $this
277298
* @throws EvaluateException
278299
*/
279-
protected function processReference()
300+
protected function processReference(Reference $reference)
280301
{
281302
try {
303+
$this
304+
->getCursor()
305+
->setReference($reference);
282306
$this->processReferenceEvaluate();
283307
} catch (EvaluateException $e) {
284-
$reference = $this
285-
->dataCursor
286-
->getReference();
287308
throw new EvaluateException(
288309
"Error evaluating data for path '{$reference->getPath()}': {$e->getMessage()}",
289310
null,
@@ -297,15 +318,9 @@ protected function processReference()
297318
protected function processReferenceEvaluate()
298319
{
299320
$this
300-
->setEvaluateForReference()
321+
->setupReferenceEvaluate()
301322
->getReferenceEvaluate()
302323
->perform();
303-
$data = &$this
304-
->getReferenceEvaluate()
305-
->getDataCursor();
306-
$this
307-
->dataCursor
308-
->setData($data);
309324
$isReferenceResultSet = $this
310325
->getReferenceEvaluate()
311326
->isResultSet();

0 commit comments

Comments
 (0)