Skip to content

v9.5.0#2572

Merged
johngrimes merged 26 commits intomainfrom
release/9.5.0
Mar 17, 2026
Merged

v9.5.0#2572
johngrimes merged 26 commits intomainfrom
release/9.5.0

Conversation

@johngrimes
Copy link
Member

No description provided.

piotrszul and others added 21 commits March 6, 2026 10:51
The benchmark POM was referencing an outdated parent version, causing
build failures. Added benchmark/pom.xml to the version update checklist
to prevent future version drift.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Add the select(projection: expression) function to the FHIRPath engine,
which evaluates a projection expression for each item in the input
collection and flattens the results. This complements the existing
where() function by supporting element transformation rather than
filtering.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Adds the STU FHIRPath repeatAll() function which recursively evaluates a
projection expression on each item in the input collection, collecting
all results without deduplication. Uses Spark's Variant type as an
intermediate representation to handle schema divergence across nesting
levels in self-referential FHIR structures like Questionnaire.item.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Extract magic depth limit to named constant, make variantTransformTree()
delegate to variantUnwrap(), expose failOnError parameter in
UnresolvedVariantUnwrap, mark repeatAll with EXPERIMENTAL profile,
strengthen test assertions, and add clarifying comments.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
ResourceCollection.copyWith() was re-deriving the extension map from the
new column representation, which fails for non-resource structs (like
Extension) that lack the _extension field. This caused repeatAll(extension)
to only return top-level extensions, missing nested sub-extensions.

Added a private constructor that accepts an explicit extension map column,
and updated copyWith() to use it. Also consolidated RepeatAllFunctionDslTest
from 13 methods to 7 by chaining groups that share the same resource setup,
and refined the delta spec for same-type recursion depth scenarios.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
…or repeatAll()

Replace hardcoded same-type recursion depth with configurable maxExtensionDepth
via FhirpathConfiguration. Non-Extension same-type depth exhaustion now raises
an error instead of silently returning bounded results, catching infinite
recursion in expressions like repeatAll($this) or repeatAll(first()).

Support EvaluationContext injection in FHIRPath function parameter resolution
so that functions can access configuration without changing the public API.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
…cally

Expressions like gender.repeatAll($this) are genuinely infinite but were
silently returning truncated results due to a primitive type shortcut that
bypassed recursion detection. Replaced the shortcut with a static type
analysis gate that applies the traversal expression twice (level_0 and
level_1) to classify behavior before any tree traversal. Non-recursive
traversals now return level_0 directly for all types, and self-referential
primitives raise an immediate error with a distinct message.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
…ication

Add repeat() as a wrapper around repeatAll() that deduplicates results
using the collection's equality comparator. Only Equatable types with a
FHIRPath type (primitives, Coding, Quantity) are deduplicated; complex
backbone elements are returned as-is.

Add allowPrimitiveSelfRef parameter to repeatAll() so repeat() can
handle self-referential primitive traversal where deduplication
guarantees termination.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
…mprove error messages

The try-catch in mapChildren now only wraps the Catalyst resolution call,
preventing unrelated errors from being silently swallowed. Error messages
are made generic to work with both repeatAll() and repeat() functions.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
…repeat

Adds an explicit check for indeterminate FHIR types (empty getFhirType())
before the type consistency gate, preventing unresolved choice elements from
silently passing. Also treats resource types like primitives in the type
analysis gate, since they use boolean existence columns rather than structs.
Updates repeat() to suppress depth exhaustion errors via the allowSelfReference
flag, relying on deduplication for termination.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
The config parameter controlled depth for all repeat()/repeatAll()
traversals, not just Extensions. Renamed to align with the existing
QueryConfiguration.maxUnboundTraversalDepth naming. Also simplified
redundant instanceof Equatable check in Collection.repeat().

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
…tion

Wire QueryConfiguration.maxUnboundTraversalDepth through to FHIRPath
evaluation so repeat()/repeatAll() respect user-configured depth limits.
Align @min constraint to 1 on both config classes. Make ViewDefinition
repeat clause error on non-Extension depth exhaustion.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Cover unresolved state, withNewChildrenInternal, mapChildren resolution
with ArrayType and non-ArrayType schemas, and failOnError propagation.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Cover Variant-based tree traversal with schema divergence, depth
limiting, error-on-exhaustion, and direct Variant round-trip unwrapping.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Extract duplicated "unknown" literal into constant, replace lambdas
with method references, fix variable naming conventions, and remove
unnecessary public modifier on test class.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Add non-empty metadata to column aliases in Projection.renderColumn() to
prevent Spark's RemoveRedundantAliases rule from collapsing the Project
above Generate, which caused column shifting when collecting rows via
toPandas() or collectAsList().

Add integration tests using DatasetAssert.hasRows() in Java and exact
row assertions in Python to verify physical row data integrity.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
StructProduct's eval and doGenCode paths passed null as the dataType
when copying struct fields via InternalRow.get(), which crashed with NPE
for UnsafeRow (Tungsten format from createDataFrame). Fixed by passing
the actual field data types.

Restructured StructProduct tests to run in both codegen and interpreted
modes via an abstract base class, replacing the separate codegen-disabled
test method.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
The column transform in repeatAll() was derived from the input collection
(e.g. QuestionnaireResponse) instead of the level-0 result (e.g.
QuestionnaireResponseItemComponent). This caused union expressions like
repeat(item | answer.item) to fail because answer is not a valid path on
the resource type. The transform now operates on the recursive element
type where all paths in the expression are valid.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
@johngrimes johngrimes self-assigned this Mar 16, 2026
@johngrimes johngrimes added the release Pull request that represents a new release label Mar 16, 2026
@github-project-automation github-project-automation bot moved this to Backlog in Pathling Mar 16, 2026
Add documentation for the new projection and recursive traversal
functions introduced in PR #2566. Update the server configuration
reference with the maxUnboundTraversalDepth query parameter.
The v0.69.0 binary download was failing in CI, causing the
pre-release build to fail with "trivy: command not found".
Add jackson-core async parser DoS, ZooKeeper reverse DNS and config
disclosure CVEs to core .trivyignore (provided dependencies not
bundled). Add minimatch, dompurify, serialize-javascript and svgo
CVEs to site .trivyignore (build-time or unreachable in static site).
@johngrimes johngrimes merged commit ca7098e into main Mar 17, 2026
10 checks passed
@johngrimes johngrimes deleted the release/9.5.0 branch March 17, 2026 02:04
@github-project-automation github-project-automation bot moved this from Backlog to Done in Pathling Mar 17, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

release Pull request that represents a new release

Projects

Status: Done

Development

Successfully merging this pull request may close these issues.

2 participants