Smart navigation with the HL7 Groovy DSL

Accessing HL7 messages usually requires knowledge about the specified message structure, which is often not visible by looking at the printed message. To make things worse, the internal structure changes between HL7 versions. In more recent versions, primitive types are sometimes replaced with composite types having the so far used primitive as first component. This appears to be backwards compatible on printed messages, but requires different DSL expressions when obtaining field values.

Smart navigation resolves these problems by assuming reasonable defaults when repetitions or component operators are omitted

Omitting repetition operator

If a repetition operator () is omitted, the first repetition of a group, segment or field is assumed

    assert message.PATIENT_RESULT.PATIENT == message.PATIENT_RESULT(0).PATIENT(0)

    assert group.NK1(0)[5](0)[1].value == group.NK1[5](0)[1].value
    assert group.NK1(0)[5](0)[1].value == group.NK1[5][1].value

Omitting component index

If a component index is omitted, the first component or subcomponent of a composite is assumed.

    def group = message.PATIENT_RESULT.PATIENT
    assert group.NK1(0)[2][1][1].value == group.NK1(0)[2].value

Combining smart navigation with finders

Both repetition on component index can be omitted.

    def group = message.PATIENT_RESULT.PATIENT
    assert group.NK1(0)[5](0)[1].value2 == group.NK1[5].value2

But even so, it is still required to specify the full path to the NK1 segment.

Here, the iterative functions come to rescue. They e.g. allow to find the first structure with a given name within the message:

    def phone = message.PATIENT_RESULT(0).PATIENT(0).NK1(0)[5](0)[1].value
    phone = message.findNK1()[5].value    // equivalent