Skip to main content

Query Engine

The query engine resolves channel selections and evaluates events and aggregations against silver-layer data. It does this through a solver: the component that knows how your silver tables are physically laid out and how to read them. Two solvers ship with Impulse — DeltaSolver and KeyValueStoreSolver — and the right one depends on which silver tables you have.

Both solvers read tag tables in the same narrow EAV layout (key, value) and pivot them on the fly; the practical difference is which silver tables each one consumes.

Available solvers

DeltaSolver consumes the full default silver-layer schema — container_metrics, container_tags, channel_metrics, channel_tags, and channels — and uses channel_tags for channel selection (pivoting its narrow EAV rows on the fly). It is the right pick whenever your data matches the default silver-layer shape and you don't need channel aliasing.

KeyValueStoreSolver does not consume channel_tags at all — channel selection runs directly against columns of channel_metrics, so attributes such as channel_name must live as columns on channel_metrics. It needs only three silver tables — container_metrics, channel_metrics, and channels — and supports two optional add-ons: a narrow EAV container_tags table for tag-based container filtering, and a channel_mapping table to resolve channel aliases (logical names that map to physical channels). It is the right pick when you don't have a channel_tags table, or when container attributes are already wide on container_metrics itself.

Table requirements

Silver tableDeltaSolverKeyValueStoreSolver
container_metricsrequiredrequired
channel_metricsrequiredrequired (also carries channel selection columns)
channelsrequiredrequired
container_tagsrequired (narrow EAV)optional (narrow EAV)
channel_tagsrequired (narrow EAV)not used
channel_mappingnot usedoptional (channel aliases)

See the Silver Layer Schema for the columns each table is expected to carry.

Which solver should I use?

  • Do you have all five silver tables in the default shape? → DeltaSolver.
  • Otherwise → KeyValueStoreSolver.

KeyValueStoreSolver also covers the wide-only case where container attributes live directly on container_metrics and no container_tags table exists; just omit source.container_tags_table from your config. See the query_engine.solver field for details.

KeyValueStoreSolver is the default — if query_engine is omitted from your config entirely, the engine runs with KeyValueStoreSolver and data_type = "RLE".

Configuring the solver

Solver selection and tuning live under the query_engine section of your report config:

API reference

Auto-generated symbol-level docs for each solver class: