Skip to main content

Silver Layer Schema

The Silver layer stores measurement data in a normalized, tag-based model. Time-series samples live in channels; metadata is split across tag tables (EAV key-value pairs) and metric tables (pre-computed statistics).

The five tables and columns on this page describe the typical default-solver shape — what Impulse's default solvers (DeltaSolver, KeyValueStoreSolver) expect when no SolverConfig overrides are applied. The framework hard-requires only a small subset of this shape:

  • container_id on every silver table (engine join key);
  • (container_id, channel_id) on the channel-side tables and channels;
  • key, value columns on the tag tables (EAV layout);
  • one of the two channels formats below (RLE with tstart/tend or raw with timestamp).

Any other column on container_metrics and channel_metrics is optional and only consulted when referenced by your config (e.g. via measurement_dimensions or metric_filters). For physical layouts that diverge further, see Adapting to existing data layouts.

Entity-relationship diagram


container_metrics

One row per measurement container with timestamps, duration, and channel count.

ColumnTypeNullableDescription
container_idlongNoUnique container identifier.
start_dttimestampYesContainer start datetime.
stop_dttimestampYesContainer stop datetime.
duration_msintYesTotal duration in milliseconds.
num_channelsintYesNumber of channels in the container.

Additional columns commonly populated

container_metrics typically carries additional metadata columns that get surfaced into the gold-layer measurement_dimension table when listed in the report's measurement_dimensions config. The framework recognises the following names through the MeasurementDimensions enum — populate any subset that fits your data; none are required by the engine.

ColumnTypeDescription
uut_idlongUnit-under-test identifier.
vehicle_keystringVehicle identifier.
project_idlongProject identifier.
file_namestringSource measurement file name.
source_file_pathstringFull path to the source file.
start_tslongMeasurement start timestamp (epoch).
stop_tslongMeasurement stop timestamp (epoch).
environmentstringRecording environment (e.g. PUMA, datalogger).
Two timestamp conventions

start_dt/stop_dt (datetime, listed in the table at the top of this section) and start_ts/stop_ts (epoch long, listed here) are different columns, not naming variants. Real-world container_metrics tables typically carry both: start_dt/stop_dt for human-readable display, start_ts/stop_ts for the gold measurement_dimension because the corresponding MeasurementDimensions enum values map to the epoch-typed columns. Populate whichever your queries and measurement_dimensions config need.


container_tags

Key-value metadata tags for measurement containers. Strict EAV layout — TSAL queries select recordings by tag key (e.g. query.havingTag(vehicle_key="Seat_Leon") looks up value where key = 'vehicle_key').

ColumnTypeNullableDescription
container_idlongNoUnique container identifier.
keystringYesTag key (e.g. "vehicle_key", "project_id").
valuestringYesTag value.

channel_metrics

Pre-computed statistics per channel. The percentile columns (pz1, pz10, pz90, pz99) and nan_ratio enable container/channel pre-filtering before scanning the much larger channels table.

ColumnTypeNullableDescription
container_idlongNoParent container identifier.
channel_idintNoChannel identifier.
value_typestringYesData type of channel values.
sample_countintYesNumber of samples.
nan_ratiofloatYesRatio of NaN values.
begin_sfloatYesChannel start time (seconds).
end_sfloatYesChannel end time (seconds).
duration_msintYesChannel duration in milliseconds.
original_sample_countintYesSample count before processing.
original_srfloatYesOriginal sample rate.
minfloatYesMinimum value.
maxfloatYesMaximum value.
meanfloatYesMean value.
stdfloatYesStandard deviation.
pz1floatYes1st percentile.
pz10floatYes10th percentile.
pz90floatYes90th percentile.
pz99floatYes99th percentile.

channel_tags

Key-value metadata tags per channel. Strict EAV layout — TSAL channel selectors look up signals by tag key (e.g. query.channel(channel_name="Engine_RPM") looks up value where key = 'channel_name').

ColumnTypeNullableDescription
container_idlongNoParent container identifier.
channel_idintNoChannel identifier within the container.
keystringYesTag key (e.g. "channel_name", "brand", "model").
valuestringYesTag value.

channels

The actual time-series data. Two format variants are supported.

RLE format (default)

Pre-encoded with run-length encoding. Each row represents one sample interval [tstart, tend) with a constant value. Used when data_type is omitted or set to RLE in the report config.

ColumnTypeNullableDescription
container_idlongNoParent container identifier.
channel_idintNoChannel identifier.
tstartlongNoSample start timestamp (microseconds).
tendlongNoSample end timestamp (microseconds).
valuedoubleYesSample value.

Raw format

Raw timestamp-based data without RLE encoding — one row per sample. Used when data_type: RAW is set in the report config; the engine derives tend from subsequent timestamps and transforms the data into RLE before query execution.

ColumnTypeNullableDescription
container_idlongNoParent container identifier.
channel_idintNoChannel identifier.
timestamplongNoSample timestamp (microseconds).
valuedoubleYesSample value.

Optional is_plausible column

An optional is_plausible: boolean column may be present on channels in either format. It is only consulted when the solver is constructed with drop_implausible_data=True — in that mode, samples with is_plausible = False are filtered before RLE encoding. If the flag is False (the default), the column is ignored and may be omitted.


channel_mapping (optional)

Alias-resolution table used by KeyValueStoreSolver when selectors are created via QueryBuilder.channel_with_alias(). Each row maps a logical channel name to one or more physical channels keyed by project_id / data_key, with an optional priority tie-breaker.

ColumnTypeNullableDescription
project_idintNoProject identifier the mapping belongs to.
concept_idintNoConcept identifier (foreign key to the concept table).
element_idintNoElement identifier (foreign key to the concept-elements table).
project_namestringYesHuman-readable project name.
element_namestringYesHuman-readable element name.
channel_namestringNoLogical channel name to match against channel_with_alias selectors.
data_keystringNoPhysical lookup key joined to channel_metrics.
priorityintYesTie-breaker when multiple physical channels match a logical name.

Configured via source.channel_mapping_table (see Configuration). Joins to channel_metrics on (project_id, data_key, channel_name).