ParaQL Result Visualizations
How ParaQL automatically selects the best presentation for your query results — tables, charts, graphs, diffs, and more
ParaQL automatically detects the best visualization for your results based on the query shape, result type, and column signatures. Every visualization includes a Table fallback tab so you always have access to the raw data.
Visualization Selection
ParaQL selects the visualization based on the query type and result shape:
- Schema —
SHOW/DESCRIBEstatements - Explain —
EXPLAINprefix - Diff —
DIFFstatements - Lineage —
LINEAGE()function - Impact — Result columns include
depth,path, andcriticality - Graph — Traversal query without aggregation
- Big Number — 1 row, 1 numeric column
- Key-Value — 1 row, multiple columns
- Line Chart — Aggregation with a time-like grouping column
- Bar Chart — Aggregation with categorical grouping
- Table — Everything else
Table
The default presentation for multi-row results. Features include:
- Sortable column headers
- Clickable CI names (green links that navigate to CI detail pages)
- Numeric formatting with thousand separators
- Timestamp formatting in your local timezone
- Row count and execution time in the header
Triggered by: Multi-row results that don't match any other detection rule.
SELECT name, namespace, config.phase, config.node_name
FROM kubernetes.pod
WHERE config.phase = 'Running'
ORDER BY namespace, name
LIMIT 50Big Number
A single large numeric value displayed prominently — ideal for KPIs and quick counts.
Triggered by: Exactly 1 row with exactly 1 column, where the value is numeric.
SELECT COUNT(*) AS active_cis
FROM *
WHERE status = 'active'SELECT COUNT(*) AS running_pods
FROM kubernetes.pod
WHERE config.phase = 'Running'Key-Value
A card layout showing label-value pairs — useful for single-CI profiles or summary statistics.
Triggered by: Exactly 1 row with 2 or more columns.
SELECT name, ci_type, source, status,
criticality, relationship_count() AS rels,
change_count(INTERVAL '30 days') AS recent_changes
FROM kubernetes.pod
LIMIT 1SELECT COUNT(*) AS total_nodes,
SUM(config.vcpus) AS total_vcpus,
AVG(config.ram_mb) AS avg_ram_mb,
MIN(created_at) AS oldest_node,
MAX(last_seen) AS last_collection
FROM openstack.instance
WHERE status = 'active'Bar Chart
Categorical aggregation results rendered as a bar chart with labeled axes.
Triggered by: Query has GROUP BY and the grouping column is not time-like.
SELECT source, COUNT(*) AS count
FROM *
WHERE status = 'active'
GROUP BY source
ORDER BY count DESCSELECT criticality, COUNT(*) AS count
FROM *
WHERE status = 'active' AND criticality IS NOT NULL
GROUP BY criticality
ORDER BY count DESCThe chart automatically uses the first column as the category axis and numeric columns as values. Switch to the Table tab for the underlying data.
Line Chart
Time-series aggregation results rendered as a line chart.
Triggered by: Query has GROUP BY and at least one grouping column is detected as time-like (column name contains "date", "time", "day", "week", "month", etc., or values match ISO 8601 format).
SELECT DATE_TRUNC('day', changed_at) AS day,
COUNT(*) AS changes
FROM changes
WHERE changed_at > NOW() - INTERVAL '30 days'
GROUP BY DATE_TRUNC('day', changed_at)
ORDER BY dayFor multi-series line charts, include a second grouping column:
SELECT DATE_TRUNC('day', changed_at) AS day,
change_type,
COUNT(*) AS count
FROM changes
WHERE changed_at > NOW() - INTERVAL '14 days'
GROUP BY DATE_TRUNC('day', changed_at), change_type
ORDER BY dayGraph
Relationship traversal results rendered as an interactive graph. Nodes are colored by CI type, and edges show the relationship type.
Triggered by: Query metadata indicates a traversal (is_traversal: true) without aggregation.
SELECT dep.name, dep.ci_type,
pod.name, pod.ci_type
FROM kubernetes.deployment dep
-[manages]-> kubernetes.pod podGraph Interactions
- Click a node to see CI details in a popover
- Drag nodes to rearrange the layout
- Scroll to zoom in/out
- CI type colors are consistent and auto-generated from the type name
Multi-hop traversals create richer graphs:
SELECT node.name, node.ci_type,
vm.name, vm.ci_type,
os.name, os.ci_type
FROM proxmox.node node
<-[runs_on]- proxmox.vm vm
<-[runs_on]- os.linux osSchema
Clean tabular display for schema introspection results.
Triggered by: result_type = "schema" (from SHOW and DESCRIBE statements).
For DESCRIBE results, columns are grouped by namespace (Universal, Configuration, Metrics) with color-coded type badges:
- Blue for numeric types (int, float)
- Purple for booleans
- Amber for timestamps
- Green for JSON/array/object types
- Rose for UUIDs
SHOW TABLES FROM kubernetesDESCRIBE kubernetes.podExplain
Displays the query execution plan with syntax highlighting.
Triggered by: result_type = "explain" (from the EXPLAIN prefix).
The explain view also shows:
- Complexity score and tier
- Complexity breakdown by factor (e.g., "FROM wildcard: +5", "missing LIMIT: +3")
EXPLAIN SELECT source, COUNT(*), SUM(change_count())
FROM *
WHERE status = 'active'
GROUP BY sourceDiff
A specialized view for temporal comparison results with change categorization.
Triggered by: result_type = "diff" (from DIFF statements).
Results are categorized with colored badges:
| Badge | Meaning |
|---|---|
| Added (green) | New CIs created in the time window |
| Removed (red) | CIs deleted in the time window |
| Modified (amber) | CIs with field-level changes |
Each row shows the CI name, diff type, field name, old value, and new value. A summary banner at the top shows totals per category.
DIFF kubernetes.pod
BETWEEN NOW() - INTERVAL '7 days' AND NOW()Lineage
A vertical stack visualization showing the infrastructure layers above and below a CI.
Triggered by: result_type = "lineage" (from the LINEAGE function).
The lineage view arranges CIs by infrastructure tier:
Site → Rack → Physical → Network → Storage → Virtual → OS → Application → Service → ProductUpward direction shows what the CI runs on; downward shows what depends on it.
SELECT name, ci_type, tier, depth, direction
FROM LINEAGE(kubernetes.pod, name LIKE '%api%')Impact
A blast-radius graph showing all CIs affected if a specific CI fails.
Triggered by: Result columns include depth, path, and criticality together.
Nodes are colored by criticality tier:
- Red — Critical
- Orange — High
- Amber — Medium
- Green — Low
- Gray — Unscored
A summary banner shows the total affected CI count and criticality distribution.
SELECT name, ci_type, depth, path, criticality, criticality_score
FROM IMPACT(proxmox.node, name LIKE '%pve%')
ORDER BY depth, criticality_score DESCForcing a Specific Visualization
You cannot explicitly choose a visualization — it's always auto-detected from the query shape. However, you can adjust your query to guide the detection:
| Want This | Write This |
|---|---|
| Big Number | Return 1 row, 1 numeric column: SELECT COUNT(*) AS total FROM ... |
| Key-Value | Return 1 row, multiple columns: SELECT ... FROM ... LIMIT 1 |
| Bar Chart | Use GROUP BY with a categorical column |
| Line Chart | Use GROUP BY with DATE_TRUNC('day', ...) as the grouping column |
| Table | Return multiple rows without GROUP BY |
| Graph | Use traversal arrow syntax without aggregation |