@@ -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}
0 commit comments