The ETL family covers the pipeline node types. This page documents the professional-grade capabilities behind them: reference-data lookups (exact and fuzzy), slowly changing dimensions, change data capture, aggregation and reshaping, the expression engine, data profiling and per-node run metrics.

Lookups

ETLLookup — Reference Data Enrichment

Joins the incoming stream against a reference source (table, query or in-memory set) and returns selected columns. It renders as a double-cylinder shape (main data + reference data).

PropertyTypeDescription
CacheModeCacheModeNone, Partial or Full — how much of the reference set is cached in memory.
MatchColumnsstringColumns used as the join key.
ReturnColumnsstringColumns to add to the output row.
FailOnNoMatchboolWhen true, an unmatched row fails the pipeline instead of passing through.
OutputSchemastringDeclared schema of the enriched output, used for downstream validation.

ETLFuzzyLookupNode — Approximate Matching

Matches when keys differ slightly (typos, formatting, transliteration). Similarity is computed with one of four algorithms and gated by a threshold:

PropertyTypeDescription
AlgorithmFuzzyAlgorithmLevenshtein (default), Soundex, Metaphone or JaroWinkler.
ThresholddoubleMinimum similarity in [0, 1]; default 0.8.
MatchColumnstringIncoming column to match.
ReferenceColumnstringReference column to compare against.

Slowly Changing Dimensions

ETLScd implements the three classic dimension strategies:

PropertyTypeDescription
TypeScdTypeType1 (overwrite), Type2 (historical rows with effective dates), Type3 (previous-value columns).
BusinessKeysstringNatural keys that identify a dimension member.
ChangeTrackingColumnsstringColumns whose changes create a new version.
EffectiveFromColumn / EffectiveToColumnstringValidity window columns used by Type 2.
CurrentFlagColumnstringCurrent-row indicator column.
TableNamestringTarget dimension table.

Change Data Capture

ETLCdcNode extracts changed rows since the last run:

PropertyTypeDescription
MethodCdcMethodTimestamp (default), Version, FullRefresh or LogBased.
TrackingColumnstringColumn used by timestamp/version detection; default ModifiedAt.
ChangeIndicatorstringOutput column carrying the operation (insert/update/delete); default __CDC_Operation.

Aggregate, Pivot and Unpivot

NodePurpose
ETLAggregateGroup-by with aggregate functions (sum, count, min, max, average).
ETLPivotRows to columns using a pivot key and value column.
ETLUnpivotColumns to rows (normalization).
ETLSortOrdering by one or more columns, ascending or descending.
ETLDerivedColumnAdds computed columns from expressions (see below).
ETLFilterRow predicate using the expression engine.
ETLConditionalSplitRoutes rows to different outputs by predicate.
ETLJoin / ETLMerge / ETLMulticastRelational join, union-style merge, and fan-out to multiple consumers.
ETLSurrogateKeyNodeGenerates surrogate keys for dimension loading.
ETLRowCountCounts rows and exposes the value downstream.
ETLScriptCustom scripted transform for cases the built-in nodes do not cover.

Expression Engine

ExpressionEngine evaluates SQL-like expressions over a row dictionary. It is the engine behind derived columns, filters and conditional splits, and it is usable directly:

var engine = new ExpressionEngine();

var row = new Dictionary<string, object>
{
    ["Amount"] = 125.50m,
    ["Country"] = "NL",
    ["Discount"] = 0.15
};

// Scalar result
object total = engine.Evaluate("Amount * (1 - Discount)", row);
Console.WriteLine(total);   // 106.675

// Boolean predicate (for filters and splits)
bool highValue = engine.EvaluateBoolean("Amount > 100 AND Country = 'NL'", row);

Invalid expressions raise ExpressionException with the failing token position, which the host surfaces in the expression tester dialog. See Automation Data Sources for how expressions integrate with datasource-backed nodes.

Data Profiling

DataProfiler produces per-column statistics you can inspect before designing a pipeline (or attach to a run for data-quality reporting):

MemberTypeDescription
NamestringColumn name.
Count / NullCount / DistinctCountintRow count, nulls and distinct values.
Min / Max / Average / Sumobject / double?Numeric and date statistics when applicable.
MinLength / MaxLengthint?String length range.
SampleValuesList<object>Representative values for display.
IsNumeric / IsDateTimeboolInferred type flags.
NullPercentage(rowCount)doubleNull share as a percentage.

Pipeline Metrics

Each node run can record NodeRunMetrics, collected in a PipelineMetrics instance for the whole run:

var metrics = new PipelineMetrics();

// Recorded per node by the pipeline runner
metrics.Nodes.Add(new NodeRunMetrics
{
    NodeName = "LookupCustomers",
    RowsIn = 12000,
    RowsOut = 11840,
    Elapsed = TimeSpan.FromMilliseconds(184),
    Status = "Completed"
});

foreach (var node in metrics.Nodes)
    Console.WriteLine($"{node.NodeName}: {node.RowsIn} in / {node.RowsOut} out, " +
                      $"{node.RowsPerSecond:0} rows/s ({node.Status})");

RowsPerSecond is derived from RowsOut and Elapsed. Metrics pair with the workflow engine's run results to give end-to-end throughput reporting; see Workflow Engine.