@@ -66,9 +66,11 @@ private FixPath(final String[] path) {
66
66
/*package-private*/ Value findIn (final Array array ) {
67
67
68
68
final Value result ;
69
- if (path .length > 0 ) {
69
+ if (path .length == 0 ) {
70
+ result = new Value (array );
71
+ }
72
+ else {
70
73
final String currentSegment = path [0 ];
71
- final ReservedField reservedField = ReservedField .fromString (currentSegment );
72
74
if (currentSegment .equals (ASTERISK )) {
73
75
result = Value .newArray (resultArray -> array .forEach (v -> {
74
76
final Value findInValue = findInValue (v , tail (path ));
@@ -80,23 +82,10 @@ private FixPath(final String[] path) {
80
82
}
81
83
}));
82
84
}
83
- else if (reservedField != null ) {
84
- switch (reservedField ) {
85
- case $first :
86
- result = findInValue (array .get (0 ), tail (path ));
87
- break ;
88
- case $last :
89
- result = findInValue (array .get (array .size () - 1 ), tail (path ));
90
- break ;
91
- default :
92
- result = null ;
93
- break ;
94
- }
95
- }
96
- else if (Value .isNumber (currentSegment )) {
97
- final int index = Integer .parseInt (currentSegment ) - 1 ; // TODO: 0-based Catmandu vs. 1-based Metafacture
98
- if (index >= 0 && index < array .size ()) {
99
- result = findInValue (array .get (index ), tail (path ));
85
+ else if (isReference (currentSegment )) {
86
+ final Value referencedValue = getReferencedValue (array , currentSegment );
87
+ if (referencedValue != null ) {
88
+ result = findInValue (referencedValue , tail (path ));
100
89
}
101
90
else {
102
91
result = null ;
@@ -107,9 +96,6 @@ else if (Value.isNumber(currentSegment)) {
107
96
result = Value .newArray (a -> array .forEach (v -> a .add (findInValue (v , path ))));
108
97
}
109
98
}
110
- else {
111
- result = new Value (array );
112
- }
113
99
return result ;
114
100
115
101
}
@@ -354,24 +340,27 @@ private boolean isReference(final String field) {
354
340
// TODO replace switch, extract to method on array?
355
341
private Value getReferencedValue (final Array array , final String field ) {
356
342
Value referencedValue = null ;
357
- final ReservedField reservedField = ReservedField . fromString (field );
358
- if ( reservedField == null && Value . isNumber (field )) {
359
- return array .get ( Integer . valueOf ( field ) - 1 ) ;
343
+ if ( Value . isNumber (field )) {
344
+ final int index = Integer . valueOf (field ) - 1 ;
345
+ return 0 <= index && index < array .size () ? array . get ( index ) : null ;
360
346
}
361
- switch (reservedField ) {
362
- case $first :
363
- referencedValue = array .get (0 );
364
- break ;
365
- case $last :
366
- referencedValue = array .get (array .size () - 1 );
367
- break ;
368
- case $append :
369
- referencedValue = Value .newHash (); // TODO: append non-hash?
370
- array .add (referencedValue );
371
- referencedValue .updatePathAppend (String .valueOf (array .size ()), "" );
372
- break ;
373
- default :
374
- break ;
347
+ final ReservedField reservedField = ReservedField .fromString (field );
348
+ if (reservedField != null ) {
349
+ switch (reservedField ) {
350
+ case $first :
351
+ referencedValue = array .get (0 );
352
+ break ;
353
+ case $last :
354
+ referencedValue = array .get (array .size () - 1 );
355
+ break ;
356
+ case $append :
357
+ referencedValue = Value .newHash (); // TODO: append non-hash?
358
+ array .add (referencedValue );
359
+ referencedValue .updatePathAppend (String .valueOf (array .size ()), "" );
360
+ break ;
361
+ default :
362
+ break ;
363
+ }
375
364
}
376
365
return referencedValue ;
377
366
}
0 commit comments