Parascope Docs

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:

  1. SchemaSHOW / DESCRIBE statements
  2. ExplainEXPLAIN prefix
  3. DiffDIFF statements
  4. LineageLINEAGE() function
  5. Impact — Result columns include depth, path, and criticality
  6. Graph — Traversal query without aggregation
  7. Big Number — 1 row, 1 numeric column
  8. Key-Value — 1 row, multiple columns
  9. Line Chart — Aggregation with a time-like grouping column
  10. Bar Chart — Aggregation with categorical grouping
  11. 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 50

Big 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 1
SELECT 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 DESC
SELECT criticality, COUNT(*) AS count
FROM *
WHERE status = 'active' AND criticality IS NOT NULL
GROUP BY criticality
ORDER BY count DESC

The 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 day

For 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 day

Graph

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 pod

Graph 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 os

Schema

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 kubernetes
DESCRIBE kubernetes.pod

Explain

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 source

Diff

A specialized view for temporal comparison results with change categorization.

Triggered by: result_type = "diff" (from DIFF statements).

Results are categorized with colored badges:

BadgeMeaning
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 → Product

Upward 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 DESC

Forcing 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 ThisWrite This
Big NumberReturn 1 row, 1 numeric column: SELECT COUNT(*) AS total FROM ...
Key-ValueReturn 1 row, multiple columns: SELECT ... FROM ... LIMIT 1
Bar ChartUse GROUP BY with a categorical column
Line ChartUse GROUP BY with DATE_TRUNC('day', ...) as the grouping column
TableReturn multiple rows without GROUP BY
GraphUse traversal arrow syntax without aggregation