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

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-27

    Hold records until upstream finishes, then release to output streams one at a time

  • Conditionread 2026-09-27

    Test entered values in an app or macro and branch on true or false

  • Control Containerread 2026-09-27

    Run a group of tools only on a signal, to set the order of execution in a workflow

  • Control Parameterread 2026-09-27

    Input of a batch macro: the macro is reconfigured and rerun for each incoming record

  • Detourread 2026-09-27

    Bypass a section of a workflow by a switch, for apps and macros

  • Detour Endread 2026-09-27

    Rejoin the two paths of an upstream Detour into one stream

  • Throttleread 2026-09-27

    Limit the number of records passed per minute to downstream tools

Apache Hop (14)
  • Blocking transformread 2026-09-27

    Hold all output until the last input row has arrived, optionally passing every row

  • Wait until named transform copies have finished before passing rows on

  • Delay rowread 2026-09-27

    Pause for a set time before passing each row on

  • Detect Empty Streamread 2026-09-27

    Emit one empty row when the input stream has no rows

  • Dummyread 2026-09-27

    Do nothing; a placeholder or junction in the workflow layout

  • Dummy (do nothing)read 2026-09-27

    Pass rows through unchanged; a placeholder or stream junction

  • End repeatread 2026-09-27

    Signal the enclosing Repeat action to stop looping

  • Joinread 2026-09-27

    Wait for parallel branches to finish before continuing

  • Repeatread 2026-09-27

    Run a pipeline or workflow repeatedly until a variable or End repeat stops it

  • Simple evaluationread 2026-09-27

    Compare a variable or result field with a value to branch the workflow

  • Startread 2026-09-27

    Entry point of every workflow

  • Wait forread 2026-09-27

    Pause the workflow for a set time

  • Wait for SQLread 2026-09-27

    Poll a SQL query until its row count meets a condition or a timeout passes

  • Wait for fileread 2026-09-27

    Wait until a file appears, checking at intervals up to a timeout

Apache NiFi (10)
  • ControlRateread 2026-09-27

    Throttle the rate at which data passes to downstream processors

  • DistributeLoadread 2026-09-27

    Distribute FlowFiles across downstream relationships by a strategy such as weighted round robin

  • EnforceOrderread 2026-09-27

    Enforce the expected order of FlowFiles that belong to the same group

  • ForkEnrichmentread 2026-09-27

    Clone each FlowFile into original and enrichment branches, tagged for JoinEnrichment

  • Funnelread 2026-09-27

    Combine the data from several connections into a single connection

  • Notifyread 2026-09-27

    Cache a release signal so FlowFiles held at the matching Wait processor are released

  • RouteHL7read 2026-09-27

    Route HL7 messages by user-defined HL7 queries, one relationship per query

  • RouteOnAttributeread 2026-09-27

    Route FlowFiles by Expression Language conditions over their attributes

  • RouteOnContentread 2026-09-27

    Route a copy of the FlowFile to each relationship whose regular expression matches the content

  • Waitread 2026-09-27

    Hold FlowFiles until a matching release signal from Notify appears in the cache

AWS Glue (4)
  • FlatMapread 2026-09-27

    Apply a transform to each frame of a collection and keep the results as a collection

  • MapToCollectionread 2026-09-27

    Apply a transform to each frame of a collection

  • SelectFromCollectionread 2026-09-27

    Choose one frame from a collection of frames

  • SelectFromCollectionread 2026-09-27

    Pick one frame out of a collection of frames

Azure Data Factory (7)
  • For Eachread 2026-09-27

    Iterate over a collection and run the inner activities for each item

  • If Condition Activityread 2026-09-27

    Run one set of activities when a condition is true and another when it is false

  • New branchread 2026-09-27

    Apply more than one set of transformations to the same stream

  • Switch activityread 2026-09-27

    Run the set of activities of the case that matches an evaluated expression

  • Until Activityread 2026-09-27

    Do-until loop: repeat activities until a condition is true or a time-out passes

  • Validation Activityread 2026-09-27

    Continue only once a reference dataset exists or meets criteria, or a time-out passes

  • Wait Activityread 2026-09-27

    Pause the pipeline for a set time

Bruin (5)
  • Query sensors (family)read 2026-09-27

    18 platform types (bq.sensor.query, …): wait until a query returns a result

  • Table sensors (family)read 2026-09-27

    14 platform types (bq.sensor.table, …): wait until a named table exists

  • gcs.sensor.objectread 2026-09-27

    Wait until an object matching a name or wildcard exists in a GCS bucket

  • gcs.sensor.prefixread 2026-09-27

    Wait until any object exists under a prefix in a GCS bucket

  • s3.sensor.key_sensorread 2026-09-27

    Wait until an S3 key or wildcard match exists, optionally checking etag, size or modified time

Duckle (8)
  • For Eachread 2026-09-25

    run a referenced pipeline once per upstream row

  • Iterateread 2026-09-25

    run a referenced pipeline N times

  • Parallelizeread 2026-09-25

    run the downstream branches concurrently over one input snapshot

  • Replicate / Teeread 2026-09-25

    send the same rows to several downstream outputs

  • Sequence Anchorread 2026-09-25

    no-op node that ordering links attach to

  • route rows to case outputs by condition, first match wins, plus a default

  • Throttleread 2026-09-25

    delay the stage to a rows-per-second target, then pass rows through

  • Wait / Delayread 2026-09-25

    sleep a fixed time, then pass rows through

EasyMorph (12)
  • Breakpointread 2026-09-27

    Stop project execution at this point

  • Either tableread 2026-09-27

    Pass on whichever of the current table and another table is not empty

  • Iterateread 2026-09-27

    Run another module or project once per row of the table

  • Iterate columnread 2026-09-27

    Run another module or project once per column and append the returned columns

  • Iterate tableread 2026-09-27

    Run another module or project once per row, passing another table to it

  • Repeatread 2026-09-27

    Run another module or project repeatedly until or while its output is empty

  • Skip the remaining actions of the table when a condition holds

  • Skip if unchangedread 2026-09-27

    Skip the remaining actions of the table when the data is unchanged since the last run

  • Skip the remaining actions of the table when a condition on another table holds

  • Hold a mutual-exclusion lock on a resource across concurrently running projects

  • Synchronizeread 2026-09-27

    Pause this action chain until another table has finished calculating

  • Waitread 2026-09-27

    Pause for a given number of seconds

KNIME Analytics Platform (24)
  • Active Branch Inverterread 2026-09-27

    Flip a branch between active and inactive, for example to run a branch only on failure

  • Breakpointread 2026-09-27

    Halt execution when the incoming table meets a condition

  • CASE Switch Endread 2026-09-27

    Merge one or more active branches back into one

  • CASE Switch Startread 2026-09-27

    Route the input to one selectable output branch

  • Chunk Loop Startread 2026-09-27

    Open a loop that processes a consecutive chunk of rows per iteration

  • Column List Loop Startread 2026-09-27

    Open a loop that iterates over the columns of a table

  • Counting Loop Startread 2026-09-27

    Open a loop that runs a fixed number of times

  • Empty Table Switchread 2026-09-27

    Route data to the first output when the table has rows, otherwise to the second

  • End IFread 2026-09-27

    Take whichever branch is active, or stack both tables when both carry data

  • Generic Loop Startread 2026-09-27

    Open a loop with no built-in end condition, closed by a variable-condition loop end

  • Group Loop Startread 2026-09-27

    Open a loop that processes one group of rows per iteration

  • IF Switchread 2026-09-27

    Send data to the top, bottom or both output branches by configuration

  • Interval Loop Startread 2026-09-27

    Open a loop that steps a numeric variable through an interval

  • Java IF (Table)read 2026-09-27

    Choose the output branch from a user-written Java expression returning 0 or 1

  • Extension outside the base install: 3 current nodes: Parallel Chunk End; Parallel Chunk End (multi port); Parallel Chunk Start

  • Loop Endread 2026-09-27

    Close a loop and stack the tables from every iteration row-wise

  • Close a loop and join the tables from every iteration column-wise on RowID

  • Recursive Loop Endread 2026-09-27

    Close a recursive loop, feeding its input back to the loop start for the next iteration

  • Recursive Loop Startread 2026-09-27

    Open a recursive loop that receives tables back from the loop end each iteration

  • Open a loop with one iteration per row, exposing that row's values as flow variables

  • Close a loop when a condition on a flow variable is met

  • Variable Loop Endread 2026-09-27

    Close a loop collecting only the flow variables produced, not data

  • Wait...read 2026-09-27

    Pause for a duration, until a time of day, or until a file is created, changed or deleted

  • Window Loop Startread 2026-09-27

    Open a loop that slides a fixed-size window of rows over the table, one step per iteration

Pentaho Data Integration (6)
Polars (1)
  • GroupBy.__iter__read 2026-09-27

    Iterate over the groups as pairs of key and sub-frame

RapidMiner Studio (27)
  • Branchread 2026-09-27

    If-then-else: run one of two subprocesses depending on a condition

  • Collectread 2026-09-27

    Combine several objects into one collection

  • Delayread 2026-09-27

    Pause process execution for a fixed or random time

  • Flatten Collectionread 2026-09-27

    Flatten a collection of collections into one collection

  • Join Pathsread 2026-09-27

    Pass on the first non-null input, merging alternative branches

  • Loopread 2026-09-27

    Run a subprocess a fixed number of times, optionally in parallel

  • Loop (While)read 2026-09-27

    Repeat a subprocess while a condition holds

  • Loop Attribute Subsetsread 2026-09-27

    Run a subprocess for every combination of columns within a size range

  • Loop Attributesread 2026-09-27

    Run a subprocess once per selected column

  • Loop Batchesread 2026-09-27

    Run a subprocess on successive batches of rows

  • Loop Clustersread 2026-09-27

    Run a subprocess once per cluster, on that cluster's rows

  • Loop Collectionread 2026-09-27

    Run a subprocess once per object in a collection

  • Loop Data Fractionsread 2026-09-27

    Run an inner learner on only a given fraction of the rows

  • Loop Data Setsread 2026-09-27

    Run a subprocess once per input table

  • Loop Examplesread 2026-09-27

    Run a subprocess once per row

  • Loop Labelsread 2026-09-27

    Run a subprocess once per label column

  • Loop Parametersread 2026-09-27

    Run a subprocess for every combination of given parameter values

  • Loop Untilread 2026-09-27

    Repeat a subprocess until a performance or iteration condition is met

  • Loop Valuesread 2026-09-27

    Run a subprocess once per distinct value of a column

  • Loop and Averageread 2026-09-27

    Run a subprocess n times and average the resulting performance values

  • Loop and Deliver Bestread 2026-09-27

    Run a subprocess n times and return the results of the best-performing iteration

  • Multiplyread 2026-09-27

    Copy an object to several output ports

  • Multiply (In Database)read 2026-09-27

    Reuse the current in-database result on several branches

  • Process Windowsread 2026-09-27

    Slide a window over a series and run an inner subprocess on each window

  • Selectread 2026-09-27

    Pick one object from a collection by index

  • Select Subprocessread 2026-09-27

    Switch: run the one subprocess selected by a parameter

  • Subprocess (Parallel)read 2026-09-27

    Run several subprocesses in parallel

SQLMesh (5)
  • @EACHread 2026-09-27

    Apply an anonymous function to each item of a list and emit the results, like a for loop

  • @FILTERread 2026-09-27

    Keep the items of a list that satisfy an anonymous SQL condition, for use by other macros

  • @IFread 2026-09-27

    Emit one SQL fragment or another according to a condition evaluated at render time

  • @REDUCEread 2026-09-27

    Combine the items of a list into one expression with a two-argument anonymous function

  • Signalsread 2026-09-27

    Python functions that decide whether a model interval is ready for the scheduler to evaluate

Talend (16)
  • tCollectorread 2026-09-27

    Feed the parallel execution processes with the threads tPartitioner generated

  • tDepartitionerread 2026-09-27

    Assemble the outputs of the parallel execution processes for tRecollector

  • tFlowToIterateread 2026-09-27

    Turn each input row into an iteration, storing its values in global variables

  • tForeachread 2026-09-27

    Loop over a list of values through an iterate link

  • tInfiniteLoopread 2026-09-27

    Run a task in an endless loop

  • tIterateToFlowread 2026-09-27

    Turn the iterations over a list into a flow of rows

  • tLoopread 2026-09-27

    Run a task or a Job repeatedly in a loop

  • tParallelizeread 2026-09-27

    Run several subJobs at once and synchronise another subJob with them

  • tPostjobread 2026-09-27

    Trigger the tasks to run after the Job has executed

  • tPrejobread 2026-09-27

    Trigger the tasks to run before the Job executes

  • tRecollectorread 2026-09-27

    Output the results of parallel execution that tDepartitioner assembled

  • tReplicateread 2026-09-27

    Duplicate the incoming flow into identical output flows

  • tSleepread 2026-09-27

    Pause the Job for a set time

  • tWaitForFileread 2026-09-27

    Watch a directory and trigger the next component when a file event occurs

  • tWaitForSocketread 2026-09-27

    Listen on a port and trigger a subJob when data arrives

  • tWaitForSqlDataread 2026-09-27

    Poll a database and trigger a subJob when a condition on the presence of rows is met

VisiData (5)
  • repeat-inputread 2026-09-23

    Rerun the previous modifying command with the same input

  • repeat-input-nread 2026-09-23

    Rerun the previous command with its input N times

  • repeat-input-selectedread 2026-09-23

    Rerun the previous command once per selected row

  • repeat-lastread 2026-09-23

    Rerun the most recent command, prompting for fresh input

  • replay-stopread 2026-09-23

    Cancel 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. [1]Control flow - Wikipediasecondary source
  2. [2]Structured program theorem - Wikipediasecondary source
  3. [3]Dataflow programming - Wikipediasecondary source