Control / flow · All operations
Branch or loop
Branch, loop, iterate, conditional execution, wait.
Status
- In arcform
Not built yet
arcform does not do this yet; it would live in how a Protocol runs. Its place on the roadmap
- Shape of the result
- not a data operation
- Level
- not a step
Variants
- Branch on a condition
Send the data or the run down one of several paths according to a condition, and merge the paths back afterwards.
- Copy a stream to several branches
Send the same rows to several downstream branches, each getting a full copy.
- Run steps once per item
Run a set of steps once for each row, value, column, group, chunk or table, and collect the results.
- Act on an empty input
Do something different when the input has no rows: emit a placeholder row, switch branch or take another table.
- Wait for upstream steps to finish
Hold a step until chosen upstream steps or all input rows have finished, to fix the order in which work runs.
- Run branches in parallel
Run several branches or partitions of the data at the same time and gather their results.
- Pause for a set time
Hold the run or each row for a fixed time before carrying on.
- Repeat until a condition is met
Run a set of steps a fixed number of times, or again and again until a condition is met.
- Limit the rate of rows
Pass rows downstream no faster than a set number per second or minute.
- Wait for a file, table or signal
Hold the run until a file, table, query result or release signal appears, or a time-out passes.
Work with collections of tables or lists
Gather, flatten, pick from or filter a collection of tables or a list of items that a loop or macro works over.
Placeholder step
Pass rows through unchanged, as a junction or stand-in in the layout of a flow.
Skip or stop on a condition
Skip the remaining steps, halt the run or flip a branch inactive when a condition holds.
What other tools call it
Meridian's classification; an independent blind rating agreed on 86.2% of 312 rows (exact class, version 2).
Alteryx Designer (7)
Block Until Doneread 2026-09-27Hold records until upstream finishes, then release to output streams one at a time
Conditionread 2026-09-27Test entered values in an app or macro and branch on true or false
Control Containerread 2026-09-27Run a group of tools only on a signal, to set the order of execution in a workflow
Control Parameterread 2026-09-27Input of a batch macro: the macro is reconfigured and rerun for each incoming record
Detourread 2026-09-27Bypass a section of a workflow by a switch, for apps and macros
Detour Endread 2026-09-27Rejoin the two paths of an upstream Detour into one stream
Throttleread 2026-09-27Limit the number of records passed per minute to downstream tools
Apache Hop (14)
Blocking transformread 2026-09-27Hold all output until the last input row has arrived, optionally passing every row
Blocking until transforms finishread 2026-09-27Wait until named transform copies have finished before passing rows on
Delay rowread 2026-09-27Pause for a set time before passing each row on
Detect Empty Streamread 2026-09-27Emit one empty row when the input stream has no rows
Dummyread 2026-09-27Do nothing; a placeholder or junction in the workflow layout
Dummy (do nothing)read 2026-09-27Pass rows through unchanged; a placeholder or stream junction
End repeatread 2026-09-27Signal the enclosing Repeat action to stop looping
Joinread 2026-09-27Wait for parallel branches to finish before continuing
Repeatread 2026-09-27Run a pipeline or workflow repeatedly until a variable or End repeat stops it
Simple evaluationread 2026-09-27Compare a variable or result field with a value to branch the workflow
Startread 2026-09-27Entry point of every workflow
Wait forread 2026-09-27Pause the workflow for a set time
Wait for SQLread 2026-09-27Poll a SQL query until its row count meets a condition or a timeout passes
Wait for fileread 2026-09-27Wait until a file appears, checking at intervals up to a timeout
Apache NiFi (10)
ControlRateread 2026-09-27Throttle the rate at which data passes to downstream processors
DistributeLoadread 2026-09-27Distribute FlowFiles across downstream relationships by a strategy such as weighted round robin
EnforceOrderread 2026-09-27Enforce the expected order of FlowFiles that belong to the same group
ForkEnrichmentread 2026-09-27Clone each FlowFile into original and enrichment branches, tagged for JoinEnrichment
Funnelread 2026-09-27Combine the data from several connections into a single connection
Notifyread 2026-09-27Cache a release signal so FlowFiles held at the matching Wait processor are released
RouteHL7read 2026-09-27Route HL7 messages by user-defined HL7 queries, one relationship per query
RouteOnAttributeread 2026-09-27Route FlowFiles by Expression Language conditions over their attributes
RouteOnContentread 2026-09-27Route a copy of the FlowFile to each relationship whose regular expression matches the content
Waitread 2026-09-27Hold FlowFiles until a matching release signal from Notify appears in the cache
AWS Glue (4)
FlatMapread 2026-09-27Apply a transform to each frame of a collection and keep the results as a collection
MapToCollectionread 2026-09-27Apply a transform to each frame of a collection
SelectFromCollectionread 2026-09-27Choose one frame from a collection of frames
SelectFromCollectionread 2026-09-27Pick one frame out of a collection of frames
Azure Data Factory (7)
For Eachread 2026-09-27Iterate over a collection and run the inner activities for each item
If Condition Activityread 2026-09-27Run one set of activities when a condition is true and another when it is false
New branchread 2026-09-27Apply more than one set of transformations to the same stream
Switch activityread 2026-09-27Run the set of activities of the case that matches an evaluated expression
Until Activityread 2026-09-27Do-until loop: repeat activities until a condition is true or a time-out passes
Validation Activityread 2026-09-27Continue only once a reference dataset exists or meets criteria, or a time-out passes
Wait Activityread 2026-09-27Pause the pipeline for a set time
Bruin (5)
Query sensors (family)read 2026-09-2718 platform types (bq.sensor.query, …): wait until a query returns a result
Table sensors (family)read 2026-09-2714 platform types (bq.sensor.table, …): wait until a named table exists
gcs.sensor.objectread 2026-09-27Wait until an object matching a name or wildcard exists in a GCS bucket
gcs.sensor.prefixread 2026-09-27Wait until any object exists under a prefix in a GCS bucket
s3.sensor.key_sensorread 2026-09-27Wait until an S3 key or wildcard match exists, optionally checking etag, size or modified time
Duckle (8)
For Eachread 2026-09-25run a referenced pipeline once per upstream row
Iterateread 2026-09-25run a referenced pipeline N times
Parallelizeread 2026-09-25run the downstream branches concurrently over one input snapshot
Replicate / Teeread 2026-09-25send the same rows to several downstream outputs
Sequence Anchorread 2026-09-25no-op node that ordering links attach to
Switch / Conditional Splitread 2026-09-25route rows to case outputs by condition, first match wins, plus a default
Throttleread 2026-09-25delay the stage to a rows-per-second target, then pass rows through
Wait / Delayread 2026-09-25sleep a fixed time, then pass rows through
EasyMorph (12)
Breakpointread 2026-09-27Stop project execution at this point
Either tableread 2026-09-27Pass on whichever of the current table and another table is not empty
Iterateread 2026-09-27Run another module or project once per row of the table
Iterate columnread 2026-09-27Run another module or project once per column and append the returned columns
Iterate tableread 2026-09-27Run another module or project once per row, passing another table to it
Repeatread 2026-09-27Run another module or project repeatedly until or while its output is empty
Skip actions on conditionread 2026-09-27Skip the remaining actions of the table when a condition holds
Skip if unchangedread 2026-09-27Skip the remaining actions of the table when the data is unchanged since the last run
Skip on condition in another tableread 2026-09-27Skip the remaining actions of the table when a condition on another table holds
Start/finish exclusive accessread 2026-09-27Hold a mutual-exclusion lock on a resource across concurrently running projects
Synchronizeread 2026-09-27Pause this action chain until another table has finished calculating
Waitread 2026-09-27Pause for a given number of seconds
KNIME Analytics Platform (24)
Active Branch Inverterread 2026-09-27Flip a branch between active and inactive, for example to run a branch only on failure
Breakpointread 2026-09-27Halt execution when the incoming table meets a condition
CASE Switch Endread 2026-09-27Merge one or more active branches back into one
CASE Switch Startread 2026-09-27Route the input to one selectable output branch
Chunk Loop Startread 2026-09-27Open a loop that processes a consecutive chunk of rows per iteration
Column List Loop Startread 2026-09-27Open a loop that iterates over the columns of a table
Counting Loop Startread 2026-09-27Open a loop that runs a fixed number of times
Empty Table Switchread 2026-09-27Route data to the first output when the table has rows, otherwise to the second
End IFread 2026-09-27Take whichever branch is active, or stack both tables when both carry data
Generic Loop Startread 2026-09-27Open a loop with no built-in end condition, closed by a variable-condition loop end
Group Loop Startread 2026-09-27Open a loop that processes one group of rows per iteration
IF Switchread 2026-09-27Send data to the top, bottom or both output branches by configuration
Interval Loop Startread 2026-09-27Open a loop that steps a numeric variable through an interval
Java IF (Table)read 2026-09-27Choose the output branch from a user-written Java expression returning 0 or 1
KNIME Parallel Chunk Loop Nodes (extension)read 2026-09-27Extension outside the base install: 3 current nodes: Parallel Chunk End; Parallel Chunk End (multi port); Parallel Chunk Start
Loop Endread 2026-09-27Close a loop and stack the tables from every iteration row-wise
Loop End (Column Append)read 2026-09-27Close a loop and join the tables from every iteration column-wise on RowID
Recursive Loop Endread 2026-09-27Close a recursive loop, feeding its input back to the loop start for the next iteration
Recursive Loop Startread 2026-09-27Open a recursive loop that receives tables back from the loop end each iteration
Table Row to Variable Loop Startread 2026-09-27Open a loop with one iteration per row, exposing that row's values as flow variables
Variable Condition Loop Endread 2026-09-27Close a loop when a condition on a flow variable is met
Variable Loop Endread 2026-09-27Close a loop collecting only the flow variables produced, not data
Wait...read 2026-09-27Pause for a duration, until a time of day, or until a file is created, changed or deleted
Window Loop Startread 2026-09-27Open a loop that slides a fixed-size window of rows over the table, one step per iteration
Pentaho Data Integration (6)
Block this step until steps finishread 2026-09-27Hold this step until selected other steps have finished
Blocking stepread 2026-09-27Hold the flow until every input row has arrived, then pass on only the last row
Delay rowread 2026-09-27Pass each row on only after a delay
Detect empty streamread 2026-09-27Emit one empty row when the input stream holds no rows
Dummy (do nothing)read 2026-09-27Pass rows through unchanged; used for testing or to split streams
Example step (deprecated)read 2026-09-27Sample plugin step kept as a developer example; no data function documented
Polars (1)
GroupBy.__iter__read 2026-09-27Iterate over the groups as pairs of key and sub-frame
RapidMiner Studio (27)
Branchread 2026-09-27If-then-else: run one of two subprocesses depending on a condition
Collectread 2026-09-27Combine several objects into one collection
Delayread 2026-09-27Pause process execution for a fixed or random time
Flatten Collectionread 2026-09-27Flatten a collection of collections into one collection
Join Pathsread 2026-09-27Pass on the first non-null input, merging alternative branches
Loopread 2026-09-27Run a subprocess a fixed number of times, optionally in parallel
Loop (While)read 2026-09-27Repeat a subprocess while a condition holds
Loop Attribute Subsetsread 2026-09-27Run a subprocess for every combination of columns within a size range
Loop Attributesread 2026-09-27Run a subprocess once per selected column
Loop Batchesread 2026-09-27Run a subprocess on successive batches of rows
Loop Clustersread 2026-09-27Run a subprocess once per cluster, on that cluster's rows
Loop Collectionread 2026-09-27Run a subprocess once per object in a collection
Loop Data Fractionsread 2026-09-27Run an inner learner on only a given fraction of the rows
Loop Data Setsread 2026-09-27Run a subprocess once per input table
Loop Examplesread 2026-09-27Run a subprocess once per row
Loop Labelsread 2026-09-27Run a subprocess once per label column
Loop Parametersread 2026-09-27Run a subprocess for every combination of given parameter values
Loop Untilread 2026-09-27Repeat a subprocess until a performance or iteration condition is met
Loop Valuesread 2026-09-27Run a subprocess once per distinct value of a column
Loop and Averageread 2026-09-27Run a subprocess n times and average the resulting performance values
Loop and Deliver Bestread 2026-09-27Run a subprocess n times and return the results of the best-performing iteration
Multiplyread 2026-09-27Copy an object to several output ports
Multiply (In Database)read 2026-09-27Reuse the current in-database result on several branches
Process Windowsread 2026-09-27Slide a window over a series and run an inner subprocess on each window
Selectread 2026-09-27Pick one object from a collection by index
Select Subprocessread 2026-09-27Switch: run the one subprocess selected by a parameter
Subprocess (Parallel)read 2026-09-27Run several subprocesses in parallel
SQLMesh (5)
@EACHread 2026-09-27Apply an anonymous function to each item of a list and emit the results, like a for loop
@FILTERread 2026-09-27Keep the items of a list that satisfy an anonymous SQL condition, for use by other macros
@IFread 2026-09-27Emit one SQL fragment or another according to a condition evaluated at render time
@REDUCEread 2026-09-27Combine the items of a list into one expression with a two-argument anonymous function
Signalsread 2026-09-27Python functions that decide whether a model interval is ready for the scheduler to evaluate
Talend (16)
tCollectorread 2026-09-27Feed the parallel execution processes with the threads tPartitioner generated
tDepartitionerread 2026-09-27Assemble the outputs of the parallel execution processes for tRecollector
tFlowToIterateread 2026-09-27Turn each input row into an iteration, storing its values in global variables
tForeachread 2026-09-27Loop over a list of values through an iterate link
tInfiniteLoopread 2026-09-27Run a task in an endless loop
tIterateToFlowread 2026-09-27Turn the iterations over a list into a flow of rows
tLoopread 2026-09-27Run a task or a Job repeatedly in a loop
tParallelizeread 2026-09-27Run several subJobs at once and synchronise another subJob with them
tPostjobread 2026-09-27Trigger the tasks to run after the Job has executed
tPrejobread 2026-09-27Trigger the tasks to run before the Job executes
tRecollectorread 2026-09-27Output the results of parallel execution that tDepartitioner assembled
tReplicateread 2026-09-27Duplicate the incoming flow into identical output flows
tSleepread 2026-09-27Pause the Job for a set time
tWaitForFileread 2026-09-27Watch a directory and trigger the next component when a file event occurs
tWaitForSocketread 2026-09-27Listen on a port and trigger a subJob when data arrives
tWaitForSqlDataread 2026-09-27Poll a database and trigger a subJob when a condition on the presence of rows is met
VisiData (5)
repeat-inputread 2026-09-23Rerun the previous modifying command with the same input
repeat-input-nread 2026-09-23Rerun the previous command with its input N times
repeat-input-selectedread 2026-09-23Rerun the previous command once per selected row
repeat-lastread 2026-09-23Rerun the most recent command, prompting for fresh input
replay-stopread 2026-09-23Cancel the replay in progress
Background
Control flow is how execution moves from one step to the next: a branch moves it to another point, and a loop runs a sequence of steps again.[1] Structured programming limits a program's structure to sequencing, selection and iteration.[1]
When to use it
A declarative language specifies the results it wants without prescribing an order of operations.[1] A pipeline needs a branch, a loop or a wait when what runs next depends on something only known at run time: whether a file has arrived, how many items there are, or whether a check passed. (Meridian's view) Reach for one around a query only when the choice cannot be written inside the query itself, because a step that decides which steps run is harder to read and to test than an expression. (Meridian's view) Give every loop and every wait a bound, a maximum count or a time-out, so that a run that goes wrong stops rather than hangs. (Meridian's view)
The method
The structured program theorem states that a class of control-flow graphs can compute any computable function using only sequence, selection and iteration.[2] The structured program theorem is generally called the Böhm–Jacopini theorem.[2] In 1964 Corrado Böhm defined a simple programming language, and the structured program theorem is typically credited to his later 1966 paper with Giuseppe Jacopini.[2]
A jump moves execution unconditionally to another point, and in a high-level language a jump is often written as a goto statement.[1] The structured program theorem forms the basis of structured programming, a paradigm that avoids the goto statement and uses other control constructs for selection and iteration.[2] A conditional statement jumps control based on the value of a Boolean expression, while a multiway branch jumps control based on matching values.[1] The number of times a loop runs usually depends on runtime state: once for each item of a collection, called definite iteration, or until a condition is met, called indefinite iteration.[1]
Compared with the alternatives
Dataflow programming models a program as a directed graph of the data flowing between operations.[3] Dataflow programming was pioneered by Jack Dennis and his graduate students at the Massachusetts Institute of Technology in the 1960s.[3] In dataflow programming an operation runs as soon as all of its inputs become valid, so dataflow languages are inherently parallel.[3] Dataflow programming contrasts with a program modelled as a series of operations happening in a specific order, which is one sense of the term control flow.[3] A data pipeline can be read both ways: rows move between steps as dataflow, while a branch, a loop or a wait decides which steps run and when. (Meridian's view)
Sources
- [1]Control flow - Wikipediasecondary source
- [2]Structured program theorem - Wikipediasecondary source
- [3]Dataflow programming - Wikipediasecondary source