stevedlawrence commented on code in PR #1137:
URL: https://github.com/apache/daffodil/pull/1137#discussion_r1465298376
##########
daffodil-core/src/main/scala/org/apache/daffodil/core/dpath/Expression.scala:
##########
@@ -744,21 +753,45 @@ abstract class PathExpression() extends Expression {
* about an array such as its current count.
*/
lazy val isPathToOneWholeArray: Boolean = {
- if (steps == Nil) false // root is never an array
+ isNotRootOrSelf &&
+ steps.last.isArray &&
+ priorStepsHaveIndexingPredicates
+ }
+
+ /**
+ * Path to a single array element without a [N] predicate qualifying it
+ * or to an optional element.
+ *
+ * That is, the kind of path expression used to access information
+ * about an array or optional such as its current count.
+ */
+ override lazy val isPathToOneWholeArrayOrOptional: Boolean = {
+ isNotRootOrSelf &&
+ steps.last.isArrayOrOptional &&
+ priorStepsHaveIndexingPredicates
+ }
+
+ private lazy val isNotRootOrSelf: Boolean = {
if (steps == Nil) false // root is never an array
else if (isSelf) false // self path is never an array
- else
- steps.last.isArray &&
- !steps.last.pred.isDefined && // last cannot have a [N] pred
- steps.dropRight(1).forall {
- // for all the prior steps
- // if they mention an array element, there
- // must be a [N] predicate.
- step =>
- if (step.isInstanceOf[Up]) true
- else if (step.isArray) step.pred.isDefined
- else true
- }
+ else true
+ }
+
+ private lazy val priorStepsHaveIndexingPredicates: Boolean = {
+ steps.last.pred.isEmpty && // last cannot have a [N] pred
+ steps.dropRight(1).forall {
+ // for all the prior steps
+ // if they mention an array element, there
+ // must be a [N] predicate.
+ // neither Up (..) nor Self (.) steps should have indexing
+ step =>
+ if (step.isInstanceOf[Up]) true
+ else if (step.isInstanceOf[Up2]) SDE("Up2 step must not have indexing")
+ else if (step.isInstanceOf[Self]) SDE("Self step must not have
indexing")
+ else if (step.isInstanceOf[Self2]) SDE("Self2 step must not have
indexing")
Review Comment:
It might be cleaner to write this as a match/case, we can also combine
Up/Up2 with the parent UpStepExpression and similarly for Self/Self2. Maybe
something like this:
```scala
step match {
case _: UpStepExpression => SDE("up step must not have indexing")
case _: SelfStepExpression => SDE("self step must not have indexing")
case _ => !step.isArray || step.pred.isDefined
}
```
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: [email protected]
For queries about this service, please contact Infrastructure at:
[email protected]