Skip to content

Commit 696a0a1

Browse files
committed
Advancer factory removed, cursor object introduced
1 parent 738792d commit 696a0a1

File tree

10 files changed

+187
-448
lines changed

10 files changed

+187
-448
lines changed

src/Pointer/Evaluate/Advancer.php

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,40 @@ public static function factory()
6565
}
6666

6767

68+
/**
69+
* @param Cursor $cursor
70+
* @return Advancer
71+
*/
72+
final public static function byCursorFactory(Cursor $cursor)
73+
{
74+
if (is_object($cursor->getData())) {
75+
return AdvancerProperty::factory();
76+
}
77+
if (is_array($cursor->getData())) {
78+
$reference = $cursor->getReference();
79+
switch ($reference->getType()) {
80+
case $reference::TYPE_NEXT_INDEX:
81+
return AdvancerNextIndex::factory();
82+
83+
case $reference::TYPE_INDEX:
84+
return AdvancerNumericIndex::factory();
85+
86+
case $reference::TYPE_PROPERTY:
87+
return AdvancerNonNumericIndex::factory();
88+
}
89+
$reference = $cursor->getReference();
90+
throw new DomainException(
91+
"Failed to create array index advancer for reference of type {$reference->getType()}"
92+
);
93+
}
94+
$reference = $cursor->getReference();
95+
throw new EvaluateException(
96+
"Cannot advance through non-structured data by reference '{$reference->getText()}'"
97+
);
98+
99+
}
100+
101+
68102
public function setDataCursor(&$dataCursor)
69103
{
70104
$this->dataCursor = &$dataCursor;

src/Pointer/Evaluate/Cursor.php

Lines changed: 85 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,85 @@
1+
<?php
2+
3+
namespace Remorhaz\JSONPointer\Pointer\Evaluate;
4+
5+
use Remorhaz\JSONPointer\Locator\Reference;
6+
7+
class Cursor
8+
{
9+
10+
/**
11+
* @var mixed
12+
*/
13+
protected $data;
14+
15+
/**
16+
* @var bool
17+
*/
18+
protected $isDataSet = false;
19+
20+
/**
21+
* @var Reference|null
22+
*/
23+
protected $reference;
24+
25+
26+
protected function __construct()
27+
{
28+
}
29+
30+
31+
/**
32+
* @return static
33+
*/
34+
public static function factory()
35+
{
36+
return new static();
37+
}
38+
39+
40+
/**
41+
* @param Reference $reference
42+
* @return $this
43+
*/
44+
public function setReference(Reference $reference)
45+
{
46+
$this->reference = $reference;
47+
return $this;
48+
}
49+
50+
51+
/**
52+
* @return Reference
53+
*/
54+
public function getReference()
55+
{
56+
if (null === $this->reference) {
57+
throw new LogicException("Reference is not set in cursor");
58+
}
59+
return $this->reference;
60+
}
61+
62+
63+
/**
64+
* @param mixed $data
65+
* @return $this
66+
*/
67+
public function setData(&$data)
68+
{
69+
$this->data = &$data;
70+
$this->isDataSet = true;
71+
return $this;
72+
}
73+
74+
75+
/**
76+
* @return mixed
77+
*/
78+
public function &getData()
79+
{
80+
if (!$this->isDataSet) {
81+
throw new LogicException("Data is not set in cursor");
82+
}
83+
return $this->data;
84+
}
85+
}

src/Pointer/Evaluate/LocatorEvaluate.php

Lines changed: 45 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ abstract class LocatorEvaluate
4444
/**
4545
* Link to data for the reference being evaluated..
4646
*
47-
* @var mixed
47+
* @var Cursor|null
4848
*/
4949
protected $dataCursor;
5050

@@ -61,9 +61,9 @@ abstract class LocatorEvaluate
6161
protected $referenceEvaluate;
6262

6363
/**
64-
* @var ReferenceEvaluateFactory|null
64+
* @var bool
6565
*/
66-
protected $referenceEvaluateFactory;
66+
protected $nonNumericIndices = false;
6767

6868

6969
/**
@@ -186,18 +186,14 @@ public function &getResult()
186186

187187
public function allowNonNumericIndices()
188188
{
189-
$this
190-
->getReferenceEvaluateFactory()
191-
->allowNonNumericIndices();
189+
$this->nonNumericIndices = true;
192190
return $this;
193191
}
194192

195193

196194
public function forbidNonNumericIndices()
197195
{
198-
$this
199-
->getReferenceEvaluateFactory()
200-
->forbidNonNumericIndices();
196+
$this->nonNumericIndices = false;
201197
return $this;
202198
}
203199

@@ -210,16 +206,21 @@ public function forbidNonNumericIndices()
210206
*/
211207
public function perform()
212208
{
213-
$this->dataCursor = &$this->getData();
209+
//$this->dataCursor = &$this->getData();
210+
$this->dataCursor = Cursor::factory()
211+
->setData($this->getData());
214212
$this->resetResult();
215213
foreach ($this->getLocator()->getReferenceList() as $reference) {
216-
$this->processReference($reference);
214+
$this
215+
->dataCursor
216+
->setReference($reference);
217+
$this->processReference();
217218
if ($this->isResultSet) {
218219
break;
219220
}
220221
}
221222
if (!$this->isResultSet) {
222-
$this->processCursor();
223+
$this->processLocator();
223224
}
224225
if (!$this->isResultSet) {
225226
throw new LogicException("Data evaluation failed");
@@ -228,44 +229,36 @@ public function perform()
228229
}
229230

230231

231-
/**
232-
* @return ReferenceEvaluateFactory
233-
*/
234-
abstract protected function createReferenceEvaluateFactory();
235-
236-
237-
/**
238-
* @return ReferenceEvaluateFactory
239-
*/
240-
protected function getReferenceEvaluateFactory()
232+
protected function setEvaluateForReference()
241233
{
242-
if (null === $this->referenceEvaluateFactory) {
243-
$this->referenceEvaluateFactory = $this->createReferenceEvaluateFactory();
244-
}
245-
return $this->referenceEvaluateFactory;
246-
}
247-
248-
249-
protected function setupReferenceEvaluateFactory(Reference $reference)
250-
{
251-
$this
252-
->getReferenceEvaluateFactory()
234+
$reference = $this
235+
->dataCursor
236+
->getReference();
237+
$this->referenceEvaluate = $this
238+
->createReferenceEvaluate()
239+
->setAdvancer($this->createAdvancerForReference())
253240
->setReference($reference)
254-
->setDataCursor($this->dataCursor);
241+
->setDataCursor($this->dataCursor->getData());
255242
return $this;
256243
}
257244

258245

259-
protected function setEvaluateForReference(Reference $reference)
246+
protected function createAdvancerForReference()
260247
{
261-
$this->referenceEvaluate = $this
262-
->setupReferenceEvaluateFactory($reference)
263-
->getReferenceEvaluateFactory()
264-
->createEvaluate();
265-
return $this;
248+
$advancer = Advancer::byCursorFactory($this->dataCursor);
249+
if ($advancer instanceof AdvancerNonNumericIndex && $this->nonNumericIndices) {
250+
$advancer->allow();
251+
}
252+
return $advancer;
266253
}
267254

268255

256+
/**
257+
* @return ReferenceAdvanceable
258+
*/
259+
abstract protected function createReferenceEvaluate();
260+
261+
269262
/**
270263
* @return ReferenceEvaluate
271264
* @throws LogicException
@@ -280,15 +273,17 @@ protected function getReferenceEvaluate()
280273

281274

282275
/**
283-
* @param Reference $reference
284276
* @return $this
285277
* @throws EvaluateException
286278
*/
287-
protected function processReference(Reference $reference)
279+
protected function processReference()
288280
{
289281
try {
290-
$this->processReferenceEvaluate($reference);
282+
$this->processReferenceEvaluate();
291283
} catch (EvaluateException $e) {
284+
$reference = $this
285+
->dataCursor
286+
->getReference();
292287
throw new EvaluateException(
293288
"Error evaluating data for path '{$reference->getPath()}': {$e->getMessage()}",
294289
null,
@@ -299,15 +294,18 @@ protected function processReference(Reference $reference)
299294
}
300295

301296

302-
protected function processReferenceEvaluate(Reference $reference)
297+
protected function processReferenceEvaluate()
303298
{
304299
$this
305-
->setEvaluateForReference($reference)
300+
->setEvaluateForReference()
306301
->getReferenceEvaluate()
307302
->perform();
308-
$this->dataCursor = &$this
303+
$data = &$this
309304
->getReferenceEvaluate()
310305
->getDataCursor();
306+
$this
307+
->dataCursor
308+
->setData($data);
311309
$isReferenceResultSet = $this
312310
->getReferenceEvaluate()
313311
->isResultSet();
@@ -321,5 +319,5 @@ protected function processReferenceEvaluate(Reference $reference)
321319
}
322320

323321

324-
abstract protected function processCursor();
322+
abstract protected function processLocator();
325323
}

src/Pointer/Evaluate/LocatorRead.php

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,14 +8,14 @@ class LocatorRead extends LocatorEvaluate
88
{
99

1010

11-
protected function processCursor()
11+
protected function processLocator()
1212
{
13-
return $this->setResult($this->dataCursor);
13+
return $this->setResult($this->dataCursor->getData());
1414
}
1515

1616

17-
protected function createReferenceEvaluateFactory()
17+
protected function createReferenceEvaluate()
1818
{
19-
return ReferenceReadFactory::factory();
19+
return ReferenceRead::factory();
2020
}
2121
}

src/Pointer/Evaluate/LocatorTest.php

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,15 +8,15 @@ class LocatorTest extends LocatorEvaluate
88
{
99

1010

11-
protected function processCursor()
11+
protected function processLocator()
1212
{
1313
$result = true;
1414
return $this->setResult($result);
1515
}
1616

1717

18-
protected function createReferenceEvaluateFactory()
18+
protected function createReferenceEvaluate()
1919
{
20-
return ReferenceTestFactory::factory();
20+
return ReferenceTest::factory();
2121
}
2222
}

0 commit comments

Comments
 (0)