Module: Trailblazer::Activity::DSL::Linear::Sequence::Compiler
- Defined in:
- lib/trailblazer/activity/dsl/linear/sequence/compiler.rb
Overview
Compile a Schema by computing implementations and intermediate from a Trailblazer::Activity::DSL::Linear::Sequence.
Class Method Summary collapse
- .call(sequence, find_stops: method(:find_termini), find_start: method(:find_start_task_id)) ⇒ Object
-
.find_connections(seq_row, searches, sequence) ⇒ Object
Execute all search strategies for a row, retrieve outputs and their respective target IDs.
-
.find_start_task_id(intermediate_wiring) ⇒ Object
The first task in the wiring is the default start task.
-
.find_termini(intermediate_wiring) ⇒ Object
Default strategy to find out what’s a stop event is to inspect the TaskRef’s :stop_event.
Class Method Details
.call(sequence, find_stops: method(:find_termini), find_start: method(:find_start_task_id)) ⇒ Object
23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 |
# File 'lib/trailblazer/activity/dsl/linear/sequence/compiler.rb', line 23 def call(sequence, find_stops: method(:find_termini), find_start: method(:find_start_task_id)) _implementations, intermediate_wiring = sequence.inject([[], []]) do |(implementations, intermediates), seq_row| _magnetic_to, task, connections, data = seq_row id = data[:id] # execute all {Search}s for one sequence row. connections = find_connections(seq_row, connections, sequence) # FIXME: {:extensions} should be initialized implementations += [[id, Schema::Implementation::Task(task, connections.collect { |output, _| output }, data[:extensions] || [])]] intermediates += [ [ Schema::Intermediate::TaskRef(id, data), # Compute outputs. connections.collect { |output, target_id| Schema::Intermediate::Out(output.semantic, target_id) } ] ] [implementations, intermediates] end start_task_id = find_start.(intermediate_wiring) terminus_to_semantic = find_stops.(intermediate_wiring) intermediate = Schema::Intermediate.new(intermediate_wiring.to_h, terminus_to_semantic, start_task_id) implementation = _implementations.to_h Schema::Intermediate::Compiler.(intermediate, implementation) # implemented in the generic {trailblazer-activity} gem. end |
.find_connections(seq_row, searches, sequence) ⇒ Object
Execute all search strategies for a row, retrieve outputs and their respective target IDs.
59 60 61 62 63 64 65 66 67 68 69 70 |
# File 'lib/trailblazer/activity/dsl/linear/sequence/compiler.rb', line 59 def find_connections(seq_row, searches, sequence) searches.collect do |search| output, target_seq_row = search.(sequence, seq_row) # invoke the node's "connection search" strategy. target_seq_row = sequence[-1] if target_seq_row.nil? # connect to an End if target unknown. # DISCUSS: make this configurable, maybe? [ output, target_seq_row.id ] end end |
.find_start_task_id(intermediate_wiring) ⇒ Object
The first task in the wiring is the default start task.
19 20 21 |
# File 'lib/trailblazer/activity/dsl/linear/sequence/compiler.rb', line 19 def find_start_task_id(intermediate_wiring) # FIXME: shouldn't we use sequence here? and Row#id? intermediate_wiring.first.first.id end |
.find_termini(intermediate_wiring) ⇒ Object
Default strategy to find out what’s a stop event is to inspect the TaskRef’s :stop_event.
11 12 13 14 15 16 |
# File 'lib/trailblazer/activity/dsl/linear/sequence/compiler.rb', line 11 def find_termini(intermediate_wiring) intermediate_wiring .find_all { |task_ref, _| task_ref.data[:stop_event] } .collect { |task_ref, _| [task_ref.id, task_ref.data.fetch(:semantic)] } .to_h end |