| Class | OpenWFE::GenericSyncExpression::MergeArray |
| In: |
lib/openwfe/expressions/fe_concurrence.rb
|
| Parent: | Object |
| merge | [RW] | |
| merge_type | [RW] | |
| synchable_fei | [RW] | |
| workitem | [RW] | |
| workitems_by_altitude | [RW] | |
| workitems_by_arrival | [RW] |
# File lib/openwfe/expressions/fe_concurrence.rb, line 510
510: def initialize (synchable_fei, merge, merge_type)
511:
512: @synchable_fei = synchable_fei
513:
514: @merge = merge
515: @merge_type = merge_type
516:
517: ensure_merge_settings
518:
519: @workitem = nil
520:
521: if highest? or lowest?
522: @workitems_by_arrival = []
523: @workitems_by_altitude = []
524: end
525: end
merges the workitems stored here
# File lib/openwfe/expressions/fe_concurrence.rb, line 581
581: def do_merge
582:
583: return @workitem if @workitem
584:
585: list = if first?
586: @workitems_by_arrival.reverse
587: elsif last?
588: @workitems_by_arrival
589: elsif highest?
590: @workitems_by_altitude.reverse
591: elsif lowest?
592: @workitems_by_altitude
593: end
594:
595: result = nil
596:
597: list.each do |wi|
598: next unless wi
599: result = merge_workitems result, wi, override?
600: end
601:
602: #puts "___ result :"
603: #puts result.to_s
604: #puts
605:
606: result
607: end
# File lib/openwfe/expressions/fe_concurrence.rb, line 527
527: def push (synchable, wi)
528:
529: #synchable.ldebug do
530: # "push() isolate? #{isolate?}"
531: #end
532:
533: if isolate?
534: push_in_isolation wi
535: elsif last? or first?
536: push_by_position wi
537: else
538: push_by_arrival wi
539: end
540: end
# File lib/openwfe/expressions/fe_concurrence.rb, line 568
568: def push_by_arrival (wi)
569:
570: #index = synchable.children.index wi.last_expression_id
571: #index = Integer(wi.last_expression_id.child_id)
572: index = Integer(get_child_id(wi))
573:
574: @workitems_by_arrival << wi
575: @workitems_by_altitude[index] = wi
576: end
# File lib/openwfe/expressions/fe_concurrence.rb, line 542
542: def push_by_position (wi)
543:
544: source, target = if first?
545: [ @workitem, wi ]
546: else
547: [ wi, @workitem ]
548: end
549: @workitem = merge_workitems target, source, override?
550: end
# File lib/openwfe/expressions/fe_concurrence.rb, line 552
552: def push_in_isolation (wi)
553:
554: unless @workitem
555: @workitem = wi.dup
556: att = @workitem.attributes
557: @workitem.attributes = {}
558: end
559:
560: #key = synchable.children.index wi.last_expression_id
561: #key = wi.last_expression_id.child_id
562: key = get_child_id wi
563:
564: @workitem.attributes[key.to_s] =
565: OpenWFE::fulldup(wi.attributes)
566: end
Making sure @merge and @merge_type are set to appropriate values.
# File lib/openwfe/expressions/fe_concurrence.rb, line 650
650: def ensure_merge_settings
651:
652: @merge_type = :mix unless override? or isolate?
653: @merge = :first unless last? or highest? or lowest?
654: end
# File lib/openwfe/expressions/fe_concurrence.rb, line 611
611: def first?
612: @merge == :first
613: end
Returns the child id of the expression that just replied with the given workitem.
# File lib/openwfe/expressions/fe_concurrence.rb, line 638
638: def get_child_id (workitem)
639:
640: return workitem.fei.child_id \
641: if workitem.fei.wfid == @synchable_fei.wfid
642:
643: workitem.fei.last_sub_instance_id
644: end
# File lib/openwfe/expressions/fe_concurrence.rb, line 617
617: def highest?
618: @merge == :highest
619: end
# File lib/openwfe/expressions/fe_concurrence.rb, line 630
630: def isolate?
631: @merge_type == :isolate
632: end
# File lib/openwfe/expressions/fe_concurrence.rb, line 614
614: def last?
615: @merge == :last
616: end
# File lib/openwfe/expressions/fe_concurrence.rb, line 620
620: def lowest?
621: @merge == :lowest
622: end
# File lib/openwfe/expressions/fe_concurrence.rb, line 624
624: def mix?
625: @merge_type == :mix
626: end