JEP | 19 |
Author | Maxime Labelle |
Created | 29-October-2022 |
SemVer | MINOR |
Status | accepted |
This JEP introduces changes that outline the exact intended behaviour of evaluating a pipe-expression
. It also clarifies an ambiguity when evaluating a sub-expression
where the left-hand-side evaluates to null
.
The specification for sub-expression
outlines how it should be evaluated using pseudocode:
left-evaluation = search(left-expression, original-json-document)
result = search(right-expression, left-evaluation)
This is slightly ambiguous, as many compliance tests expect the result to be null
when the left-hand-side evaluates to null
. So, the real pseudocode shoud in fact be:
left-evaluation = search(left-expression, original-json-document)
if left-evaluation is `null` then result = `null`
else result = search(right-expression, left-evaluation)
In contrast, however, it seems intuitive for pipe-expression
to evaluate as was originally outlined by the first pseudocode fragment referred to a above.
left-evaluation = search(left-expression, original-json-document)
result = search(right-expression, left-evaluation)
Which means that the evaluation should still happens if the left-hand-side is null
.
The paragraph on sub expressions in the specification will be updated as follows, with changes outlined in bold:
A subexpression is evaluted as follows:
- Evaluate the expression on the left with the original JSON document.
- If the result of the left expression evaluation is
null
, returnnull
. - Otherwise, e
Evaluate the expression on the right with the result of the left expression evaluation.
In pseudocode:
left-evaluation = search(left-expression, original-json-document)
If result is `null` the result = `null`
else result = search(right-expression, left-evaluation)
Likewise the paragraph on pipe expressions in the specification will be updated as follows:
A pipe expression combines two expressions, separated by the | character. It is similar to a sub-expression with twothe following important distinctions:
- Any expression can be used on the right hand side. A
sub-expression
restricts the type of expression that can be used on the right hand side. - A
pipe-expression
stops projections on the left hand sideforfrom propagating to the right hand side. If the left expression creates a projection, it does not apply to the right hand side. - A
pipe-expression
evaluates the right expression unconditionally. Asub-expression
shortcuts evaluation if the result of the left expression evaluation isnull
In pseudocode:
left-evaluation = search(left-expression, original-json-document)
result = search(right-expression, left-evaluation)
Expression | Result |
---|---|
`null` . [@] |
null |
`null` | [@] |
[ null ] |
The pipe.json
compliance test file will be updated with the example from this JEP.