mbeckerle commented on code in PR #1137:
URL: https://github.com/apache/daffodil/pull/1137#discussion_r1462425576


##########
daffodil-core/src/main/scala/org/apache/daffodil/core/dpath/Expression.scala:
##########
@@ -744,21 +744,41 @@ 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.
+   */
+  lazy val isPathToOneWholeArrayOrOptional: Boolean = {
+    isNotRootOrSelf &&
+    (steps.last.isArray || steps.last.isOptional) &&
+    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.
+      step =>
+        if (step.isInstanceOf[Up]) true
+        else if (step.isArray) step.pred.isDefined // no special case to check 
for optional

Review Comment:
   To address @stevedlawrence original question, optionals do not need 
indexing. A path step that is the name of an optional element generates 
DownElement just like for a scalar. This is part of the clarification of what 
does isArray mean which is now distinct from isArrayOrOptional. This piece of 
code calls isArray and generates array downward steps, the else clause 
generates DownElement, and this use of isArray is the strong isArray which 
excludes optionals. 
   The DownElement RecipeOp has this comment:
   ```
   /**
    * Down to a non-array element. Can be **optional or scalar**.
    */
   case class DownElement(nqn: NamedQName) extends RecipeOp { 
   ...
   ```



-- 
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]

Reply via email to