{% extends "base.html" %} {% from "_context.html" import context_panel %} {% block body %} {% macro col_links(cols, base_url='') %} {%- for c in cols %}{{ c }}{% if not loop.last %}, {% endif %}{% endfor -%} {% endmacro %}

{{ fqn }} {{ conn }}{% if adapter %} · {{ adapter }}{% endif %}

{% if has_connection_notes %}

Connection notes for {{ conn }} apply to this table.

{% endif %} {% if unprofiled_notice %}
{{ unprofiled_notice }} - this page shows an earlier run's print.
{% endif %} {% if missing_artifacts_notice %}
{{ missing_artifacts_notice }}
{% endif %} {% if corrupted_artifacts_notice %}
{{ corrupted_artifacts_notice }}
{% endif %} {% if catalog_only_notice %}
{{ catalog_only_notice }}
{% endif %} {% if external_notice %}
{{ external_notice }}
{% endif %}
metadata
{{ entry.type|capitalize }}
profiled {{ entry.profiled_at|relative }}
rows
{{ row_count.row_count|number }}
{% if row_count.method %}
{{ row_count.method }}
{% endif %} {% if row_count.share is not none %}
scanned {{ row_count.rows_scanned|number }} ({{ row_count.share|percent }}) {% if row_count.sample is not none %}, sample {{ row_count.sample|number }}{% endif %} {% if row_count.filter %}, filter {{ row_count.filter }}{% endif %}
{% endif %}
columns
{{ entry.columns|number }}
{% if skyline %}
{% for s in skyline %} {% endfor %}
{% endif %}
{% if cards %}
related
{{ cards.refers_to + cards.referenced_by }}
{% if cards.refers_to and cards.referenced_by %} {{ cards.refers_to }} table{{ 's' if cards.refers_to != 1 else '' }} out · {{ cards.referenced_by }} in {% elif cards.refers_to %} {{ cards.refers_to }} table{{ 's' if cards.refers_to != 1 else '' }} out {% elif cards.referenced_by %} {{ cards.referenced_by }} table{{ 's' if cards.referenced_by != 1 else '' }} in {% elif relationships.eligible_target == false %} not a join target - no declared-unique column {% else %} no related tables {% endif %}
{% endif %} {% if grain %}
grain
{% if grain.key_list %}
{{ grain.key_list[0].columns|length }}
{% for k in grain.key_list %} ({{ col_links(k.columns) }}) - {{ k.detection }}{% if k.note %}: {{ k.note }}{% endif %}{% if not loop.last %}
{% endif %} {% endfor %}
{% elif grain.state == "exhausted" %}
-
searched, none found
{% elif grain.state == "bounded" %}
-
search bounded, none found
{% else %}
-
not determined
{% endif %}
{% endif %} {% if cards and cards.freshest %}
data through
{{ cards.freshest.max|dt }}
{{ cards.freshest.classification }} · {{ cards.freshest.column }}{% if cards.freshest.clause %} · {{ cards.freshest.clause }}{% endif %}
{% endif %} {% if cards %}
sensitive
{{ cards.sensitive }}
of {{ cards.n_columns }} columns
redacted
{{ cards.redacted }}
of {{ cards.n_columns }} columns
{% endif %} {% if cardinality %}
cardinality
{{ cardinality.avg|percent }}
avg across {{ cardinality.n_columns }} of {{ cardinality.n_total }} columns
{% for b in cardinality.bars %} {% endfor %}
{% endif %} {% if no_rows %}
completeness
-
no rows measured
{% endif %} {% if completeness %}
completeness
{{ completeness.avg|percent }}
avg across {{ completeness.n_columns }} columns
{% for bucket, count in completeness.buckets %} {% if count %}{% endif %} {% endfor %}
{% endif %}
{% set has_relationships = relationships.refers_to or relationships.referenced_by %}
{% if columns %}{% endif %} {% if has_relationships %}{% endif %} {% if ddl %}{% endif %}
{% if description %}

Description

{{ description|md }}
{% endif %} {% if unlisted_annotations %}

Annotations

{% endif %} {% if grain %}

Grain - what identifies a row

{% if grain.key_list %} {% elif grain.state == "exhausted" %}
Searched for an undeclared grain; none found.
{% elif grain.state == "bounded" %}
Search for an undeclared grain was bounded; none found within the cap.
{% else %}
Not determined.
{% endif %}
{% endif %} {% if timeline %}

Timeline - {{ timeline.column }} by {{ timeline.unit }}

Bucketed non-null counts{% if timeline.coverage_words %}, {{ timeline.coverage_words }}{% endif %}. A missing bucket is a gap - no rows fell in that {{ timeline.unit }}.
{% if timeline.buckets %} {% for b in timeline.buckets %} {% endfor %}
StartCount
{{ b.start }} {{ b.count }}
{% else %}
No non-null values bucketed.
{% endif %}
{% endif %} {% if depends_on is not none %}

Depends on

Catalog-derived, direct dependencies only - a different relation than a foreign key.
{% if depends_on %} {% else %}
Depends on no other object in the print.
{% endif %}
{% endif %} {% if physical_layout %}

{{ {'cluster': 'Clustered by', 'partition': 'Partitioned by', 'sort': 'Sorted by'} .get(physical_layout.mechanism, 'Partitioned by') }}

Declared in the catalog, not measured - it names the key, not how closely the rows follow it.
    {% for k in physical_layout.key_list %}
  1. {{ k.expression }}{% if k.column %} ({{ k.column }}){% endif %}
  2. {% endfor %}
{% endif %} {% if merging %}

Merged by {{ merging.engine }}

{% if merging.rows == 'merged' %} Read with FINAL: the counts here are the merged rows, and a query without FINAL sees more. {% elif merging.one_row_per_key %} The counts here are the stored rows, which may repeat a key until merged; query with FINAL for one row per key. {% else %} The counts here include state and cancel rows not yet collapsed; query with FINAL for the collapsed rows. {% endif %}
    {% for k in merging.key_list %}
  1. {{ k.expression }}{% if k.column %} ({{ k.column }}){% endif %}
  2. {% endfor %}
{% endif %} {% if 'physical_layout' in unmeasured %}

Clustering or partitioning

Named in the file's unmeasured list: {{ unmeasured['physical_layout'] }}
{% endif %} {% if dependencies %}

Dependencies

Measured over the scanned rows, not a rule the database enforces.
{% for d in dependencies %} {% endfor %}
DeterminantDependentStrength
{{ d.determinant }} {{ d.dependent }} {{ d.strength|percent }}
{% endif %} {% if 'dependencies' in unmeasured %}

Dependencies

Named in the file's unmeasured list: {{ unmeasured['dependencies'] }}
{% endif %} {% for name, message in unmeasured.items() if name not in ('physical_layout', 'dependencies', 'null_patterns') %}

{{ name }}

Named in the file's unmeasured list: {{ message }}
{% endfor %} {% for name, message in disabled.items() %}

{{ name }}

Named in the file's disabled list: {{ message }}
{% endfor %} {% if columns_empty_notice %}
{{ columns_empty_notice }}
{% elif no_rows %}

Cardinality and completeness by column

No rows measured - a column holds no cardinality or completeness to plot.
{% elif columns %}

Cardinality and completeness by column

{% for s in skyline %} {{ s.name }} {% endfor %}
{% for bucket, label in skyline_legend %} {{ label }} {% endfor %} height = cardinality (log)
fill = completeness
{% if skyline_coverage and skyline_coverage.measured < skyline_coverage.total %} {{ skyline_coverage.measured }} of {{ skyline_coverage.total }} columns plotted - the rest carry no measured cardinality {% endif %}
{% endif %} {% if diagram %}

Relationships

{{ diagram }}
{% endif %}
{% if columns %}
{% for col in columns %} {% endfor %}
Column Type Class Null rate Cardinality Distribution Notes
{{ col.name }} {% if col.collation %}
collation {{ col.collation }}
{% endif %} {% if col.null_companions %}
null with: {{ col_links(col.null_companions) }}
{% endif %} {% if col.annotation_note %}
{{ col.annotation_note|md }}
{% endif %} {% for value, note in col.annotation_values %}
{{ value }}: {{ note }}
{% endfor %} {% for stat, predicate in col.annotation_claims %}
claims {{ stat }} {{ predicate }}
{% endfor %}
{{ col.sql_type }}{% if not col.nullable %} not null{% endif %} {{ col.classification|capitalize|nbsp }}
{% if col.null_rate is not none %}{% endif %} {{ col.null_count|number }}
{% if col.zero_count or col.negative_count or col.empty_count %}
{% if col.zero_count %}{{ col.zero_count|number }} zero{% endif %} {% if col.zero_count and col.negative_count %}·{% endif %} {% if col.negative_count %}{{ col.negative_count|number }} negative{% endif %} {% if (col.zero_count or col.negative_count) and col.empty_count %}·{% endif %} {% if col.empty_count %}{{ col.empty_count|number }} empty{% endif %}
{% endif %}
{% if col.cardinality %}
{{ col.cardinality.value|number }} {% if col.cardinality.approximate %}(approx){% endif %} {% if col.cardinality.saturates %}(= {{ "scanned rows" if col.cardinality.saturates == "scanned_rows" else "row count" }}){% endif %}
{% else %} n/a {% endif %}
{% if col.distribution %}
{{ col.distribution|replace('_', ' ') }}
{% endif %} {% if col.redacted %}
redacted ({{ col.redacted }})
{% endif %} {% if col.unmeasured %}
unmeasured: {{ col.unmeasured|join(', ') }}
{% endif %} {% if col.value_list %} {% if col.value_list.bars %}
{% for v in col.value_list.bars %}
{{ v.value }}{% if v.spellings %} + {{ v.spellings|join(", ") }}{% endif %} {{ v.count|number }}
{% endfor %}
{% endif %} {% if col.value_list.coverage is not none %}
{{ col.value_list.coverage_text }} {% if col.value_list.coverage_method == 'bounded' %}bounded{% endif %}
{% endif %} {% endif %} {% if col.range %} {% if col.range.redacted %}
bounds withheld (redacted: {{ col.range.redacted }})
{% else %} {% if col.range.box %}
{{ col.range.bounds.min|dt }} {{ col.range.box.p25_value|dt }} {{ col.range.box.p50_value|dt }} {{ col.range.box.p75_value|dt }} {{ col.range.bounds.max|dt }}
{% endif %} {% if col.range.percentiles %}
{% for k, v in col.range.percentiles %}{{ k }} {{ v|dt }}{% endfor %}
{% endif %} {% endif %} {% if col.range.unrepresentable %}
unrepresentable: {{ col.range.unrepresentable|join(', ') }}
{% endif %} {% if col.range.mean is not none or col.range.sum is not none %}
{% if col.range.mean is not none %}mean {{ col.range.mean|number }}{% endif %} {% if col.range.mean is not none and col.range.sum is not none %}·{% endif %} {% if col.range.sum is not none %}sum {{ col.range.sum|number }}{% endif %}
{% endif %} {% if col.range.frequencies %}
top {{ col.range.frequencies.top|number }} · bottom {{ col.range.frequencies.bottom|number }} · {{ col.range.frequencies.listed }} listed of {{ col.range.frequencies.total|number }}
{% endif %} {% if col.range.freshness %}
{{ col.range.freshness.classification }} · {{ col.range.freshness.max_age_days }}d old{% if col.range.freshness_clause %} · {{ col.range.freshness_clause }}{% endif %}
{% endif %} {% endif %} {% if col.length %}
length {{ col.length.min|number }}-{{ col.length.max|number }} · avg {{ col.length.avg|number }} · p95 {{ col.length.p95|number }}
{% endif %} {% for p in col.parts %}
{{ p.label }} · {{ p.classification }} · {{ p.notes }}
{% endfor %}
{{ col.notes }} {% if col.sketch_available %}sketch{% endif %}
{% if null_patterns and null_patterns.patterns %}

Columns null on the same rows

{% for p in null_patterns.patterns %} {% endfor %}
RowsNull together
{{ p.count|number }} {{ col_links(p.columns) if p.columns else '(none - fully populated)' }}
{% if null_patterns.coverage_words %}
Observed over {{ null_patterns.coverage_words }}{% if null_patterns.coverage_method == 'bounded' %} (bounded){% endif %}.
{% endif %}
{% endif %} {% if 'null_patterns' in unmeasured %}

Columns null on the same rows

Named in the file's unmeasured list: {{ unmeasured['null_patterns'] }}
{% endif %}
{% endif %} {% if has_relationships %}
{% if relationships.eligible_target == false %}
This table declares no unique column, so nothing can ever reference it.
{% endif %} {% for r in relationships.refers_to %} {% endfor %} {% for r in relationships.referenced_by %} {% endfor %}
DirectionColumnsTableColumnsDetectionDetail
refers to {{ col_links(r.column) }} {{ r.target_table }} {{ col_links(r.target_column, url_for('table', conn=conn, table=r.target_table)) }} {{ r.detection }} {% if r.on_delete %}
on_delete={{ r.on_delete }}
{% endif %} {% if r.constraint_name %}
{{ r.constraint_name }}
{% endif %} {% if r.path or r.target_path %}
via {{ (r.path or ['(column)'])|join('.') }} -> {{ (r.target_path or ['(column)'])|join('.') }}
{% endif %} {% if r.note %}
{{ r.note }}
{% endif %} {% if r.observed %} {% if r.observed.scope_compatible == false %}
scopes not comparable
{% else %}
fanout avg {{ r.observed.fanout_avg|number }}{% if r.observed.fanout_max is not none %} (max {{ r.observed.fanout_max|number }}){% endif %}, covers {{ r.observed.target_coverage|percent }} of target {% if r.observed.containment is not none %}, {{ r.observed.containment|percent }} of referencing values contained{% endif %} {% if r.observed.containment is not none and r.observed.answerable_count is not none %}({{ r.observed.answerable_count|number }} answerable){% endif %}
{% if r.observed.coherent == false %}
INCOHERENT: referencing cardinality exceeds the target's
{% endif %} {% endif %} {% endif %} {% if r.rejected %}
REJECTED by human annotation{% if r.rejected_note %}: {{ r.rejected_note }}{% endif %}
{% endif %}
referenced by {{ col_links(r.column) }} {{ r.referencer_table }} {{ col_links(r.referencer_column, url_for('table', conn=conn, table=r.referencer_table)) }} {{ r.detection }} {% if r.on_delete %}
on_delete={{ r.on_delete }}
{% endif %} {% if r.constraint_name %}
{{ r.constraint_name }}
{% endif %} {% if r.referencer_path or r.path %}
via {{ (r.referencer_path or ['(column)'])|join('.') }} -> {{ (r.path or ['(column)'])|join('.') }}
{% endif %} {% if r.note %}
{{ r.note }}
{% endif %} {% if r.observed %} {% if r.observed.scope_compatible == false %}
scopes not comparable
{% else %}
fanout avg {{ r.observed.fanout_avg|number }}{% if r.observed.fanout_max is not none %} (max {{ r.observed.fanout_max|number }}){% endif %}, covers {{ r.observed.target_coverage|percent }} of target {% if r.observed.containment is not none %}, {{ r.observed.containment|percent }} of referencing values contained{% endif %} {% if r.observed.containment is not none and r.observed.answerable_count is not none %}({{ r.observed.answerable_count|number }} answerable){% endif %}
{% if r.observed.coherent == false %}
INCOHERENT: referencing cardinality exceeds the target's
{% endif %} {% endif %} {% endif %} {% if r.rejected %}
REJECTED by human annotation{% if r.rejected_note %}: {{ r.rejected_note }}{% endif %}
{% endif %}
{% endif %} {% if ddl %}
{{ ddl }}
{% endif %} {{ context_panel(context) }} {% endblock %}