Changeset 0a11f975ff365fd1126c45cad8b8e5f48ed94fc6
- Timestamp:
- 06/27/07 00:56:09 (19 months ago)
- Author:
- segfault <segfault@…>
- Parents:
- 85bd278bd86d778d6470d03712e0518ad48f49a7
- Children:
- 0f328931727ae67b2b7f9854942844792fdd24b2
- git-committer:
- segfault <segfault@72d81af0-b0fa-4b65-b54c-2b622d79b57a> / 2007-06-27T04:56:09Z+0000
- Message:
-
child segment parsing seems to work
re-worked the way child segments are printed
git-svn-id: svn://hasno.info/ruby-hl7/trunk@38 72d81af0-b0fa-4b65-b54c-2b622d79b57a
- Files:
-
Legend:
- Unmodified
- Added
- Removed
-
|
r5e6f05
|
r0a11f9
|
|
| 92 | 92 | |
| 93 | 93 | if block_given? |
| 94 | | blk.call |
| | 94 | blk.call self |
| 95 | 95 | end |
| 96 | 96 | end |
| … |
… |
|
| 123 | 123 | if index.kind_of?(Range) || index.kind_of?(Fixnum) |
| 124 | 124 | @segments[ index ] = value |
| | 125 | elsif index.respond_to?(:to_sym) |
| | 126 | (@segments_by_name[ index.to_sym ] ||= []) << value |
| 125 | 127 | else |
| 126 | | (@segments_by_name[ index.to_sym ] ||= []) << value |
| 127 | | end |
| | 128 | raise HL7::Exception.new( "attempting to use an indice that is not a Range, Fixnum or to_sym providing object" ) |
| | 129 | end |
| | 130 | |
| | 131 | value.parent = self |
| 128 | 132 | end |
| 129 | 133 | |
| … |
… |
|
| 146 | 150 | end |
| 147 | 151 | |
| | 152 | value.parent = self unless value.parent && value.parent == self # this limits us to two levels. |
| 148 | 153 | (@segments ||= []) << value |
| 149 | 154 | name = value.class.to_s.gsub("HL7::Message::Segment::", "").to_sym |
| … |
… |
|
| 180 | 185 | |
| 181 | 186 | # provide a screen-readable version of the message |
| 182 | | def to_s |
| 183 | | @segments.join( '\n' ) |
| | 187 | def to_s |
| | 188 | @segments.join( "\n" ) |
| 184 | 189 | end |
| 185 | 190 | |
| 186 | 191 | # provide a HL7 spec version of the message |
| 187 | 192 | def to_hl7 |
| 188 | | @segments.join( @segment_delim ) |
| | 193 | segs = @segments.collect { |s| s if s.to_s.length > 0 } |
| | 194 | segs.join( @segment_delim ) |
| 189 | 195 | end |
| 190 | 196 | |
| … |
… |
|
| 239 | 245 | raise HL7::ParseError.new unless ary.length > 0 |
| 240 | 246 | |
| | 247 | last_seg = nil |
| 241 | 248 | ary.each do |elm| |
| | 249 | last_seg = generate_segment( elm, last_seg ) |
| | 250 | end |
| | 251 | end |
| | 252 | |
| | 253 | def generate_segment( elm, last_seg ) |
| 242 | 254 | seg_parts = elm.split( @element_delim, -1 ) |
| 243 | 255 | raise HL7::ParseError.new unless seg_parts && (seg_parts.length > 0) |
| … |
… |
|
| 252 | 264 | end |
| 253 | 265 | new_seg = kls.new( elm ) |
| | 266 | ret = new_seg |
| | 267 | |
| | 268 | if last_seg && last_seg.respond_to?(:children) && last_seg.accepts?( seg_name ) |
| | 269 | last_seg.children << new_seg |
| | 270 | new_seg.is_child = true |
| | 271 | ret = last_seg |
| | 272 | end |
| | 273 | |
| 254 | 274 | @segments << new_seg |
| 255 | 275 | |
| … |
… |
|
| 260 | 280 | @segments_by_name[ seg_sym ] << new_seg |
| 261 | 281 | end |
| 262 | | end |
| 263 | | |
| | 282 | |
| | 283 | ret |
| 264 | 284 | end |
| 265 | 285 | end |
| … |
… |
|
| 284 | 304 | # |
| 285 | 305 | class HL7::Message::Segment |
| | 306 | attr :parent, true |
| 286 | 307 | attr :element_delim |
| 287 | 308 | attr :item_delim |
| … |
… |
|
| 295 | 316 | @element_delim = '|' |
| 296 | 317 | @field_total = 0 |
| | 318 | @is_child = false |
| 297 | 319 | |
| 298 | 320 | if (raw_segment.kind_of? Array) |
| … |
… |
|
| 369 | 391 | end |
| 370 | 392 | |
| | 393 | # sort-compare two Segments, 0 indicates equality |
| 371 | 394 | def <=>( other ) |
| 372 | 395 | return nil unless other.kind_of?(HL7::Message::Segment) |
| … |
… |
|
| 384 | 407 | end |
| 385 | 408 | |
| | 409 | |
| | 410 | # return true if the segment has a parent |
| | 411 | def is_child? |
| | 412 | (@is_child ||= false) |
| | 413 | end |
| | 414 | |
| | 415 | # indicate whether or not the segment has a parent |
| | 416 | def is_child=(val) |
| | 417 | @is_child = val |
| | 418 | end |
| | 419 | |
| | 420 | # get the length of the segment (number of fields it contains) |
| | 421 | def length |
| | 422 | 0 unless @elements |
| | 423 | @elements.length |
| | 424 | end |
| | 425 | |
| | 426 | |
| 386 | 427 | private |
| 387 | 428 | def self.singleton #:nodoc: |
| 388 | 429 | class << self; self end |
| 389 | 430 | end |
| 390 | | |
| 391 | 431 | |
| 392 | 432 | # DSL element to define a segment's sort weight |
| … |
… |
|
| 409 | 449 | # allows a segment to store other segment objects |
| 410 | 450 | # used to handle associated lists like one OBR to many OBX segments |
| 411 | | def self.has_children |
| | 451 | def self.has_children(child_types) |
| | 452 | @child_types = child_types |
| | 453 | define_method(:child_types) do |
| | 454 | @child_types |
| | 455 | end |
| | 456 | |
| 412 | 457 | self.class_eval do |
| 413 | 458 | define_method(:children) do |
| 414 | 459 | unless @my_children |
| | 460 | p = self |
| 415 | 461 | @my_children ||= [] |
| 416 | 462 | @my_children.instance_eval do |
| | 463 | @parental = p |
| 417 | 464 | alias :old_append :<< |
| 418 | 465 | |
| … |
… |
|
| 421 | 468 | raise HL7::Exception.new( "attempting to append non-segment to a segment list" ) |
| 422 | 469 | end |
| 423 | | |
| | 470 | |
| | 471 | value.parent = self |
| 424 | 472 | old_append( value ) |
| 425 | 473 | end |
| … |
… |
|
| 430 | 478 | end |
| 431 | 479 | |
| 432 | | alias :my_to_s :to_s |
| 433 | | define_method(:to_s) do |
| 434 | | out = my_to_s |
| 435 | | if @my_children |
| 436 | | @my_children.each do |seg| |
| 437 | | out << '\r' |
| 438 | | out << seg.to_s |
| 439 | | end |
| 440 | | end |
| 441 | | out |
| 442 | | end |
| 443 | | end |
| 444 | | |
| 445 | | end |
| | 480 | define_method('accepts?') do |t| |
| | 481 | t = t.to_sym if t && (t.to_s.length > 0) && t.respond_to?(:to_sym) |
| | 482 | child_types.index t |
| | 483 | end |
| | 484 | end |
| | 485 | end |
| 446 | 486 | |
| 447 | 487 | # define a field alias |
| … |
… |
|
| 531 | 571 | @elements = [] |
| 532 | 572 | |
| 533 | | |
| 534 | 573 | end |
| 535 | 574 | |
-
|
rab3b68
|
r0a11f9
|
|
| 3 | 3 | class HL7::Message::Segment::OBR < HL7::Message::Segment |
| 4 | 4 | weight 89 # obr.weight-1 |
| 5 | | has_children |
| | 5 | has_children [:OBX] |
| 6 | 6 | add_field :name=>:set_id |
| 7 | 7 | add_field :name=>:placer_order_number |
-
|
rab3b68
|
r0a11f9
|
|
| 3 | 3 | class HL7::Message::Segment::OBX < HL7::Message::Segment |
| 4 | 4 | weight 90 |
| | 5 | has_children [:NTE] |
| 5 | 6 | add_field :name=>:set_id |
| 6 | 7 | add_field :name=>:value_type |
-
|
r5e6f05
|
r0a11f9
|
|
| 41 | 41 | msg = HL7::Message.new |
| 42 | 42 | msg.parse @simple_msh_txt |
| 43 | | orig = @simple_msh_txt.gsub( /\r/, '\n' ) |
| | 43 | orig = @simple_msh_txt.gsub( /\r/, "\n" ) |
| 44 | 44 | assert_equal( orig, msg.to_s ) |
| 45 | 45 | end |
-
|
r85bd27
|
r0a11f9
|
|
| 15 | 15 | assert_equal( 3, msg[:OBR].length ) |
| 16 | 16 | assert_not_nil msg[:OBR].first.children |
| | 17 | assert_equal( 5, msg[:OBR].first.children.length ) |
| 17 | 18 | |
| 18 | 19 | msg[:OBR].first.children.each do |x| |
-
|
r772e02
|
r0a11f9
|
|
| 7 | 7 | OBX||FT|EXAM^MICROSCOPIC||GRAM POSITIVE COCCI IN GROUPS|| |
| 8 | 8 | |
| 9 | | |